gsd-pi 2.66.1-dev.ed243f2 → 2.67.0-dev.43b0159
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/dist/claude-cli-check.d.ts +8 -0
- package/dist/claude-cli-check.js +36 -0
- package/dist/cli.js +40 -0
- package/dist/onboarding.js +19 -2
- package/dist/resources/extensions/ask-user-questions.js +79 -11
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +4 -3
- package/dist/resources/extensions/claude-code-cli/readiness.js +63 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +10 -3
- package/dist/resources/extensions/gsd/auto/loop.js +13 -1
- package/dist/resources/extensions/gsd/auto/phases.js +22 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
- package/dist/resources/extensions/gsd/auto/session.js +1 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +65 -15
- package/dist/resources/extensions/gsd/auto-dispatch.js +30 -28
- package/dist/resources/extensions/gsd/auto-model-selection.js +12 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +173 -25
- package/dist/resources/extensions/gsd/auto-recovery.js +11 -12
- package/dist/resources/extensions/gsd/auto.js +13 -1
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +18 -6
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +59 -5
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +8 -5
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +186 -14
- package/dist/resources/extensions/gsd/codebase-generator.js +4 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
- package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +94 -4
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +49 -9
- package/dist/resources/extensions/gsd/context-store.js +134 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -1
- package/dist/resources/extensions/gsd/detection.js +6 -0
- package/dist/resources/extensions/gsd/files.js +19 -2
- package/dist/resources/extensions/gsd/guided-flow.js +12 -8
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +2 -0
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -1
- package/dist/resources/extensions/gsd/preferences.js +6 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +7 -7
- package/dist/resources/extensions/gsd/prompts/discuss.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
- package/dist/resources/extensions/gsd/prompts/rethink.md +6 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +11 -9
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +3 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +2 -1
- package/dist/resources/extensions/gsd/state.js +2 -1
- package/dist/resources/extensions/gsd/visualizer-overlay.js +27 -26
- package/dist/resources/extensions/gsd/workflow-reconcile.js +46 -7
- package/dist/resources/extensions/remote-questions/manager.js +8 -0
- package/dist/resources/extensions/shared/interview-ui.js +10 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{6502.8874bcae249c02e1.js → 6502.b804e48b7919f55e.js} +3 -3
- package/dist/web/standalone/.next/static/chunks/{webpack-9fed74684e1c5bb1.js → webpack-65f0501b197d1c49.js} +1 -1
- package/package.json +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +4 -3
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +11 -1
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +60 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/json-parse.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/tests/json-parse.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/tests/json-parse.test.js +14 -0
- package/packages/pi-ai/dist/utils/tests/json-parse.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +10 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +4 -3
- package/packages/pi-ai/src/utils/json-parse.ts +11 -1
- package/packages/pi-ai/src/utils/repair-tool-json.ts +69 -1
- package/packages/pi-ai/src/utils/tests/json-parse.test.ts +17 -0
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +13 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +16 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +58 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +58 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +4 -0
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +69 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +66 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +5 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +18 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +11 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +13 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +35 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/tui.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +43 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +9 -7
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.js +54 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -0
- package/packages/pi-tui/dist/components/editor.d.ts +3 -1
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +14 -3
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +6 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +8 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +15 -0
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +43 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +50 -0
- package/packages/pi-tui/src/autocomplete.ts +9 -7
- package/packages/pi-tui/src/components/__tests__/editor.test.ts +64 -0
- package/packages/pi-tui/src/components/editor.ts +14 -3
- package/packages/pi-tui/src/stdin-buffer.ts +7 -0
- package/packages/pi-tui/src/tui.ts +9 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +103 -11
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +4 -3
- package/src/resources/extensions/claude-code-cli/readiness.ts +67 -12
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +12 -3
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +17 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +18 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop.ts +14 -1
- package/src/resources/extensions/gsd/auto/phases.ts +27 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +14 -2
- package/src/resources/extensions/gsd/auto/session.ts +1 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +76 -16
- package/src/resources/extensions/gsd/auto-dispatch.ts +36 -35
- package/src/resources/extensions/gsd/auto-model-selection.ts +12 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +195 -25
- package/src/resources/extensions/gsd/auto-recovery.ts +15 -15
- package/src/resources/extensions/gsd/auto.ts +12 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +27 -6
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +67 -6
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +11 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +209 -16
- package/src/resources/extensions/gsd/codebase-generator.ts +4 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
- package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -2
- package/src/resources/extensions/gsd/commands/handlers/core.ts +113 -8
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -11
- package/src/resources/extensions/gsd/context-store.ts +167 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -1
- package/src/resources/extensions/gsd/detection.ts +6 -0
- package/src/resources/extensions/gsd/files.ts +21 -2
- package/src/resources/extensions/gsd/guided-flow.ts +15 -8
- package/src/resources/extensions/gsd/index.ts +6 -0
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +2 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -1
- package/src/resources/extensions/gsd/preferences.ts +6 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/discuss-prepared.md +7 -7
- package/src/resources/extensions/gsd/prompts/discuss.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/rethink.md +6 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +11 -9
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +3 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +4 -1
- package/src/resources/extensions/gsd/state.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +50 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +21 -7
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/decision-scope-cascade.test.ts +370 -0
- package/src/resources/extensions/gsd/tests/detection.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +53 -13
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/measurement.test.ts +531 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +71 -2
- package/src/resources/extensions/gsd/tests/parsers.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -4
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +210 -35
- package/src/resources/extensions/gsd/visualizer-overlay.ts +31 -27
- package/src/resources/extensions/gsd/workflow-reconcile.ts +59 -8
- package/src/resources/extensions/remote-questions/manager.ts +9 -0
- package/src/resources/extensions/shared/interview-ui.ts +13 -0
- /package/dist/web/standalone/.next/static/{HAq0VE4k68rhRvJbQL1VW → CrKrzIIxk55witDF1eS0L}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{HAq0VE4k68rhRvJbQL1VW → CrKrzIIxk55witDF1eS0L}/_ssgManifest.js +0 -0
|
@@ -109,7 +109,7 @@ Options:
|
|
|
109
109
|
- "Needs adjustment" — user will clarify, then re-present scope
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
**Do NOT proceed to Layer 2 until the user explicitly approves the scope
|
|
112
|
+
**CRITICAL — Non-bypassable gate:** Do NOT proceed to Layer 2 until the user explicitly approves the scope. If `ask_user_questions` fails, errors, returns no response, or the user's response does not match a provided option, you MUST re-ask — never rationalize past the block. "Tool not responding, I'll proceed," "auth issues," or "I'll use my recommended scope" are all **forbidden**. The gate exists to protect the user's work; treat a block as an instruction to wait, not an obstacle to work around.
|
|
113
113
|
|
|
114
114
|
---
|
|
115
115
|
|
|
@@ -120,7 +120,7 @@ Before presenting Layer 2 findings, use your available web search tools to resea
|
|
|
120
120
|
1. Search for "[technology] [version] best practices [current year]"
|
|
121
121
|
2. Search for "[technology] [version] known issues"
|
|
122
122
|
|
|
123
|
-
Summarize findings concisely. If
|
|
123
|
+
Summarize findings concisely. If search tools fail or are unavailable, note this and proceed using your training knowledge — but do NOT use a search failure as justification to skip any gate.
|
|
124
124
|
|
|
125
125
|
Present ecosystem findings at the start of Layer 2 alongside your architecture recommendation.
|
|
126
126
|
|
|
@@ -180,7 +180,7 @@ Options:
|
|
|
180
180
|
- "Want to adjust" — user will clarify, then re-present architecture
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
-
**Do NOT proceed to Layer 3 until the user explicitly approves the architecture
|
|
183
|
+
**CRITICAL — Non-bypassable gate:** Do NOT proceed to Layer 3 until the user explicitly approves the architecture. If `ask_user_questions` fails, errors, returns no response, or the user's response does not match a provided option, you MUST re-ask — never rationalize past the block. The gate exists to protect the user's work; treat a block as an instruction to wait, not an obstacle to work around.
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
@@ -243,7 +243,7 @@ Options:
|
|
|
243
243
|
- "Want to adjust error handling" — user will clarify, then re-present errors
|
|
244
244
|
```
|
|
245
245
|
|
|
246
|
-
**Do NOT proceed to Layer 4 until the user explicitly approves error handling
|
|
246
|
+
**CRITICAL — Non-bypassable gate:** Do NOT proceed to Layer 4 until the user explicitly approves error handling. If `ask_user_questions` fails, errors, returns no response, or the user's response does not match a provided option, you MUST re-ask — never rationalize past the block. The gate exists to protect the user's work; treat a block as an instruction to wait, not an obstacle to work around.
|
|
247
247
|
|
|
248
248
|
---
|
|
249
249
|
|
|
@@ -297,7 +297,7 @@ Options:
|
|
|
297
297
|
- "Want to adjust the quality bar" — user will clarify, then re-present quality
|
|
298
298
|
```
|
|
299
299
|
|
|
300
|
-
**Do NOT proceed to Output Phase until the user explicitly approves the quality bar
|
|
300
|
+
**CRITICAL — Non-bypassable gate:** Do NOT proceed to Output Phase until the user explicitly approves the quality bar. If `ask_user_questions` fails, errors, returns no response, or the user's response does not match a provided option, you MUST re-ask — never rationalize past the block. The gate exists to protect the user's work; treat a block as an instruction to wait, not an obstacle to work around.
|
|
301
301
|
|
|
302
302
|
---
|
|
303
303
|
|
|
@@ -315,13 +315,13 @@ Before writing a roadmap, produce or update `.gsd/REQUIREMENTS.md`.
|
|
|
315
315
|
|
|
316
316
|
Use it as the project's explicit capability contract. Requirements discovered during the 4-layer discussion should be captured here with source `user` or `inferred` as appropriate.
|
|
317
317
|
|
|
318
|
-
**Print the requirements in chat before writing the roadmap.** Print a markdown table with columns: ID, Title, Status, Owner, Source. Group by status (Active, Deferred, Out of Scope). After the table, ask: "Confirm, adjust, or add?"
|
|
318
|
+
**Print the requirements in chat before writing the roadmap.** Print a markdown table with columns: ID, Title, Status, Owner, Source. Group by status (Active, Deferred, Out of Scope). After the table, ask: "Confirm, adjust, or add?" **Non-bypassable:** If the user does not respond or gives an ambiguous answer, you MUST re-ask — never proceed to roadmap creation without explicit requirement confirmation.
|
|
319
319
|
|
|
320
320
|
### Roadmap Preview
|
|
321
321
|
|
|
322
322
|
Before writing any files, **print the planned roadmap in chat** so the user can see and approve it. Print a markdown table with columns: Slice, Title, Risk, Depends, Demo. One row per slice. Below the table, print the milestone definition of done as a bullet list.
|
|
323
323
|
|
|
324
|
-
If the user raises a substantive objection, adjust the roadmap. Otherwise, present the roadmap and ask: "Ready to write, or want to adjust?" — one gate, not two.
|
|
324
|
+
If the user raises a substantive objection, adjust the roadmap. Otherwise, present the roadmap and ask: "Ready to write, or want to adjust?" — one gate, not two. **Non-bypassable:** If the user does not respond or gives an ambiguous answer, you MUST re-ask — never write files without explicit approval. A missing response is not a "yes."
|
|
325
325
|
|
|
326
326
|
### Naming Convention
|
|
327
327
|
|
|
@@ -173,7 +173,7 @@ For multi-milestone projects, requirements should span the full vision. Requirem
|
|
|
173
173
|
|
|
174
174
|
If the project is new or has no `REQUIREMENTS.md`, surface candidate requirements in chat before writing the roadmap. Ask for correction only on material omissions, wrong ownership, or wrong scope. If the user has already been specific and raises no substantive objection, treat the requirement set as confirmed and continue.
|
|
175
175
|
|
|
176
|
-
**Print the requirements in chat before writing the roadmap.** Do not say "here are the requirements" and then only write them to a file. The user must see them in the terminal. Print a markdown table with columns: ID, Title, Status, Owner, Source. Group by status (Active, Deferred, Out of Scope). After the table, ask: "Confirm, adjust, or add?"
|
|
176
|
+
**Print the requirements in chat before writing the roadmap.** Do not say "here are the requirements" and then only write them to a file. The user must see them in the terminal. Print a markdown table with columns: ID, Title, Status, Owner, Source. Group by status (Active, Deferred, Out of Scope). After the table, ask: "Confirm, adjust, or add?" **Non-bypassable:** If the user does not respond or gives an ambiguous answer, you MUST re-ask — never proceed to roadmap creation without explicit requirement confirmation.
|
|
177
177
|
|
|
178
178
|
## Scope Assessment
|
|
179
179
|
|
|
@@ -185,7 +185,7 @@ Before moving to output, confirm the size estimate from your reflection still ho
|
|
|
185
185
|
|
|
186
186
|
Before writing any files, **print the planned roadmap in chat** so the user can see and approve it. Print a markdown table with columns: Slice, Title, Risk, Depends, Demo. One row per slice. Below the table, print the milestone definition of done as a bullet list.
|
|
187
187
|
|
|
188
|
-
If the user raises a substantive objection, adjust the roadmap. Otherwise, present the roadmap and ask: "Ready to write, or want to adjust?" — one gate, not two.
|
|
188
|
+
If the user raises a substantive objection, adjust the roadmap. Otherwise, present the roadmap and ask: "Ready to write, or want to adjust?" — one gate, not two. **Non-bypassable:** If the user does not respond or gives an ambiguous answer, you MUST re-ask — never write files without explicit approval. A missing response is not a "yes."
|
|
189
189
|
|
|
190
190
|
### Naming Convention
|
|
191
191
|
|
|
@@ -242,7 +242,7 @@ If a milestone has no dependencies, omit the frontmatter. The dependency chain f
|
|
|
242
242
|
|
|
243
243
|
#### Phase 3: Sequential readiness gate for remaining milestones
|
|
244
244
|
|
|
245
|
-
For each remaining milestone **one at a time, in sequence**, decide the most likely readiness mode from the evidence you already have, then use `ask_user_questions` to let the user correct that recommendation. Present three options:
|
|
245
|
+
For each remaining milestone **one at a time, in sequence**, decide the most likely readiness mode from the evidence you already have, then use `ask_user_questions` to let the user correct that recommendation. **Non-bypassable:** If `ask_user_questions` fails, errors, returns no response, or the user's response does not match a provided option, you MUST re-ask — never rationalize past the block or auto-select a readiness mode. Present three options:
|
|
246
246
|
|
|
247
247
|
- **"Discuss now"** — The user wants to conduct a focused discussion for this milestone in the current session, while the context from the broader discussion is still fresh. Proceed with a focused discussion for this milestone (reflection → investigation → questioning → depth verification). When the discussion concludes, write a full `CONTEXT.md`. Then move to the gate for the next milestone.
|
|
248
248
|
- **"Write draft for later"** — This milestone has seed material from the current conversation but needs its own dedicated discussion in a future session. Write a `CONTEXT-DRAFT.md` capturing the seed material (what was discussed, key ideas, provisional scope, open questions). Mark it clearly as a draft, not a finalized context. **What happens downstream:** When auto-mode reaches this milestone, it pauses and notifies the user: "M00x has draft context — needs discussion. Run /gsd." The `/gsd` wizard shows a "Discuss from draft" option that seeds the new discussion with this draft, so nothing from the current conversation is lost. After the dedicated discussion produces a full CONTEXT.md, the draft file is automatically deleted.
|
|
@@ -69,14 +69,14 @@ Then:
|
|
|
69
69
|
16. If you made an architectural, pattern, library, or observability decision during this task that downstream work should know about, append it to `.gsd/DECISIONS.md` (read the template at `~/.gsd/agent/extensions/gsd/templates/decisions.md` if the file doesn't exist yet). Not every task produces decisions — only append when a meaningful choice was made.
|
|
70
70
|
17. If you discover a non-obvious rule, recurring gotcha, or useful pattern during execution, append it to `.gsd/KNOWLEDGE.md`. Only add entries that would save future agents from repeating your investigation. Don't add obvious things.
|
|
71
71
|
18. Read the template at `~/.gsd/agent/extensions/gsd/templates/task-summary.md`
|
|
72
|
-
19.
|
|
73
|
-
20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and
|
|
72
|
+
19. Use that template to prepare the completion content you will pass to `gsd_complete_task` using the camelCase fields `milestoneId`, `sliceId`, `taskId`, `oneLiner`, `narrative`, `verification`, and `verificationEvidence`. Do **not** manually write `{{taskSummaryPath}}` — the DB-backed tool is the canonical write path and renders the summary file for you.
|
|
73
|
+
20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and the completion fields derived from the template. This is your final required step — do NOT manually edit PLAN.md checkboxes. The tool marks the task complete, updates the DB, renders `{{taskSummaryPath}}`, and updates PLAN.md automatically.
|
|
74
74
|
21. Do not run git commands — the system reads your task summary after completion and creates a meaningful commit from it (type inferred from title, message from your one-liner, key files from frontmatter). Write a clear, specific one-liner in the summary — it becomes the commit message.
|
|
75
75
|
|
|
76
76
|
All work stays in your working directory: `{{workingDirectory}}`.
|
|
77
77
|
|
|
78
78
|
**Autonomous execution:** Do not call `ask_user_questions` or `secure_env_collect`. You are running in auto-mode — there is no human available to answer questions. Make reasonable assumptions and document them in the task summary. If a decision genuinely requires human input, note it in the summary and proceed with the best available option.
|
|
79
79
|
|
|
80
|
-
**You MUST call `gsd_complete_task`
|
|
80
|
+
**You MUST call `gsd_complete_task` before finishing. Do not manually write `{{taskSummaryPath}}`.**
|
|
81
81
|
|
|
82
82
|
When done, say: "Task {{taskId}} complete."
|
|
@@ -92,15 +92,15 @@ Before moving to the wrap-up gate, verify you have covered:
|
|
|
92
92
|
- header: "Depth Check"
|
|
93
93
|
- question: "Did I capture the depth right?"
|
|
94
94
|
- options: "Yes, you got it (Recommended)", "Not quite — let me clarify"
|
|
95
|
-
- **The question ID must contain `depth_verification
|
|
95
|
+
- **The question ID must contain `depth_verification` and the milestone id** (e.g. `depth_verification_{{milestoneId}}_confirm`) — this enables the write-gate downstream and keeps verification scoped to the milestone being discussed.
|
|
96
96
|
|
|
97
|
-
**If `{{structuredQuestionsAvailable}}` is `false`:** ask in plain text: "Did I capture that correctly? If not, tell me what I missed." Wait for confirmation before proceeding.
|
|
97
|
+
**If `{{structuredQuestionsAvailable}}` is `false`:** ask in plain text: "Did I capture that correctly? If not, tell me what I missed." Wait for explicit confirmation before proceeding. **The same non-bypassable gate applies to the plain-text path** — if the user does not respond, gives an ambiguous answer, or does not explicitly confirm, you MUST re-ask. Never rationalize past a missing confirmation.
|
|
98
98
|
|
|
99
99
|
If they clarify, absorb the correction and re-verify.
|
|
100
100
|
|
|
101
101
|
The depth verification is the only required confirmation gate. Do not add a second "ready to proceed?" gate after it.
|
|
102
102
|
|
|
103
|
-
**CRITICAL — Non-bypassable gate:** The system mechanically blocks CONTEXT.md writes until the user selects the "(Recommended)" option. If the user declines, cancels, or the tool fails, you MUST re-ask — never rationalize past the block ("tool not responding, I'll proceed" is forbidden). The gate exists to protect the user's work; treat a block as an instruction, not an obstacle to work around.
|
|
103
|
+
**CRITICAL — Non-bypassable gate:** The system mechanically blocks CONTEXT.md writes until the user selects the "(Recommended)" option (structured path) or explicitly confirms (plain-text path). If the user declines, cancels, does not respond, or the tool fails, you MUST re-ask — never rationalize past the block ("tool not responding, I'll proceed" is forbidden). The gate exists to protect the user's work; treat a block as an instruction, not an obstacle to work around.
|
|
104
104
|
|
|
105
105
|
---
|
|
106
106
|
|
|
@@ -41,11 +41,13 @@ After each round of answers, decide whether you already have enough signal to wr
|
|
|
41
41
|
- Ask a single wrap-up question only when you genuinely believe the slice is well understood or the user signals they want to stop.
|
|
42
42
|
- When you do ask it, offer two choices: "Write the context file" *(recommended when the slice is well understood)* or "One more pass". Use `ask_user_questions` if available, otherwise ask in plain text.
|
|
43
43
|
|
|
44
|
+
**CRITICAL — Non-bypassable gate:** Do NOT write the context file until the user explicitly selects "Write the context file." If `ask_user_questions` fails, errors, returns no response, or the user's response does not match a provided option, you MUST re-ask — never rationalize past the block. "Tool not responding, I'll proceed," "auth issues," or "the slice seems well understood, I'll write it" are all **forbidden**. The gate exists to protect the user's work; treat a block as an instruction to wait, not an obstacle to work around.
|
|
45
|
+
|
|
44
46
|
---
|
|
45
47
|
|
|
46
48
|
## Output
|
|
47
49
|
|
|
48
|
-
Once the user
|
|
50
|
+
Once the user has explicitly confirmed they are ready to write the context file:
|
|
49
51
|
|
|
50
52
|
1. Use the **Slice Context** output template below
|
|
51
53
|
2. `mkdir -p {{sliceDirPath}}`
|
|
@@ -12,7 +12,7 @@ You are a project reorganization assistant for a GSD (Get Shit Done) project. Th
|
|
|
12
12
|
|
|
13
13
|
1. Present the current milestone order as a clear numbered list with status indicators (e.g. ✅ complete, ▶ active, ⏳ pending, ⏸ parked)
|
|
14
14
|
2. Ask: **"What would you like to change?"**
|
|
15
|
-
3. Execute changes conversationally, confirming destructive operations before proceeding
|
|
15
|
+
3. Execute changes conversationally, confirming destructive operations before proceeding. **Non-bypassable:** For any destructive operation (discard, skip, reorder that breaks dependencies), you MUST get explicit user confirmation before executing. If the user does not respond, gives an ambiguous answer, or `ask_user_questions` fails, you MUST re-ask — never rationalize past the block. A missing confirmation is a "do not proceed."
|
|
16
16
|
|
|
17
17
|
## Supported Operations
|
|
18
18
|
|
|
@@ -53,8 +53,12 @@ gsd_skip_slice({ milestoneId: "M003", sliceId: "S02", reason: "Descoped — feat
|
|
|
53
53
|
Skipped slices are treated as closed by the state machine (like "complete" but distinct). Use when a slice is no longer needed or has been superseded. The slice data is preserved for reference.
|
|
54
54
|
**Do NOT** just check the slice checkbox in the roadmap — this does not update the DB and auto-mode will resume the slice.
|
|
55
55
|
|
|
56
|
+
**CRITICAL — Non-bypassable gate:** Skipping a slice is a permanent DB operation. You MUST confirm with the user before calling `gsd_skip_slice`. If the user does not respond or gives an ambiguous answer, you MUST re-ask — never proceed without explicit approval.
|
|
57
|
+
|
|
56
58
|
### Discard a milestone
|
|
57
|
-
**Permanently** delete a milestone directory and prune it from QUEUE-ORDER.json.
|
|
59
|
+
**Permanently** delete a milestone directory and prune it from QUEUE-ORDER.json.
|
|
60
|
+
|
|
61
|
+
**CRITICAL — Non-bypassable gate:** Discarding is irreversible. You MUST confirm with the user before discarding. Warn explicitly if the milestone has completed work. If the user does not respond or gives an ambiguous answer, you MUST re-ask — never rationalize past the block. A missing confirmation is a "do not discard."
|
|
58
62
|
|
|
59
63
|
### Add a new milestone
|
|
60
64
|
Use the `gsd_milestone_generate_id` tool to get the next ID, then call `gsd_summary_save` with `milestone_id: {ID}`, `artifact_type: "CONTEXT"`, and the scope/goals/success criteria as `content` — the tool writes the context file to disk and persists to DB. Update QUEUE-ORDER.json to place it at the desired position.
|
|
@@ -38,7 +38,7 @@ GSD ships with bundled skills. Load the relevant skill file with the `read` tool
|
|
|
38
38
|
- Never print, echo, log, or restate secrets or credentials. Report only key names and applied/skipped status.
|
|
39
39
|
- Never ask the user to edit `.env` files or set secrets manually. Use `secure_env_collect`.
|
|
40
40
|
- In enduring files, write current state only unless the file is explicitly historical.
|
|
41
|
-
- **Never take outward-facing actions on GitHub (or any external service) without explicit user confirmation.** This includes: creating issues, closing issues, merging PRs, approving PRs, posting comments, pushing to remote branches, publishing packages, or any other action that affects state outside the local filesystem. Read-only operations (listing, viewing, diffing) are fine. Always present what you intend to do and get a clear "yes" before executing.
|
|
41
|
+
- **Never take outward-facing actions on GitHub (or any external service) without explicit user confirmation.** This includes: creating issues, closing issues, merging PRs, approving PRs, posting comments, pushing to remote branches, publishing packages, or any other action that affects state outside the local filesystem. Read-only operations (listing, viewing, diffing) are fine. Always present what you intend to do and get a clear "yes" before executing. **Non-bypassable:** If the user does not respond, gives an ambiguous answer, or `ask_user_questions` fails, you MUST re-ask — never rationalize past the block ("tool not responding, I'll proceed" is forbidden). A missing "yes" is a "no."
|
|
42
42
|
|
|
43
43
|
If a `GSD Skill Preferences` block is present below this contract, treat it as explicit durable guidance for which skills to use, prefer, or avoid during GSD work. Follow it where it does not conflict with required GSD artifact rules, verification requirements, or higher-priority system/developer instructions.
|
|
44
44
|
|
|
@@ -51,7 +51,7 @@ For each capture, classify it as one of:
|
|
|
51
51
|
|
|
52
52
|
For captures classified as **note** or **defer**, auto-confirm without asking — these are low-impact.
|
|
53
53
|
For captures classified as **stop** or **backtrack**, auto-confirm without asking — these are urgent user directives that must be honored immediately.
|
|
54
|
-
For captures classified as **quick-task**, **inject**, or **replan**, ask the user to confirm or choose a different classification.
|
|
54
|
+
For captures classified as **quick-task**, **inject**, or **replan**, ask the user to confirm or choose a different classification. **Non-bypassable:** If `ask_user_questions` fails, errors, or the user does not respond, you MUST re-ask — never auto-confirm these classifications without explicit user approval.
|
|
55
55
|
|
|
56
56
|
3. **Update** `.gsd/CAPTURES.md` — for each capture, update its section with the confirmed classification:
|
|
57
57
|
- Change `**Status:** pending` to `**Status:** resolved`
|
|
@@ -14,7 +14,7 @@ This is remediation round {{remediationRound}}. If this is round 0, this is the
|
|
|
14
14
|
|
|
15
15
|
## Context
|
|
16
16
|
|
|
17
|
-
All relevant context has been preloaded below — the roadmap, all slice summaries,
|
|
17
|
+
All relevant context has been preloaded below — the roadmap, all slice summaries, assessment results, requirements, decisions, and project context are inlined. Start working immediately without re-reading these files.
|
|
18
18
|
|
|
19
19
|
{{inlinedContext}}
|
|
20
20
|
|
|
@@ -30,8 +30,8 @@ Prompt: "Review milestone {{milestoneId}} requirements coverage. Working directo
|
|
|
30
30
|
**Reviewer B — Cross-Slice Integration**
|
|
31
31
|
Prompt: "Review milestone {{milestoneId}} cross-slice integration. Working directory: {{workingDirectory}}. Read `{{roadmapPath}}` and find the boundary map (produces/consumes contracts). For each boundary, check that the producing slice's SUMMARY confirms it produced the artifact, and the consuming slice's SUMMARY confirms it consumed it. Output a markdown table: Boundary | Producer Summary | Consumer Summary | Status. End with a one-line verdict: PASS if all boundaries honored, NEEDS-ATTENTION if any gaps."
|
|
32
32
|
|
|
33
|
-
**Reviewer C —
|
|
34
|
-
Prompt: "Review milestone {{milestoneId}}
|
|
33
|
+
**Reviewer C — Assessment & Acceptance Criteria**
|
|
34
|
+
Prompt: "Review milestone {{milestoneId}} assessment evidence and acceptance criteria. Working directory: {{workingDirectory}}. Read `.gsd/{{milestoneId}}/CONTEXT.md` for acceptance criteria. Check for ASSESSMENT files in each slice directory. Verify each acceptance criterion maps to either a passing assessment result or clear SUMMARY evidence. Output a checklist: [ ] Criterion | Evidence. End with a one-line verdict: PASS if all criteria met, NEEDS-ATTENTION if gaps exist."
|
|
35
35
|
|
|
36
36
|
### Step 2 — Synthesize Findings
|
|
37
37
|
|
|
@@ -40,9 +40,9 @@ After all reviewers complete, aggregate their verdicts:
|
|
|
40
40
|
- If any reviewer says NEEDS-ATTENTION → overall verdict: `needs-attention`
|
|
41
41
|
- If any reviewer says FAIL → overall verdict: `needs-remediation`
|
|
42
42
|
|
|
43
|
-
### Step 3 —
|
|
43
|
+
### Step 3 — Persist Validation
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Prepare the validation content you will pass to `gsd_validate_milestone`. Do **not** manually write `{{validationPath}}` — the DB-backed tool is the canonical write path and renders the validation file for you.
|
|
46
46
|
|
|
47
47
|
```markdown
|
|
48
48
|
---
|
|
@@ -59,7 +59,7 @@ reviewers: 3
|
|
|
59
59
|
## Reviewer B — Cross-Slice Integration
|
|
60
60
|
<paste Reviewer B output>
|
|
61
61
|
|
|
62
|
-
## Reviewer C —
|
|
62
|
+
## Reviewer C — Assessment & Acceptance Criteria
|
|
63
63
|
<paste Reviewer C output>
|
|
64
64
|
|
|
65
65
|
## Synthesis
|
|
@@ -69,13 +69,15 @@ reviewers: 3
|
|
|
69
69
|
<if verdict is not pass: specific actions required>
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
+
Call `gsd_validate_milestone` with the camelCase fields `milestoneId`, `verdict`, `remediationRound`, `successCriteriaChecklist`, `sliceDeliveryAudit`, `crossSliceIntegration`, `requirementCoverage`, `verdictRationale`, and `remediationPlan` when needed. If you include verification-class analysis, pass it in `verificationClasses`.
|
|
73
|
+
|
|
72
74
|
**DB access safety:** Do NOT query `.gsd/gsd.db` directly via `sqlite3` or `node -e require('better-sqlite3')` — the engine owns the WAL connection. Use `gsd_milestone_status` to read milestone and slice state. All data you need is already inlined in the context above or accessible via the `gsd_*` tools. Direct DB access corrupts the WAL and bypasses tool-level validation.
|
|
73
75
|
|
|
74
76
|
If verdict is `needs-remediation`:
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
+
- Use `gsd_reassess_roadmap` to add the remediation slices instead of editing `{{roadmapPath}}` manually
|
|
78
|
+
- Those slices will be planned and executed before validation re-runs
|
|
77
79
|
|
|
78
|
-
**You MUST write `{{validationPath}}
|
|
80
|
+
**You MUST call `gsd_validate_milestone` before finishing. Do not manually write `{{validationPath}}`.**
|
|
79
81
|
|
|
80
82
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
|
|
81
83
|
|
|
@@ -90,9 +90,11 @@ Present a merge plan to the user:
|
|
|
90
90
|
|
|
91
91
|
Ask the user to confirm the merge plan before proceeding.
|
|
92
92
|
|
|
93
|
+
**CRITICAL — Non-bypassable gate:** Do NOT execute any merge commands until the user explicitly approves the merge plan. If `ask_user_questions` fails, errors, returns no response, or the user's response is ambiguous, you MUST re-ask — never rationalize past the block. "No response, I'll proceed with the clean merges," "the plan looks safe, merging," or any other self-authorization is **forbidden**. The gate exists to protect the user's branches; treat a block as an instruction to wait, not an obstacle to work around.
|
|
94
|
+
|
|
93
95
|
### Step 4: Execute Merge
|
|
94
96
|
|
|
95
|
-
Once confirmed, run all commands from `{{mainTreePath}}` (your CWD):
|
|
97
|
+
Once the user has explicitly confirmed, run all commands from `{{mainTreePath}}` (your CWD):
|
|
96
98
|
|
|
97
99
|
1. Ensure you are on the target branch: `git checkout {{mainBranch}}`
|
|
98
100
|
2. If there are conflicts requiring manual reconciliation, apply the reconciled versions first
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
10
10
|
*/
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
|
+
import { normalizePlannedFileReference } from "../files.js";
|
|
12
13
|
import { logWarning } from "../workflow-logger.js";
|
|
13
14
|
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
14
15
|
/**
|
|
@@ -31,7 +32,7 @@ export function validateFileChanges(basePath, expectedOutput, plannedFiles) {
|
|
|
31
32
|
// Filter out .gsd/ internal files — only validate project source files
|
|
32
33
|
const projectFiles = actualFiles.filter(f => !f.startsWith(".gsd/") && !f.startsWith(".gsd\\"));
|
|
33
34
|
// Normalize expected paths (strip leading ./ or /)
|
|
34
|
-
const normalizedExpected = new Set([...allExpected].map(f => f.replace(/^\.\//, "").replace(/^\//, "")));
|
|
35
|
+
const normalizedExpected = new Set([...allExpected].map((f) => normalizePlannedFileReference(f).replace(/^\.\//, "").replace(/^\//, "")));
|
|
35
36
|
// Compute symmetric difference
|
|
36
37
|
const unexpectedFiles = projectFiles.filter(f => !normalizedExpected.has(f));
|
|
37
38
|
const missingFiles = [...normalizedExpected].filter(f => !projectFiles.includes(f));
|
|
@@ -1194,7 +1194,8 @@ export async function _deriveStateImpl(basePath) {
|
|
|
1194
1194
|
? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
|
|
1195
1195
|
: 'All milestones complete.';
|
|
1196
1196
|
return {
|
|
1197
|
-
activeMilestone:
|
|
1197
|
+
activeMilestone: null,
|
|
1198
|
+
lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
1198
1199
|
activeSlice: null,
|
|
1199
1200
|
activeTask: null,
|
|
1200
1201
|
phase: 'complete',
|
|
@@ -19,6 +19,21 @@ const TAB_LABELS = [
|
|
|
19
19
|
"9 Captures",
|
|
20
20
|
"0 Export",
|
|
21
21
|
];
|
|
22
|
+
function buildTabBarEntries(activeTab, filterText, capturesPendingCount) {
|
|
23
|
+
return TAB_LABELS.map((label, i) => {
|
|
24
|
+
let displayLabel = label;
|
|
25
|
+
if (i === activeTab && filterText) {
|
|
26
|
+
displayLabel += " \u2731";
|
|
27
|
+
}
|
|
28
|
+
if (i === 8 && capturesPendingCount) {
|
|
29
|
+
displayLabel += ` (${capturesPendingCount})`;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
label: displayLabel,
|
|
33
|
+
width: visibleWidth(displayLabel) + 2,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
}
|
|
22
37
|
export class GSDVisualizerOverlay {
|
|
23
38
|
tui;
|
|
24
39
|
theme;
|
|
@@ -89,15 +104,13 @@ export class GSDVisualizerOverlay {
|
|
|
89
104
|
};
|
|
90
105
|
}
|
|
91
106
|
handleInput(data) {
|
|
107
|
+
if (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl("c"))) {
|
|
108
|
+
this.dispose();
|
|
109
|
+
this.onClose();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
92
112
|
// Filter mode input routing
|
|
93
113
|
if (this.filterMode) {
|
|
94
|
-
if (matchesKey(data, Key.escape)) {
|
|
95
|
-
this.filterMode = false;
|
|
96
|
-
this.filterText = "";
|
|
97
|
-
this.invalidate();
|
|
98
|
-
this.tui.requestRender();
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
114
|
if (matchesKey(data, Key.enter)) {
|
|
102
115
|
this.filterMode = false;
|
|
103
116
|
this.invalidate();
|
|
@@ -150,8 +163,9 @@ export class GSDVisualizerOverlay {
|
|
|
150
163
|
// Left click — check if on tab bar row
|
|
151
164
|
if (mouse.y === 2) {
|
|
152
165
|
let xPos = 3;
|
|
153
|
-
|
|
154
|
-
|
|
166
|
+
const tabs = buildTabBarEntries(this.activeTab, this.filterText, this.data?.captures?.pendingCount);
|
|
167
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
168
|
+
const tabWidth = tabs[i].width;
|
|
155
169
|
if (mouse.x >= xPos && mouse.x < xPos + tabWidth) {
|
|
156
170
|
this.activeTab = i;
|
|
157
171
|
this.invalidate();
|
|
@@ -164,11 +178,6 @@ export class GSDVisualizerOverlay {
|
|
|
164
178
|
}
|
|
165
179
|
return;
|
|
166
180
|
}
|
|
167
|
-
if (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl("c"))) {
|
|
168
|
-
this.dispose();
|
|
169
|
-
this.onClose();
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
181
|
if (matchesKey(data, Key.shift("tab"))) {
|
|
173
182
|
this.activeTab = (this.activeTab - 1 + TAB_COUNT) % TAB_COUNT;
|
|
174
183
|
this.invalidate();
|
|
@@ -391,20 +400,12 @@ export class GSDVisualizerOverlay {
|
|
|
391
400
|
const innerWidth = width - 4;
|
|
392
401
|
const content = [];
|
|
393
402
|
// Tab bar
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
// Show filter indicator on active tab with filter
|
|
397
|
-
if (i === this.activeTab && this.filterText) {
|
|
398
|
-
displayLabel += " \u2731";
|
|
399
|
-
}
|
|
400
|
-
// Show captures badge
|
|
401
|
-
if (i === 8 && this.data?.captures?.pendingCount) {
|
|
402
|
-
displayLabel += ` (${this.data.captures.pendingCount})`;
|
|
403
|
-
}
|
|
403
|
+
const tabEntries = buildTabBarEntries(this.activeTab, this.filterText, this.data?.captures?.pendingCount);
|
|
404
|
+
const tabs = tabEntries.map((entry, i) => {
|
|
404
405
|
if (i === this.activeTab) {
|
|
405
|
-
return th.fg("accent", `[${
|
|
406
|
+
return th.fg("accent", `[${entry.label}]`);
|
|
406
407
|
}
|
|
407
|
-
return th.fg("dim", `[${
|
|
408
|
+
return th.fg("dim", `[${entry.label}]`);
|
|
408
409
|
});
|
|
409
410
|
content.push(" " + tabs.join(" "));
|
|
410
411
|
content.push("");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
3
3
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
4
|
-
import { readEvents, findForkPoint,
|
|
4
|
+
import { readEvents, findForkPoint, getSessionId } from "./workflow-events.js";
|
|
5
5
|
import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, _getAdapter, getMilestoneSlices, insertVerificationEvidence, upsertDecision, openDatabase, setTaskBlockerDiscovered, } from "./gsd-db.js";
|
|
6
6
|
import { isClosedStatus } from "./status-guards.js";
|
|
7
7
|
import { invalidateStateCache } from "./state.js";
|
|
@@ -275,6 +275,31 @@ export function detectConflicts(mainDiverged, wtDiverged) {
|
|
|
275
275
|
}
|
|
276
276
|
return conflicts;
|
|
277
277
|
}
|
|
278
|
+
function rewriteDivergedEventsForEntity(divergedEvents, entityType, entityId, replacementEvents) {
|
|
279
|
+
const rewritten = [];
|
|
280
|
+
let inserted = false;
|
|
281
|
+
for (const event of divergedEvents) {
|
|
282
|
+
const key = extractEntityKey(event);
|
|
283
|
+
if (key?.type === entityType && key.id === entityId) {
|
|
284
|
+
if (!inserted) {
|
|
285
|
+
rewritten.push(...replacementEvents);
|
|
286
|
+
inserted = true;
|
|
287
|
+
}
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
rewritten.push(event);
|
|
291
|
+
}
|
|
292
|
+
if (!inserted) {
|
|
293
|
+
rewritten.push(...replacementEvents);
|
|
294
|
+
}
|
|
295
|
+
return rewritten;
|
|
296
|
+
}
|
|
297
|
+
function writeEventLog(basePath, events) {
|
|
298
|
+
const dir = join(basePath, ".gsd");
|
|
299
|
+
mkdirSync(dir, { recursive: true });
|
|
300
|
+
const content = events.map((e) => JSON.stringify(e)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
301
|
+
atomicWriteSync(join(dir, "event-log.jsonl"), content);
|
|
302
|
+
}
|
|
278
303
|
// ─── writeConflictsFile ───────────────────────────────────────────────────────
|
|
279
304
|
/**
|
|
280
305
|
* Write a human-readable CONFLICTS.md to basePath/.gsd/CONFLICTS.md.
|
|
@@ -483,8 +508,8 @@ function parseEventBlock(block) {
|
|
|
483
508
|
}
|
|
484
509
|
/**
|
|
485
510
|
* Resolve a single conflict by picking one side's events.
|
|
486
|
-
* Replays the picked events through the DB helpers,
|
|
487
|
-
* and updates or removes CONFLICTS.md.
|
|
511
|
+
* Replays the picked events through the DB helpers, rewrites the chosen side's
|
|
512
|
+
* event log so the conflict is durable, and updates or removes CONFLICTS.md.
|
|
488
513
|
*
|
|
489
514
|
* When the last conflict is resolved, non-conflicting events from both sides
|
|
490
515
|
* are also replayed (they were blocked by the all-or-nothing D-04 rule).
|
|
@@ -500,13 +525,27 @@ pick) {
|
|
|
500
525
|
throw new Error(`No conflict found for entity ${entityKey}`);
|
|
501
526
|
const conflict = conflicts[idx];
|
|
502
527
|
const eventsToReplay = pick === "main" ? conflict.mainSideEvents : conflict.worktreeSideEvents;
|
|
528
|
+
const mainLogPath = join(basePath, ".gsd", "event-log.jsonl");
|
|
529
|
+
const wtLogPath = join(worktreeBasePath, ".gsd", "event-log.jsonl");
|
|
530
|
+
const mainEvents = readEvents(mainLogPath);
|
|
531
|
+
const wtEvents = readEvents(wtLogPath);
|
|
532
|
+
const forkPoint = findForkPoint(mainEvents, wtEvents);
|
|
533
|
+
const mainBaseEvents = mainEvents.slice(0, forkPoint + 1);
|
|
534
|
+
const wtBaseEvents = wtEvents.slice(0, forkPoint + 1);
|
|
535
|
+
const mainDiverged = mainEvents.slice(forkPoint + 1);
|
|
536
|
+
const wtDiverged = wtEvents.slice(forkPoint + 1);
|
|
537
|
+
const rewrittenTargetEvents = pick === "main"
|
|
538
|
+
? rewriteDivergedEventsForEntity(wtDiverged, entityType, entityId, eventsToReplay)
|
|
539
|
+
: rewriteDivergedEventsForEntity(mainDiverged, entityType, entityId, eventsToReplay);
|
|
540
|
+
const targetBasePath = pick === "main" ? worktreeBasePath : basePath;
|
|
541
|
+
const targetBaseEvents = pick === "main" ? wtBaseEvents : mainBaseEvents;
|
|
542
|
+
writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
503
543
|
// Replay resolved events through the DB (updates DB state)
|
|
504
544
|
openDatabase(join(basePath, ".gsd", "gsd.db"));
|
|
505
545
|
replayEvents(eventsToReplay);
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
}
|
|
546
|
+
invalidateStateCache();
|
|
547
|
+
clearPathCache();
|
|
548
|
+
clearParseCache();
|
|
510
549
|
// Remove resolved conflict from list
|
|
511
550
|
conflicts.splice(idx, 1);
|
|
512
551
|
if (conflicts.length === 0) {
|
|
@@ -8,6 +8,14 @@ import { SlackAdapter } from "./slack-adapter.js";
|
|
|
8
8
|
import { TelegramAdapter } from "./telegram-adapter.js";
|
|
9
9
|
import { createPromptRecord, writePromptRecord, markPromptAnswered, markPromptDispatched, markPromptStatus, updatePromptRecord } from "./store.js";
|
|
10
10
|
import { sanitizeError } from "../shared/sanitize.js";
|
|
11
|
+
/**
|
|
12
|
+
* Check whether a remote channel is configured without triggering any
|
|
13
|
+
* side effects (no HTTP requests, no prompt records). Used by the race
|
|
14
|
+
* logic to decide routing before committing to a remote dispatch.
|
|
15
|
+
*/
|
|
16
|
+
export function isRemoteConfigured() {
|
|
17
|
+
return resolveRemoteConfig() !== null;
|
|
18
|
+
}
|
|
11
19
|
export async function tryRemoteQuestions(questions, signal) {
|
|
12
20
|
const config = resolveRemoteConfig();
|
|
13
21
|
if (!config)
|
|
@@ -119,6 +119,16 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
119
119
|
let showingExitConfirm = false;
|
|
120
120
|
let exitCursor = 0; // 0 = keep going (default), 1 = end interview
|
|
121
121
|
let cachedLines;
|
|
122
|
+
// External cancellation (e.g. remote channel won the race)
|
|
123
|
+
if (opts.signal) {
|
|
124
|
+
const onAbort = () => done({ endInterview: false, answers: {} });
|
|
125
|
+
if (opts.signal.aborted) {
|
|
126
|
+
onAbort();
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
122
132
|
// Editor is created once; editorTheme comes from the design system
|
|
123
133
|
const editorRef = { current: null };
|
|
124
134
|
function getEditor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
CrKrzIIxk55witDF1eS0L
|
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"/_not-found/page": "/_not-found",
|
|
3
3
|
"/_global-error/page": "/_global-error",
|
|
4
|
+
"/api/boot/route": "/api/boot",
|
|
4
5
|
"/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
|
|
5
|
-
"/api/bridge-terminal/
|
|
6
|
-
"/api/captures/route": "/api/captures",
|
|
7
|
-
"/api/browse-directories/route": "/api/browse-directories",
|
|
6
|
+
"/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
|
|
8
7
|
"/api/dev-mode/route": "/api/dev-mode",
|
|
9
8
|
"/api/cleanup/route": "/api/cleanup",
|
|
10
9
|
"/api/doctor/route": "/api/doctor",
|
|
10
|
+
"/api/browse-directories/route": "/api/browse-directories",
|
|
11
11
|
"/api/export-data/route": "/api/export-data",
|
|
12
12
|
"/api/forensics/route": "/api/forensics",
|
|
13
|
-
"/api/
|
|
13
|
+
"/api/captures/route": "/api/captures",
|
|
14
14
|
"/api/git/route": "/api/git",
|
|
15
15
|
"/api/history/route": "/api/history",
|
|
16
16
|
"/api/hooks/route": "/api/hooks",
|
|
17
|
-
"/api/knowledge/route": "/api/knowledge",
|
|
18
17
|
"/api/inspect/route": "/api/inspect",
|
|
18
|
+
"/api/knowledge/route": "/api/knowledge",
|
|
19
19
|
"/api/live-state/route": "/api/live-state",
|
|
20
|
+
"/api/experimental/route": "/api/experimental",
|
|
21
|
+
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
20
22
|
"/api/notifications/route": "/api/notifications",
|
|
21
|
-
"/api/preferences/route": "/api/preferences",
|
|
22
|
-
"/api/files/route": "/api/files",
|
|
23
|
-
"/api/onboarding/route": "/api/onboarding",
|
|
24
23
|
"/api/recovery/route": "/api/recovery",
|
|
25
|
-
"/api/
|
|
24
|
+
"/api/preferences/route": "/api/preferences",
|
|
26
25
|
"/api/session/browser/route": "/api/session/browser",
|
|
26
|
+
"/api/projects/route": "/api/projects",
|
|
27
27
|
"/api/session/command/route": "/api/session/command",
|
|
28
|
+
"/api/onboarding/route": "/api/onboarding",
|
|
28
29
|
"/api/session/events/route": "/api/session/events",
|
|
29
30
|
"/api/session/manage/route": "/api/session/manage",
|
|
30
|
-
"/api/settings-data/route": "/api/settings-data",
|
|
31
|
-
"/api/skill-health/route": "/api/skill-health",
|
|
32
31
|
"/api/shutdown/route": "/api/shutdown",
|
|
32
|
+
"/api/settings-data/route": "/api/settings-data",
|
|
33
|
+
"/api/terminal/input/route": "/api/terminal/input",
|
|
33
34
|
"/api/steer/route": "/api/steer",
|
|
34
|
-
"/api/remote-questions/route": "/api/remote-questions",
|
|
35
35
|
"/api/switch-root/route": "/api/switch-root",
|
|
36
|
-
"/api/terminal/input/route": "/api/terminal/input",
|
|
37
36
|
"/api/terminal/resize/route": "/api/terminal/resize",
|
|
38
|
-
"/api/
|
|
37
|
+
"/api/skill-health/route": "/api/skill-health",
|
|
39
38
|
"/api/terminal/sessions/route": "/api/terminal/sessions",
|
|
40
|
-
"/api/visualizer/route": "/api/visualizer",
|
|
41
39
|
"/api/terminal/upload/route": "/api/terminal/upload",
|
|
42
|
-
"/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
|
|
43
|
-
"/api/update/route": "/api/update",
|
|
44
40
|
"/api/terminal/stream/route": "/api/terminal/stream",
|
|
41
|
+
"/api/visualizer/route": "/api/visualizer",
|
|
42
|
+
"/api/update/route": "/api/update",
|
|
45
43
|
"/api/undo/route": "/api/undo",
|
|
44
|
+
"/api/remote-questions/route": "/api/remote-questions",
|
|
45
|
+
"/api/files/route": "/api/files",
|
|
46
46
|
"/page": "/"
|
|
47
47
|
}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
],
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"lowPriorityFiles": [
|
|
7
|
-
"static/
|
|
8
|
-
"static/
|
|
7
|
+
"static/CrKrzIIxk55witDF1eS0L/_buildManifest.js",
|
|
8
|
+
"static/CrKrzIIxk55witDF1eS0L/_ssgManifest.js"
|
|
9
9
|
],
|
|
10
10
|
"rootMainFiles": [
|
|
11
|
-
"static/chunks/webpack-
|
|
11
|
+
"static/chunks/webpack-65f0501b197d1c49.js",
|
|
12
12
|
"static/chunks/4bd1b696-e5d7c65570c947b7.js",
|
|
13
13
|
"static/chunks/3794-337d1ca25ad99a89.js",
|
|
14
14
|
"static/chunks/main-app-fdab67f7802d7832.js"
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"dynamicRoutes": {},
|
|
79
79
|
"notFoundRoutes": [],
|
|
80
80
|
"preview": {
|
|
81
|
-
"previewModeId": "
|
|
82
|
-
"previewModeSigningKey": "
|
|
83
|
-
"previewModeEncryptionKey": "
|
|
81
|
+
"previewModeId": "a1f1a3b82739c8573081cf79eb9b55b9",
|
|
82
|
+
"previewModeSigningKey": "45cb31c58e849530252dabd187be0cc92f253cb3e7ca4c9a39222d41e8d6efb1",
|
|
83
|
+
"previewModeEncryptionKey": "c6731bbad9a37e7296023fa699e941d252ac6a8b4cce4f4e1f313f5cd517740e"
|
|
84
84
|
}
|
|
85
85
|
}
|