v0.3.1 — a skill that did not run, and the checks that missed it
A repository review, not new features. One skill did not work at all; two more shipped things nobody could reach; and the checks that were supposed to catch this had gaps.
Upgrade with claude plugin update <plugin>@cc-agents-kit, then restart open sessions.
Fixed
session-export could not run once installed. Its skill told the agent to execute ~/.claude/skills/session-export/scripts/session-to-md.mjs — the path it had while it was a personal skill, and a path that exists for nobody who installs the plugin.
Substituting ${CLAUDE_PLUGIN_ROOT} does not fix it. That substitution is for hook commands; the variable is unset in the Bash tool the skill actually uses. The mechanism intended for this is a plugin bin/ directory, whose contents join PATH while the plugin is enabled. The exporter now ships as context-handoff/bin/session-to-md and the skill calls it by bare name.
find-trunk-repos.sh shipped with nothing referencing it — a file users downloaded and could never be told to run. It now lives in repo-gate/bin/find-trunk-repos, where PATH reaches it, and setup-trunk documents what it is good at: reading a trunk config you already wrote instead of inventing one.
setup-trunk deferred day-to-day work to an agent that is not part of this repository. The paragraph now states the scope boundary rather than pointing at something the reader has no way to obtain.
Changed — the gate covers what it claimed to
Shellcheck and the bash 3.2 parse ran over plugins/*/hooks/*.sh only, so two scripts that ship to users sat outside them, one of them inside a skill. Both were clean, but a repository arguing that shell quality is gated should not exempt the shell it hands out. Both steps now walk every .sh in the tree. The hook-wiring check no longer hardcodes guard-hooks either.
Two new checks, each confirmed to fail before being trusted:
bin/entries are executable and carry a shebang. OnPATHand unrunnable is exactly the failure a skill calling it by bare name cannot observe — the shape of the bug above.- The demo is compared against what the guard actually prints, by running it. Comparing against the source would miss the part of the message assembled at runtime. It found a real mismatch on its first run: the recording had been shortening the message's final line, so the GIF showed text the tool does not print. Corrected, and the recording regenerated.
Versions
context-handoff and repo-gate move to 0.1.1. guard-hooks is unchanged at 0.2.1.