Skip to content

feat: one-command install via the skills CLI - #79

Merged
ValentinJSchmidt merged 5 commits into
mainfrom
feat/skills-cli-install
Aug 30, 2026
Merged

ValentinJSchmidt merged 5 commits into
mainfrom
feat/skills-cli-install

Conversation

@ValentinJSchmidt

Copy link
Copy Markdown
Collaborator

Summary

Makes the repo installable with npx skills add Tue-StudyOS/study-os-thesis --skill '*' (the third-party Vercel skills CLI). Our skills/<name>/SKILL.md layout already matched what it scans — but running it exposed a bug that silently dropped the entry-point skill.

What Changed

  • fix: 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 without thesis-finder — exactly the partial install INSTALL.md warns about. Fixed with an em dash, not quoting, so the bundlers' frontmatter regexes are untouched.
  • test: every shipped SKILL.md frontmatter must yaml.safe_load; pyyaml added to the dev extra.
  • chore: the two maintainer-only skills marked metadata.internal, so installers no longer offer them to students (public listing 12 → 10).
  • docs: Route C Step 0 in INSTALL.md + README paragraph, with both caveats — --skill '*' is mandatory, and the CLI tracks main unless @skills-vX.Y.Z is appended.

Routes A, B and the manual Route C copy are unchanged: no files moved, no build script touched.

How to Test

python -m pytest -q                                   # 66 passed
npx skills@latest add . --list                        # 10 skills, no skip warning

🤖 Generated with Claude Code

https://claude.ai/code/session_01A5VtwCJkmfxRtTAa1gQ7bA

ValentinJSchmidt and others added 4 commits August 30, 2026 10:13
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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.md frontmatter across shipped and agent-synced skill folders parses via yaml.safe_load, and adds pyyaml to the dev extra.
  • Documents npx skills ... install caveats in README/INSTALL and updates changelog/status notes; marks maintainer-only agent-local skills as metadata.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.

Comment thread skills/tests/test_skill_package.py Outdated
Comment on lines +90 to +95
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")

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread INSTALL.md Outdated
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
@ValentinJSchmidt
ValentinJSchmidt merged commit 31c96c1 into main Aug 30, 2026
1 check passed
@ValentinJSchmidt
ValentinJSchmidt deleted the feat/skills-cli-install branch August 30, 2026 09:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants