- Add
generatecommand — fetches a skill from GitHub at a pinned commit and produces a valid<skillname>-openapi-spec.json generate --repo / --skill / --commitpins to an exact commit SHA (reproducible, supply-chain safe)generate --branchauto-resolves branch to commit SHA via GitHub API, then pins- SKILL.md body is scanned for file references (
references/,scripts/,assets/) — only referenced files are fetched and embedded - Hard error if a referenced file is missing from the repo at the pinned commit
build_spec()produces a valid OpenAPI 3.1.0 JSON with all 25 routes, embedded file content, correctETag/Cache-Control/X-Skill-*headers, andinfo.version=<skill-version>+<commit[:10]>info.versionfallback to0.0.0+<commit[:10]>when SKILL.md has noversionfield- Fix: disabled Typer/Rich ANSI color output (
rich_markup_mode=None) — all CLI output is plain text, agent-friendly, no escape codes - Pure stdlib implementation for HTTP and GitHub fetching — only new runtime dependency is
pyyaml>=6.0.0 - 219 tests passing (48 spec contract + 106 HTTP server + 62 generate + 3 CLI smoke)
- Implement
servecommand — serves all 25 approved routes from a<skillname>-openapi-spec.json - Fileserver routes:
GET /,GET /<skill>/,GET /<skill>/SKILL.md, references, scripts, assets - Special root routes:
/list,/to-prompt,/to-conventions,/validate,/meta,/pin,/find/<partial>,/schema/openapi.json,/schema/swagger - Per-skill special routes:
/<skill>/to-prompt,/<skill>/to-conventions,/<skill>/validate,/<skill>/meta,/<skill>/pin,/<skill>/schema/* - HATEOAS root
GET /with full URLs per skill entry Cache-Control: immutable+ETag: "sha256:..."+X-Skill-*response headers on all file routes/find/<partial>fuzzy matching with302redirect,404on no match- Swagger UI served via CDN at
/schema/swaggerand/<skill>/schema/swagger - Pure stdlib implementation — zero new runtime dependencies
- 154 tests passing (48 spec contract + 106 HTTP server tests)
- Initial release — CLI scaffold with
versionandserve(stub) commands servecommand not yet implemented — reserved for v0.2.0- Establishes PyPI name and package structure