@opengsd/gsd-core 1.9.0 → 1.10.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 +131 -34
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-executor.md +7 -5
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-plan-checker.md +9 -0
- package/agents/gsd-planner.md +5 -8
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-verifier.md +14 -70
- package/bin/install.js +503 -341
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/plan-phase.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +607 -63
- package/gsd-core/bin/lib/active-workstream-store.cjs +25 -0
- package/gsd-core/bin/lib/agent-install-check.cjs +38 -6
- package/gsd-core/bin/lib/api-coverage.cjs +120 -0
- package/gsd-core/bin/lib/audit.cjs +89 -1
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-registry.cjs +96 -110
- package/gsd-core/bin/lib/capability-validator.cjs +12 -2
- package/gsd-core/bin/lib/check-command-router.cjs +43 -1
- package/gsd-core/bin/lib/command-aliases.cjs +72 -0
- package/gsd-core/bin/lib/commands.cjs +26 -25
- package/gsd-core/bin/lib/commonjs-marker.cjs +136 -0
- package/gsd-core/bin/lib/config-loader.cjs +1 -0
- package/gsd-core/bin/lib/config.cjs +12 -1
- 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 +91 -12
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/frontmatter.cjs +84 -12
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +58 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +27 -4
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1021 -57
- package/gsd-core/bin/lib/install-engine.cjs +64 -10
- package/gsd-core/bin/lib/install-profiles.cjs +27 -1
- 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 +87 -1
- package/gsd-core/bin/lib/io.cjs +28 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +6 -0
- 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.cjs +106 -51
- package/gsd-core/bin/lib/phase-id.cjs +63 -0
- package/gsd-core/bin/lib/phase-locator.cjs +138 -45
- package/gsd-core/bin/lib/phase.cjs +260 -25
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +232 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +4 -0
- package/gsd-core/bin/lib/project-root.cjs +48 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +80 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +99 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +30 -6
- package/gsd-core/bin/lib/roadmap-command-router.cjs +42 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +100 -18
- package/gsd-core/bin/lib/roadmap.cjs +37 -7
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +195 -62
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +15 -3
- package/gsd-core/bin/lib/runtime-homes.cjs +154 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +105 -41
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +113 -27
- package/gsd-core/bin/lib/smart-entry.cjs +12 -0
- package/gsd-core/bin/lib/state-transition.cjs +73 -8
- package/gsd-core/bin/lib/state.cjs +151 -62
- package/gsd-core/bin/lib/surface.cjs +12 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +11 -1
- package/gsd-core/bin/lib/uat.cjs +320 -21
- package/gsd-core/bin/lib/unusable-input.cjs +9 -0
- package/gsd-core/bin/lib/verification.cjs +29 -12
- package/gsd-core/bin/lib/verify.cjs +29 -5
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +181 -18
- package/gsd-core/bin/lib/workstream-inventory.cjs +519 -27
- package/gsd-core/bin/lib/workstream.cjs +6 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +276 -118
- package/gsd-core/bin/shared/config-schema.manifest.json +2 -0
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/specless-probe-fallback.md +7 -6
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/worktree-branch-check.md +2 -2
- 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/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 +32 -69
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +83 -0
- package/gsd-core/workflows/code-review.md +42 -145
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +23 -81
- package/gsd-core/workflows/debug.md +9 -12
- package/gsd-core/workflows/diagnose-issues.md +22 -0
- package/gsd-core/workflows/discovery-phase.md +4 -4
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +5 -16
- 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/execute-phase/steps/executor-isolation-dispatch.md +34 -2
- 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-worktree-gate.md +19 -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 +65 -137
- package/gsd-core/workflows/execute-plan.md +1 -1
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/ingest-docs.md +2 -1
- 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 +21 -38
- 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 +13 -226
- 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 +49 -193
- 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 +11 -153
- 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 +46 -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 +20 -390
- 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 +15 -8
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +17 -14
- 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 +49 -11
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +8 -21
- package/gsd-core/workflows/ui-phase.md +8 -7
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +18 -7
- package/gsd-core/workflows/verify-phase.md +4 -7
- 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 +8 -58
- package/hooks/dist/gsd-agent-isolation-guard.js +428 -0
- package/hooks/dist/gsd-check-update-worker.js +14 -5
- package/hooks/dist/gsd-cursor-subagent-start.js +532 -26
- package/hooks/dist/gsd-read-injection-scanner.js +7 -0
- package/hooks/dist/gsd-statusline.js +72 -6
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/isolation-sentinel.js +268 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +428 -0
- package/hooks/gsd-check-update-worker.js +14 -5
- package/hooks/gsd-cursor-subagent-start.js +532 -26
- package/hooks/gsd-read-injection-scanner.js +7 -0
- package/hooks/gsd-statusline.js +72 -6
- 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/isolation-sentinel.js +268 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +14 -5
- package/pi/gsd.cjs +57 -12
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +9 -2
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-context-index.cjs +448 -0
- package/scripts/gen-inventory-manifest.cjs +101 -1
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +39 -15
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lint-allow-test-rule-refs.allowlist.json +17 -31
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- 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-example-parser-parity.cjs +395 -0
- package/scripts/lint-test-file-count.allowlist.json +27 -1
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/prompt-injection-scan.sh +27 -6
- package/scripts/registry-schema.cjs +323 -94
- package/scripts/run-tests.cjs +3 -2
- package/scripts/validate-registry.cjs +10 -6
- package/skills/gsd-autonomous/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-plan-phase/SKILL.md +2 -2
- package/vscode/package.json +1 -1
- package/scripts/gen-emitted-baseline.cjs +0 -145
|
@@ -32,9 +32,20 @@ Parse `GSD_WS` and `MILESTONE_ARG` using the established idiom (see `verify-work
|
|
|
32
32
|
```bash
|
|
33
33
|
_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
|
|
34
34
|
GSD_WS=""
|
|
35
|
-
echo "$ARGUMENTS" | grep -qE -- '--ws[[:space:]]+[
|
|
36
|
-
MILESTONE_ARG=$(echo "$ARGUMENTS" | sed -E 's/--ws[[:space:]]+[
|
|
35
|
+
echo "$ARGUMENTS" | grep -qE -- '--ws[[:space:]]+[A-Za-z0-9._-]+' && GSD_WS=$(echo "$ARGUMENTS" | grep -oE -- '--ws[[:space:]]+[A-Za-z0-9._-]+')
|
|
36
|
+
MILESTONE_ARG=$(echo "$ARGUMENTS" | sed -E 's/--ws[[:space:]]+[A-Za-z0-9._-]+//g' | xargs)
|
|
37
37
|
RESPONSE_LANGUAGE=$(gsd_run query config-get response_language --default "" 2>/dev/null || echo "")
|
|
38
|
+
# #2994: EARLY, section-manifest-only init.new-milestone call — needed here
|
|
39
|
+
# (before Step 4) to gate the project-md-milestone-write section. This is
|
|
40
|
+
# DELIBERATELY separate from Step 7's full init.new-milestone call below,
|
|
41
|
+
# which must stay AFTER Step 6's phase archival/phases.clear so its
|
|
42
|
+
# phase_dir_count / roadmap_exists / latest_completed_milestone fields
|
|
43
|
+
# reflect POST-archival state — moving that call here would compute those
|
|
44
|
+
# fields too early and corrupt the roadmapper's phase-numbering context.
|
|
45
|
+
# init.new-milestone is a pure read (no mutation), so calling it twice is
|
|
46
|
+
# safe; only `section_manifest` is consumed from this early call.
|
|
47
|
+
INIT_EARLY=$(gsd_run query init.new-milestone)
|
|
48
|
+
if [[ "$INIT_EARLY" == @file:* ]]; then INIT_EARLY=$(cat "${INIT_EARLY#@file:}"); fi
|
|
38
49
|
```
|
|
39
50
|
|
|
40
51
|
`GSD_WS` must chain to every downstream routing suggestion in this workflow (Step 4's shared-file guard, and the `/gsd:discuss-phase`/`/gsd:plan-phase` routing hints below) per the routing-propagation contract in `references/workstream-flag.md` — never let it silently drop.
|
|
@@ -151,22 +162,9 @@ AskUserQuestion:
|
|
|
151
162
|
|
|
152
163
|
PROJECT.md is shared across workstreams (`references/workstream-flag.md` marks it `# Shared` in the directory diagram). This step has two independently-scoped parts — only Part A is workstream-guarded.
|
|
153
164
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
```markdown
|
|
159
|
-
## Current Milestone: v[X.Y] [Name]
|
|
160
|
-
|
|
161
|
-
**Goal:** [One sentence describing milestone focus]
|
|
162
|
-
|
|
163
|
-
**Target features:**
|
|
164
|
-
- [Feature 1]
|
|
165
|
-
- [Feature 2]
|
|
166
|
-
- [Feature 3]
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
Update Active requirements section and "Last updated" footer.
|
|
165
|
+
<!-- gsd:section id="project-md-milestone-write" when="state:flat-mode" -->
|
|
166
|
+
If `section_manifest` (from `INIT_EARLY`) is `null` or `"project-md-milestone-write"` is in its `included` list: read and execute `gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md`. Otherwise (a workstream is active) skip — do not read the file; Part B below still runs regardless of `GSD_WS`.
|
|
167
|
+
<!-- /gsd:section -->
|
|
170
168
|
|
|
171
169
|
**Part B — Evolution structural repair (always runs, regardless of `GSD_WS`).** `## Evolution` is a shared, idempotent structural section, not workstream state — a pre-Evolution project must be backfilled whether or not a workstream is active, so this part is NOT covered by Part A's skip. Ensure the `## Evolution` section exists in PROJECT.md. If missing (projects created before this feature), add it before the footer:
|
|
172
170
|
|
|
@@ -273,7 +271,8 @@ gsd_run query commit "docs: start milestone v[X.Y] [Name]" --files .planning/PRO
|
|
|
273
271
|
## 7. Load Context and Resolve Models
|
|
274
272
|
|
|
275
273
|
```bash
|
|
276
|
-
|
|
274
|
+
RESET_PHASE_NUMBERS_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--reset-phase-numbers([[:space:]]|$) ]]; then RESET_PHASE_NUMBERS_PARAM="--reset-phase-numbers"; fi
|
|
275
|
+
INIT=$(gsd_run query init.new-milestone $RESET_PHASE_NUMBERS_PARAM)
|
|
277
276
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
278
277
|
AGENT_SKILLS_RESEARCHER=$(gsd_run query agent-skills gsd-project-researcher)
|
|
279
278
|
AGENT_SKILLS_SYNTHESIZER=$(gsd_run query agent-skills gsd-research-synthesizer)
|
|
@@ -296,25 +295,9 @@ Proceeding without research subagents — roadmap will be generated inline.
|
|
|
296
295
|
```
|
|
297
296
|
Skip the parallel research spawn step and generate the roadmap inline.
|
|
298
297
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
1. Set starting phase number to `1` for the upcoming roadmap.
|
|
304
|
-
2. If `phase_dir_count > 0`, archive the old phase directories before roadmapping so new `01-*` / `02-*` directories cannot collide with stale milestone directories.
|
|
305
|
-
|
|
306
|
-
If `phase_dir_count > 0` and `phase_archive_path` is available:
|
|
307
|
-
|
|
308
|
-
```bash
|
|
309
|
-
mkdir -p "${phase_archive_path}"
|
|
310
|
-
find .planning/phases -mindepth 1 -maxdepth 1 -type d -exec mv {} "${phase_archive_path}/" \;
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
Then verify `.planning/phases/` no longer contains old milestone directories before continuing.
|
|
314
|
-
|
|
315
|
-
If `phase_dir_count > 0` but `phase_archive_path` is missing:
|
|
316
|
-
- Stop and explain that reset numbering is unsafe without a completed milestone archive target.
|
|
317
|
-
- Tell the user to complete/archive the previous milestone first, then rerun `/gsd:new-milestone --reset-phase-numbers ${GSD_WS}`.
|
|
298
|
+
<!-- gsd:section id="reset-phase-safety" when="flag:--reset-phase-numbers" -->
|
|
299
|
+
If `section_manifest` is `null` or `"reset-phase-safety"` is in its `included` list: read and execute `gsd-core/workflows/new-milestone/steps/reset-phase-safety.md`. Otherwise skip — do not read the file.
|
|
300
|
+
<!-- /gsd:section -->
|
|
318
301
|
|
|
319
302
|
## 8. Research Decision
|
|
320
303
|
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
## 2a. Auto Mode Config (auto mode only)
|
|
2
|
+
|
|
3
|
+
**If auto mode:** Collect config settings upfront before processing the idea document.
|
|
4
|
+
|
|
5
|
+
YOLO mode is implicit (auto = YOLO). Ask remaining config questions:
|
|
6
|
+
|
|
7
|
+
**Round 1 — Core settings (3 questions, no Mode question):**
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
AskUserQuestion([
|
|
11
|
+
{
|
|
12
|
+
header: "Granularity",
|
|
13
|
+
question: "How finely should scope be sliced into phases?",
|
|
14
|
+
multiSelect: false,
|
|
15
|
+
options: [
|
|
16
|
+
{ label: "Coarse (Recommended)", description: "Fewer, broader phases (3-5 phases, 1-3 plans each)" },
|
|
17
|
+
{ label: "Standard", description: "Balanced phase size (5-8 phases, 3-5 plans each)" },
|
|
18
|
+
{ label: "Fine", description: "Many focused phases (8-12 phases, 5-10 plans each)" }
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
header: "Execution",
|
|
23
|
+
question: "Run plans in parallel?",
|
|
24
|
+
multiSelect: false,
|
|
25
|
+
options: [
|
|
26
|
+
{ label: "Parallel (Recommended)", description: "Independent plans run simultaneously" },
|
|
27
|
+
{ label: "Sequential", description: "One plan at a time" }
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
header: "Git Tracking",
|
|
32
|
+
question: "Commit planning docs to git?",
|
|
33
|
+
multiSelect: false,
|
|
34
|
+
options: [
|
|
35
|
+
{ label: "Yes (Recommended)", description: "Planning docs tracked in version control" },
|
|
36
|
+
{ label: "No", description: "Keep .planning/ local-only (add to .gitignore)" }
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
])
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Round 2 — Workflow agents (same as Step 5):**
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
AskUserQuestion([
|
|
46
|
+
{
|
|
47
|
+
header: "Research",
|
|
48
|
+
question: "Research before planning each phase? (adds tokens/time)",
|
|
49
|
+
multiSelect: false,
|
|
50
|
+
options: [
|
|
51
|
+
{ label: "Yes (Recommended)", description: "Investigate domain, find patterns, surface gotchas" },
|
|
52
|
+
{ label: "No", description: "Plan directly from requirements" }
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
header: "Plan Check",
|
|
57
|
+
question: "Verify plans will achieve their goals? (adds tokens/time)",
|
|
58
|
+
multiSelect: false,
|
|
59
|
+
options: [
|
|
60
|
+
{ label: "Yes (Recommended)", description: "Catch gaps before execution starts" },
|
|
61
|
+
{ label: "No", description: "Execute plans without verification" }
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
header: "Verifier",
|
|
66
|
+
question: "Verify work satisfies requirements after each phase? (adds tokens/time)",
|
|
67
|
+
multiSelect: false,
|
|
68
|
+
options: [
|
|
69
|
+
{ label: "Yes (Recommended)", description: "Confirm deliverables match phase goals" },
|
|
70
|
+
{ label: "No", description: "Trust execution, skip verification" }
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
header: "Drift Guard",
|
|
75
|
+
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]",
|
|
76
|
+
multiSelect: false,
|
|
77
|
+
options: [
|
|
78
|
+
{ label: "Yes (Recommended)", description: "Resolve symbol references against live source during plan review — catches hallucinated names before execution" },
|
|
79
|
+
{ label: "No", description: "Skip symbol grounding — plan review proceeds without source verification" }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
])
|
|
83
|
+
|
|
84
|
+
// Model profile uses a two-question split because AskUserQuestion enforces a hard
|
|
85
|
+
// 4-option cap and there are 5 valid profiles (quality, balanced, budget, adaptive,
|
|
86
|
+
// inherit). Q1 routes between adaptive/standard-tier/inherit; Q2 (shown only when
|
|
87
|
+
// Q1 = "Standard tier…") picks among the three standard profiles. Mirrors the
|
|
88
|
+
// /gsd:settings split (#3784, #1516).
|
|
89
|
+
AskUserQuestion([
|
|
90
|
+
{
|
|
91
|
+
header: "AI Models",
|
|
92
|
+
question: "Which AI models for planning agents?",
|
|
93
|
+
multiSelect: false,
|
|
94
|
+
options: [
|
|
95
|
+
{ 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)." },
|
|
96
|
+
{ label: "Standard tier…", description: "Choose Quality, Balanced, or Budget — flat tier applied to all agents" },
|
|
97
|
+
{ label: "Inherit", description: "Use the current session model for all agents (required for non-Claude runtimes: Codex, Gemini CLI, OpenCode /model, OpenRouter, local models)" }
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
])
|
|
101
|
+
|
|
102
|
+
**Conditional visibility — model_profile (Q2):**
|
|
103
|
+
Only ask this question when Q1's answer is "Standard tier…".
|
|
104
|
+
If Q1 = "Adaptive (Recommended)" → write model_profile=adaptive and SKIP Q2.
|
|
105
|
+
If Q1 = "Inherit" → write model_profile=inherit and SKIP Q2.
|
|
106
|
+
If user cancels Q2 after picking "Standard tier…" → leave existing model_profile value unchanged.
|
|
107
|
+
|
|
108
|
+
AskUserQuestion([
|
|
109
|
+
{
|
|
110
|
+
question: "Which standard profile? (Quality / Balanced / Budget)",
|
|
111
|
+
header: "Model Tier",
|
|
112
|
+
multiSelect: false,
|
|
113
|
+
options: [
|
|
114
|
+
{ label: "Quality", description: "Opus everywhere except verification (highest cost) — Claude only" },
|
|
115
|
+
{ label: "Balanced", description: "Opus for planning, Sonnet for research/execution/verification — Claude only" },
|
|
116
|
+
{ label: "Budget", description: "Sonnet for writing, Haiku for research/verification (lowest cost) — Claude only" }
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
])
|
|
120
|
+
|
|
121
|
+
// Map UI choices → config values:
|
|
122
|
+
// Q1 "Adaptive (Recommended)" → model_profile = "adaptive"
|
|
123
|
+
// Q1 "Inherit" → model_profile = "inherit"
|
|
124
|
+
// Q1 "Standard tier…" + Q2 "Quality" → model_profile = "quality"
|
|
125
|
+
// Q1 "Standard tier…" + Q2 "Balanced" → model_profile = "balanced"
|
|
126
|
+
// Q1 "Standard tier…" + Q2 "Budget" → model_profile = "budget"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Round 3 — PR body onboarding:**
|
|
130
|
+
|
|
131
|
+
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`.
|
|
132
|
+
|
|
133
|
+
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.
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
AskUserQuestion([
|
|
137
|
+
{
|
|
138
|
+
header: "PR Body",
|
|
139
|
+
question: "Which optional PRD-style sections should /gsd:ship include in PR bodies?",
|
|
140
|
+
multiSelect: true,
|
|
141
|
+
options: [
|
|
142
|
+
{ label: "User Stories & Acceptance Criteria", description: "Append user-facing stories and acceptance checks from REQUIREMENTS.md" },
|
|
143
|
+
{ label: "Risks & Dependencies", description: "Append rollout risks, dependencies, and rollback notes from PLAN.md" },
|
|
144
|
+
{ label: "Success Metrics & Release Criteria", description: "Append measurable Definition of Done and release checks for stakeholder review" },
|
|
145
|
+
{ label: "Stakeholder Review & Approval", description: "Append approval checklist for projects that need sign-off traceability" }
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
])
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
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":[]}`.
|
|
152
|
+
|
|
153
|
+
Create `.planning/config.json` with all settings (CLI fills in remaining defaults automatically):
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
_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
|
|
157
|
+
mkdir -p .planning
|
|
158
|
+
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}."}]}}'
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**If commit_docs = No:** Add `.planning/` to `.gitignore`.
|
|
162
|
+
|
|
163
|
+
**Commit config.json:**
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
mkdir -p .planning
|
|
167
|
+
gsd_run query commit "chore: add project config" --files .planning/config.json
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Persist auto-advance chain flag to config (survives context compaction):**
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
gsd_run query config-set workflow._auto_chain_active true
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Proceed to Step 4 (skip Steps 3 and 5).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## Auto Mode Detection
|
|
2
|
+
|
|
3
|
+
Check if `--auto` flag is present in $ARGUMENTS.
|
|
4
|
+
|
|
5
|
+
**If auto mode:**
|
|
6
|
+
|
|
7
|
+
- Skip brownfield mapping offer (assume greenfield)
|
|
8
|
+
- Skip deep questioning (extract context from provided document)
|
|
9
|
+
- Config: YOLO mode is implicit (skip that question), but ask granularity/git/agents FIRST (Step 2a)
|
|
10
|
+
- After config: run Steps 6-9 automatically with smart defaults:
|
|
11
|
+
- Research: Always yes
|
|
12
|
+
- Requirements: Include all table stakes + features from provided document
|
|
13
|
+
- Requirements approval: Auto-approve
|
|
14
|
+
- Roadmap approval: Auto-approve
|
|
15
|
+
|
|
16
|
+
**Document requirement:**
|
|
17
|
+
Auto mode requires an idea document — either:
|
|
18
|
+
|
|
19
|
+
- File reference: `/gsd:new-project --auto @prd.md`
|
|
20
|
+
- Pasted/written text in the prompt
|
|
21
|
+
|
|
22
|
+
If no document content provided, error:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Error: --auto requires an idea document.
|
|
26
|
+
|
|
27
|
+
Usage:
|
|
28
|
+
/gsd:new-project --auto @your-idea.md
|
|
29
|
+
/gsd:new-project --auto [paste or write your idea here]
|
|
30
|
+
|
|
31
|
+
The document should describe what you want to build.
|
|
32
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
**If `needs_codebase_map` is true** (from init — existing code detected but no codebase map):
|
|
2
|
+
|
|
3
|
+
**Text mode (`workflow.text_mode: true` in config or `--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS` OR `text_mode` from init JSON is `true`. When TEXT_MODE is active, replace every `AskUserQuestion` call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available.
|
|
4
|
+
Use AskUserQuestion:
|
|
5
|
+
|
|
6
|
+
- header: "Codebase"
|
|
7
|
+
- question: "I detected existing code in this directory. Would you like to map the codebase first?"
|
|
8
|
+
- options:
|
|
9
|
+
- "Map codebase first" — Run /gsd:map-codebase to understand existing architecture (Recommended)
|
|
10
|
+
- "Skip mapping" — Proceed with project initialization
|
|
11
|
+
|
|
12
|
+
**If "Map codebase first":**
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Run `/gsd:map-codebase` first, then return to `/gsd:new-project`
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Exit command.
|
|
@@ -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
|
|
|
@@ -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
|
+
|