Skip to content

Commit bd3e8a5

Browse files
authored
Merge branch 'openai:main' into main
2 parents 6da48ac + 894d404 commit bd3e8a5

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

.github/workflows/cla.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
env:
4444
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4545
with:
46-
path-to-document: https://github.com/openai/skills/blob/main/docs/CLA.md
46+
path-to-document: https://github.com/openai/skills/blob/main/CLA.md
4747
path-to-signatures: signatures/cla.json
4848
branch: cla-signatures
4949
allowlist: codex,dependabot,dependabot[bot],github-actions[bot]

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Codex uses skills to help package capabilities that teams and individuals can us
66

77
Learn more:
88
- [Using skills in Codex](https://developers.openai.com/codex/skills)
9+
- [Create custom skills in Codex](https://developers.openai.com/codex/skills/create-skill)
910
- [Agent Skills open standard](https://agentskills.io)
1011

1112
## Installing a skill

skills/.system/skill-installer/SKILL.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@ metadata:
77

88
# Skill Installer
99

10-
Helps install skills. By default these are from https://github.com/openai/skills/tree/main/skills/.curated, but users can also provide other locations.
10+
Helps install skills. By default these are from https://github.com/openai/skills/tree/main/skills/.curated, but users can also provide other locations. Experimental skills live in https://github.com/openai/skills/tree/main/skills/.experimental and can be installed the same way.
1111

1212
Use the helper scripts based on the task:
13-
- List curated skills when the user asks what is available, or if the user uses this skill without specifying what to do.
13+
- List skills when the user asks what is available, or if the user uses this skill without specifying what to do. Default listing is `.curated`, but you can pass `--path skills/.experimental` when they ask about experimental skills.
1414
- Install from the curated list when the user provides a skill name.
1515
- Install from another repo when the user provides a GitHub repo/path (including private repos).
1616

1717
Install skills with the helper scripts.
1818

1919
## Communication
2020

21-
When listing curated skills, output approximately as follows, depending on the context of the user's request:
21+
When listing skills, output approximately as follows, depending on the context of the user's request. If they ask about experimental skills, list from `.experimental` instead of `.curated` and label the source accordingly:
2222
"""
2323
Skills from {repo}:
2424
1. skill-1
@@ -33,10 +33,12 @@ After installing a skill, tell the user: "Restart Codex to pick up new skills."
3333

3434
All of these scripts use network, so when running in the sandbox, request escalation when running them.
3535

36-
- `scripts/list-curated-skills.py` (prints curated list with installed annotations)
37-
- `scripts/list-curated-skills.py --format json`
36+
- `scripts/list-skills.py` (prints skills list with installed annotations)
37+
- `scripts/list-skills.py --format json`
38+
- Example (experimental list): `scripts/list-skills.py --path skills/.experimental`
3839
- `scripts/install-skill-from-github.py --repo <owner>/<repo> --path <path/to/skill> [<path/to/skill> ...]`
3940
- `scripts/install-skill-from-github.py --url https://github.com/<owner>/<repo>/tree/<ref>/<path>`
41+
- Example (experimental skill): `scripts/install-skill-from-github.py --repo openai/skills --path skills/.experimental/<skill-name>`
4042

4143
## Behavior and Options
4244

skills/.system/skill-installer/scripts/list-curated-skills.py renamed to skills/.system/skill-installer/scripts/list-skills.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env python3
2-
"""List curated skills from a GitHub repo path."""
2+
"""List skills from a GitHub repo path."""
33

44
from __future__ import annotations
55

@@ -47,28 +47,32 @@ def _installed_skills() -> set[str]:
4747
return entries
4848

4949

50-
def _list_curated(repo: str, path: str, ref: str) -> list[str]:
50+
def _list_skills(repo: str, path: str, ref: str) -> list[str]:
5151
api_url = github_api_contents_url(repo, path, ref)
5252
try:
5353
payload = _request(api_url)
5454
except urllib.error.HTTPError as exc:
5555
if exc.code == 404:
5656
raise ListError(
57-
"Curated skills path not found: "
57+
"Skills path not found: "
5858
f"https://github.com/{repo}/tree/{ref}/{path}"
5959
) from exc
60-
raise ListError(f"Failed to fetch curated skills: HTTP {exc.code}") from exc
60+
raise ListError(f"Failed to fetch skills: HTTP {exc.code}") from exc
6161
data = json.loads(payload.decode("utf-8"))
6262
if not isinstance(data, list):
63-
raise ListError("Unexpected curated listing response.")
63+
raise ListError("Unexpected skills listing response.")
6464
skills = [item["name"] for item in data if item.get("type") == "dir"]
6565
return sorted(skills)
6666

6767

6868
def _parse_args(argv: list[str]) -> Args:
69-
parser = argparse.ArgumentParser(description="List curated skills.")
69+
parser = argparse.ArgumentParser(description="List skills.")
7070
parser.add_argument("--repo", default=DEFAULT_REPO)
71-
parser.add_argument("--path", default=DEFAULT_PATH)
71+
parser.add_argument(
72+
"--path",
73+
default=DEFAULT_PATH,
74+
help="Repo path to list (default: skills/.curated)",
75+
)
7276
parser.add_argument("--ref", default=DEFAULT_REF)
7377
parser.add_argument(
7478
"--format",
@@ -82,7 +86,7 @@ def _parse_args(argv: list[str]) -> Args:
8286
def main(argv: list[str]) -> int:
8387
args = _parse_args(argv)
8488
try:
85-
skills = _list_curated(args.repo, args.path, args.ref)
89+
skills = _list_skills(args.repo, args.path, args.ref)
8690
installed = _installed_skills()
8791
if args.format == "json":
8892
payload = [

0 commit comments

Comments
 (0)