@opengsd/gsd-core 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +458 -0
- package/agents/gsd-code-fixer.md +5 -5
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +345 -0
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +63 -35
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-plan-checker.md +76 -57
- package/agents/gsd-planner.md +14 -0
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-checker.md +19 -3
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +29 -0
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +23 -1
- package/bin/install.js +444 -134
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +1 -0
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +2 -1
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/surface.md +18 -8
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +532 -174
- package/gsd-core/bin/lib/adr-parser.cjs +1 -1
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +39 -22
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +528 -116
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-state.cjs +7 -1
- package/gsd-core/bin/lib/capability-validator.cjs +134 -5
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +198 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/commands.cjs +981 -79
- package/gsd-core/bin/lib/config-loader.cjs +4 -0
- package/gsd-core/bin/lib/config.cjs +153 -38
- package/gsd-core/bin/lib/core-utils.cjs +34 -7
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +343 -28
- package/gsd-core/bin/lib/edge-probe.cjs +14 -1
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +137 -23
- package/gsd-core/bin/lib/gap-checker.cjs +22 -13
- package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +54 -11
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +87 -23
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-integration.cjs +57 -5
- package/gsd-core/bin/lib/init-command-router.cjs +14 -0
- package/gsd-core/bin/lib/init.cjs +539 -60
- package/gsd-core/bin/lib/install-engine.cjs +199 -14
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
- package/gsd-core/bin/lib/install-profiles.cjs +36 -14
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +33 -4
- package/gsd-core/bin/lib/io.cjs +35 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +64 -39
- package/gsd-core/bin/lib/markdown-table.cjs +123 -0
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +41 -10
- package/gsd-core/bin/lib/model-resolver.cjs +101 -10
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -7
- package/gsd-core/bin/lib/phase-id.cjs +412 -31
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase.cjs +941 -98
- package/gsd-core/bin/lib/plan-document.cjs +10 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +34 -18
- package/gsd-core/bin/lib/planning-snapshot.cjs +206 -30
- package/gsd-core/bin/lib/planning-workspace.cjs +153 -29
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
- package/gsd-core/bin/lib/review-lane-invocation.cjs +96 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +555 -41
- package/gsd-core/bin/lib/roadmap.cjs +292 -69
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +260 -43
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +28 -20
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +294 -108
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -47
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
- package/gsd-core/bin/lib/smart-entry.cjs +7 -9
- package/gsd-core/bin/lib/state-document.cjs +159 -32
- package/gsd-core/bin/lib/state-md-schema.cjs +44 -27
- package/gsd-core/bin/lib/state-transition.cjs +465 -62
- package/gsd-core/bin/lib/state.cjs +906 -151
- package/gsd-core/bin/lib/surface.cjs +83 -10
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/uat.cjs +1420 -516
- package/gsd-core/bin/lib/update-context.cjs +36 -26
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +316 -23
- package/gsd-core/bin/lib/verify-command-grounding.cjs +1 -1
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +531 -36
- package/gsd-core/bin/lib/workstream-inventory.cjs +21 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +21 -7
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +507 -81
- package/gsd-core/references/agent-contracts.md +3 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe.md +17 -13
- package/gsd-core/references/execute-mvp-tdd.md +18 -16
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +12 -3
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +75 -2
- package/gsd-core/references/planning-config.md +5 -1
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/tdd.md +17 -9
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/worktree-path-safety.md +112 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/phase-prompt.md +4 -0
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/add-backlog.md +2 -0
- package/gsd-core/workflows/add-phase.md +2 -0
- package/gsd-core/workflows/add-tests.md +1 -1
- package/gsd-core/workflows/add-todo.md +4 -3
- package/gsd-core/workflows/ai-integration-phase.md +1 -1
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +2 -0
- package/gsd-core/workflows/audit-milestone.md +2 -0
- package/gsd-core/workflows/audit-uat.md +2 -0
- package/gsd-core/workflows/autonomous.md +15 -10
- package/gsd-core/workflows/check-todos.md +5 -3
- package/gsd-core/workflows/cleanup.md +4 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +22 -13
- package/gsd-core/workflows/code-review-fix.md +5 -3
- package/gsd-core/workflows/code-review.md +211 -43
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +40 -254
- package/gsd-core/workflows/debug.md +1 -1
- package/gsd-core/workflows/diagnose-issues.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +43 -13
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +15 -156
- package/gsd-core/workflows/edit-phase.md +2 -0
- package/gsd-core/workflows/eval-review.md +1 -1
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +20 -3
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +24 -3
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +78 -159
- package/gsd-core/workflows/execute-plan.md +28 -15
- package/gsd-core/workflows/explore.md +2 -0
- package/gsd-core/workflows/extract-learnings.md +2 -0
- package/gsd-core/workflows/fast.md +6 -0
- package/gsd-core/workflows/forensics.md +2 -0
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +1 -1
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +3 -1
- package/gsd-core/workflows/import.md +3 -3
- package/gsd-core/workflows/inbox.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +2 -0
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +2 -0
- package/gsd-core/workflows/list-workspaces.md +2 -0
- package/gsd-core/workflows/manager.md +3 -3
- package/gsd-core/workflows/map-codebase.md +52 -3
- package/gsd-core/workflows/milestone-summary.md +2 -0
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +55 -13
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project.md +37 -205
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -0
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +19 -4
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
- package/gsd-core/workflows/plan-phase.md +144 -185
- package/gsd-core/workflows/plan-review-convergence.md +102 -10
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +30 -10
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +25 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
- package/gsd-core/workflows/quick/steps/research-phase.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +21 -4
- package/gsd-core/workflows/reapply-patches.md +79 -3
- package/gsd-core/workflows/remove-phase.md +2 -0
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +6 -2
- package/gsd-core/workflows/review.md +215 -10
- package/gsd-core/workflows/scan.md +2 -0
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +2 -0
- package/gsd-core/workflows/settings-integrations.md +9 -8
- package/gsd-core/workflows/settings.md +19 -6
- package/gsd-core/workflows/ship.md +10 -10
- package/gsd-core/workflows/sketch-wrap-up.md +2 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +1 -1
- package/gsd-core/workflows/spec-phase.md +24 -19
- package/gsd-core/workflows/spike-wrap-up.md +2 -0
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +2 -0
- package/gsd-core/workflows/sync-skills.md +12 -4
- package/gsd-core/workflows/thread.md +2 -0
- package/gsd-core/workflows/transition.md +2 -0
- package/gsd-core/workflows/ui-phase.md +26 -5
- package/gsd-core/workflows/ui-review.md +1 -1
- package/gsd-core/workflows/ultraplan-phase.md +2 -0
- package/gsd-core/workflows/undo.md +1 -1
- package/gsd-core/workflows/update.md +48 -43
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work.md +68 -182
- package/hooks/dist/gsd-agent-isolation-guard.js +42 -16
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-context-monitor.js +371 -27
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-node-runner.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +30 -5
- package/hooks/dist/gsd-read-guard.js +2 -0
- package/hooks/dist/gsd-read-injection-scanner.js +5 -5
- package/hooks/dist/gsd-secret-read-guard.js +1105 -0
- package/hooks/dist/gsd-statusline.js +18 -10
- package/hooks/dist/gsd-validate-commit.sh +474 -7
- package/hooks/dist/gsd-workflow-guard.js +2 -1
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +42 -16
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-context-monitor.js +371 -27
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-node-runner.sh +1 -0
- package/hooks/gsd-prompt-guard.js +30 -5
- package/hooks/gsd-read-guard.js +2 -0
- package/hooks/gsd-read-injection-scanner.js +5 -5
- package/hooks/gsd-secret-read-guard.js +1105 -0
- package/hooks/gsd-statusline.js +18 -10
- package/hooks/gsd-validate-commit.sh +474 -7
- package/hooks/gsd-workflow-guard.js +2 -1
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/hooks.json +6 -0
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -9
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +11 -4
- package/scripts/check-contract-drift.cjs +4 -1
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +133 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +17 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +67 -15
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +210 -0
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +276 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +24 -2
- package/scripts/lint-phase-enumeration-drift.cjs +24 -6
- package/scripts/lint-phase-id-drift.cjs +465 -15
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-response-language-coverage.cjs +530 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +4 -1
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +1112 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +22 -0
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +1 -0
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +2 -1
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -37,6 +37,8 @@ When a milestone completes:
|
|
|
37
37
|
|
|
38
38
|
<process>
|
|
39
39
|
|
|
40
|
+
**Compact Content Gate.** Read and follow `gsd-core/references/compact-content-gate.md` now — it states the `workflow.compact_content` check and the resolution rule this spine defers to. When it directs a Read, read `gsd-core/workflows/complete-milestone/detail/elaboration.md` in full before continuing past this point; its content elaborates on the audit-acknowledge branch and the handle_branches step below.
|
|
41
|
+
|
|
40
42
|
<step name="pre_close_artifact_audit">
|
|
41
43
|
Before proceeding with milestone close, run the comprehensive open artifact audit.
|
|
42
44
|
|
|
@@ -46,7 +48,7 @@ RESPONSE_LANGUAGE=$(gsd_run query config-get response_language --raw --default "
|
|
|
46
48
|
gsd_run query audit-open
|
|
47
49
|
```
|
|
48
50
|
|
|
49
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
51
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
50
52
|
|
|
51
53
|
If the output contains open items (any section with count > 0):
|
|
52
54
|
|
|
@@ -60,136 +62,14 @@ These items are open. Choose an action:
|
|
|
60
62
|
[C] Cancel — exit without closing
|
|
61
63
|
```
|
|
62
64
|
|
|
63
|
-
If user chooses [A] (Acknowledge):
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
AUDIT_JSON=$(gsd_run query audit-open --json)
|
|
68
|
-
if [[ "$AUDIT_JSON" == @file:* ]]; then AUDIT_JSON=$(cat "${AUDIT_JSON#@file:}"); fi
|
|
69
|
-
MILESTONE_VERSION="v[X.Y]" # already known from ROADMAP.md's active milestone header — the same identifier `milestone.complete` uses in the archive_milestone step
|
|
70
|
-
|
|
71
|
-
ACK_FAILURES=0
|
|
72
|
-
ACK_FAILURE_LOG=""
|
|
73
|
-
record_ack_failure() {
|
|
74
|
-
ACK_FAILURES=$((ACK_FAILURES + 1))
|
|
75
|
-
ACK_FAILURE_LOG="${ACK_FAILURE_LOG}
|
|
76
|
-
- $1"
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
# debug_sessions / threads (--slug)
|
|
80
|
-
# NOTE: `< <(...)` process substitution, not `... | while`, so the loop
|
|
81
|
-
# runs in THIS shell — a `| while` pipeline puts the loop in a subshell
|
|
82
|
-
# and any ACK_FAILURES/ACK_FAILURE_LOG update inside it is lost the
|
|
83
|
-
# moment the pipeline exits.
|
|
84
|
-
for cat in debug_sessions threads; do
|
|
85
|
-
while IFS= read -r slug; do
|
|
86
|
-
[ -z "$slug" ] && continue
|
|
87
|
-
if ! gsd_run query audit-open acknowledge --category "$cat" --milestone "$MILESTONE_VERSION" --slug "$slug"; then
|
|
88
|
-
record_ack_failure "$cat slug=$slug"
|
|
89
|
-
fi
|
|
90
|
-
done < <(printf '%s' "$AUDIT_JSON" | jq -r --arg cat "$cat" '.items[$cat][] | select(.scan_error | not) | .slug')
|
|
91
|
-
done
|
|
92
|
-
|
|
93
|
-
# seeds (--seed-id)
|
|
94
|
-
while IFS= read -r seed_id; do
|
|
95
|
-
[ -z "$seed_id" ] && continue
|
|
96
|
-
if ! gsd_run query audit-open acknowledge --category seeds --milestone "$MILESTONE_VERSION" --seed-id "$seed_id"; then
|
|
97
|
-
record_ack_failure "seeds seed_id=$seed_id"
|
|
98
|
-
fi
|
|
99
|
-
done < <(printf '%s' "$AUDIT_JSON" | jq -r '.items.seeds[] | select(.scan_error | not) | .seed_id')
|
|
100
|
-
|
|
101
|
-
# todos (--filename) — the scanner caps its list to 5 entries per scan
|
|
102
|
-
# (remainder items carry `_remainder_count`, no `filename`, and are skipped)
|
|
103
|
-
while IFS= read -r filename; do
|
|
104
|
-
[ -z "$filename" ] && continue
|
|
105
|
-
if ! gsd_run query audit-open acknowledge --category todos --milestone "$MILESTONE_VERSION" --filename "$filename"; then
|
|
106
|
-
record_ack_failure "todos filename=$filename"
|
|
107
|
-
fi
|
|
108
|
-
done < <(printf '%s' "$AUDIT_JSON" | jq -r '.items.todos[] | select((.scan_error or ._remainder_count) | not) | .filename')
|
|
109
|
-
|
|
110
|
-
# quick_tasks (--dir) — the scanner's `slug` strips a leading
|
|
111
|
-
# YYYYMMDD-/YYYY-MM-DD- date prefix for display; `--dir` needs the
|
|
112
|
-
# ORIGINAL .planning/quick/<dir>/ name, so reconstruct it from `date`+`slug`.
|
|
113
|
-
while IFS= read -r dir; do
|
|
114
|
-
[ -z "$dir" ] && continue
|
|
115
|
-
if ! gsd_run query audit-open acknowledge --category quick_tasks --milestone "$MILESTONE_VERSION" --dir "$dir"; then
|
|
116
|
-
record_ack_failure "quick_tasks dir=$dir"
|
|
117
|
-
fi
|
|
118
|
-
done < <(printf '%s' "$AUDIT_JSON" | jq -r '.items.quick_tasks[] | select(.scan_error | not) | if .date != "" then "\(.date)-\(.slug)" else .slug end')
|
|
119
|
-
|
|
120
|
-
# uat_gaps / verification_gaps / context_questions — phase-scoped
|
|
121
|
-
# (--phase --file [--archived-milestone] when the item was found in an archived phase)
|
|
122
|
-
for cat in uat_gaps verification_gaps context_questions; do
|
|
123
|
-
while IFS= read -r item; do
|
|
124
|
-
[ -z "$item" ] && continue
|
|
125
|
-
phase=$(printf '%s' "$item" | jq -r '.phase')
|
|
126
|
-
file=$(printf '%s' "$item" | jq -r '.file')
|
|
127
|
-
archived=$(printf '%s' "$item" | jq -r '.archived_milestone // empty')
|
|
128
|
-
if [ -n "$archived" ]; then
|
|
129
|
-
if ! gsd_run query audit-open acknowledge --category "$cat" --milestone "$MILESTONE_VERSION" --phase "$phase" --file "$file" --archived-milestone "$archived"; then
|
|
130
|
-
record_ack_failure "$cat phase=$phase file=$file archived-milestone=$archived"
|
|
131
|
-
fi
|
|
132
|
-
else
|
|
133
|
-
if ! gsd_run query audit-open acknowledge --category "$cat" --milestone "$MILESTONE_VERSION" --phase "$phase" --file "$file"; then
|
|
134
|
-
record_ack_failure "$cat phase=$phase file=$file"
|
|
135
|
-
fi
|
|
136
|
-
fi
|
|
137
|
-
done < <(printf '%s' "$AUDIT_JSON" | jq -c --arg cat "$cat" '.items[$cat][] | select(.scan_error | not)')
|
|
138
|
-
done
|
|
139
|
-
|
|
140
|
-
# deferred_items — same phase-scoped identification, plus --text (the
|
|
141
|
-
# exact bullet the audit read, which uniquely identifies the entry)
|
|
142
|
-
while IFS= read -r item; do
|
|
143
|
-
[ -z "$item" ] && continue
|
|
144
|
-
phase=$(printf '%s' "$item" | jq -r '.phase')
|
|
145
|
-
file=$(printf '%s' "$item" | jq -r '.file')
|
|
146
|
-
text=$(printf '%s' "$item" | jq -r '.text')
|
|
147
|
-
archived=$(printf '%s' "$item" | jq -r '.archived_milestone // empty')
|
|
148
|
-
if [ -n "$archived" ]; then
|
|
149
|
-
if ! gsd_run query audit-open acknowledge --category deferred_items --milestone "$MILESTONE_VERSION" --phase "$phase" --file "$file" --text "$text" --archived-milestone "$archived"; then
|
|
150
|
-
record_ack_failure "deferred_items phase=$phase file=$file archived-milestone=$archived"
|
|
151
|
-
fi
|
|
152
|
-
else
|
|
153
|
-
if ! gsd_run query audit-open acknowledge --category deferred_items --milestone "$MILESTONE_VERSION" --phase "$phase" --file "$file" --text "$text"; then
|
|
154
|
-
record_ack_failure "deferred_items phase=$phase file=$file"
|
|
155
|
-
fi
|
|
156
|
-
fi
|
|
157
|
-
done < <(printf '%s' "$AUDIT_JSON" | jq -c '.items.deferred_items[] | select(.scan_error | not)')
|
|
158
|
-
|
|
159
|
-
if [ "$ACK_FAILURES" -gt 0 ]; then
|
|
160
|
-
echo "ERROR: $ACK_FAILURES acknowledge call(s) failed — HALTING before milestone close. Resolve each listed item manually (e.g. edit the file directly for unsupported_heading_shape/ambiguous, or re-run the audit if a --text/--file target has since changed) and re-run /gsd:complete-milestone:" >&2
|
|
161
|
-
printf '%s\n' "$ACK_FAILURE_LOG" >&2
|
|
162
|
-
exit 1
|
|
163
|
-
fi
|
|
164
|
-
```
|
|
165
|
-
`todos` is the only category the scanner caps (5 entries per scan, with a remainder count for the rest). Re-run `gsd_run query audit-open --json` (through the same `@file:` handling above) and repeat the `todos` block until it reports no `todos` items — every other category always returns its full open set in one pass.
|
|
166
|
-
3. Re-run `gsd_run query audit-open --json` once more and write the items just acknowledged as new rows to STATE.md under `## Deferred Items` — append to the existing table (creating the section if absent) rather than overwriting it, preserving rows recorded at earlier milestone closes:
|
|
167
|
-
```markdown
|
|
168
|
-
## Deferred Items
|
|
169
|
-
|
|
170
|
-
Items acknowledged and deferred at milestone close, most recent first:
|
|
171
|
-
|
|
172
|
-
| Category | Item | Status | Deferred At | Milestone |
|
|
173
|
-
|----------|------|--------|-------------|-----------|
|
|
174
|
-
| debug_sessions | {slug} | {status} | {date} | {milestone} |
|
|
175
|
-
| quick_tasks | {slug} | {status} | {date} | {milestone} |
|
|
176
|
-
| threads | {slug} | {status} | {date} | {milestone} |
|
|
177
|
-
| seeds | {seed_id} | {status} | {date} | {milestone} |
|
|
178
|
-
| todos | {filename} | (presence-only) | {date} | {milestone} |
|
|
179
|
-
| uat_gaps | {phase}/{file} | {status} | {date} | {milestone} |
|
|
180
|
-
| verification_gaps | {phase}/{file} | {status} | {date} | {milestone} |
|
|
181
|
-
| context_questions | {phase}/{file} | {question_count} questions | {date} | {milestone} |
|
|
182
|
-
| deferred_items | {phase}/{file}: {text} | acknowledged | {date} | {milestone} |
|
|
183
|
-
```
|
|
184
|
-
One row per item actually acknowledged in step 2 (omit categories with nothing to disclose this close). `{date}` is today's date; `{milestone}` is `MILESTONE_VERSION`. Sanitize all slug/status/text values via `sanitizeForDisplay()` before writing. Never inject raw file content into STATE.md.
|
|
185
|
-
4. Set `closeout_type=override_closeout` and record in the MILESTONES.md entry: `Known verification overrides: {N} newly acknowledged, {M} carried forward from a prior close (see STATE.md Deferred Items)` — `{N}` is the count of items acknowledged in step 2 (the pre-acknowledgment audit JSON's `counts.total`) and `{M}` is that same audit JSON's `acknowledged.total` (items a PRIOR close already suppressed and still are).
|
|
186
|
-
5. Proceed with milestone close.
|
|
187
|
-
|
|
188
|
-
Acknowledging is verdict-preserving and self-invalidating: it never rewrites the artifact's own `status:` field (except `deferred_items`, whose entry has no other meaning for that field), and the suppression it grants lapses automatically the moment the artifact's observed state changes again — a reopened debug session, an edited UAT gap, a re-triggered seed, etc. resurfaces on its own at the next audit and must be acknowledged again.
|
|
189
|
-
|
|
190
|
-
If output shows all clear (no open items): set `closeout_type=verified_closeout`. If the audit JSON's `acknowledged.total` is `0`, print `All artifact types clear.` and proceed. Otherwise the close is clean only because `{acknowledged.total}` item(s) acknowledged at an earlier milestone close are still being suppressed, not because everything was fixed this time — print `All artifact types clear ({acknowledged.total} previously acknowledged item(s) still suppressed — see STATE.md Deferred Items).` and record `Known verification overrides: 0 newly acknowledged, {acknowledged.total} carried forward from a prior close (see STATE.md Deferred Items)` in the MILESTONES.md entry before proceeding.
|
|
65
|
+
**If user chooses [A] (Acknowledge):** re-fetch `audit-open --json`, then acknowledge EVERY open item (across all categories — debug_sessions, threads, seeds, todos, quick_tasks, uat_gaps, verification_gaps, context_questions, deferred_items) through the `audit-open acknowledge` CLI writer, which is what actually suppresses each item starting at the next scan (the STATE.md `## Deferred Items` table is a disclosure record only). Any failed acknowledge call HALTS the close before proceeding — a refusal must never be silently discarded. After a clean pass, append one row per acknowledged item to STATE.md's `## Deferred Items` table (sanitized via `sanitizeForDisplay()`, never raw content), set `closeout_type=override_closeout`, and record a `Known verification overrides: {N} newly acknowledged, {M} carried forward` line in MILESTONES.md. Acknowledging is verdict-preserving and self-invalidating — it never rewrites the artifact's own status (except `deferred_items`), and the suppression lapses automatically the moment the artifact's state changes again (a reopened session, an edited gap, a re-triggered seed), resurfacing at the next audit.
|
|
66
|
+
|
|
67
|
+
If output shows all clear (no open items): set `closeout_type=verified_closeout` — but if any items are `acknowledged.total` from a PRIOR close, note that carried-forward suppression explicitly rather than implying everything was fixed this time.
|
|
191
68
|
|
|
69
|
+
<!-- gsd:protected -->
|
|
192
70
|
SECURITY: Audit JSON output is structured data from the `audit-open` query handler (same JSON contract as legacy `gsd_run audit-open`) — validated and sanitized at source. The `audit-open acknowledge` writer is the only path that sets the `audit_acknowledged` suppression marker — it snapshots each artifact's current state itself from the identifiers passed on the command line, so this workflow never hand-authors the marker. When writing the STATE.md disclosure table, item identifiers, statuses, and deferred-item text are sanitized via `sanitizeForDisplay()` before inclusion. Never inject raw user-supplied content into STATE.md without sanitization.
|
|
71
|
+
|
|
72
|
+
Exact per-category bash (including the `@file:` large-payload handling, the `todos` 5-per-scan cap, and the phase-scoped `--archived-milestone` handling) and the exact STATE.md table shape: `gsd-core/workflows/complete-milestone/detail/elaboration.md` § 1.
|
|
193
73
|
</step>
|
|
194
74
|
|
|
195
75
|
<step name="verify_readiness">
|
|
@@ -572,8 +452,12 @@ After `milestone complete` has archived, reorganize ROADMAP.md with milestone gr
|
|
|
572
452
|
Extract the Backlog section from the current ROADMAP.md before making any changes:
|
|
573
453
|
|
|
574
454
|
```bash
|
|
455
|
+
INIT_REORG=$(gsd_run query init.complete-milestone)
|
|
456
|
+
if [[ "$INIT_REORG" == @file:* ]]; then INIT_REORG=$(cat "${INIT_REORG#@file:}"); fi
|
|
457
|
+
_gsd_field() { node -e "const o=JSON.parse(process.argv[1]); const v=o[process.argv[2]]; process.stdout.write(v==null?'':String(v))" "$1" "$2"; }
|
|
458
|
+
ROADMAP_PATH=$(_gsd_field "$INIT_REORG" roadmap_path)
|
|
575
459
|
# Extract lines under ## Backlog through end of file (or next ## section)
|
|
576
|
-
BACKLOG_SECTION=$(awk '/^## Backlog/{found=1} found{print}'
|
|
460
|
+
BACKLOG_SECTION=$(awk '/^## Backlog/{found=1} found{print}' "$ROADMAP_PATH")
|
|
577
461
|
```
|
|
578
462
|
|
|
579
463
|
If `$BACKLOG_SECTION` is empty, there is no Backlog section — skip silently.
|
|
@@ -585,10 +469,15 @@ This rewrite is an *intentional* catastrophic shrink: phase detail was just arch
|
|
|
585
469
|
1. Arm the sentinel (single-use; the guard checks it is fresh — within 15 minutes — and names exactly this file, then consumes it):
|
|
586
470
|
|
|
587
471
|
```bash
|
|
588
|
-
|
|
472
|
+
INIT_REORG=$(gsd_run query init.complete-milestone)
|
|
473
|
+
if [[ "$INIT_REORG" == @file:* ]]; then INIT_REORG=$(cat "${INIT_REORG#@file:}"); fi
|
|
474
|
+
_gsd_field() { node -e "const o=JSON.parse(process.argv[1]); const v=o[process.argv[2]]; process.stdout.write(v==null?'':String(v))" "$1" "$2"; }
|
|
475
|
+
ROADMAP_PATH=$(_gsd_field "$INIT_REORG" roadmap_path)
|
|
476
|
+
printf '%s\n' "$ROADMAP_PATH" > .planning/.gsd-allow-shrink
|
|
477
|
+
echo "Write target: $ROADMAP_PATH"
|
|
589
478
|
```
|
|
590
479
|
|
|
591
|
-
2. Compose the full new ROADMAP.md content (template below) and overwrite `.planning/ROADMAP.md` with the **Write tool** — the normal path. The guard allows this one shrink and deletes the sentinel. If the Write is blocked anyway, the sentinel was stale or consumed — re-run the `printf` and retry the Write.
|
|
480
|
+
2. Compose the full new ROADMAP.md content (template below) and overwrite the file at **`$ROADMAP_PATH`** (the "Write target" path printed above — under an active workstream this is the workstream-scoped roadmap, NOT the literal `.planning/ROADMAP.md`) with the **Write tool** — the normal path. The guard allows this one shrink and deletes the sentinel. If the Write is blocked anyway, the sentinel was stale or consumed — re-run the `printf` and retry the Write.
|
|
592
481
|
|
|
593
482
|
Template for the composed content:
|
|
594
483
|
|
|
@@ -618,15 +507,29 @@ Append the extracted Backlog content verbatim to the end of the newly written RO
|
|
|
618
507
|
**Safety commit — commit archive files BEFORE deleting any originals:**
|
|
619
508
|
|
|
620
509
|
```bash
|
|
621
|
-
gsd_run query
|
|
510
|
+
INIT_REORG=$(gsd_run query init.complete-milestone)
|
|
511
|
+
if [[ "$INIT_REORG" == @file:* ]]; then INIT_REORG=$(cat "${INIT_REORG#@file:}"); fi
|
|
512
|
+
_gsd_field() { node -e "const o=JSON.parse(process.argv[1]); const v=o[process.argv[2]]; process.stdout.write(v==null?'':String(v))" "$1" "$2"; }
|
|
513
|
+
STATE_PATH=$(_gsd_field "$INIT_REORG" state_path)
|
|
514
|
+
ROADMAP_PATH=$(_gsd_field "$INIT_REORG" roadmap_path)
|
|
515
|
+
ARCHIVE_DIR=$(_gsd_field "$INIT_REORG" archive_dir)
|
|
516
|
+
MILESTONES_PATH=$(_gsd_field "$INIT_REORG" milestones_path)
|
|
517
|
+
PROJECT_PATH=$(_gsd_field "$INIT_REORG" project_path)
|
|
518
|
+
gsd_run query commit "chore: archive v[X.Y] milestone files" --files "${ARCHIVE_DIR}/v[X.Y]-ROADMAP.md" "${ARCHIVE_DIR}/v[X.Y]-REQUIREMENTS.md" "${ARCHIVE_DIR}/v[X.Y]-MILESTONE-AUDIT.md" "$MILESTONES_PATH" "$PROJECT_PATH" "$STATE_PATH" "$ROADMAP_PATH"
|
|
622
519
|
```
|
|
623
520
|
|
|
624
521
|
This creates a durable checkpoint in git history. If anything fails after this point, the working tree can be reconstructed from git.
|
|
625
522
|
|
|
523
|
+
MILESTONES.md and PROJECT.md are workstream-scoped the same way STATE.md/ROADMAP.md are (`planningPaths(cwd).planning`/`.project`) — under an active workstream this commits the actual files `milestone complete` wrote, not the root copies.
|
|
524
|
+
|
|
626
525
|
**Remove REQUIREMENTS.md via git rm** (preserves history, stages deletion atomically):
|
|
627
526
|
|
|
628
527
|
```bash
|
|
629
|
-
|
|
528
|
+
INIT_REORG=$(gsd_run query init.complete-milestone)
|
|
529
|
+
if [[ "$INIT_REORG" == @file:* ]]; then INIT_REORG=$(cat "${INIT_REORG#@file:}"); fi
|
|
530
|
+
_gsd_field() { node -e "const o=JSON.parse(process.argv[1]); const v=o[process.argv[2]]; process.stdout.write(v==null?'':String(v))" "$1" "$2"; }
|
|
531
|
+
REQUIREMENTS_PATH=$(_gsd_field "$INIT_REORG" requirements_path)
|
|
532
|
+
git rm "$REQUIREMENTS_PATH"
|
|
630
533
|
```
|
|
631
534
|
|
|
632
535
|
</step>
|
|
@@ -716,131 +619,14 @@ See: .planning/PROJECT.md (updated [today])
|
|
|
716
619
|
|
|
717
620
|
<step name="handle_branches">
|
|
718
621
|
|
|
719
|
-
Check
|
|
720
|
-
|
|
721
|
-
Use `init milestone-op` for context, or load config directly:
|
|
722
|
-
|
|
723
|
-
```bash
|
|
724
|
-
INIT=$(gsd_run query init.execute-phase "1")
|
|
725
|
-
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
726
|
-
INIT_CM=$(gsd_run query init.complete-milestone)
|
|
727
|
-
if [[ "$INIT_CM" == @file:* ]]; then INIT_CM=$(cat "${INIT_CM#@file:}"); fi
|
|
728
|
-
```
|
|
729
|
-
|
|
730
|
-
Extract `branching_strategy`, `phase_branch_template`, `milestone_branch_template`, and `commit_docs` from init JSON. Extract `git_create_tag` and `section_manifest` from `INIT_CM` (used by the `git_tag` step below).
|
|
731
|
-
|
|
732
|
-
Detect base branch:
|
|
622
|
+
Check the project's `branching_strategy` (from `init.execute-phase`/`init.complete-milestone`). `"none"` skips straight to `git_tag`. For `"phase"` or `"milestone"`, list the matching branches (by the configured prefix template); no branches found also skips to `git_tag`. Resolve the base branch through the single shared resolver, never a bare `main`/`master` fallback (Issue #1146):
|
|
733
623
|
```bash
|
|
734
624
|
BASE_BRANCH=$(gsd_run query git.base-branch)
|
|
735
625
|
```
|
|
736
626
|
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
**For "phase" strategy:**
|
|
740
|
-
|
|
741
|
-
```bash
|
|
742
|
-
BRANCH_PREFIX=$(echo "$PHASE_BRANCH_TEMPLATE" | sed 's/{.*//')
|
|
743
|
-
PHASE_BRANCHES=$(git branch --list "${BRANCH_PREFIX}*" 2>/dev/null | sed 's/^\*//' | tr -d ' ')
|
|
744
|
-
```
|
|
745
|
-
|
|
746
|
-
**For "milestone" strategy:**
|
|
747
|
-
|
|
748
|
-
```bash
|
|
749
|
-
BRANCH_PREFIX=$(echo "$MILESTONE_BRANCH_TEMPLATE" | sed 's/{.*//')
|
|
750
|
-
MILESTONE_BRANCH=$(git branch --list "${BRANCH_PREFIX}*" 2>/dev/null | sed 's/^\*//' | tr -d ' ' | head -1)
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
**If no branches found:** Skip to git_tag.
|
|
754
|
-
|
|
755
|
-
**If branches exist:**
|
|
756
|
-
|
|
757
|
-
```
|
|
758
|
-
## Git Branches Detected
|
|
759
|
-
|
|
760
|
-
Branching strategy: {phase/milestone}
|
|
761
|
-
Branches: {list}
|
|
762
|
-
|
|
763
|
-
Options:
|
|
764
|
-
1. **Merge to main** — Merge branch(es) to main
|
|
765
|
-
2. **Delete without merging** — Already merged or not needed
|
|
766
|
-
3. **Keep branches** — Leave for manual handling
|
|
767
|
-
```
|
|
768
|
-
|
|
769
|
-
AskUserQuestion with options: Squash merge (Recommended), Merge with history, Delete without merging, Keep branches.
|
|
770
|
-
|
|
771
|
-
**Squash merge:**
|
|
772
|
-
|
|
773
|
-
```bash
|
|
774
|
-
CURRENT_BRANCH=$(git branch --show-current)
|
|
775
|
-
git checkout ${BASE_BRANCH}
|
|
776
|
-
|
|
777
|
-
if [ "$BRANCHING_STRATEGY" = "phase" ]; then
|
|
778
|
-
for branch in $PHASE_BRANCHES; do
|
|
779
|
-
git merge --squash "$branch"
|
|
780
|
-
# Strip .planning/ from staging if commit_docs is false
|
|
781
|
-
if [ "$COMMIT_DOCS" = "false" ]; then
|
|
782
|
-
git reset HEAD .planning/ 2>/dev/null || true
|
|
783
|
-
fi
|
|
784
|
-
git commit -m "feat: $branch for v[X.Y]"
|
|
785
|
-
done
|
|
786
|
-
fi
|
|
787
|
-
|
|
788
|
-
if [ "$BRANCHING_STRATEGY" = "milestone" ]; then
|
|
789
|
-
git merge --squash "$MILESTONE_BRANCH"
|
|
790
|
-
# Strip .planning/ from staging if commit_docs is false
|
|
791
|
-
if [ "$COMMIT_DOCS" = "false" ]; then
|
|
792
|
-
git reset HEAD .planning/ 2>/dev/null || true
|
|
793
|
-
fi
|
|
794
|
-
git commit -m "feat: $MILESTONE_BRANCH for v[X.Y]"
|
|
795
|
-
fi
|
|
796
|
-
|
|
797
|
-
git checkout "$CURRENT_BRANCH"
|
|
798
|
-
```
|
|
799
|
-
|
|
800
|
-
**Merge with history:**
|
|
801
|
-
|
|
802
|
-
```bash
|
|
803
|
-
CURRENT_BRANCH=$(git branch --show-current)
|
|
804
|
-
git checkout ${BASE_BRANCH}
|
|
805
|
-
|
|
806
|
-
if [ "$BRANCHING_STRATEGY" = "phase" ]; then
|
|
807
|
-
for branch in $PHASE_BRANCHES; do
|
|
808
|
-
git merge --no-ff --no-commit "$branch"
|
|
809
|
-
# Strip .planning/ from staging if commit_docs is false
|
|
810
|
-
if [ "$COMMIT_DOCS" = "false" ]; then
|
|
811
|
-
git reset HEAD .planning/ 2>/dev/null || true
|
|
812
|
-
fi
|
|
813
|
-
git commit -m "Merge branch '$branch' for v[X.Y]"
|
|
814
|
-
done
|
|
815
|
-
fi
|
|
816
|
-
|
|
817
|
-
if [ "$BRANCHING_STRATEGY" = "milestone" ]; then
|
|
818
|
-
git merge --no-ff --no-commit "$MILESTONE_BRANCH"
|
|
819
|
-
# Strip .planning/ from staging if commit_docs is false
|
|
820
|
-
if [ "$COMMIT_DOCS" = "false" ]; then
|
|
821
|
-
git reset HEAD .planning/ 2>/dev/null || true
|
|
822
|
-
fi
|
|
823
|
-
git commit -m "Merge branch '$MILESTONE_BRANCH' for v[X.Y]"
|
|
824
|
-
fi
|
|
825
|
-
|
|
826
|
-
git checkout "$CURRENT_BRANCH"
|
|
827
|
-
```
|
|
828
|
-
|
|
829
|
-
**Delete without merging:**
|
|
830
|
-
|
|
831
|
-
```bash
|
|
832
|
-
if [ "$BRANCHING_STRATEGY" = "phase" ]; then
|
|
833
|
-
for branch in $PHASE_BRANCHES; do
|
|
834
|
-
git branch -d "$branch" 2>/dev/null || git branch -D "$branch"
|
|
835
|
-
done
|
|
836
|
-
fi
|
|
837
|
-
|
|
838
|
-
if [ "$BRANCHING_STRATEGY" = "milestone" ]; then
|
|
839
|
-
git branch -d "$MILESTONE_BRANCH" 2>/dev/null || git branch -D "$MILESTONE_BRANCH"
|
|
840
|
-
fi
|
|
841
|
-
```
|
|
627
|
+
If branches exist, present them and ask (AskUserQuestion): **Squash merge** (recommended) / **Merge with history** / **Delete without merging** / **Keep branches**. All three merge/delete options iterate every matching branch (phase strategy) or the one milestone branch, checking out `BASE_BRANCH` first and returning to the original branch after; both merge options strip `.planning/` from staging first when `commit_docs` is false. "Keep branches" just reports them as preserved for manual handling.
|
|
842
628
|
|
|
843
|
-
|
|
629
|
+
Exact bash for each of the four options (squash, history-preserving merge, delete, keep): `gsd-core/workflows/complete-milestone/detail/elaboration.md` § 2.
|
|
844
630
|
|
|
845
631
|
</step>
|
|
846
632
|
|
|
@@ -30,7 +30,7 @@ One round-trip carries everything this workflow needs (#3149 — this call repla
|
|
|
30
30
|
- `tdd_mode` — used as `{TDD_MODE}` in the session parameter blocks below.
|
|
31
31
|
- `section_manifest` — `null` today, because this workflow declares no applicability-section markers of its own. **When it is `null`, read this workflow in full.** When it is present, read only the files named in its `read` array. `null` and an empty `included` array are NOT the same: `null` means "no manifest for this workflow", an empty `included` means "nothing applies".
|
|
32
32
|
|
|
33
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
33
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
34
34
|
|
|
35
35
|
## 1a. LIST subcommand
|
|
36
36
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@~/.claude/gsd-core/references/response-language-directive.md
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
Orchestrate parallel debug agents to investigate UAT gaps and find root causes.
|
|
3
5
|
|
|
@@ -216,7 +218,9 @@ Parse each return to extract:
|
|
|
216
218
|
- root_cause: The diagnosed cause
|
|
217
219
|
- files: Files involved
|
|
218
220
|
- debug_path: Path to debug session file
|
|
219
|
-
-
|
|
221
|
+
- fix_hint: NON-BINDING example route for the gap closure plan — the binding payload is
|
|
222
|
+
`root_cause`; a gap plan that removes the root cause by a smaller or different mechanism has
|
|
223
|
+
closed the gap in full
|
|
220
224
|
|
|
221
225
|
If agent returns `## INVESTIGATION INCONCLUSIVE`:
|
|
222
226
|
- root_cause: "Investigation inconclusive - manual review needed"
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# Advisor mode — research-backed comparison tables
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded and gated.** The parent `workflows/discuss-phase.md` Reads
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --all mode — auto-select ALL gray areas, discuss interactively
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file from `workflows/discuss-phase.md` when
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --analyze mode — trade-off tables before each question
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded overlay.** Read this file from `workflows/discuss-phase.md`
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --auto mode — fully autonomous discuss-phase
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file from `workflows/discuss-phase.md` when
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --batch mode — grouped question batches
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded overlay.** Read this file from `workflows/discuss-phase.md`
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --chain mode — interactive discuss, then auto-advance
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file from `workflows/discuss-phase.md` when
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# Default mode — interactive discuss-phase
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file from `workflows/discuss-phase.md` when no
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --power mode — bulk question generation, async answering
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file from `workflows/discuss-phase.md` when
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# --text mode — plain-text overlay (no AskUserQuestion)
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded overlay.** Read this file from `workflows/discuss-phase.md`
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# CONTEXT.md template — for discuss-phase write_context step
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file only inside the `write_context` step of
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
# DISCUSSION-LOG.md template — for discuss-phase git_commit step
|
|
2
4
|
|
|
3
5
|
> **Lazy-loaded.** Read this file only inside the `git_commit` step of
|
|
@@ -73,7 +73,7 @@ AGENT_SKILLS_ANALYZER=$(gsd_run query agent-skills gsd-assumptions-analyzer)
|
|
|
73
73
|
ANALYZER_MODEL=$(gsd_run query resolve-model gsd-assumptions-analyzer --raw)
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
76
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
77
77
|
|
|
78
78
|
Parse JSON for: `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`,
|
|
79
79
|
`phase_slug`, `padded_phase`, `has_research`, `has_context`, `has_plans`, `has_verification`,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@~/.claude/gsd-core/references/response-language-directive.md
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
Power user mode for discuss-phase. Generates ALL questions upfront into a JSON state file and an HTML companion UI, then waits for the user to answer at their own pace. When the user signals readiness, processes all answers in one pass and generates CONTEXT.md.
|
|
3
5
|
|
|
@@ -122,7 +122,7 @@ AGENT_SKILLS_ADVISOR=$(gsd_run query agent-skills gsd-advisor-researcher)
|
|
|
122
122
|
|
|
123
123
|
Parse JSON for: `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `has_research`, `has_context`, `has_plans`, `has_verification`, `plan_count`, `roadmap_exists`, `planning_exists`, `response_language`.
|
|
124
124
|
|
|
125
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
125
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
126
126
|
|
|
127
127
|
**If `phase_found` is false:**
|
|
128
128
|
```
|
package/gsd-core/workflows/do.md
CHANGED
|
@@ -13,7 +13,7 @@ _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-pars
|
|
|
13
13
|
RESPONSE_LANGUAGE=$(gsd_run query config-get response_language --raw --default "" 2>/dev/null || echo "")
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
16
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
17
17
|
|
|
18
18
|
<step name="validate">
|
|
19
19
|
**Check for input.**
|
|
@@ -41,23 +41,31 @@ Track whether `.planning/` exists — some routes require it, others don't.
|
|
|
41
41
|
<step name="route">
|
|
42
42
|
**Match intent to command.**
|
|
43
43
|
|
|
44
|
-
Evaluate `$ARGUMENTS` against these routing rules.
|
|
44
|
+
Evaluate `$ARGUMENTS` against these routing rules. Rules are ordered **most-specific first**: apply the **first matching** rule, and never let a generic keyword rule ("set up", "spike", "review") preempt a more specific operation that also matches ("set up this existing codebase", "wrap up the spike findings", "review the changed source code").
|
|
45
45
|
|
|
46
46
|
| If the text describes... | Route to | Why |
|
|
47
47
|
|--------------------------|----------|-----|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
48
|
+
| First-time setup for an existing codebase, brownfield onboarding, "onboard this codebase" | `/gsd:onboard` | Safe map → docs ingest → project setup sequence |
|
|
49
|
+
| Starting a new greenfield project, "set up", "initialize" (no existing codebase named) | `/gsd:new-project` | Needs full project initialization |
|
|
50
50
|
| Mapping or analyzing an existing codebase map | `/gsd:map-codebase` | Codebase discovery or refresh |
|
|
51
51
|
| A bug, error, crash, failure, or something broken | `/gsd:debug` | Needs systematic investigation |
|
|
52
|
-
| Spiking, "test if", "will this work", "experiment", "prove this out", validate feasibility | `/gsd:spike` | Throwaway experiment to validate feasibility |
|
|
53
|
-
| Sketching, "mockup", "what would this look like", "prototype the UI", "design this", explore visual direction | `/gsd:sketch` | Throwaway HTML mockups to explore design |
|
|
54
52
|
| Wrapping up spikes, "package the spikes", "consolidate spike findings" | `/gsd:spike --wrap-up` | Package spike findings into reusable skill |
|
|
55
53
|
| Wrapping up sketches, "package the designs", "consolidate sketch findings" | `/gsd:sketch --wrap-up` | Package sketch findings into reusable skill |
|
|
54
|
+
| Spiking, "test if", "will this work", "experiment", "prove this out", validate feasibility | `/gsd:spike` | Throwaway experiment to validate feasibility |
|
|
55
|
+
| Sketching, "mockup", "what would this look like", "prototype the UI", "design this", explore visual direction | `/gsd:sketch` | Throwaway HTML mockups to explore design |
|
|
56
|
+
| Reviewing changed source code for bugs, security issues, or code quality ("code review the changes") | `/gsd:code-review` | Source review of phase-changed files |
|
|
57
|
+
| Requesting peer review of phase plans from another AI CLI ("plan review", "review the plan") | `/gsd:review` | Cross-AI plan review |
|
|
58
|
+
| Reviewing or hardening implemented UI ("visual audit", "review the UI") | `/gsd:ui-review` | Retroactive 6-pillar visual audit |
|
|
59
|
+
| Verifying security mitigations of a completed phase ("security check", "secure phase N") | `/gsd:secure-phase` | Retroactive threat-mitigation verification |
|
|
60
|
+
| Auditing milestone completion against original intent ("audit the milestone") | `/gsd:audit-milestone` | Milestone audit against original intent |
|
|
61
|
+
| An autonomous audit-to-fix pass ("audit and fix", "audit the repo and fix what it finds") | `/gsd:audit-fix` | Audit-to-fix pipeline |
|
|
62
|
+
| Generating or updating project documentation ("update the docs", "documentation update") | `/gsd:docs-update` | Docs verified against the codebase |
|
|
56
63
|
| Exploring, researching, comparing, or "how does X work" | `/gsd:explore` | Socratic ideation and idea routing |
|
|
57
64
|
| Discussing vision, "how should X look", brainstorming | `/gsd:discuss-phase` | Needs context gathering |
|
|
58
|
-
| A complex task: refactoring, migration, multi-file architecture, system redesign | `/gsd:phase` | Needs a full phase with plan/build cycle |
|
|
59
65
|
| Planning a specific phase or "plan phase N" | `/gsd:plan-phase` | Direct planning request |
|
|
60
|
-
| Executing a phase or "build phase N", "run phase N" | `/gsd:execute-phase` | Direct execution request |
|
|
66
|
+
| Executing a phase or "build phase N", "run phase N" (SDD dependency-aware wave execution) | `/gsd:execute-phase` | Direct execution request |
|
|
67
|
+
| Adding, inserting, removing, or editing phases in the roadmap ("multi-phase", roadmap phase management) | `/gsd:phase` | Roadmap phase CRUD |
|
|
68
|
+
| A complex task: refactoring, migration, multi-file architecture, system redesign | `/gsd:plan-phase` | Needs a full phase with plan/build cycle |
|
|
61
69
|
| Running all remaining phases automatically | `/gsd:autonomous` | Full autonomous execution |
|
|
62
70
|
| A review or quality concern about existing work | `/gsd:verify-work` | Needs verification |
|
|
63
71
|
| Checking progress, status, "where am I" | `/gsd:progress` | Status check |
|
|
@@ -73,7 +81,7 @@ Evaluate `$ARGUMENTS` against these routing rules. Apply the **first matching**
|
|
|
73
81
|
|
|
74
82
|
```
|
|
75
83
|
"Refactor the authentication system" could be:
|
|
76
|
-
1. /gsd:phase — Full planning cycle (recommended for multi-file refactors)
|
|
84
|
+
1. /gsd:plan-phase — Full planning cycle (recommended for multi-file refactors)
|
|
77
85
|
2. /gsd:quick — Quick execution (if scope is small and clear)
|
|
78
86
|
|
|
79
87
|
Which approach fits better?
|
|
@@ -92,12 +100,33 @@ Which approach fits better?
|
|
|
92
100
|
```
|
|
93
101
|
</step>
|
|
94
102
|
|
|
103
|
+
<step name="confirm">
|
|
104
|
+
**Confirm the route before dispatching (REQ-DO-03).**
|
|
105
|
+
|
|
106
|
+
Before invoking anything, ask the user to confirm the displayed route via AskUserQuestion:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
Route to {chosen command}?
|
|
110
|
+
1. Yes — proceed with {chosen command} (recommended)
|
|
111
|
+
2. Choose a different command
|
|
112
|
+
3. Cancel — do not dispatch
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
- **Yes / proceed:** continue to the dispatch step.
|
|
116
|
+
- **Choose a different command:** present the 2-3 next-best routes from the routing table as options and loop back through display + confirm with the new selection.
|
|
117
|
+
- **Cancel:** stop. Do not invoke any command.
|
|
118
|
+
|
|
119
|
+
**TEXT_MODE:** present the same choices as a plain-text numbered list and ask the user to type their choice number, exactly like other AskUserQuestion calls in this workflow.
|
|
120
|
+
</step>
|
|
121
|
+
|
|
95
122
|
<step name="dispatch">
|
|
96
|
-
**Invoke the chosen command.**
|
|
123
|
+
**Invoke the chosen command with only the arguments it accepts.**
|
|
97
124
|
|
|
98
|
-
|
|
125
|
+
Read the chosen command's frontmatter `argument-hint` (in `commands/gsd/<name>.md`) and forward **only arguments that command accepts**. Do NOT pass the full freeform sentence wholesale.
|
|
99
126
|
|
|
100
|
-
If the
|
|
127
|
+
- If the command expects a phase number or flags only (e.g. `/gsd:verify-work [phase number]`, `/gsd:plan-phase`, `/gsd:execute-phase`), extract the phase number / flags from the input; if none was provided, extract it from context or ask via AskUserQuestion. Drop the surrounding prose.
|
|
128
|
+
- If the command explicitly accepts a freeform task description (e.g. `/gsd:quick`, `/gsd:debug`, `/gsd:spike`, `/gsd:sketch`), forward the relevant portion of `$ARGUMENTS` as the description.
|
|
129
|
+
- If the command takes no arguments, invoke it without arguments.
|
|
101
130
|
|
|
102
131
|
After invoking the command, stop. The dispatched command handles everything from here.
|
|
103
132
|
</step>
|
|
@@ -110,6 +139,7 @@ After invoking the command, stop. The dispatched command handles everything from
|
|
|
110
139
|
- [ ] Ambiguity resolved via user question (if needed)
|
|
111
140
|
- [ ] Project existence checked for routes that require it
|
|
112
141
|
- [ ] Routing decision displayed before dispatch
|
|
113
|
-
- [ ]
|
|
142
|
+
- [ ] Route confirmed by the user before dispatch (REQ-DO-03), with TEXT_MODE equivalent
|
|
143
|
+
- [ ] Command invoked with only the arguments it accepts (argument-hint aware; freeform text only where the command takes a freeform description)
|
|
114
144
|
- [ ] No work done directly — dispatcher only
|
|
115
145
|
</success_criteria>
|