gsd-pi 2.82.0 → 3.0.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/README.md +51 -32
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +19 -6
- package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
- package/dist/resources/extensions/gsd/auto/phases.js +90 -31
- package/dist/resources/extensions/gsd/auto/session.js +4 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
- package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
- package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -14
- package/dist/resources/extensions/gsd/auto-verification.js +45 -26
- package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
- package/dist/resources/extensions/gsd/auto.js +178 -63
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -2
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +3 -3
- package/dist/resources/extensions/gsd/git-service.js +45 -3
- package/dist/resources/extensions/gsd/gsd-db.js +21 -6
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +101 -116
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
- package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +3 -3
- package/dist/resources/extensions/gsd/status-guards.js +11 -0
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +68 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- 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 +5 -5
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- 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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- 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 +4 -5
- 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 +2 -5
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -7
- 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 +4 -7
- 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 +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- 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/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/package.json +6 -5
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +14 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- 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 +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +5 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +6 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +22 -6
- package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
- package/src/resources/extensions/gsd/auto/phases.ts +104 -38
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
- package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -12
- package/src/resources/extensions/gsd/auto-verification.ts +58 -36
- package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
- package/src/resources/extensions/gsd/auto.ts +187 -61
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -2
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +3 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +3 -3
- package/src/resources/extensions/gsd/git-service.ts +51 -4
- package/src/resources/extensions/gsd/gsd-db.ts +21 -6
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +134 -133
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
- package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +3 -3
- package/src/resources/extensions/gsd/status-guards.ts +13 -0
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +78 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Split into two functions called sequentially by auto-loop with
|
|
9
9
|
* the verification gate between them:
|
|
10
|
-
* 1. postUnitPreVerification() —
|
|
11
|
-
* 2. postUnitPostVerification() — DB dual-write, hooks, triage, quick-tasks
|
|
10
|
+
* 1. postUnitPreVerification() — closeout git for non-task units, doctor, state rebuild, worktree sync, artifact verification
|
|
11
|
+
* 2. postUnitPostVerification() — post-verified task git, DB dual-write, hooks, triage, quick-tasks
|
|
12
12
|
*
|
|
13
13
|
* Extracted from the pre-loop agent_end handler in auto.ts.
|
|
14
14
|
*/
|
|
@@ -41,12 +41,13 @@ import {
|
|
|
41
41
|
resolveExpectedArtifactPath,
|
|
42
42
|
writeBlockerPlaceholder,
|
|
43
43
|
diagnoseExpectedArtifact,
|
|
44
|
+
diagnoseWorktreeIntegrityFailure,
|
|
44
45
|
} from "./auto-recovery.js";
|
|
45
46
|
import { regenerateIfMissing } from "./workflow-projections.js";
|
|
46
47
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
47
48
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
48
49
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
49
|
-
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
50
|
+
import { isDbAvailable, getDbPath, refreshOpenDatabaseFromDisk, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
50
51
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
51
52
|
import { consumeSignal } from "./session-status-io.js";
|
|
52
53
|
import {
|
|
@@ -62,8 +63,7 @@ import { runSafely } from "./auto-utils.js";
|
|
|
62
63
|
import type { AutoSession, SidecarItem } from "./auto/session.js";
|
|
63
64
|
import { getEvidence, clearEvidenceFromDisk } from "./safety/evidence-collector.js";
|
|
64
65
|
import { validateFileChanges } from "./safety/file-change-validator.js";
|
|
65
|
-
|
|
66
|
-
// import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
|
|
66
|
+
import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
|
|
67
67
|
import { validateContent } from "./safety/content-validator.js";
|
|
68
68
|
import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
|
|
69
69
|
import { resolveExpectedArtifactPath as resolveArtifactForContent } from "./auto-artifact-paths.js";
|
|
@@ -164,7 +164,7 @@ async function buildTaskCommitContextForUnit(
|
|
|
164
164
|
sliceTitle: stripKnownIdPrefix(slice?.title, sid),
|
|
165
165
|
oneLiner: summary?.oneLiner || task?.one_liner || undefined,
|
|
166
166
|
keyFiles:
|
|
167
|
-
summary?.frontmatter.key_files?.filter(f => !f.includes("{{")) ??
|
|
167
|
+
summary?.frontmatter.key_files?.filter(f => !f.includes("{{") && f.trim() !== "(none)") ??
|
|
168
168
|
task?.key_files ??
|
|
169
169
|
undefined,
|
|
170
170
|
issueNumber: ghIssueNumber,
|
|
@@ -222,6 +222,10 @@ export function _shouldDispatchQuickTaskForTest(
|
|
|
222
222
|
state.currentUnit.type !== "quick-task";
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
+
export function shouldDeferCloseoutGitAction(unitType: string): boolean {
|
|
226
|
+
return unitType === "execute-task";
|
|
227
|
+
}
|
|
228
|
+
|
|
225
229
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
226
230
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
227
231
|
* next actual task commit via `smartStage()`. */
|
|
@@ -367,7 +371,7 @@ export function detectRogueFileWrites(
|
|
|
367
371
|
export const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
|
|
368
372
|
|
|
369
373
|
export const STEP_COMPLETE_FALLBACK_MESSAGE =
|
|
370
|
-
"Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
|
|
374
|
+
"Step complete. Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).";
|
|
371
375
|
|
|
372
376
|
export function buildStepCompleteMessage(nextState: import("./types.js").GSDState): string {
|
|
373
377
|
if (nextState.phase === "complete") {
|
|
@@ -375,7 +379,24 @@ export function buildStepCompleteMessage(nextState: import("./types.js").GSDStat
|
|
|
375
379
|
}
|
|
376
380
|
const next = describeNextUnit(nextState);
|
|
377
381
|
return `Step complete. Next: ${next.label}\n`
|
|
378
|
-
+ `Run /clear, then /gsd to continue (or /gsd auto to run continuously).`;
|
|
382
|
+
+ `Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).`;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Decide whether step mode should stop at the step wizard after a unit finishes.
|
|
387
|
+
*
|
|
388
|
+
* @param currentUnitType The just-finished unit type, such as "execute-task" or
|
|
389
|
+
* "complete-milestone"; may be null/undefined when no current unit is known.
|
|
390
|
+
* @param phaseAfterUnit The freshly derived next phase, such as "executing" or
|
|
391
|
+
* "complete"; may be null/undefined if state derivation failed.
|
|
392
|
+
* @returns true to show the step wizard; false to keep the loop running so
|
|
393
|
+
* terminal milestone completion can reach the merge/finalization path.
|
|
394
|
+
*/
|
|
395
|
+
export function shouldReturnStepWizardAfterUnit(
|
|
396
|
+
currentUnitType: string | null | undefined,
|
|
397
|
+
phaseAfterUnit: string | null | undefined,
|
|
398
|
+
): boolean {
|
|
399
|
+
return currentUnitType !== "complete-milestone" && phaseAfterUnit !== "complete";
|
|
379
400
|
}
|
|
380
401
|
|
|
381
402
|
export interface PreVerificationOpts {
|
|
@@ -410,6 +431,11 @@ function artifactValidationKind(unitType: string): "project" | "requirements" |
|
|
|
410
431
|
}
|
|
411
432
|
|
|
412
433
|
function describeArtifactVerificationFailure(unitType: string, unitId: string, basePath: string): string {
|
|
434
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(basePath);
|
|
435
|
+
if (worktreeFailure) {
|
|
436
|
+
return `${worktreeFailure} Unit: ${unitType} ${unitId}.`;
|
|
437
|
+
}
|
|
438
|
+
|
|
413
439
|
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
414
440
|
if (!artifactPath) {
|
|
415
441
|
return `Artifact verification failed: ${unitType} "${unitId}" has no resolvable artifact path.`;
|
|
@@ -466,6 +492,164 @@ export async function autoCommitUnit(
|
|
|
466
492
|
}
|
|
467
493
|
}
|
|
468
494
|
|
|
495
|
+
/**
|
|
496
|
+
* Execute the turn-level git action (commit, snapshot, or status-only).
|
|
497
|
+
*
|
|
498
|
+
* @param opts.softFailure - Defaults to false. When true, retry git failures,
|
|
499
|
+
* warn, and continue without pausing auto-mode; use for best-effort deferred
|
|
500
|
+
* closeout work where a git failure should not block the run.
|
|
501
|
+
*/
|
|
502
|
+
async function runCloseoutGitAction(
|
|
503
|
+
pctx: PostUnitContext,
|
|
504
|
+
unit: NonNullable<AutoSession["currentUnit"]>,
|
|
505
|
+
opts?: { softFailure?: boolean },
|
|
506
|
+
): Promise<"continue" | "dispatched"> {
|
|
507
|
+
const { s, ctx, pi, pauseAuto } = pctx;
|
|
508
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
509
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
510
|
+
const turnAction: TurnGitActionMode = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
|
|
511
|
+
const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
|
|
512
|
+
const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
|
|
513
|
+
|
|
514
|
+
s.lastGitActionFailure = null;
|
|
515
|
+
s.lastGitActionStatus = null;
|
|
516
|
+
|
|
517
|
+
try {
|
|
518
|
+
let taskContext: TaskCommitContext | undefined;
|
|
519
|
+
|
|
520
|
+
if (turnAction === "commit" && unit.type === "execute-task") {
|
|
521
|
+
taskContext = await buildTaskCommitContextForUnit(s.basePath, unit.id);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
525
|
+
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
526
|
+
// `false` result causes autoCommit to skip staging entirely.
|
|
527
|
+
_resetHasChangesCache();
|
|
528
|
+
|
|
529
|
+
const skipLifecycleCommit =
|
|
530
|
+
turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(unit.type);
|
|
531
|
+
|
|
532
|
+
if (skipLifecycleCommit) {
|
|
533
|
+
debugLog("postUnit", {
|
|
534
|
+
phase: "git-action-skipped",
|
|
535
|
+
reason: "lifecycle-only-unit",
|
|
536
|
+
unitType: unit.type,
|
|
537
|
+
unitId: unit.id,
|
|
538
|
+
});
|
|
539
|
+
} else {
|
|
540
|
+
const maxAttempts = opts?.softFailure ? 3 : 1;
|
|
541
|
+
let gitResult = runTurnGitAction({
|
|
542
|
+
basePath: s.basePath,
|
|
543
|
+
action: turnAction,
|
|
544
|
+
unitType: unit.type,
|
|
545
|
+
unitId: unit.id,
|
|
546
|
+
taskContext,
|
|
547
|
+
});
|
|
548
|
+
for (let attempt = 1; gitResult.status === "failed" && attempt < maxAttempts; attempt++) {
|
|
549
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
|
|
550
|
+
gitResult = runTurnGitAction({
|
|
551
|
+
basePath: s.basePath,
|
|
552
|
+
action: turnAction,
|
|
553
|
+
unitType: unit.type,
|
|
554
|
+
unitId: unit.id,
|
|
555
|
+
taskContext,
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
if (uokFlags.gitops) {
|
|
560
|
+
writeTurnGitTransaction({
|
|
561
|
+
basePath: s.basePath,
|
|
562
|
+
traceId,
|
|
563
|
+
turnId,
|
|
564
|
+
unitType: unit.type,
|
|
565
|
+
unitId: unit.id,
|
|
566
|
+
stage: "publish",
|
|
567
|
+
action: turnAction,
|
|
568
|
+
push: uokFlags.gitopsTurnPush,
|
|
569
|
+
status: gitResult.status,
|
|
570
|
+
error: gitResult.error,
|
|
571
|
+
metadata: {
|
|
572
|
+
dirty: gitResult.dirty,
|
|
573
|
+
commitMessage: gitResult.commitMessage,
|
|
574
|
+
snapshotLabel: gitResult.snapshotLabel,
|
|
575
|
+
},
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
if (gitResult.status === "failed") {
|
|
580
|
+
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
581
|
+
s.lastGitActionStatus = "failed";
|
|
582
|
+
if (uokFlags.gitops && uokFlags.gates) {
|
|
583
|
+
const parsed = parseUnitId(unit.id);
|
|
584
|
+
const gateRunner = new UokGateRunner();
|
|
585
|
+
gateRunner.register({
|
|
586
|
+
id: "closeout-git-action",
|
|
587
|
+
type: "closeout",
|
|
588
|
+
execute: async () => ({
|
|
589
|
+
outcome: "fail",
|
|
590
|
+
failureClass: "git",
|
|
591
|
+
rationale: `turn git action "${turnAction}" failed`,
|
|
592
|
+
findings: gitResult.error ?? "unknown git failure",
|
|
593
|
+
}),
|
|
594
|
+
});
|
|
595
|
+
await gateRunner.run("closeout-git-action", {
|
|
596
|
+
basePath: s.basePath,
|
|
597
|
+
traceId,
|
|
598
|
+
turnId,
|
|
599
|
+
milestoneId: parsed.milestone ?? undefined,
|
|
600
|
+
sliceId: parsed.slice ?? undefined,
|
|
601
|
+
taskId: parsed.task ?? undefined,
|
|
602
|
+
unitType: unit.type,
|
|
603
|
+
unitId: unit.id,
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
|
|
608
|
+
ctx.ui.notify(failureMsg, opts?.softFailure ? "warning" : "error");
|
|
609
|
+
debugLog("postUnit", {
|
|
610
|
+
phase: opts?.softFailure ? "git-action-failed-soft" : "git-action-failed-blocking",
|
|
611
|
+
action: turnAction,
|
|
612
|
+
error: gitResult.error ?? "unknown error",
|
|
613
|
+
});
|
|
614
|
+
if (opts?.softFailure) {
|
|
615
|
+
return "continue";
|
|
616
|
+
}
|
|
617
|
+
await pauseAuto(ctx, pi);
|
|
618
|
+
return "dispatched";
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
s.lastGitActionStatus = "ok";
|
|
622
|
+
|
|
623
|
+
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
624
|
+
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
625
|
+
} else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
626
|
+
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
} catch (e) {
|
|
630
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
631
|
+
s.lastGitActionFailure = message;
|
|
632
|
+
s.lastGitActionStatus = "failed";
|
|
633
|
+
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
634
|
+
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, opts?.softFailure ? "warning" : "error");
|
|
635
|
+
if (opts?.softFailure) {
|
|
636
|
+
return "continue";
|
|
637
|
+
}
|
|
638
|
+
if (uokFlags.gitops) {
|
|
639
|
+
await pauseAuto(ctx, pi);
|
|
640
|
+
return "dispatched";
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
// GitHub sync (non-blocking, opt-in)
|
|
645
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
646
|
+
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
647
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
648
|
+
});
|
|
649
|
+
|
|
650
|
+
return "continue";
|
|
651
|
+
}
|
|
652
|
+
|
|
469
653
|
/**
|
|
470
654
|
* Pre-verification processing: parallel worker signal check, cache invalidation,
|
|
471
655
|
* auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
|
|
@@ -476,7 +660,7 @@ export async function autoCommitUnit(
|
|
|
476
660
|
* - "retry" — artifact verification failed, s.pendingVerificationRetry set for loop re-iteration
|
|
477
661
|
*/
|
|
478
662
|
export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreVerificationOpts): Promise<"dispatched" | "continue" | "retry"> {
|
|
479
|
-
const { s, ctx, pi,
|
|
663
|
+
const { s, ctx, pi, stopAuto, pauseAuto } = pctx;
|
|
480
664
|
|
|
481
665
|
// ── Parallel worker signal check ──
|
|
482
666
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
@@ -502,135 +686,30 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
502
686
|
await new Promise(r => setTimeout(r, 100));
|
|
503
687
|
}
|
|
504
688
|
|
|
505
|
-
const
|
|
506
|
-
|
|
689
|
+
const dbPath = getDbPath();
|
|
690
|
+
if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
|
|
691
|
+
const refreshed = refreshOpenDatabaseFromDisk();
|
|
692
|
+
if (!refreshed) {
|
|
693
|
+
logWarning("db", "post-unit database refresh failed; derived state may be stale");
|
|
694
|
+
}
|
|
695
|
+
}
|
|
507
696
|
|
|
508
697
|
// Turn-level git action (commit | snapshot | status-only)
|
|
509
698
|
if (s.currentUnit) {
|
|
510
699
|
const unit = s.currentUnit;
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
if (
|
|
520
|
-
taskContext = await buildTaskCommitContextForUnit(s.basePath, s.currentUnit.id);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
524
|
-
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
525
|
-
// `false` result causes autoCommit to skip staging entirely, leaving
|
|
526
|
-
// code files only in the working tree where they are destroyed by
|
|
527
|
-
// `git worktree remove --force` during teardown.
|
|
528
|
-
_resetHasChangesCache();
|
|
529
|
-
|
|
530
|
-
const skipLifecycleCommit =
|
|
531
|
-
turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type);
|
|
532
|
-
|
|
533
|
-
if (skipLifecycleCommit) {
|
|
534
|
-
debugLog("postUnit", {
|
|
535
|
-
phase: "git-action-skipped",
|
|
536
|
-
reason: "lifecycle-only-unit",
|
|
537
|
-
unitType: s.currentUnit.type,
|
|
538
|
-
unitId: s.currentUnit.id,
|
|
539
|
-
});
|
|
540
|
-
} else {
|
|
541
|
-
const gitResult = runTurnGitAction({
|
|
542
|
-
basePath: s.basePath,
|
|
543
|
-
action: turnAction,
|
|
544
|
-
unitType: s.currentUnit.type,
|
|
545
|
-
unitId: s.currentUnit.id,
|
|
546
|
-
taskContext,
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
if (uokFlags.gitops) {
|
|
550
|
-
writeTurnGitTransaction({
|
|
551
|
-
basePath: s.basePath,
|
|
552
|
-
traceId,
|
|
553
|
-
turnId,
|
|
554
|
-
unitType: unit.type,
|
|
555
|
-
unitId: unit.id,
|
|
556
|
-
stage: "publish",
|
|
557
|
-
action: turnAction,
|
|
558
|
-
push: uokFlags.gitopsTurnPush,
|
|
559
|
-
status: gitResult.status,
|
|
560
|
-
error: gitResult.error,
|
|
561
|
-
metadata: {
|
|
562
|
-
dirty: gitResult.dirty,
|
|
563
|
-
commitMessage: gitResult.commitMessage,
|
|
564
|
-
snapshotLabel: gitResult.snapshotLabel,
|
|
565
|
-
},
|
|
566
|
-
});
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
if (gitResult.status === "failed") {
|
|
570
|
-
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
571
|
-
s.lastGitActionStatus = "failed";
|
|
572
|
-
if (uokFlags.gitops && uokFlags.gates) {
|
|
573
|
-
const parsed = parseUnitId(unit.id);
|
|
574
|
-
const gateRunner = new UokGateRunner();
|
|
575
|
-
gateRunner.register({
|
|
576
|
-
id: "closeout-git-action",
|
|
577
|
-
type: "closeout",
|
|
578
|
-
execute: async () => ({
|
|
579
|
-
outcome: "fail",
|
|
580
|
-
failureClass: "git",
|
|
581
|
-
rationale: `turn git action "${turnAction}" failed`,
|
|
582
|
-
findings: gitResult.error ?? "unknown git failure",
|
|
583
|
-
}),
|
|
584
|
-
});
|
|
585
|
-
await gateRunner.run("closeout-git-action", {
|
|
586
|
-
basePath: s.basePath,
|
|
587
|
-
traceId,
|
|
588
|
-
turnId,
|
|
589
|
-
milestoneId: parsed.milestone ?? undefined,
|
|
590
|
-
sliceId: parsed.slice ?? undefined,
|
|
591
|
-
taskId: parsed.task ?? undefined,
|
|
592
|
-
unitType: unit.type,
|
|
593
|
-
unitId: unit.id,
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
|
|
598
|
-
ctx.ui.notify(failureMsg, "error");
|
|
599
|
-
debugLog("postUnit", {
|
|
600
|
-
phase: "git-action-failed-blocking",
|
|
601
|
-
action: turnAction,
|
|
602
|
-
error: gitResult.error ?? "unknown error",
|
|
603
|
-
});
|
|
604
|
-
await pauseAuto(ctx, pi);
|
|
605
|
-
return "dispatched";
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
s.lastGitActionStatus = "ok";
|
|
609
|
-
|
|
610
|
-
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
611
|
-
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
612
|
-
} else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
613
|
-
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
} catch (e) {
|
|
617
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
618
|
-
s.lastGitActionFailure = message;
|
|
619
|
-
s.lastGitActionStatus = "failed";
|
|
620
|
-
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
621
|
-
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, uokFlags.gitops ? "error" : "warning");
|
|
622
|
-
if (uokFlags.gitops) {
|
|
623
|
-
await pauseAuto(ctx, pi);
|
|
700
|
+
if (shouldDeferCloseoutGitAction(unit.type)) {
|
|
701
|
+
debugLog("postUnit", {
|
|
702
|
+
phase: "git-action-deferred-until-verification",
|
|
703
|
+
unitType: unit.type,
|
|
704
|
+
unitId: unit.id,
|
|
705
|
+
});
|
|
706
|
+
} else {
|
|
707
|
+
const gitActionResult = await runCloseoutGitAction(pctx, unit);
|
|
708
|
+
if (gitActionResult === "dispatched") {
|
|
624
709
|
return "dispatched";
|
|
625
710
|
}
|
|
626
711
|
}
|
|
627
712
|
|
|
628
|
-
// GitHub sync (non-blocking, opt-in)
|
|
629
|
-
await runSafely("postUnit", "github-sync", async () => {
|
|
630
|
-
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
631
|
-
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
632
|
-
});
|
|
633
|
-
|
|
634
713
|
// Prune dead bg-shell processes
|
|
635
714
|
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
636
715
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
@@ -866,7 +945,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
866
945
|
if (safetyConfig.enabled) {
|
|
867
946
|
const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
|
|
868
947
|
|
|
869
|
-
// File change validation (execute-task only, after
|
|
948
|
+
// File change validation (execute-task only, after unit execution)
|
|
870
949
|
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid && isDbAvailable()) {
|
|
871
950
|
try {
|
|
872
951
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
@@ -902,15 +981,42 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
902
981
|
const bashCalls = actual.filter(e => e.kind === "bash");
|
|
903
982
|
if (sMid && sSid && sTid && isDbAvailable()) {
|
|
904
983
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
"
|
|
913
|
-
);
|
|
984
|
+
if (taskRow?.status === "complete") {
|
|
985
|
+
const claimedEvidence: ClaimedEvidence[] = getVerificationEvidence(sMid, sSid, sTid)
|
|
986
|
+
.map((row) => ({
|
|
987
|
+
command: row.command,
|
|
988
|
+
exitCode: row.exit_code,
|
|
989
|
+
verdict: row.verdict,
|
|
990
|
+
}))
|
|
991
|
+
.filter((row) => typeof row.command === "string" && row.command.trim().length > 0);
|
|
992
|
+
const mismatches = crossReferenceEvidence(claimedEvidence, actual);
|
|
993
|
+
|
|
994
|
+
for (const mismatch of mismatches) {
|
|
995
|
+
const logMessage = `evidence-xref: ${mismatch.reason}`;
|
|
996
|
+
if (mismatch.severity === "error") {
|
|
997
|
+
logError("safety", logMessage);
|
|
998
|
+
} else {
|
|
999
|
+
logWarning("safety", logMessage);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
if (claimedEvidence.length > 0 && bashCalls.length === 0) {
|
|
1004
|
+
logWarning("safety", "task claimed verification command evidence but no execution tool calls were recorded");
|
|
1005
|
+
ctx.ui.notify(
|
|
1006
|
+
`Safety: task ${sTid} claimed command evidence but no execution tool calls were recorded`,
|
|
1007
|
+
"warning",
|
|
1008
|
+
);
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
|
|
1012
|
+
if (blockingMismatch) {
|
|
1013
|
+
ctx.ui.notify(
|
|
1014
|
+
`Safety: task ${sTid} claimed passing verification that failed in recorded execution`,
|
|
1015
|
+
"error",
|
|
1016
|
+
);
|
|
1017
|
+
await pauseAuto(ctx, pi);
|
|
1018
|
+
return "dispatched";
|
|
1019
|
+
}
|
|
914
1020
|
}
|
|
915
1021
|
}
|
|
916
1022
|
} catch (e) {
|
|
@@ -1079,10 +1185,28 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1079
1185
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1080
1186
|
writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
|
|
1081
1187
|
ctx.ui.notify(
|
|
1082
|
-
`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)
|
|
1188
|
+
`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)`,
|
|
1083
1189
|
"warning",
|
|
1084
1190
|
);
|
|
1085
1191
|
// Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
|
|
1192
|
+
} else if (!triggerArtifactVerified && diagnoseWorktreeIntegrityFailure(s.basePath)) {
|
|
1193
|
+
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
1194
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(s.basePath)!;
|
|
1195
|
+
s.pendingVerificationRetry = null;
|
|
1196
|
+
s.verificationRetryCount.delete(retryKey);
|
|
1197
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1198
|
+
debugLog("postUnit", {
|
|
1199
|
+
phase: "worktree-integrity-failure",
|
|
1200
|
+
unitType: s.currentUnit.type,
|
|
1201
|
+
unitId: s.currentUnit.id,
|
|
1202
|
+
basePath: s.basePath,
|
|
1203
|
+
});
|
|
1204
|
+
ctx.ui.notify(
|
|
1205
|
+
`${worktreeFailure} Retry ${s.currentUnit.id} after repair.`,
|
|
1206
|
+
"error",
|
|
1207
|
+
);
|
|
1208
|
+
await pauseAuto(ctx, pi);
|
|
1209
|
+
return "dispatched";
|
|
1086
1210
|
} else if (!triggerArtifactVerified && !isDbAvailable()) {
|
|
1087
1211
|
debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
|
|
1088
1212
|
const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
@@ -1169,6 +1293,13 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
1169
1293
|
const { s, ctx, pi, buildSnapshotOpts, lockBase, stopAuto, pauseAuto, updateProgressWidget } = pctx;
|
|
1170
1294
|
|
|
1171
1295
|
if (s.currentUnit) {
|
|
1296
|
+
if (shouldDeferCloseoutGitAction(s.currentUnit.type)) {
|
|
1297
|
+
const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit, { softFailure: true });
|
|
1298
|
+
if (gitActionResult === "dispatched") {
|
|
1299
|
+
return "stopped";
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1172
1303
|
try {
|
|
1173
1304
|
const codebasePrefs = loadEffectiveGSDPreferences()?.preferences?.codebase;
|
|
1174
1305
|
const refresh = ensureCodebaseMapFresh(
|
|
@@ -1608,17 +1739,21 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
1608
1739
|
}
|
|
1609
1740
|
|
|
1610
1741
|
// Step mode → show wizard instead of dispatch.
|
|
1611
|
-
// Without this notify(), /gsd
|
|
1612
|
-
//
|
|
1742
|
+
// Without this notify(), /gsd next finishes a unit and silently exits the
|
|
1743
|
+
// loop, leaving the user with no next-step command.
|
|
1613
1744
|
if (s.stepMode) {
|
|
1745
|
+
let phaseAfterUnit: string | null = null;
|
|
1614
1746
|
try {
|
|
1615
1747
|
const nextState = await deriveState(s.canonicalProjectRoot);
|
|
1748
|
+
phaseAfterUnit = nextState.phase;
|
|
1616
1749
|
ctx.ui.notify(buildStepCompleteMessage(nextState), "info");
|
|
1617
1750
|
} catch (e) {
|
|
1618
1751
|
debugLog("postUnit", { phase: "step-wizard-notify", error: String(e) });
|
|
1619
1752
|
ctx.ui.notify(STEP_COMPLETE_FALLBACK_MESSAGE, "info");
|
|
1620
1753
|
}
|
|
1621
|
-
return
|
|
1754
|
+
return shouldReturnStepWizardAfterUnit(s.currentUnit?.type, phaseAfterUnit)
|
|
1755
|
+
? "step-wizard"
|
|
1756
|
+
: "continue";
|
|
1622
1757
|
}
|
|
1623
1758
|
|
|
1624
1759
|
return "continue";
|
|
@@ -806,14 +806,22 @@ export async function inlineDecisionsFromDb(
|
|
|
806
806
|
try {
|
|
807
807
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
808
808
|
if (isDbAvailable()) {
|
|
809
|
-
|
|
809
|
+
// ADR-013 Phase 6 cutover (Stage 1): read decisions from the `memories`
|
|
810
|
+
// table. Both `queryDecisions` (legacy) and `queryDecisionsFromMemories`
|
|
811
|
+
// return identical Decision[] for active rows once Phase 5 dual-write is
|
|
812
|
+
// caught up. Switching the read here lets the destructive Phase 6 step
|
|
813
|
+
// (#5755) retire the legacy `decisions` table without changing prompt
|
|
814
|
+
// contents. Projection regen (`DECISIONS.md`) still sources from the
|
|
815
|
+
// legacy table — that switch lands separately to handle superseded
|
|
816
|
+
// history cleanly.
|
|
817
|
+
const { queryDecisionsFromMemories, formatDecisionsForPrompt } = await import("./context-store.js");
|
|
810
818
|
|
|
811
819
|
// First query: try with both milestoneId and scope (if scope provided)
|
|
812
|
-
let decisions =
|
|
820
|
+
let decisions = queryDecisionsFromMemories({ milestoneId, scope });
|
|
813
821
|
|
|
814
822
|
// Cascade: if empty AND scope was provided, retry without scope
|
|
815
823
|
if (decisions.length === 0 && scope) {
|
|
816
|
-
decisions =
|
|
824
|
+
decisions = queryDecisionsFromMemories({ milestoneId });
|
|
817
825
|
}
|
|
818
826
|
|
|
819
827
|
if (decisions.length > 0) {
|
|
@@ -3189,7 +3197,7 @@ export async function buildParallelResearchSlicesPrompt(
|
|
|
3189
3197
|
subagentSections.push([
|
|
3190
3198
|
`### ${slice.id}: ${slice.title}`,
|
|
3191
3199
|
"",
|
|
3192
|
-
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`
|
|
3200
|
+
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`scout\`):`,
|
|
3193
3201
|
"",
|
|
3194
3202
|
"```",
|
|
3195
3203
|
slicePrompt,
|
|
@@ -3271,7 +3279,7 @@ export async function buildGateEvaluatePrompt(
|
|
|
3271
3279
|
subagentSections.push([
|
|
3272
3280
|
`### ${def.id}: ${def.question}`,
|
|
3273
3281
|
"",
|
|
3274
|
-
`Use this as the prompt for a \`subagent\` call${modelSuffix}:`,
|
|
3282
|
+
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`tester\`):`,
|
|
3275
3283
|
"",
|
|
3276
3284
|
"```",
|
|
3277
3285
|
subPrompt,
|