Register inbox-wake + prune-memory commands in plugin.json (#608)#609
Merged
Conversation
) PR #603 shipped commands/watch-inbox.md and commands/unwatch-inbox.md without adding them to .claude-plugin/plugin.json's commands array; commands/prune-memory.md (from #493) had the same gap. Result: all three commands were non-discoverable as slash commands and non-invokable via the Skill tool, leaving the entire inbox-wake mechanism shipped in #591/#603 silently non-functional in the installed plugin. Append the three entries to plugin.json's commands array (15 total). Bump version 3.21.0 → 3.21.1 across the four version-tracked files (plugin.json, marketplace.json, root README.md, pact-plugin/README.md) and update test_inbox_wake_version_bump.py constants accordingly. Add pact-plugin/tests/test_plugin_manifest_parity.py with four set-membership invariants pinning manifest-vs-filesystem parity for both commands and agents in both directions. Counter-test-by-revert verified RED-on-revert for each. The invariant prevents this bug class from recurring: any future commands/*.md or agents/*.md added without manifest registration will fail CI before merge.
Remediation for three reviewer follow-ups accepted on PR #609. M1 (3-way reviewer convergence): rename test_inbox_wake_version_bump.py to test_plugin_version_bump.py. The file guards a generic 4-file plugin-version-consistency invariant; the inbox_wake_ provenance prefix dated to #603 and no longer reflects the test's scope. F3 (3-way convergence): add test_every_skill_subdir_has_skill_md to test_plugin_manifest_parity.py. Skills register via a directory pointer ("./skills/") in plugin.json, so a subdir without a SKILL.md ships silently non-discoverable rather than being caught by the array-based parity invariants. Counter-test-by-revert: renaming skills/orchestration/SKILL.md fails only the new test (cardinality 1). F4 (test-engineer): add test_agent_frontmatter_name_matches_filename to the same file plus a small regex-based _frontmatter_name helper. Claude Code resolves agents by frontmatter name; the filename-stem parity test passes when frontmatter and filename diverge. The new invariant pins them in lockstep. Counter-test-by-revert: mutating pact-architect.md frontmatter name fails only the new test (cardinality 1). No PyYAML dependency added. 14 manifest-parity + plugin-version-bump tests pass. Full suite 7212 pass + 1 pre-existing unrelated failure (skills/orchestration/SKILL.md exceeds 600 lines, covered by #594).
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
PR #603 shipped
commands/watch-inbox.mdandcommands/unwatch-inbox.mdwithout registering them inpact-plugin/.claude-plugin/plugin.json'scommandsarray;commands/prune-memory.md(added in PR #493) had the same gap. Result: all three commands were non-discoverable as slash commands and non-invokable via the Skill tool, leaving the entire inbox-wake mechanism shipped in #591/#603 silently non-functional in the installed plugin.plugin.json'scommandsarray (12 → 15)pact-plugin/tests/test_plugin_manifest_parity.pywith four set-membership invariants pinning manifest-vs-filesystem parity for both commands and agents in both directionsThe parity invariant prevents this bug class from recurring: any future
commands/*.mdoragents/*.mdadded without manifest registration will fail CI before merge.Closes #608.
Activation Path (Important)
Merging this PR alone does NOT activate the new commands. The installed plugin lives at `~/.claude/plugins/cache/pact-plugin/PACT/3.21.0/` — a version-pinned cache copy. The fix takes effect only after:
Until those three steps complete, `/PACT:watch-inbox` and `/PACT:unwatch-inbox` remain non-typeable and the PostToolUse Arm/Teardown emitter's `Skill("PACT:watch-inbox")` / `Skill("PACT:unwatch-inbox")` directives still fail with "Unknown skill." The wake mechanism stays degraded to baseline `useInboxPoller` for any in-flight session.
Test plan