* fix(#1145): implement query user-story.validate handler `query user-story.validate` was a phantom command invoked by mvp-phase.md (line 102) and verify-work.md (line 170) but had no CJS handler. Every call exited with "Unknown command: user-story". The dotted-form dispatcher strips the `query` prefix, splits on `.`, yielding command='user-story' which fell through to the `default:` case with no registered capability handler. Adds a `case 'user-story':` handler inline in gsd-tools.cjs (same pattern as the #1140 fix in PR #1148). The handler: - Validates "As a [role], I want to [capability], so that [outcome]." - Uses \S anchors to require non-whitespace content in each slot (whitespace-only slots like "As a , I want to ..." now correctly return valid:false — found by adversarial Codex review) - Returns { valid: boolean, errors: string[], slots: {role, capability, outcome} | null } - Supports --pick valid for bare boolean output (verify-work.md usage) - Added 'user-story' to SKIP_ROOT_RESOLUTION (pure string validation) - Added 'user-story' to TOP_LEVEL_USAGE command list Regression tests added to tests/commands.test.cjs (per lint-regression- test-names policy; new bug-NNNN standalone files are banned). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(changeset): backfill PR number for #1145 fix Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
94 KiB
94 KiB