@opengsd/gsd-core 1.9.1 → 1.11.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 +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -15,38 +15,9 @@ Valid GSD subagent types (use exact names — do not fall back to 'general-purpo
|
|
|
15
15
|
|
|
16
16
|
<auto_mode>
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
**If auto mode:**
|
|
23
|
-
|
|
24
|
-
- Skip brownfield mapping offer (assume greenfield)
|
|
25
|
-
- Skip deep questioning (extract context from provided document)
|
|
26
|
-
- Config: YOLO mode is implicit (skip that question), but ask granularity/git/agents FIRST (Step 2a)
|
|
27
|
-
- After config: run Steps 6-9 automatically with smart defaults:
|
|
28
|
-
- Research: Always yes
|
|
29
|
-
- Requirements: Include all table stakes + features from provided document
|
|
30
|
-
- Requirements approval: Auto-approve
|
|
31
|
-
- Roadmap approval: Auto-approve
|
|
32
|
-
|
|
33
|
-
**Document requirement:**
|
|
34
|
-
Auto mode requires an idea document — either:
|
|
35
|
-
|
|
36
|
-
- File reference: `/gsd:new-project --auto @prd.md`
|
|
37
|
-
- Pasted/written text in the prompt
|
|
38
|
-
|
|
39
|
-
If no document content provided, error:
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
Error: --auto requires an idea document.
|
|
43
|
-
|
|
44
|
-
Usage:
|
|
45
|
-
/gsd:new-project --auto @your-idea.md
|
|
46
|
-
/gsd:new-project --auto [paste or write your idea here]
|
|
47
|
-
|
|
48
|
-
The document should describe what you want to build.
|
|
49
|
-
```
|
|
18
|
+
<!-- gsd:section id="auto-mode-detection" when="flag:--auto" -->
|
|
19
|
+
If `section_manifest` is `null` or `"auto-mode-detection"` is in its `included` list: read and execute `gsd-core/workflows/new-project/steps/auto-mode-detection.md`. Otherwise skip — do not read the file.
|
|
20
|
+
<!-- /gsd:section -->
|
|
50
21
|
|
|
51
22
|
</auto_mode>
|
|
52
23
|
|
|
@@ -58,7 +29,8 @@ The document should describe what you want to build.
|
|
|
58
29
|
|
|
59
30
|
```bash
|
|
60
31
|
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
61
|
-
|
|
32
|
+
AUTO_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--auto([[:space:]]|$) ]]; then AUTO_PARAM="--auto"; fi
|
|
33
|
+
INIT=$(gsd_run query init.new-project $AUTO_PARAM)
|
|
62
34
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
63
35
|
AGENT_SKILLS_RESEARCHER=$(gsd_run query agent-skills gsd-project-researcher)
|
|
64
36
|
AGENT_SKILLS_SYNTHESIZER=$(gsd_run query agent-skills gsd-research-synthesizer)
|
|
@@ -101,6 +73,7 @@ Derive `RUNTIME` from the invoking prompt's `execution_context` path:
|
|
|
101
73
|
- Path contains `/.codex/` → `RUNTIME=codex`
|
|
102
74
|
- Path contains `/.gemini/` → `RUNTIME=gemini`
|
|
103
75
|
- Path contains `/.config/opencode/` or `/.opencode/` → `RUNTIME=opencode`
|
|
76
|
+
- Path contains `/.trae/` → `RUNTIME=trae`
|
|
104
77
|
- Otherwise → `RUNTIME=claude`
|
|
105
78
|
|
|
106
79
|
If `execution_context` path is not available, fall back to env vars:
|
|
@@ -108,6 +81,7 @@ If `execution_context` path is not available, fall back to env vars:
|
|
|
108
81
|
if [ -n "$CODEX_HOME" ]; then RUNTIME="codex"
|
|
109
82
|
elif [ -n "$GEMINI_CONFIG_DIR" ]; then RUNTIME="gemini"
|
|
110
83
|
elif [ -n "$OPENCODE_CONFIG_DIR" ] || [ -n "$OPENCODE_CONFIG" ]; then RUNTIME="opencode"
|
|
84
|
+
elif [ -n "$TRAE_CONFIG_DIR" ]; then RUNTIME="trae"
|
|
111
85
|
else RUNTIME="claude"; fi
|
|
112
86
|
```
|
|
113
87
|
|
|
@@ -130,202 +104,15 @@ All subsequent references to the project instruction file use `$INSTRUCTION_FILE
|
|
|
130
104
|
|
|
131
105
|
**If auto mode:** Skip to Step 4 (assume greenfield, synthesize PROJECT.md from provided document).
|
|
132
106
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
Use AskUserQuestion:
|
|
137
|
-
|
|
138
|
-
- header: "Codebase"
|
|
139
|
-
- question: "I detected existing code in this directory. Would you like to map the codebase first?"
|
|
140
|
-
- options:
|
|
141
|
-
- "Map codebase first" — Run /gsd:map-codebase to understand existing architecture (Recommended)
|
|
142
|
-
- "Skip mapping" — Proceed with project initialization
|
|
143
|
-
|
|
144
|
-
**If "Map codebase first":**
|
|
145
|
-
|
|
146
|
-
```
|
|
147
|
-
Run `/gsd:map-codebase` first, then return to `/gsd:new-project`
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Exit command.
|
|
107
|
+
<!-- gsd:section id="codebase-map-offer" when="state:needs-codebase-map" -->
|
|
108
|
+
If `section_manifest` is `null` or `"codebase-map-offer"` is in its `included` list: read and execute `gsd-core/workflows/new-project/steps/codebase-map-offer.md`. Otherwise skip — do not read the file.
|
|
109
|
+
<!-- /gsd:section -->
|
|
151
110
|
|
|
152
111
|
**If "Skip mapping" OR `needs_codebase_map` is false:** Continue to Step 3.
|
|
153
112
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
YOLO mode is implicit (auto = YOLO). Ask remaining config questions:
|
|
159
|
-
|
|
160
|
-
**Round 1 — Core settings (3 questions, no Mode question):**
|
|
161
|
-
|
|
162
|
-
```
|
|
163
|
-
AskUserQuestion([
|
|
164
|
-
{
|
|
165
|
-
header: "Granularity",
|
|
166
|
-
question: "How finely should scope be sliced into phases?",
|
|
167
|
-
multiSelect: false,
|
|
168
|
-
options: [
|
|
169
|
-
{ label: "Coarse (Recommended)", description: "Fewer, broader phases (3-5 phases, 1-3 plans each)" },
|
|
170
|
-
{ label: "Standard", description: "Balanced phase size (5-8 phases, 3-5 plans each)" },
|
|
171
|
-
{ label: "Fine", description: "Many focused phases (8-12 phases, 5-10 plans each)" }
|
|
172
|
-
]
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
header: "Execution",
|
|
176
|
-
question: "Run plans in parallel?",
|
|
177
|
-
multiSelect: false,
|
|
178
|
-
options: [
|
|
179
|
-
{ label: "Parallel (Recommended)", description: "Independent plans run simultaneously" },
|
|
180
|
-
{ label: "Sequential", description: "One plan at a time" }
|
|
181
|
-
]
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
header: "Git Tracking",
|
|
185
|
-
question: "Commit planning docs to git?",
|
|
186
|
-
multiSelect: false,
|
|
187
|
-
options: [
|
|
188
|
-
{ label: "Yes (Recommended)", description: "Planning docs tracked in version control" },
|
|
189
|
-
{ label: "No", description: "Keep .planning/ local-only (add to .gitignore)" }
|
|
190
|
-
]
|
|
191
|
-
}
|
|
192
|
-
])
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
**Round 2 — Workflow agents (same as Step 5):**
|
|
196
|
-
|
|
197
|
-
```
|
|
198
|
-
AskUserQuestion([
|
|
199
|
-
{
|
|
200
|
-
header: "Research",
|
|
201
|
-
question: "Research before planning each phase? (adds tokens/time)",
|
|
202
|
-
multiSelect: false,
|
|
203
|
-
options: [
|
|
204
|
-
{ label: "Yes (Recommended)", description: "Investigate domain, find patterns, surface gotchas" },
|
|
205
|
-
{ label: "No", description: "Plan directly from requirements" }
|
|
206
|
-
]
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
header: "Plan Check",
|
|
210
|
-
question: "Verify plans will achieve their goals? (adds tokens/time)",
|
|
211
|
-
multiSelect: false,
|
|
212
|
-
options: [
|
|
213
|
-
{ label: "Yes (Recommended)", description: "Catch gaps before execution starts" },
|
|
214
|
-
{ label: "No", description: "Execute plans without verification" }
|
|
215
|
-
]
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
header: "Verifier",
|
|
219
|
-
question: "Verify work satisfies requirements after each phase? (adds tokens/time)",
|
|
220
|
-
multiSelect: false,
|
|
221
|
-
options: [
|
|
222
|
-
{ label: "Yes (Recommended)", description: "Confirm deliverables match phase goals" },
|
|
223
|
-
{ label: "No", description: "Trust execution, skip verification" }
|
|
224
|
-
]
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
header: "Drift Guard",
|
|
228
|
-
question: "Enable the plan drift-guard? It verifies that symbols your plans cite (decorators, classes, functions, CLI flags) actually exist in your source at review time, catching hallucinated names before execution. [Y/n]",
|
|
229
|
-
multiSelect: false,
|
|
230
|
-
options: [
|
|
231
|
-
{ label: "Yes (Recommended)", description: "Resolve symbol references against live source during plan review — catches hallucinated names before execution" },
|
|
232
|
-
{ label: "No", description: "Skip symbol grounding — plan review proceeds without source verification" }
|
|
233
|
-
]
|
|
234
|
-
}
|
|
235
|
-
])
|
|
236
|
-
|
|
237
|
-
// Model profile uses a two-question split because AskUserQuestion enforces a hard
|
|
238
|
-
// 4-option cap and there are 5 valid profiles (quality, balanced, budget, adaptive,
|
|
239
|
-
// inherit). Q1 routes between adaptive/standard-tier/inherit; Q2 (shown only when
|
|
240
|
-
// Q1 = "Standard tier…") picks among the three standard profiles. Mirrors the
|
|
241
|
-
// /gsd:settings split (#3784, #1516).
|
|
242
|
-
AskUserQuestion([
|
|
243
|
-
{
|
|
244
|
-
header: "AI Models",
|
|
245
|
-
question: "Which AI models for planning agents?",
|
|
246
|
-
multiSelect: false,
|
|
247
|
-
options: [
|
|
248
|
-
{ label: "Adaptive (Recommended)", description: "Role-based cost optimization: heavy roles use the highest-tier model available on the active runtime, light roles use the cheapest. Best balance of quality and cost across all supported runtimes (Claude, Codex, Gemini, OpenRouter, local)." },
|
|
249
|
-
{ label: "Standard tier…", description: "Choose Quality, Balanced, or Budget — flat tier applied to all agents" },
|
|
250
|
-
{ label: "Inherit", description: "Use the current session model for all agents (required for non-Claude runtimes: Codex, Gemini CLI, OpenCode /model, OpenRouter, local models)" }
|
|
251
|
-
]
|
|
252
|
-
}
|
|
253
|
-
])
|
|
254
|
-
|
|
255
|
-
**Conditional visibility — model_profile (Q2):**
|
|
256
|
-
Only ask this question when Q1's answer is "Standard tier…".
|
|
257
|
-
If Q1 = "Adaptive (Recommended)" → write model_profile=adaptive and SKIP Q2.
|
|
258
|
-
If Q1 = "Inherit" → write model_profile=inherit and SKIP Q2.
|
|
259
|
-
If user cancels Q2 after picking "Standard tier…" → leave existing model_profile value unchanged.
|
|
260
|
-
|
|
261
|
-
AskUserQuestion([
|
|
262
|
-
{
|
|
263
|
-
question: "Which standard profile? (Quality / Balanced / Budget)",
|
|
264
|
-
header: "Model Tier",
|
|
265
|
-
multiSelect: false,
|
|
266
|
-
options: [
|
|
267
|
-
{ label: "Quality", description: "Opus everywhere except verification (highest cost) — Claude only" },
|
|
268
|
-
{ label: "Balanced", description: "Opus for planning, Sonnet for research/execution/verification — Claude only" },
|
|
269
|
-
{ label: "Budget", description: "Sonnet for writing, Haiku for research/verification (lowest cost) — Claude only" }
|
|
270
|
-
]
|
|
271
|
-
}
|
|
272
|
-
])
|
|
273
|
-
|
|
274
|
-
// Map UI choices → config values:
|
|
275
|
-
// Q1 "Adaptive (Recommended)" → model_profile = "adaptive"
|
|
276
|
-
// Q1 "Inherit" → model_profile = "inherit"
|
|
277
|
-
// Q1 "Standard tier…" + Q2 "Quality" → model_profile = "quality"
|
|
278
|
-
// Q1 "Standard tier…" + Q2 "Balanced" → model_profile = "balanced"
|
|
279
|
-
// Q1 "Standard tier…" + Q2 "Budget" → model_profile = "budget"
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
**Round 3 — PR body onboarding:**
|
|
283
|
-
|
|
284
|
-
Ask which optional PRD-style sections `/gsd:ship` should append to generated PR bodies. These map to `ship.pr_body_sections`; selected sections are written with `"enabled": true`, unselected seeded sections are written with `"enabled": false` so the project can enable them later without editing `ship.md`.
|
|
285
|
-
|
|
286
|
-
Prefer lean/agile PRD sections that make the delivered increment clear: user stories, acceptance criteria, Definition of Done or release criteria, risks, dependencies, and stakeholder review.
|
|
287
|
-
|
|
288
|
-
```
|
|
289
|
-
AskUserQuestion([
|
|
290
|
-
{
|
|
291
|
-
header: "PR Body",
|
|
292
|
-
question: "Which optional PRD-style sections should /gsd:ship include in PR bodies?",
|
|
293
|
-
multiSelect: true,
|
|
294
|
-
options: [
|
|
295
|
-
{ label: "User Stories & Acceptance Criteria", description: "Append user-facing stories and acceptance checks from REQUIREMENTS.md" },
|
|
296
|
-
{ label: "Risks & Dependencies", description: "Append rollout risks, dependencies, and rollback notes from PLAN.md" },
|
|
297
|
-
{ label: "Success Metrics & Release Criteria", description: "Append measurable Definition of Done and release checks for stakeholder review" },
|
|
298
|
-
{ label: "Stakeholder Review & Approval", description: "Append approval checklist for projects that need sign-off traceability" }
|
|
299
|
-
]
|
|
300
|
-
}
|
|
301
|
-
])
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
Build `ship.pr_body_sections` from those choices. For selected options, set `enabled: true`; for seeded but unselected options, set `enabled: false`. If the user selects none, use `"ship":{"pr_body_sections":[]}`.
|
|
305
|
-
|
|
306
|
-
Create `.planning/config.json` with all settings (CLI fills in remaining defaults automatically):
|
|
307
|
-
|
|
308
|
-
```bash
|
|
309
|
-
mkdir -p .planning
|
|
310
|
-
gsd_run query config-new-project '{"mode":"yolo","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|adaptive|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"nyquist_validation":true|false,"auto_advance":true},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
**If commit_docs = No:** Add `.planning/` to `.gitignore`.
|
|
314
|
-
|
|
315
|
-
**Commit config.json:**
|
|
316
|
-
|
|
317
|
-
```bash
|
|
318
|
-
mkdir -p .planning
|
|
319
|
-
gsd_run query commit "chore: add project config" --files .planning/config.json
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
**Persist auto-advance chain flag to config (survives context compaction):**
|
|
323
|
-
|
|
324
|
-
```bash
|
|
325
|
-
gsd_run query config-set workflow._auto_chain_active true
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
Proceed to Step 4 (skip Steps 3 and 5).
|
|
113
|
+
<!-- gsd:section id="auto-mode-config" when="flag:--auto" -->
|
|
114
|
+
If `section_manifest` is `null` or `"auto-mode-config"` is in its `included` list: read and execute `gsd-core/workflows/new-project/steps/auto-mode-config.md`. Otherwise skip — do not read the file.
|
|
115
|
+
<!-- /gsd:section -->
|
|
329
116
|
|
|
330
117
|
## 2b. Prior Spike/Sketch Detection
|
|
331
118
|
|
|
@@ -965,9 +752,9 @@ Subsequent: Research what's needed to add [target features] to an existing [doma
|
|
|
965
752
|
What's the standard 2025 stack for [domain]?
|
|
966
753
|
</question>
|
|
967
754
|
|
|
968
|
-
<
|
|
755
|
+
<required_reading>
|
|
969
756
|
- {project_path} (Project context and goals)
|
|
970
|
-
</
|
|
757
|
+
</required_reading>
|
|
971
758
|
|
|
972
759
|
${AGENT_SKILLS_RESEARCHER}
|
|
973
760
|
|
|
@@ -1009,9 +796,9 @@ Subsequent: How do [target features] typically work? What's expected behavior?
|
|
|
1009
796
|
What features do [domain] products have? What's table stakes vs differentiating?
|
|
1010
797
|
</question>
|
|
1011
798
|
|
|
1012
|
-
<
|
|
799
|
+
<required_reading>
|
|
1013
800
|
- {project_path} (Project context)
|
|
1014
|
-
</
|
|
801
|
+
</required_reading>
|
|
1015
802
|
|
|
1016
803
|
${AGENT_SKILLS_RESEARCHER}
|
|
1017
804
|
|
|
@@ -1049,9 +836,9 @@ Subsequent: How do [target features] integrate with existing [domain] architectu
|
|
|
1049
836
|
How are [domain] systems typically structured? What are major components?
|
|
1050
837
|
</question>
|
|
1051
838
|
|
|
1052
|
-
<
|
|
839
|
+
<required_reading>
|
|
1053
840
|
- {project_path} (Project context)
|
|
1054
|
-
</
|
|
841
|
+
</required_reading>
|
|
1055
842
|
|
|
1056
843
|
${AGENT_SKILLS_RESEARCHER}
|
|
1057
844
|
|
|
@@ -1089,9 +876,9 @@ Subsequent: What are common mistakes when adding [target features] to [domain]?
|
|
|
1089
876
|
What do [domain] projects commonly get wrong? Critical mistakes?
|
|
1090
877
|
</question>
|
|
1091
878
|
|
|
1092
|
-
<
|
|
879
|
+
<required_reading>
|
|
1093
880
|
- {project_path} (Project context)
|
|
1094
|
-
</
|
|
881
|
+
</required_reading>
|
|
1095
882
|
|
|
1096
883
|
${AGENT_SKILLS_RESEARCHER}
|
|
1097
884
|
|
|
@@ -1125,12 +912,12 @@ Agent(prompt="
|
|
|
1125
912
|
Synthesize research outputs into SUMMARY.md.
|
|
1126
913
|
</task>
|
|
1127
914
|
|
|
1128
|
-
<
|
|
915
|
+
<required_reading>
|
|
1129
916
|
- {research_dir}/STACK.md
|
|
1130
917
|
- {research_dir}/FEATURES.md
|
|
1131
918
|
- {research_dir}/ARCHITECTURE.md
|
|
1132
919
|
- {research_dir}/PITFALLS.md
|
|
1133
|
-
</
|
|
920
|
+
</required_reading>
|
|
1134
921
|
|
|
1135
922
|
${AGENT_SKILLS_SYNTHESIZER}
|
|
1136
923
|
|
|
@@ -1374,12 +1161,12 @@ Spawn gsd-roadmapper agent with path references:
|
|
|
1374
1161
|
Agent(prompt="
|
|
1375
1162
|
<planning_context>
|
|
1376
1163
|
|
|
1377
|
-
<
|
|
1164
|
+
<required_reading>
|
|
1378
1165
|
- {project_path} (Project context)
|
|
1379
1166
|
- {requirements_path} (v1 Requirements)
|
|
1380
1167
|
- {research_dir}/SUMMARY.md (Research findings - if exists)
|
|
1381
1168
|
- {config_path} (Granularity and mode settings)
|
|
1382
|
-
</
|
|
1169
|
+
</required_reading>
|
|
1383
1170
|
|
|
1384
1171
|
${AGENT_SKILLS_ROADMAPPER}
|
|
1385
1172
|
|
|
@@ -1475,9 +1262,9 @@ Use AskUserQuestion:
|
|
|
1475
1262
|
User feedback on roadmap:
|
|
1476
1263
|
[user's notes]
|
|
1477
1264
|
|
|
1478
|
-
<
|
|
1265
|
+
<required_reading>
|
|
1479
1266
|
- {roadmap_path} (Current roadmap to revise)
|
|
1480
|
-
</
|
|
1267
|
+
</required_reading>
|
|
1481
1268
|
|
|
1482
1269
|
${AGENT_SKILLS_ROADMAPPER}
|
|
1483
1270
|
|
|
@@ -104,11 +104,22 @@ Illustrative bash:
|
|
|
104
104
|
```bash
|
|
105
105
|
INCOMPLETE_PHASE=""
|
|
106
106
|
ROADMAP_JSON=$(gsd_run query roadmap.analyze)
|
|
107
|
+
ROADMAP_SCOPE=$(echo "$ROADMAP_JSON" | jq -r '.scope // "complete"')
|
|
107
108
|
if [ $? -ne 0 ] || [ -z "$ROADMAP_JSON" ]; then
|
|
108
109
|
echo "⚠ WARNING: resume-incomplete-phase scan could not run (roadmap.analyze failed)." >&2
|
|
109
110
|
echo " The incomplete-phase invariant (#160) could not be verified." >&2
|
|
110
111
|
echo " Proceeding to prior-phase completeness check — review project state carefully." >&2
|
|
111
112
|
# Fall through to prior_phase_completeness rather than silently skipping
|
|
113
|
+
elif [ "$ROADMAP_SCOPE" != "complete" ]; then
|
|
114
|
+
# #3184/#3165: roadmap.analyze succeeded and returned a well-formed document,
|
|
115
|
+
# but its milestone window did not see all of its input, so `.phases[]` is a
|
|
116
|
+
# NON-answer rather than a real empty. Looping it would run the invariant over
|
|
117
|
+
# a phase list the scan could not populate and report "clean" — the silent
|
|
118
|
+
# disarm #3165 reports. Treated as scan-failed, same as an outright failure.
|
|
119
|
+
echo "⚠ WARNING: resume-incomplete-phase scan could not be scoped (roadmap.analyze scope: $ROADMAP_SCOPE)." >&2
|
|
120
|
+
echo " The milestone window did not cover the whole ROADMAP, so the phase list is incomplete." >&2
|
|
121
|
+
echo " The incomplete-phase invariant (#160) could not be verified — review project state carefully." >&2
|
|
122
|
+
# Fall through to prior_phase_completeness rather than silently passing
|
|
112
123
|
else
|
|
113
124
|
for PHASE_NUM in $(echo "$ROADMAP_JSON" | jq -r '.phases[] | (.number // .phase_number // empty)'); do
|
|
114
125
|
PHASE_JSON=$(gsd_run query find-phase "$PHASE_NUM")
|
|
@@ -338,6 +349,7 @@ Resume with: `/gsd:progress --next --auto` once resolved.
|
|
|
338
349
|
- [ ] `--no-resume`: Route 0 skipped, prior_phase_completeness defer prompt runs as before
|
|
339
350
|
- [ ] `--force`: everything skipped (Gates, Route 0, prior_phase_completeness) → straight to `determine_next_action`
|
|
340
351
|
- [ ] Scan uses `gsd_run` (canonical resolver form); errors are surfaced rather than suppressed
|
|
352
|
+
- [ ] A `roadmap.analyze` result whose `scope` is not `complete` is treated as scan-failed (warn + fall through), never as a clean empty scan (#3184/#3165)
|
|
341
353
|
- [ ] Predicate is plans-without-summaries (`plans.length > summaries.length`) — consistent with `determine_next_action` Route 4
|
|
342
354
|
- [ ] Next action correctly determined from routing rules
|
|
343
355
|
- [ ] Command invoked immediately without user confirmation
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
## 3.6. Handle ADR Ingest Express Path
|
|
2
|
+
|
|
3
|
+
**Skip if:** No `--ingest` flag in arguments.
|
|
4
|
+
|
|
5
|
+
**If `--ingest <path-or-glob>` provided:**
|
|
6
|
+
|
|
7
|
+
1. Display banner: `GSD ► ADR Ingest Express Path` with `{INGEST_PATH}` and `{INGEST_FORMAT}`.
|
|
8
|
+
2. Parse each resolved ADR through `gsd-core/bin/lib/adr-parser.cjs` (`--input`, `--format`) and collect normalized records.
|
|
9
|
+
3. Status gate: reject `superseded`/`rejected`/`deprecated`; warn on `proposed`; missing status defaults to `accepted`.
|
|
10
|
+
4. Empty-decisions fallback: if all parsed ADRs have zero `decisions[]`, emit `ADR ingest produced no locked decisions; fall back to discuss-phase for this phase.` and exit with `/gsd:discuss-phase {N}` guidance.
|
|
11
|
+
5. Generate CONTEXT.md using `<domain>`, `<decisions>`, `<canonical_refs>`, `<specifics>`, `<deferred>`, `<scope_fence>`, map `consequences_positive[]` to Success Criteria and `consequences_negative[]` to Risk Summary, and include `**Source:** ADR Ingest Express Path ({INGEST_PATH})`.
|
|
12
|
+
6. Commit with `gsd-tools.cjs query commit "docs(${padded_phase}): generate context from ADR ingest" --files "${phase_dir}/${padded_phase}-CONTEXT.md"` and set `context_content`; continue to step 5.
|
|
13
|
+
|
|
14
|
+
**Effect:** This bypasses step 4 (Load CONTEXT.md) since CONTEXT.md was synthesized from ADR input.
|
|
15
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
## 8.5. Chunked Planning Mode
|
|
2
|
+
|
|
3
|
+
**Skip if `CHUNKED_MODE` is `false`.**
|
|
4
|
+
|
|
5
|
+
Chunked mode splits the single planner run into a short outline run + N short per-plan
|
|
6
|
+
runs (~3–5 min each), committing each plan individually for crash resilience. Rerunning
|
|
7
|
+
`/gsd:plan-phase {N} --chunked` resumes from the last committed plan.
|
|
8
|
+
|
|
9
|
+
For recovering plans from a prior *non-chunked* run, use step 6's "Add more plans" or
|
|
10
|
+
proceed to `/gsd:execute-phase` — don't start a fresh chunked run over them.
|
|
11
|
+
|
|
12
|
+
### 8.5.1 Outline Phase (outline-only mode, ~2 min)
|
|
13
|
+
|
|
14
|
+
**Resume detection:** If `${PHASE_DIR}/${PADDED_PHASE}-PLAN-OUTLINE.md` exists and contains
|
|
15
|
+
the `## OUTLINE COMPLETE` marker (written by the outline agent — #2762), skip to 8.5.2.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
OUTLINE_FILE="${PHASE_DIR}/${PADDED_PHASE}-PLAN-OUTLINE.md"
|
|
19
|
+
if [[ -f "$OUTLINE_FILE" ]] && grep -q "^## OUTLINE COMPLETE" "$OUTLINE_FILE"; then
|
|
20
|
+
# reuse existing outline — skip to 8.5.2
|
|
21
|
+
fi
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Display:
|
|
25
|
+
```text
|
|
26
|
+
◆ Chunked mode: spawning outline planner... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Spawn the planner in **outline-only** mode — it must write only the outline manifest, not any
|
|
30
|
+
PLAN.md files:
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
Agent(
|
|
34
|
+
prompt="{same planning_context as step 8, plus:}
|
|
35
|
+
|
|
36
|
+
**Chunked mode: outline-only.**
|
|
37
|
+
Do NOT write any PLAN.md files in this Task.
|
|
38
|
+
Write only: {PHASE_DIR}/{PADDED_PHASE}-PLAN-OUTLINE.md
|
|
39
|
+
|
|
40
|
+
The outline must be a markdown table with columns:
|
|
41
|
+
Plan ID | Objective | Wave | Depends On | Requirements
|
|
42
|
+
|
|
43
|
+
End the file with a final line `## OUTLINE COMPLETE` — §8.5.1's resume-check greps
|
|
44
|
+
the file for it, so it MUST be written here, not just returned.
|
|
45
|
+
Return: ## OUTLINE COMPLETE with plan count.",
|
|
46
|
+
subagent_type="gsd-planner",
|
|
47
|
+
model="{planner_model}",
|
|
48
|
+
description="Outline Phase {phase} (chunked)",
|
|
49
|
+
run_in_background=true
|
|
50
|
+
)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**ORCHESTRATOR RULE — ALL RUNTIMES:** `TS=$(date +%s)`; repeat `PLANNER_STALL_RESULT=$(gsd_stall_watch "$TS" "{outputFile}" "$OUTLINE_FILE" "## OUTLINE COMPLETE")` while waiting/active.
|
|
54
|
+
|
|
55
|
+
Handle return:
|
|
56
|
+
- **`marker_received`:** Read `PLAN-OUTLINE.md`, extract plan list. Continue to 8.5.2.
|
|
57
|
+
- **`stalled` / any other return or empty:** Display error. Offer: 1) Retry outline, 2) Stop.
|
|
58
|
+
|
|
59
|
+
### 8.5.2 Per-Plan Tasks (single-plan mode, ~3-5 min each)
|
|
60
|
+
|
|
61
|
+
For each plan entry extracted from `PLAN-OUTLINE.md`:
|
|
62
|
+
|
|
63
|
+
1. **Resume check:** Skip if `${PHASE_DIR}/{plan_id}-PLAN.md` exists with valid frontmatter
|
|
64
|
+
(resume safety) — UNLESS `--reviews` is set, whose purpose is to REPLAN with review
|
|
65
|
+
feedback (§6), so existing plans are overwritten, not skipped (#2762).
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
PLAN_FILE="${PHASE_DIR}/${plan_id}-PLAN.md"
|
|
69
|
+
if [[ -f "$PLAN_FILE" ]] && head -1 "$PLAN_FILE" | grep -q '^---' && [[ "$ARGUMENTS" != *"--reviews"* ]]; then
|
|
70
|
+
continue # resume safety — NOT under --reviews (replan)
|
|
71
|
+
fi
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
2. Display:
|
|
75
|
+
```text
|
|
76
|
+
◆ Chunked mode: planning {plan_id} ({k}/{N})... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
3. Spawn the planner in **single-plan** mode — it must write exactly one PLAN.md file:
|
|
80
|
+
```javascript
|
|
81
|
+
Agent(
|
|
82
|
+
prompt="{same planning_context as step 8, plus:}
|
|
83
|
+
|
|
84
|
+
**Chunked mode: single-plan.**
|
|
85
|
+
Write exactly ONE plan file: {PHASE_DIR}/{plan_id}-PLAN.md
|
|
86
|
+
Plan to write: {plan_id} — {objective}
|
|
87
|
+
Wave: {wave} | Depends on: {depends_on}
|
|
88
|
+
Phase requirement IDs to cover in this plan: {plan_requirements}
|
|
89
|
+
|
|
90
|
+
Return: ## PLAN COMPLETE with the plan ID.",
|
|
91
|
+
subagent_type="gsd-planner",
|
|
92
|
+
model="{planner_model}",
|
|
93
|
+
description="Plan {plan_id} (chunked {k}/{N})",
|
|
94
|
+
run_in_background=true
|
|
95
|
+
)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**ORCHESTRATOR RULE — ALL RUNTIMES:** `TS=$(date +%s)`; repeat `PLANNER_STALL_RESULT=$(gsd_stall_watch "$TS" "{outputFile}" "$PLAN_FILE" "## PLAN COMPLETE")` while waiting/active — `stalled` falls into step 4 (preserves prior committed chunks).
|
|
99
|
+
|
|
100
|
+
4. **Verify disk:** Check `${PHASE_DIR}/{plan_id}-PLAN.md` exists. If missing: offer 1) Retry, 2) Stop.
|
|
101
|
+
|
|
102
|
+
5. **Commit per-plan:**
|
|
103
|
+
```bash
|
|
104
|
+
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
105
|
+
gsd_run query commit "docs(${PADDED_PHASE}): plan ${plan_id} (chunked)" --files "${PHASE_DIR}/${plan_id}-PLAN.md"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
After all N plans are written and committed, treat this as `## PLANNING COMPLETE` and continue
|
|
109
|
+
to step 9.
|
|
110
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## 3.5. Handle PRD Express Path
|
|
2
|
+
|
|
3
|
+
**Skip if:** No `--prd` flag in arguments.
|
|
4
|
+
|
|
5
|
+
**If `--prd <filepath>` provided:**
|
|
6
|
+
|
|
7
|
+
Read and execute `gsd-core/workflows/plan-phase/steps/prd-express-path.md` — it reads the PRD (`$PRD_FILE`), generates `CONTEXT.md` (every PRD requirement/story/criterion → locked decision, uncovered areas → "Claude's Discretion", canonical refs extracted from ROADMAP.md + PRD-referenced specs), commits it, sets `context_content`, and bypasses step 4 (Load CONTEXT.md). The rest of the workflow proceeds normally with the PRD-derived context.
|
|
8
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
### Research-Only Early Exit (`--research-phase`)
|
|
2
|
+
|
|
3
|
+
**Skip if:** `RESEARCH_ONLY` is `false` (the default).
|
|
4
|
+
|
|
5
|
+
**If `RESEARCH_ONLY=true`:** the user invoked `/gsd:plan-phase --research-phase <N>` for research-only mode. Do **not** continue to Section 5.5+ (validation strategy, planner, plan-checker, verification, gaps, bounce, post-planning-gaps). Print the research-complete summary and exit cleanly:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
✓ Research-only mode complete (#3042)
|
|
9
|
+
|
|
10
|
+
Phase: ${PHASE}
|
|
11
|
+
RESEARCH.md: ${research_path}
|
|
12
|
+
|
|
13
|
+
Re-run /gsd:plan-phase ${PHASE} to plan the phase using this research,
|
|
14
|
+
or /gsd:plan-phase ${PHASE} --research to refresh research and plan.
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This exits the workflow. The planner / plan-checker / verifier blocks below are skipped.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
### 5.0. Research-Only Modifiers (`--view`, `--research`)
|
|
2
|
+
|
|
3
|
+
**Skip if:** `RESEARCH_ONLY` is `false`.
|
|
4
|
+
|
|
5
|
+
Three branches in research-only mode (`--research-phase <N>`):
|
|
6
|
+
|
|
7
|
+
1. **`--view`**: print `RESEARCH.md` to stdout, no spawn, exit. If `RESEARCH.md` is missing, error with: `--view requires an existing RESEARCH.md; drop --view to spawn the researcher.`
|
|
8
|
+
2. **`--research`** (force-refresh): re-spawn researcher unconditionally — fall through to "Spawn gsd-phase-researcher" below.
|
|
9
|
+
3. **Neither flag AND `has_research=true`:** auto-use the existing research and exit cleanly — do not prompt, do not re-spawn. Emit `RESEARCH.md already exists for Phase ${PHASE}, using it. To force-refresh, re-invoke with --research; to print, re-invoke with --view. Path: ${research_path}` then exit. The explicit-flag escape hatches cover any deviation; this matches §5.1's promptless auto-use of existing research, removing the §5.0/§5.1 inconsistency (#159).
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
if [[ "$VIEW_ONLY" == "true" ]]; then
|
|
13
|
+
[[ -f "$research_path" ]] || { echo "Error: --view requires an existing RESEARCH.md (Phase ${PHASE}). Drop --view to spawn the researcher."; exit 1; }
|
|
14
|
+
cat "$research_path"; exit 0
|
|
15
|
+
fi
|
|
16
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## 2.5. Validate `--reviews` Prerequisite
|
|
2
|
+
|
|
3
|
+
**Skip if:** No `--reviews` flag.
|
|
4
|
+
|
|
5
|
+
**If `--reviews` AND `--gaps`:** Error — cannot combine `--reviews` with `--gaps`. These are conflicting modes.
|
|
6
|
+
|
|
7
|
+
**If `--reviews` AND `has_reviews` is false (no REVIEWS.md in phase dir):**
|
|
8
|
+
|
|
9
|
+
Error:
|
|
10
|
+
```
|
|
11
|
+
No REVIEWS.md found for Phase {N}. Run reviews first:
|
|
12
|
+
|
|
13
|
+
/gsd:review --phase {N}
|
|
14
|
+
|
|
15
|
+
Then re-run /gsd:plan-phase {N} --reviews
|
|
16
|
+
```
|
|
17
|
+
Exit workflow.
|