feat(dispatcher): expose statusline/agy/review CLIs; document monitors exclusion (#172) - #198
Merged
Merged
Conversation
…s exclusion Four main-guarded CLI entrypoints were only reachable by direct `node` path, not via the `forge <area> <cmd>` dispatcher (#150 contract gap). AC1 decision — inclusive where sensible, documented exclusion otherwise: - statusline.mjs -> `forge statusline` (top-level, sibling of init/doctor) - agy/ask.mjs -> `forge agy ask` (new area) - review/agy-opinion.mjs -> `forge review agy-opinion` (new area) - monitors/{ci-watch,decisions-watch}.mjs -> deliberately EXCLUDED: they are background watchers registered in plugin/monitors/monitors.json (when: on-skill-invoke:autopilot), launched by the monitor runner as long-running polling loops, not interactive dispatcher CLIs. Documented in the usage block and an explicit `monitors)` case with a clear message. AC2 — tests/bin/forge.test.mjs extended to cover agy/review/statusline routing and to assert the documented monitors exclusion. Closes #172 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This was referenced Jul 22, 2026
Open
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.
Closes #172
Problem
Four main-guarded CLI entrypoints were reachable only by direct
nodepath, not through theforge <area> <cmd>dispatcher — an inconsistency in the dispatcher contract from #150.AC1 decision — inclusive where sensible, documented exclusion otherwise
Verified all five cited scripts are genuinely main-guarded CLI entrypoints, then split them by whether they are interactive CLIs:
Wired (inclusive):
plugin/scripts/statusline.mjs->forge statusline(top-level, sibling ofinit/doctor, same$S/$area.mjsmapping)plugin/scripts/agy/ask.mjs->forge agy ask(newagytwo-level area)plugin/scripts/review/agy-opinion.mjs->forge review agy-opinion(newreviewtwo-level area)These three are invoked by direct
nodepath in skill docs (investigate/review/spike SKILL.md), i.e. exactly the inconsistency the ticket describes.Documented exclusion:
plugin/scripts/monitors/ci-watch.mjs,plugin/scripts/monitors/decisions-watch.mjs-> deliberately NOT dispatched. They are background watchers registered inplugin/monitors/monitors.jsonwithwhen: on-skill-invoke:autopilot, launched by the monitor runner as long-running polling loops for the life of an autopilot session — not interactiveforge <area> <cmd>commands. The dispatcher documents this in both theusage()block and an explicitmonitors)case that prints a clear message and exits 2 (previously fell through to the generic unknown-area catch-all).AC checklist
agy/reviewareas +statuslinecase added;tests/bin/forge.test.mjsextended to cover agy/review/statusline routing AND to assert the documented monitors exclusion (source text + non-zero exit).Verification (honest)
pnpm verify(vitest, full suite incl. manifests/plugin-validity test): 362 passed, exit 0 locally.forge agy ask,forge review agy-opinion,forge statuslineresolve to the right scripts;forge monitors ci-watchprints the exclusion message and exits 2.forge:reviewer(full branch): verdict pass, zero findings.forge:security(full branch): verdict pass, zero critical/high (one low: pre-existing unsanitized$subpath pattern, unchanged trust boundary, now also applies to the two new hardcoded areas).CI note
GitHub Actions minutes are exhausted this run, so CI jobs fail at startup (0 steps) — infrastructure, not this diff. Owner authorized merge on LOCAL-green for this run.
🤖 Generated with Claude Code