skillset v0.28.0
skillset v0.28.0: published 2026-10-13. Package changelog notes and the original GitHub publication notice.
GitHub release · Package changelog
Publication
Published the seven-package Skillset 0.28.0 set to npm with dist-tag latest.
Changes
Minor Changes
-
acfa236: Add
skillset build --repair, which consults filesystem reality instead of trusting the lock and classifies every managed output with a three-way verdict against the lock’s recordedoutputHashand a fresh render. It restores a deleted generated file byte-identically, reports a hand-edited one asoutput-editedand preserves it unless--discard-editsconfirms the overwrite, and refuses adivergedpath where the output and its source both moved. Verdicts print one per line and are available under--json. -
c50e3c5: Classify invocation errors found by argument validators and at execution time as usage errors. They now exit 2 in human,
--json, and--jsonlmodes:- argument validators called by the parsers: ad hoc
testflag combinations and--presetvalues; - missing required arguments: the
reconcileandimportpath, thenewkind, thecreatename,newnames,new hook --attach,--event, and--commandor--script, andhooks print --runner; - conflicting or unsupported flags on
new,new hook, andhooks print; - malformed argument values: change refs that are not hex or are too short, release refs that are too short, non-slug
new --idand--invalues, and unknownnew hook --eventnames.
In human mode these move from 1 to 2. In JSON mode they exit 2 rather than the 1 that dropping message-prefix inference would otherwise give. Well-formed values that do not resolve, such as unmatched or ambiguous refs and missing containers, and other data failures still exit 1.
- argument validators called by the parsers: ad hoc
-
1f4b4f2: Add plan-first
skillset draftandskillset promotecommands with fork-baseline provenance, changed-shipped warnings, atomic paired replacement, unpaired promotion, and rollback-safe generated lifecycle cleanup. -
40dd770: Add plugin project-use draft
onlyandoverridemodes with selection-first pairing, deterministic effective names, lifecycle-safe cleanup, and inspectable lock, explain, and status provenance. -
92b2370: Place plugin-owned Agent Skills baselines only inside their canonical Agent Plugins package, add explicit projection roles to current generated locks, and require a one-time rebuild for older generated state.
-
24232c6: Copy plugin skills selected by
plugins.internal_useinto fixed project skill roots with deterministic collision names, boolean internal markers, owned cleanup, and inspectable provenance. -
47511f4: Recognize skill groups and drafts during discovery, reject duplicate skill leaves, classify reserved rule path segments, and report the new metadata through
listandexplainwithout flattening rendered paths. -
c5bfb94: Expose root plugin selection and planned package paths through build-graph inspection, reject retired provider skill-root overrides, and refuse placement behavior that later package-output features have not implemented.
-
b8d3b4c: Rename the rule CLI vocabulary (ADR-0039).
skillset new rule <name>scaffolds.skillset/rules/source andskillset lookup ruleshows rule frontmatter and compatibility facts; the retiredskillset new instructionandskillset lookup instructionfail with an error naming the rewrite.init/adoptreport rootAGENTS.mdandCLAUDE.mdimport candidates with kindrulesand idsrules:<path>, and new reports writerules:<relative-path>identities. Theskillset.report@1schema still accepts the legacyinstructions:<relative-path>form, so receipts recorded before this release stay valid. -
489d5bb: Rename the remaining rule output and config vocabulary (ADR-0039). Render results and generated locks report
destination: "rule"instead of"instruction", andskillset explainreports rule source paths with thesource-rulerole instead ofsource-instruction. Target defaults accept<target>.defaults.rules; the retired<target>.defaults.instructionsfails validation with an error naming therulesrewrite. Theproject-instructionsfeature ID is unchanged until SET-658. -
ecf239b: Rename the rule frontmatter schema contract from
instruction-frontmattertorule-frontmatter(ADR-0039). The published schema moves fromdocs/reference/schemas/0.1.0/instruction-frontmatter.schema.jsontodocs/reference/schemas/0.1.0/rule-frontmatter.schema.json, with no alias left at the old path, and diagnostics reportschema/rule-frontmatter/*codes.@skillset/schemaexportsruleFrontmatterContract,validateRuleFrontmatter, andskillsetRuleFrontmatterJsonSchema, and Workbench source-contract checks takekind: "rule". -
0c65419: Rename the rule source-unit kind and selector from
instruction/instruction:<id>torule/rule:<id>(ADR-0039).skillset change status,change check,explain, and generated locks reportrule:<id>. Rule source hashes are unchanged, so existing baselines stay valid and no rule appears edited. Change history recorded withinstruction:<id>is translated when read. A pending change entry orskillset change add --scopethat still namesinstruction:<id>fails with an error naming therule:<id>rewrite. -
47511f4: Add
skillset new plugin <name>to preview or create a validated empty plugin container that can immediately receive plugin-owned skills. -
cabd7d2: Render and verify Skillset-owned project SessionStart hooks with explicit compile-time activation policy and field-level settings ownership.
-
89b9140: Add exact partials and marked shared-resource links with implied skill-local copies.
-
76899f4: Give human and JSON CLI modes one exit-code classifier. Shared classes are 0 success, 1 failure, and 2 usage. Codes 3 and 4 stay command-specific and explicit.
Visible exit-code changes: human-mode usage errors now exit 2 instead of 1;
--jsonand--jsonlgeneral failures now exit 1 instead of 3; and JSON-mode errors that were promoted to 2 only because their message looked like a usage error now exit 1. -
0694930: Render workspace and selected plugin drafts beside live project skills with draft-specific names, descriptions, internal markers, lifecycle cleanup, and inspectable provenance, and add plan-first
skillset new skill --draftscaffolding. -
8b1c1c1: Generate each plugin as one shared package with one immediate-child skill tree across enabled providers.
-
26d4317: Add plan-first
skillset movefor atomic same-workspace skill moves between workspace and plugin collections, preserving paired drafts, current references, generated provenance, and append-only history. -
548a2ff: Add
skillset resolve, which clears generated-output conflicts during a rebase or merge. It partitions the conflicted set using the lock inventory, materializes each conflicted generated path from its conflict stage so the three-way verdict sees whole files rather than markers, regenerates what is safe, and stages only paths confirmed generated. Authored conflicts block the repair and are named for a human, because regenerating from source that still carries conflict markers would render those markers into generated output. Works inside a linked git worktree. -
47511f4: Adopt the current authoring source layout with root
RULES.md,subagents/, andshared/partials/, and reject retired locations.
Patch Changes
-
bf67376: Allocate project skill copy names once across workspace drafts and project-use copies:
- A workspace draft whose derived
draft-<name>is held by a live workspace skill renders under the next free suffix and reports the conflict, instead of failing with an output collision. Any two copies that still claim one project skill directory fail the render loudly. - Derived copy names (
draft-prefixes, plugin-prefixed collision renames, and numeric suffixes) stay within the Agent Skills 64-character name limit, so long skill ids no longer fail Codex classification.
- A workspace draft whose derived
-
299e2ee: Publish retained-run pointers, mutable statuses, and final reports through the shared atomic single-file writer so pollers never observe partial JSON.
latest.jsonnow points its report and status paths at the immutableruns/<id>/directory instead of thelatest/copy, which is rewritten on every refresh. -
6dd3799: Add an owned JSONL append primitive whose rollback removes only the records the writer appended, so a later concurrent append survives a failed change-ledger mutation.
-
fa94b44: Serialize
change add,reason,migrate,refresh,ignore, andamendon one owner-fenced change-ledger mutation, and roll back only the JSONL records each command appended so a concurrent writer’s append survives a failure. -
c453fc4: Load CLI command implementations only when dispatched so help and version commands start without evaluating the compiler.
-
cf199ab: Share the test-sandbox descriptor parser with cleanup of stale retained test sandboxes. New sandboxes carry repository and runner-process leases so cleanup fails closed for unverified roots and only collects old sandboxes after the lease owner has exited.
-
06a1b03: Remove temporary Git snapshots when preparation fails and collect remote acquisition clones after they are copied into an explicit adoption destination. Preserve completed adoption results and original errors if temporary cleanup itself fails.
-
36c1ed4: Pin Cursor authoring evidence and add a checked-in parity fixture with owned gaps for later renderer work.
-
d2e2fcc:
skillset draft --yesno longer reports the shipped skill it copied from as a written path; the write count and JSONwriteslist only the draft, the ledger, and generated output. -
415fceb: Fail closed when change status, reconcile, or provider-format updates read a corrupt or unreadable on-disk
skillset.lock. -
702a83f: Prevent a freshly scaffolded draft from borrowing an abandoned fork baseline. Confirmed
new skill --draftatomically recordssource.draft-discardedwith the new files, preserving edited and moved draft provenance and append-only fork history. Older Skillset readers must be upgraded before reading this new ledger event. -
0b50e8a: Install imported source directories with the host atomic no-replace rename so a concurrent occupant is refused instead of replaced.
-
a9c65ca: Append
draft,promote, andmovelifecycle events to the change ledger instead of replacing it: the record is built from the ledger read when the transaction applies, a failed transaction removes only its own line, and the applying commands serialize with other ledger writers on the change-ledger lock. -
633df0d:
skillset movenow rewrites the moved skill’s selector in pending change entry scopes and evidence, refuses when an entry’s evidence map already has a key for the new selector, tells you to runskillset change refresh --yes(afterskillset change migrate --yesfor frontmatter entries) whenever a pending entry or its ledger evidence named the moved skill, because moved evidence hashes turn stale under the new identity, and refuses without writing when a rewritten selector does not match the schema pattern for its field, such as a distributionfrom.selectornaming a workspace skill that moves into a plugin. -
76b52ce:
change check,change refresh, and release planning treat a removed selector as covered by a reason that names the unit it was moved to since the last release, and release retires the old selector with that reason, so a move keeps the check green after the usual evidence refresh. -
537cd37: Keep shared references literal inside Markdown code spans that cross line breaks, so
skillset buildno longer rewrites or copies a reference written inside a multiline backtick span. -
02424d3: Report shared plugin package companions (
README.md,assets/,scripts/,src/) under the consumers that actually own them, such as the Agent Plugins standard profile, instead of attributing them to the first enabled provider target. Standard-profile companions reportrendered; provider-owned copies keeptarget_native. -
02424d3: Keep a plugin’s root
README.md,scripts/, andsrc/in its Claude and Codex output, and itsassets/in Codex output, when the Agent Plugins baseline does not own the package, for example when the plugin id exceeds the Agent Plugins name limit andunsupportedDestination: warnlets the provider projection continue. Each copy follows the feature registry’s proven support, so Cursor, whose support for these companions is still planned, receives none of them. Editing a copied companion now changes the plugin’ssourceHash. -
05a26cd: Remove the project SessionStart entry Skillset previously wrote when its target is disabled or its
projectRootmoves, instead of leaving the command active and unmanaged. -
951e5ff: Compose project SessionStart settings for
build --isolatedfrom the mirror under.skillset/cache/latest/and its lock, so an existing live settings file no longer blocks the isolated build and repeated isolated builds keep their own preimage. -
421e423: Derive plugin component paths from provider registry metadata when resolving source features, rendering manifests, and checking provider conformance.
-
e097159: Run
release applyinside the change-ledger mutation so a failed release rolls back only its own history, release, and ledger records instead of restoring whole-file snapshots over a concurrent writer’s append. -
a3f1293: Publish remote-repository cache checkouts with the host atomic no-replace rename so an outside occupant is refused instead of replaced, and a late symlink occupant is refused instead of followed. Marketplace checks on a cache filesystem without that primitive now report the move-the-cache remedy instead of an invalid-workspace reason, and a host rename failure such as a permission error reports a cache-publication reason.
-
5e4c2c6: Read project skill copies from the rendered-copy inventory in lint, output-root registration, and status:
skillset checkand lint now examine workspace drafts and selected plugin drafts that the build renders into project skill roots.- Output-root registration matches project-use selections by status, so a live skill and its draft that enable different targets both register the provider skill root they write.
skillset statusreports whole-plugin internal-use selections, so a selected plugin with no live skills no longer printsplugin internal use: none.
-
608b60c: Refuse repository create, write, restore, and delete operations that would traverse a symlinked parent directory or write through a symlinked file, while still allowing a symlink supplied as the workspace root itself.
-
76cbd21: Move the rule reference pages to
docs/reference/features/rules.mdanddocs/reference/source/rules.md(ADR-0039). Feature lookups and lock evidence now point at the new pages, and the documentation describes authored guidance as rules. -
6e8a30e: Discover runtime-hook CLI runners with
Bun.whichagainst the hook PATH instead of spawning a login shell. -
7a5b6b6: Run discovered runtime-hook CLI runners and
SKILLSET_HOOK_COMMANDoverrides as argv, or through/bin/sh/%ComSpec%, including Windows.cmdand.batshims in paths with spaces. Overrides that rely on shell expansion (~, globs,NAME=valueprefixes) or start with a POSIX reserved word or shell built-in (exec,exit,command,.,if) still run through the shell, explicitly empty quoted arguments are kept, and a missing override executable exits 127 and one that cannot execute exits 126 instead of failing the hook. -
274e57e: Sanitize hook-exported Git repository variables for every compiler, toolkit, and test-sandbox git subprocess so
GIT_DIRcannot retargetgit -Cor cwd discovery. -
f39b47a: Reject provider skill root overrides and non-slug plugin selectors during shared schema validation, so
skillset buildandskillset checkfail on input the JSON Schema already rejected. Rootskillset.yaml, split.skillset/config.yaml, and pluginskillset.yamlnow reject<target>.skills.pathand malformed<target>.skillsselections.skillset.outputs.skills.<target>(and a non-objectskillset.outputs.skills) is now rejected in root and plugin config, the split-layout.skillset/skillset.yamlroot manifest, and skill, agent, and instruction frontmatter. Rootdraftsselectors accept only slug plugin ids (plugin.<slug>.skill:<name>), matching the plugin ids Core loads. Validation-tightening. -
4852fdb: Apply aggregate CI package Changeset enforcement only to workspaces that opt into Changesets with
.changeset/config.json, so downstream authoring repositories can commit README updates without dummy npm release entries. -
4e52e58: Scope project skill copies to their own source and route their diagnostics:
- Workspace draft copies no longer inherit a same-id live sibling’s adaptive hooks.
- Project-use component diagnostics are gated on the scope that writes the copy, so
build --scope reporeports (and by default blocks) omitted hooks or plugin components, and--scope projectno longer reports copies it excludes. - A Codex project copy that fails Agent Skills classification is omitted and reported as an unsupported result, so
compile.unsupportedDestinationdecides whether the build fails instead of a raw render error. The softened result names its skill root asoutputRoot, so that root’sskillset.lockrecords the omission even underbuild --scope repo, and that lock is written even when the omitted copy was its only output. - A plugin draft copy’s component diagnostics resolve the draft’s own hooks, so a same-id live sibling’s hook no longer blocks
build --scope repo.
-
2f3f0f9: Report stale generated output through the read-only SessionStart hook runner without blocking agent sessions.
-
05a26cd: Keep the live file mode on a settings island handed back after the project SessionStart hook is turned off. Island lock items now accept the preserved four-digit mode their output hash covers, as settings entries do, so a private (
0600) live settings file no longer produces a lock that the next build and check reject. -
a7dd43b: Report verified project runtime-hook destinations for Claude and Codex, including the Codex
.codex/hooks.jsonpath. -
5c9a8fc: Make OS path containment go through one Windows-safe helper so computed writes cannot escape their root.