feat: one-command install via the skills CLI - #79
Conversation
An unquoted ": " inside the description ("multi-session continuity:
detects prior searches") parses as a nested mapping under a strict YAML
reader. Claude Code's lenient parser and our regex-based bundlers never
noticed, but external installers do: `npx skills add` skipped the entry
point and offered an install that dangles at the first hand-off.
Replaced with an em dash rather than quoting the value, so the
frontmatter regexes in the bundle scripts are untouched. Added a test
that yaml.safe_load's every shipped SKILL.md frontmatter across skills/,
.claude/skills/ and .codex/skills/; pyyaml joins the dev extra for it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5VtwCJkmfxRtTAa1gQ7bA
create-thesis-sim-student and run-thesis-simulations drive the local simulation suite and mean nothing to a student. Installers that scan .claude/skills/ were listing them alongside the ten public skills; metadata.internal is the documented opt-out and Claude Code still loads them locally. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A5VtwCJkmfxRtTAa1gQ7bA
Route C gains an optional Step 0: `npx skills add Tue-StudyOS/study-os-thesis --skill '*'` installs all ten skills into any of ~70 skills-directory clients. The manual copy route and the release archives are unchanged and stay the fallback for anyone without Node. Both caveats are stated: --skill '*' is mandatory because a partial pick breaks the name-based hand-offs, and the CLI tracks main unless a @skills-vX.Y.Z tag is appended. Also corrects the README's "dependency-free (pytest only)" claim now that pyyaml is a dev dep. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A5VtwCJkmfxRtTAa1gQ7bA
Testing the published branch rather than only the local tree showed the `repo@tag` shorthand parses but silently ignores the ref — every such install gets the default branch. The tag has to be spelled out as a URL path (`/tree/skills-vX.Y.Z`), which in turn cannot express a ref containing a slash. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A5VtwCJkmfxRtTAa1gQ7bA
There was a problem hiding this comment.
Pull request overview
This PR makes the repository directly installable via the third-party Vercel skills CLI by ensuring skill frontmatter is strict-YAML compatible (so installers don’t silently skip skills) and by documenting the one-command install path.
Changes:
- Fixes invalid YAML frontmatter in
skills/thesis-finder/SKILL.md(unquoted:in a plain scalar) so strict parsers don’t drop the entry-point skill. - Adds a pytest gate that
SKILL.mdfrontmatter across shipped and agent-synced skill folders parses viayaml.safe_load, and addspyyamlto thedevextra. - Documents
npx skills ...install caveats in README/INSTALL and updates changelog/status notes; marks maintainer-only agent-local skills asmetadata.internal.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| STATUS.md | Adds a dated log entry documenting the installer discovery, YAML failure mode, and mitigation. |
| skills/thesis-finder/SKILL.md | Replaces : with an em dash to restore valid YAML frontmatter for strict parsers. |
| skills/tests/test_skill_package.py | Adds strict YAML parsing test over skill frontmatter (requires pyyaml). |
| README.md | Documents npx skills ... install route and key caveats (must install all skills; default-branch behavior). |
| pyproject.toml | Adds pyyaml to the dev optional dependencies for the new test. |
| INSTALL.md | Adds “Route C Step 0” one-command installer instructions and troubleshooting note. |
| CHANGELOG.md | Records the new install route and the YAML/frontmatter fix in Unreleased notes. |
| .codex/skills/run-thesis-simulations/SKILL.md | Marks agent-local maintainer skill as internal so installers can hide it. |
| .codex/skills/create-thesis-sim-student/SKILL.md | Marks agent-local maintainer skill as internal so installers can hide it. |
| .claude/skills/run-thesis-simulations/SKILL.md | Marks agent-local maintainer skill as internal so installers can hide it. |
| .claude/skills/create-thesis-sim-student/SKILL.md | Marks agent-local maintainer skill as internal so installers can hide it. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| def test_every_shipped_skill_frontmatter_parses_as_strict_yaml() -> None: | ||
| """External installers (e.g. `npx skills add`) parse frontmatter with a strict YAML | ||
| reader and silently skip a skill whose frontmatter fails. An unquoted `: ` inside a | ||
| description is enough to drop the entry point from an install.""" | ||
| yaml = pytest.importorskip("yaml") | ||
|
|
There was a problem hiding this comment.
Fixed in 4d79beb — yaml is now imported at module level, so a missing pyyaml fails collection instead of skipping the gate. Also added pyyaml to the codex-multiturn-evals workflow, which was the one job installing bare pytest rather than the dev extra.
Import yaml directly in the strict-YAML frontmatter test so a missing pyyaml fails the suite instead of silently skipping the gate, and install pyyaml in the codex-evals workflow, which was the only job not installing the dev extra. Move the pinned-install command into a fenced block; inline code cannot span lines, so it rendered broken and could not be copied. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HmFo5RDAjNo6DPPDAEH9vg
Summary
Makes the repo installable with
npx skills add Tue-StudyOS/study-os-thesis --skill '*'(the third-party VercelskillsCLI). Ourskills/<name>/SKILL.mdlayout already matched what it scans — but running it exposed a bug that silently dropped the entry-point skill.What Changed
thesis-finder's frontmatter had an unquoted:(multi-session continuity: detects …), which is invalid YAML. Strict parsers skipped the skill entirely, so the CLI offered 11 skills withoutthesis-finder— exactly the partial install INSTALL.md warns about. Fixed with an em dash, not quoting, so the bundlers' frontmatter regexes are untouched.SKILL.mdfrontmatter mustyaml.safe_load;pyyamladded to thedevextra.metadata.internal, so installers no longer offer them to students (public listing 12 → 10).--skill '*'is mandatory, and the CLI tracksmainunless@skills-vX.Y.Zis appended.Routes A, B and the manual Route C copy are unchanged: no files moved, no build script touched.
How to Test
🤖 Generated with Claude Code
https://claude.ai/code/session_01A5VtwCJkmfxRtTAa1gQ7bA