Repository navigation
Release 0.30.0: harden names, MCP writes, rollback, catalogs and update checks - #21
Merged
Merged
Conversation
devohmycode
marked this pull request as ready for review
October 23, 2026 08:50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Seven fixes from a review of 0.20.0, one commit each, plus a general CI workflow and the docs.
checkSkillNamemoves toinstall/plan.tsand runs insideparseSkillIdandplanRemove, so every entry point (CLI, selection files, packs, MCP, web) refuses an empty name, a leading-, a quote, a control character or more than 200 characters.install o/r@x o/r@--global … --no-audit --dry-runused to print-s x --global; it now fails before building a command.install_skillsandremove_skills(not dry runs) go through one queue per handler, so a second call re-reads the installed state after the first. An error frees the queue; reads answer while an install runs. Within one MCP process only.installedRevisionreturns a commit only when it is proven: one remembered after a rollback while the lock keeps the same folder hash (revisions.jsonnext tohistory.json, written with temp + rename), an exactreffrom the lock if the installer records one, or the date-found commit whose folder tree SHA (root tree for a root skill) matchesskillFolderHash. Otherwiseundefined, andupdatekeeps saying the skill has no way back.decodeCatalogchecks the shape with Zod (unknown fields kept, recent optional fields optional). A bad download is rejected before it is cached. Entries whose id would failparseSkillIdor differs fromsource@nameare left out rather than failing the catalog: the current snapshot has 59 of them (e.g.@-21risk-automation). Load time grows by about 170 ms on the full snapshot.buildCatalogthrows when the result has no skill, beforecrawl.tssaves anything.findUpdatesreturns{ outdated, unchecked }. HTTP errors, timeouts, invalid answers, truncated trees and missing folders areunchecked(reason without URL or token); the root tree is compared under''.outdated/updateprint them on stderr and exit 1;outdated --jsonkeeps its array on stdout; the tree shows a translated warning.ci.ymlrunsnpm ci, typecheck, tests and build on every pull request and on pushes tomain.Compatibility
MCP
outdated_skillsnow returns{ skills, unchecked }instead of an array.outdatedandupdateexit with 1 when the check is incomplete. Both are documented in the README, the agent skill and the command.Validation
npm run typecheck,npm test(268 tests),npm run build,npm run demo.install o/r@x o/r@--global --agent codex --project --symlink --yes --no-audit --dry-run→invalid skill name in "o/r@--global", exit 1.npx skillsinstall.