Repository navigation
chore: make the one-command skills install actually install only the ten public skills - #81
Conversation
The Vercel `skills` CLI scans `.claude/skills/` and `.codex/skills/` next to `skills/`, so `npx skills add Tue-StudyOS/study-os-thesis` offered 12 skills to students: the ten public ones plus the two repo-internal simulation skills, which `--skill '*'` then installed as well. `metadata.internal: true` keeps them out of both the picker and the wildcard. The key is part of the Agent Skills frontmatter spec, so Claude Code and Codex still load them repo-locally. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H8uhg9be5GbE6QpPHipwta
Assert that the skill set the installer discovers across `skills/`, `.claude/skills/` and `.codex/skills/` is exactly the ten public skills, and that every copy of a maintainer skill carries `metadata.internal: true`. Extend the QA workflow's path filter to the two agent skill directories so the check runs when a maintainer skill changes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H8uhg9be5GbE6QpPHipwta
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H8uhg9be5GbE6QpPHipwta
There was a problem hiding this comment.
🟢 Approval recommended
The changes are low-risk, align with the stated goal, and include a targeted regression test plus CI path coverage to prevent the installer surface from regressing.
Pull request overview
This PR cleans up the npx skills add one-command install path so that only the 10 public skills are discoverable/installable, by marking the two maintainer-only simulation skills as internal and adding regression tests to prevent them from leaking into the installer surface.
Changes:
- Marked
create-thesis-sim-studentandrun-thesis-simulationsasmetadata.internal: truein both.claude/skills/and.codex/skills/. - Added a pytest regression test to assert that only the 10 public skills are offered by the CLI discovery surface and that maintainer skills remain internal.
- Expanded the QA workflow path filter so CI runs when
.claude/skills/**or.codex/skills/**changes.
File summaries
| File | Description |
|---|---|
STATUS.md |
Logs the install-surface cleanup and verification notes. |
skills/tests/test_skills_cli_install.py |
Adds deterministic tests asserting the non-internal discovered skill set equals the public skills set. |
.github/workflows/qa.yml |
Ensures QA runs when agent-local skill directories change. |
.codex/skills/run-thesis-simulations/SKILL.md |
Marks maintainer skill internal for Codex. |
.codex/skills/create-thesis-sim-student/SKILL.md |
Marks maintainer skill internal for Codex. |
.claude/skills/run-thesis-simulations/SKILL.md |
Marks maintainer skill internal for Claude. |
.claude/skills/create-thesis-sim-student/SKILL.md |
Marks maintainer skill internal for Claude. |
Review details
- Files reviewed: 7/7 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| REPO_ROOT = Path(__file__).resolve().parents[2] | ||
| SCANNED_DIRS = ( | ||
| REPO_ROOT / "skills", | ||
| REPO_ROOT / ".claude" / "skills", | ||
| REPO_ROOT / ".codex" / "skills", | ||
| ) | ||
| PUBLIC_SKILLS = { | ||
| "build-student-profile", | ||
| "design-agent-skill", | ||
| "discover-company-candidates", | ||
| "discover-university-candidates", | ||
| "draft-thesis-contact", | ||
| "find-company-thesis-options", | ||
| "find-recent-papers", | ||
| "find-university-chairs", | ||
| "generate-thesis-directions", | ||
| "thesis-finder", | ||
| } |
There was a problem hiding this comment.
Good catch — adopted in 6a50ab2. PUBLIC_SKILLS is gone; the test now derives the expected set from the skills/ directories that contain a SKILL.md, so it only asserts "nothing outside skills/ reaches the installer surface". test_skill_package.py::test_expected_portable_skills_exist stays the single place that pins the canonical ten.
Copilot review on #81: the hard-coded list duplicated test_skill_package.py's EXPECTED_SKILLS and could drift. That test already pins the canonical ten, so this one only needs "nothing outside skills/ is offered to the installer". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H8uhg9be5GbE6QpPHipwta
Summary
Beat's feedback asked us to use vercel-labs/skills
as the install path for local agents. That route already existed (INSTALL.md Route C,
Step 0) but was dirty: the installer offered 12 skills instead of ten. This marks the
two repo-internal maintainer skills as internal, so the one-command route installs exactly
the ten skills that belong together.
INSTALL.md is deliberately untouched — shortening it is a separate call.
Motivation
The
skillsCLI discovers skills inskills/and in agent directories, including.claude/skills/and.codex/skills/. Those holdcreate-thesis-sim-studentandrun-thesis-simulations, which exist only to run our own simulation suite against thisrepo. They showed up in the interactive picker between the real skills, and
--skill '*'— which INSTALL.md tells students to pass — installed them into a student'sclient, where they are useless at best.
What Changed
npx skills add … --listFound 12 skillsFound 10 skills--skill '*'installmetadata.internal: trueon both maintainer skills, in each agent directory (4 files).The CLI honours this for the picker and for the
'*'wildcard (src/skills.ts:115,src/add.ts:1143). The key is part of the Agent Skills frontmatter spec, so Claude Codeand Codex still load both skills repo-locally — confirmed in a live session.
skills/tests/test_skills_cli_install.py— asserts the discovered, non-internal skillset across
skills/,.claude/skills/and.codex/skills/is exactly the ten publicskills, and that every copy of a maintainer skill carries the flag.
qa.ymlpath filter extended to.claude/skills/**and.codex/skills/**, so the newcheck runs on exactly the changes it guards.
Known Issues / Not Yet Done
makes the one-command route he pointed at reliable. With this merged, local agents
genuinely need one line, which makes a later trim easier.
.claude-plugin/marketplace.json, so/plugin marketplace addis still not a route.Left out as scope creep; easy follow-up if we want it.
How to Run / Test
Verified end-to-end on this branch: the real install produces ten skill folders with their
references/intact, and the new test fails if the internal flag is removed.🤖 Generated with Claude Code
https://claude.ai/code/session_01H8uhg9be5GbE6QpPHipwta