gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.8b8d129d7
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 +93 -18
- package/dist/cli.js +20 -9
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- 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 +110 -37
- package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -1
- package/dist/resources/extensions/gsd/auto/phases.js +97 -38
- package/dist/resources/extensions/gsd/auto/session.js +6 -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 +278 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -14
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +102 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
- package/dist/resources/extensions/gsd/auto.js +98 -54
- 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 +5 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- 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 +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- 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/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-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
- 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 +8 -3
- package/dist/resources/extensions/gsd/git-service.js +138 -10
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- 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 +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- 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/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
- package/dist/resources/extensions/gsd/preferences.js +2 -0
- 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/forensics.md +3 -3
- 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/reactive-execute.md +1 -1
- 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/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
- 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 +14 -4
- package/dist/resources/extensions/gsd/status-guards.js +14 -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 +151 -15
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +36 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -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/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- 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/resources/skills/forensics/SKILL.md +1 -1
- 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-8c10ec293ae0f1d5.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 +4 -4
- 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 +13 -4
- 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.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-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/package.json +1 -1
- 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/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/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.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/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/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.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/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/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- 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/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- 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/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/__tests__/tui.test.js +45 -2
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- 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 +106 -27
- 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/__tests__/tui.test.ts +59 -2
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +108 -27
- 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/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- 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 +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +111 -38
- package/src/resources/extensions/gsd/auto/orchestrator.ts +12 -1
- package/src/resources/extensions/gsd/auto/phases.ts +115 -49
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -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 +312 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -12
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +124 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
- package/src/resources/extensions/gsd/auto.ts +91 -42
- 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 +5 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- 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 +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- 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/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-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +1 -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 +7 -3
- package/src/resources/extensions/gsd/git-service.ts +166 -11
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- 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 +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- 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/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-types.ts +33 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- 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/forensics.md +3 -3
- 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/reactive-execute.md +1 -1
- 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/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
- 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 +15 -4
- package/src/resources/extensions/gsd/status-guards.ts +16 -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 +300 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +174 -8
- 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 +129 -6
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- 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/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -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 +32 -4
- 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/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-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -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 +68 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- 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/init-prefs-routing.test.ts +22 -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 +199 -2
- 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 +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -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 +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- 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.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 +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- 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 +105 -3
- 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 +59 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +70 -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/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/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
- 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 +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -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 +128 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -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/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -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 +172 -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 +51 -18
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -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/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -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/src/resources/skills/forensics/SKILL.md +1 -1
- 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-a16c7a7ecdf0c2cf.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/{YEvjuT-fsFfYQhDSWtueS → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → _kljR-_Miq_YV1IW0wpRO}/_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";
|
|
@@ -109,6 +109,18 @@ function formatPreExecutionCheckDetail(check: PreExecutionCheckJSON): string {
|
|
|
109
109
|
|
|
110
110
|
const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
|
|
111
111
|
const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
|
|
112
|
+
const GIT_ACTION_FAILURE_LOG_REL_PATH = ".gsd/git-action-failures.log";
|
|
113
|
+
|
|
114
|
+
function persistGitActionFailure(basePath: string, action: TurnGitActionMode, message: string): string {
|
|
115
|
+
const logPath = join(basePath, GIT_ACTION_FAILURE_LOG_REL_PATH);
|
|
116
|
+
const logDir = join(basePath, ".gsd");
|
|
117
|
+
const timestamp = new Date().toISOString();
|
|
118
|
+
const body = message.trim() || "unknown git failure";
|
|
119
|
+
const entry = `[${timestamp}] action=${action}\n${body}\n\n`;
|
|
120
|
+
mkdirSync(logDir, { recursive: true });
|
|
121
|
+
appendFileSync(logPath, entry, "utf-8");
|
|
122
|
+
return logPath;
|
|
123
|
+
}
|
|
112
124
|
|
|
113
125
|
function stripKnownIdPrefix(value: string | undefined | null, id: string): string | undefined {
|
|
114
126
|
const raw = String(value ?? "").trim();
|
|
@@ -164,7 +176,7 @@ async function buildTaskCommitContextForUnit(
|
|
|
164
176
|
sliceTitle: stripKnownIdPrefix(slice?.title, sid),
|
|
165
177
|
oneLiner: summary?.oneLiner || task?.one_liner || undefined,
|
|
166
178
|
keyFiles:
|
|
167
|
-
summary?.frontmatter.key_files?.filter(f => !f.includes("{{")) ??
|
|
179
|
+
summary?.frontmatter.key_files?.filter(f => !f.includes("{{") && f.trim() !== "(none)") ??
|
|
168
180
|
task?.key_files ??
|
|
169
181
|
undefined,
|
|
170
182
|
issueNumber: ghIssueNumber,
|
|
@@ -222,6 +234,10 @@ export function _shouldDispatchQuickTaskForTest(
|
|
|
222
234
|
state.currentUnit.type !== "quick-task";
|
|
223
235
|
}
|
|
224
236
|
|
|
237
|
+
export function shouldDeferCloseoutGitAction(unitType: string): boolean {
|
|
238
|
+
return unitType === "execute-task";
|
|
239
|
+
}
|
|
240
|
+
|
|
225
241
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
226
242
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
227
243
|
* next actual task commit via `smartStage()`. */
|
|
@@ -237,7 +253,7 @@ import {
|
|
|
237
253
|
unitVerb,
|
|
238
254
|
describeNextUnit,
|
|
239
255
|
} from "./auto-dashboard.js";
|
|
240
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
256
|
+
import { appendFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs";
|
|
241
257
|
import { join, relative } from "node:path";
|
|
242
258
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
243
259
|
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
@@ -367,7 +383,7 @@ export function detectRogueFileWrites(
|
|
|
367
383
|
export const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
|
|
368
384
|
|
|
369
385
|
export const STEP_COMPLETE_FALLBACK_MESSAGE =
|
|
370
|
-
"Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
|
|
386
|
+
"Step complete. Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).";
|
|
371
387
|
|
|
372
388
|
export function buildStepCompleteMessage(nextState: import("./types.js").GSDState): string {
|
|
373
389
|
if (nextState.phase === "complete") {
|
|
@@ -375,7 +391,24 @@ export function buildStepCompleteMessage(nextState: import("./types.js").GSDStat
|
|
|
375
391
|
}
|
|
376
392
|
const next = describeNextUnit(nextState);
|
|
377
393
|
return `Step complete. Next: ${next.label}\n`
|
|
378
|
-
+ `Run /clear, then /gsd to continue (or /gsd auto to run continuously).`;
|
|
394
|
+
+ `Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).`;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Decide whether step mode should stop at the step wizard after a unit finishes.
|
|
399
|
+
*
|
|
400
|
+
* @param currentUnitType The just-finished unit type, such as "execute-task" or
|
|
401
|
+
* "complete-milestone"; may be null/undefined when no current unit is known.
|
|
402
|
+
* @param phaseAfterUnit The freshly derived next phase, such as "executing" or
|
|
403
|
+
* "complete"; may be null/undefined if state derivation failed.
|
|
404
|
+
* @returns true to show the step wizard; false to keep the loop running so
|
|
405
|
+
* terminal milestone completion can reach the merge/finalization path.
|
|
406
|
+
*/
|
|
407
|
+
export function shouldReturnStepWizardAfterUnit(
|
|
408
|
+
currentUnitType: string | null | undefined,
|
|
409
|
+
phaseAfterUnit: string | null | undefined,
|
|
410
|
+
): boolean {
|
|
411
|
+
return currentUnitType !== "complete-milestone" && phaseAfterUnit !== "complete";
|
|
379
412
|
}
|
|
380
413
|
|
|
381
414
|
export interface PreVerificationOpts {
|
|
@@ -410,6 +443,11 @@ function artifactValidationKind(unitType: string): "project" | "requirements" |
|
|
|
410
443
|
}
|
|
411
444
|
|
|
412
445
|
function describeArtifactVerificationFailure(unitType: string, unitId: string, basePath: string): string {
|
|
446
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(basePath);
|
|
447
|
+
if (worktreeFailure) {
|
|
448
|
+
return `${worktreeFailure} Unit: ${unitType} ${unitId}.`;
|
|
449
|
+
}
|
|
450
|
+
|
|
413
451
|
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
414
452
|
if (!artifactPath) {
|
|
415
453
|
return `Artifact verification failed: ${unitType} "${unitId}" has no resolvable artifact path.`;
|
|
@@ -466,6 +504,178 @@ export async function autoCommitUnit(
|
|
|
466
504
|
}
|
|
467
505
|
}
|
|
468
506
|
|
|
507
|
+
/**
|
|
508
|
+
* Execute the turn-level git action (commit, snapshot, or status-only).
|
|
509
|
+
*
|
|
510
|
+
* @param opts.softFailure - Defaults to false. When true, retry git failures,
|
|
511
|
+
* warn, and continue without pausing auto-mode; use for best-effort deferred
|
|
512
|
+
* closeout work where a git failure should not block the run.
|
|
513
|
+
*/
|
|
514
|
+
async function runCloseoutGitAction(
|
|
515
|
+
pctx: PostUnitContext,
|
|
516
|
+
unit: NonNullable<AutoSession["currentUnit"]>,
|
|
517
|
+
opts?: { softFailure?: boolean },
|
|
518
|
+
): Promise<"continue" | "dispatched"> {
|
|
519
|
+
const { s, ctx, pi, pauseAuto } = pctx;
|
|
520
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
521
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
522
|
+
const turnAction: TurnGitActionMode = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
|
|
523
|
+
const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
|
|
524
|
+
const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
|
|
525
|
+
|
|
526
|
+
s.lastGitActionFailure = null;
|
|
527
|
+
s.lastGitActionStatus = null;
|
|
528
|
+
|
|
529
|
+
try {
|
|
530
|
+
let taskContext: TaskCommitContext | undefined;
|
|
531
|
+
let targetRepositories: string[] | undefined;
|
|
532
|
+
|
|
533
|
+
if (turnAction === "commit" && unit.type === "execute-task") {
|
|
534
|
+
taskContext = await buildTaskCommitContextForUnit(s.basePath, unit.id);
|
|
535
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unit.id);
|
|
536
|
+
if (mid && sid && tid && isDbAvailable()) {
|
|
537
|
+
targetRepositories = getTask(mid, sid, tid)?.target_repositories;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
542
|
+
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
543
|
+
// `false` result causes autoCommit to skip staging entirely.
|
|
544
|
+
_resetHasChangesCache();
|
|
545
|
+
|
|
546
|
+
const skipLifecycleCommit =
|
|
547
|
+
turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(unit.type);
|
|
548
|
+
|
|
549
|
+
if (skipLifecycleCommit) {
|
|
550
|
+
debugLog("postUnit", {
|
|
551
|
+
phase: "git-action-skipped",
|
|
552
|
+
reason: "lifecycle-only-unit",
|
|
553
|
+
unitType: unit.type,
|
|
554
|
+
unitId: unit.id,
|
|
555
|
+
});
|
|
556
|
+
} else {
|
|
557
|
+
const maxAttempts = opts?.softFailure ? 3 : 1;
|
|
558
|
+
let gitResult = runTurnGitAction({
|
|
559
|
+
basePath: s.basePath,
|
|
560
|
+
action: turnAction,
|
|
561
|
+
unitType: unit.type,
|
|
562
|
+
unitId: unit.id,
|
|
563
|
+
taskContext,
|
|
564
|
+
targetRepositories,
|
|
565
|
+
});
|
|
566
|
+
for (let attempt = 1; gitResult.status === "failed" && attempt < maxAttempts; attempt++) {
|
|
567
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
|
|
568
|
+
gitResult = runTurnGitAction({
|
|
569
|
+
basePath: s.basePath,
|
|
570
|
+
action: turnAction,
|
|
571
|
+
unitType: unit.type,
|
|
572
|
+
unitId: unit.id,
|
|
573
|
+
taskContext,
|
|
574
|
+
targetRepositories,
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
if (uokFlags.gitops) {
|
|
579
|
+
writeTurnGitTransaction({
|
|
580
|
+
basePath: s.basePath,
|
|
581
|
+
traceId,
|
|
582
|
+
turnId,
|
|
583
|
+
unitType: unit.type,
|
|
584
|
+
unitId: unit.id,
|
|
585
|
+
stage: "publish",
|
|
586
|
+
action: turnAction,
|
|
587
|
+
push: uokFlags.gitopsTurnPush,
|
|
588
|
+
status: gitResult.status,
|
|
589
|
+
error: gitResult.error,
|
|
590
|
+
metadata: {
|
|
591
|
+
dirty: gitResult.dirty,
|
|
592
|
+
dirtyRepositories: gitResult.dirtyRepositories,
|
|
593
|
+
commitMessage: gitResult.commitMessage,
|
|
594
|
+
commitMessages: gitResult.commitMessages,
|
|
595
|
+
commitErrors: gitResult.commitErrors,
|
|
596
|
+
skippedRepositories: gitResult.skippedRepositories,
|
|
597
|
+
snapshotLabel: gitResult.snapshotLabel,
|
|
598
|
+
},
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
if (gitResult.status === "failed") {
|
|
603
|
+
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
604
|
+
s.lastGitActionStatus = "failed";
|
|
605
|
+
const fullError = gitResult.error ?? "unknown error";
|
|
606
|
+
const failureLogPath = persistGitActionFailure(s.basePath, turnAction, fullError);
|
|
607
|
+
if (uokFlags.gitops && uokFlags.gates) {
|
|
608
|
+
const parsed = parseUnitId(unit.id);
|
|
609
|
+
const gateRunner = new UokGateRunner();
|
|
610
|
+
gateRunner.register({
|
|
611
|
+
id: "closeout-git-action",
|
|
612
|
+
type: "closeout",
|
|
613
|
+
execute: async () => ({
|
|
614
|
+
outcome: "fail",
|
|
615
|
+
failureClass: "git",
|
|
616
|
+
rationale: `turn git action "${turnAction}" failed`,
|
|
617
|
+
findings: fullError,
|
|
618
|
+
}),
|
|
619
|
+
});
|
|
620
|
+
await gateRunner.run("closeout-git-action", {
|
|
621
|
+
basePath: s.basePath,
|
|
622
|
+
traceId,
|
|
623
|
+
turnId,
|
|
624
|
+
milestoneId: parsed.milestone ?? undefined,
|
|
625
|
+
sliceId: parsed.slice ?? undefined,
|
|
626
|
+
taskId: parsed.task ?? undefined,
|
|
627
|
+
unitType: unit.type,
|
|
628
|
+
unitId: unit.id,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
const failureMsg = `Git ${turnAction} failed: ${fullError.split("\n")[0]} (full details: ${failureLogPath})`;
|
|
633
|
+
ctx.ui.notify(failureMsg, opts?.softFailure ? "warning" : "error");
|
|
634
|
+
debugLog("postUnit", {
|
|
635
|
+
phase: opts?.softFailure ? "git-action-failed-soft" : "git-action-failed-blocking",
|
|
636
|
+
action: turnAction,
|
|
637
|
+
error: fullError,
|
|
638
|
+
failureLogPath,
|
|
639
|
+
});
|
|
640
|
+
if (opts?.softFailure) {
|
|
641
|
+
return "continue";
|
|
642
|
+
}
|
|
643
|
+
await pauseAuto(ctx, pi);
|
|
644
|
+
return "dispatched";
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
s.lastGitActionStatus = "ok";
|
|
648
|
+
|
|
649
|
+
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
650
|
+
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
651
|
+
} else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
652
|
+
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
} catch (e) {
|
|
656
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
657
|
+
s.lastGitActionFailure = message;
|
|
658
|
+
s.lastGitActionStatus = "failed";
|
|
659
|
+
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
660
|
+
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, opts?.softFailure ? "warning" : "error");
|
|
661
|
+
if (opts?.softFailure) {
|
|
662
|
+
return "continue";
|
|
663
|
+
}
|
|
664
|
+
if (uokFlags.gitops) {
|
|
665
|
+
await pauseAuto(ctx, pi);
|
|
666
|
+
return "dispatched";
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// GitHub sync (non-blocking, opt-in)
|
|
671
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
672
|
+
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
673
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
return "continue";
|
|
677
|
+
}
|
|
678
|
+
|
|
469
679
|
/**
|
|
470
680
|
* Pre-verification processing: parallel worker signal check, cache invalidation,
|
|
471
681
|
* auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
|
|
@@ -476,7 +686,7 @@ export async function autoCommitUnit(
|
|
|
476
686
|
* - "retry" — artifact verification failed, s.pendingVerificationRetry set for loop re-iteration
|
|
477
687
|
*/
|
|
478
688
|
export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreVerificationOpts): Promise<"dispatched" | "continue" | "retry"> {
|
|
479
|
-
const { s, ctx, pi,
|
|
689
|
+
const { s, ctx, pi, stopAuto, pauseAuto } = pctx;
|
|
480
690
|
|
|
481
691
|
// ── Parallel worker signal check ──
|
|
482
692
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
@@ -502,135 +712,30 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
502
712
|
await new Promise(r => setTimeout(r, 100));
|
|
503
713
|
}
|
|
504
714
|
|
|
505
|
-
const
|
|
506
|
-
|
|
715
|
+
const dbPath = getDbPath();
|
|
716
|
+
if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
|
|
717
|
+
const refreshed = refreshOpenDatabaseFromDisk();
|
|
718
|
+
if (!refreshed) {
|
|
719
|
+
logWarning("db", "post-unit database refresh failed; derived state may be stale");
|
|
720
|
+
}
|
|
721
|
+
}
|
|
507
722
|
|
|
508
723
|
// Turn-level git action (commit | snapshot | status-only)
|
|
509
724
|
if (s.currentUnit) {
|
|
510
725
|
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);
|
|
726
|
+
if (shouldDeferCloseoutGitAction(unit.type)) {
|
|
727
|
+
debugLog("postUnit", {
|
|
728
|
+
phase: "git-action-deferred-until-verification",
|
|
729
|
+
unitType: unit.type,
|
|
730
|
+
unitId: unit.id,
|
|
731
|
+
});
|
|
732
|
+
} else {
|
|
733
|
+
const gitActionResult = await runCloseoutGitAction(pctx, unit);
|
|
734
|
+
if (gitActionResult === "dispatched") {
|
|
624
735
|
return "dispatched";
|
|
625
736
|
}
|
|
626
737
|
}
|
|
627
738
|
|
|
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
739
|
// Prune dead bg-shell processes
|
|
635
740
|
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
636
741
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
@@ -866,7 +971,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
866
971
|
if (safetyConfig.enabled) {
|
|
867
972
|
const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
|
|
868
973
|
|
|
869
|
-
// File change validation (execute-task only, after
|
|
974
|
+
// File change validation (execute-task only, after unit execution)
|
|
870
975
|
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid && isDbAvailable()) {
|
|
871
976
|
try {
|
|
872
977
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
@@ -902,15 +1007,43 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
902
1007
|
const bashCalls = actual.filter(e => e.kind === "bash");
|
|
903
1008
|
if (sMid && sSid && sTid && isDbAvailable()) {
|
|
904
1009
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
1010
|
+
if (taskRow?.status === "complete") {
|
|
1011
|
+
const claimedEvidence: ClaimedEvidence[] = getVerificationEvidence(sMid, sSid, sTid)
|
|
1012
|
+
.map((row) => ({
|
|
1013
|
+
command: row.command,
|
|
1014
|
+
exitCode: row.exit_code,
|
|
1015
|
+
verdict: row.verdict,
|
|
1016
|
+
createdAt: row.created_at,
|
|
1017
|
+
}))
|
|
1018
|
+
.filter((row) => typeof row.command === "string" && row.command.trim().length > 0);
|
|
1019
|
+
const mismatches = crossReferenceEvidence(claimedEvidence, actual);
|
|
1020
|
+
|
|
1021
|
+
for (const mismatch of mismatches) {
|
|
1022
|
+
const logMessage = `evidence-xref: ${mismatch.reason}`;
|
|
1023
|
+
if (mismatch.severity === "error") {
|
|
1024
|
+
logError("safety", logMessage);
|
|
1025
|
+
} else {
|
|
1026
|
+
logWarning("safety", logMessage);
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
if (claimedEvidence.length > 0 && bashCalls.length === 0) {
|
|
1031
|
+
logWarning("safety", "task claimed verification command evidence but no execution tool calls were recorded");
|
|
1032
|
+
ctx.ui.notify(
|
|
1033
|
+
`Safety: task ${sTid} claimed command evidence but no execution tool calls were recorded`,
|
|
1034
|
+
"warning",
|
|
1035
|
+
);
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
|
|
1039
|
+
if (blockingMismatch) {
|
|
1040
|
+
ctx.ui.notify(
|
|
1041
|
+
`Safety: task ${sTid} claimed passing verification that failed in recorded execution`,
|
|
1042
|
+
"error",
|
|
1043
|
+
);
|
|
1044
|
+
await pauseAuto(ctx, pi);
|
|
1045
|
+
return "dispatched";
|
|
1046
|
+
}
|
|
914
1047
|
}
|
|
915
1048
|
}
|
|
916
1049
|
} catch (e) {
|
|
@@ -1079,10 +1212,28 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1079
1212
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1080
1213
|
writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
|
|
1081
1214
|
ctx.ui.notify(
|
|
1082
|
-
`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)
|
|
1215
|
+
`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)`,
|
|
1083
1216
|
"warning",
|
|
1084
1217
|
);
|
|
1085
1218
|
// Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
|
|
1219
|
+
} else if (!triggerArtifactVerified && diagnoseWorktreeIntegrityFailure(s.basePath)) {
|
|
1220
|
+
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
1221
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(s.basePath)!;
|
|
1222
|
+
s.pendingVerificationRetry = null;
|
|
1223
|
+
s.verificationRetryCount.delete(retryKey);
|
|
1224
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1225
|
+
debugLog("postUnit", {
|
|
1226
|
+
phase: "worktree-integrity-failure",
|
|
1227
|
+
unitType: s.currentUnit.type,
|
|
1228
|
+
unitId: s.currentUnit.id,
|
|
1229
|
+
basePath: s.basePath,
|
|
1230
|
+
});
|
|
1231
|
+
ctx.ui.notify(
|
|
1232
|
+
`${worktreeFailure} Retry ${s.currentUnit.id} after repair.`,
|
|
1233
|
+
"error",
|
|
1234
|
+
);
|
|
1235
|
+
await pauseAuto(ctx, pi);
|
|
1236
|
+
return "dispatched";
|
|
1086
1237
|
} else if (!triggerArtifactVerified && !isDbAvailable()) {
|
|
1087
1238
|
debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
|
|
1088
1239
|
const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
@@ -1169,6 +1320,13 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
1169
1320
|
const { s, ctx, pi, buildSnapshotOpts, lockBase, stopAuto, pauseAuto, updateProgressWidget } = pctx;
|
|
1170
1321
|
|
|
1171
1322
|
if (s.currentUnit) {
|
|
1323
|
+
if (shouldDeferCloseoutGitAction(s.currentUnit.type)) {
|
|
1324
|
+
const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit, { softFailure: true });
|
|
1325
|
+
if (gitActionResult === "dispatched") {
|
|
1326
|
+
return "stopped";
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1172
1330
|
try {
|
|
1173
1331
|
const codebasePrefs = loadEffectiveGSDPreferences()?.preferences?.codebase;
|
|
1174
1332
|
const refresh = ensureCodebaseMapFresh(
|
|
@@ -1371,7 +1529,9 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
1371
1529
|
// s.canonicalProjectRoot is the project root and lacks files that a
|
|
1372
1530
|
// prior slice wrote to the worktree but hasn't merged to main yet.
|
|
1373
1531
|
const preExecutionBasePath = s.basePath;
|
|
1374
|
-
const result: PreExecutionResult = await runPreExecutionChecks(tasks, preExecutionBasePath
|
|
1532
|
+
const result: PreExecutionResult = await runPreExecutionChecks(tasks, preExecutionBasePath, {
|
|
1533
|
+
additionalRoots: [s.canonicalProjectRoot],
|
|
1534
|
+
});
|
|
1375
1535
|
|
|
1376
1536
|
// Log summary to stderr in existing verification output format
|
|
1377
1537
|
const emoji = result.status === "pass" ? "✅" : result.status === "warn" ? "⚠️" : "❌";
|
|
@@ -1388,12 +1548,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
1388
1548
|
}
|
|
1389
1549
|
|
|
1390
1550
|
// Write evidence JSON to slice artifacts directory
|
|
1391
|
-
const slicePath = resolveSlicePath(
|
|
1551
|
+
const slicePath = resolveSlicePath(s.canonicalProjectRoot, mid, sid);
|
|
1392
1552
|
const evidenceFileName = `${sid}-PRE-EXEC-VERIFY.json`;
|
|
1393
1553
|
let evidencePath = join(".gsd", "milestones", mid, "slices", sid, evidenceFileName);
|
|
1394
1554
|
if (slicePath) {
|
|
1395
1555
|
writePreExecutionEvidence(result, slicePath, mid, sid);
|
|
1396
|
-
evidencePath = relative(
|
|
1556
|
+
evidencePath = relative(s.canonicalProjectRoot, join(slicePath, evidenceFileName)) || evidenceFileName;
|
|
1397
1557
|
}
|
|
1398
1558
|
|
|
1399
1559
|
if (uokFlags.gates) {
|
|
@@ -1608,17 +1768,21 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
1608
1768
|
}
|
|
1609
1769
|
|
|
1610
1770
|
// Step mode → show wizard instead of dispatch.
|
|
1611
|
-
// Without this notify(), /gsd
|
|
1612
|
-
//
|
|
1771
|
+
// Without this notify(), /gsd next finishes a unit and silently exits the
|
|
1772
|
+
// loop, leaving the user with no next-step command.
|
|
1613
1773
|
if (s.stepMode) {
|
|
1774
|
+
let phaseAfterUnit: string | null = null;
|
|
1614
1775
|
try {
|
|
1615
1776
|
const nextState = await deriveState(s.canonicalProjectRoot);
|
|
1777
|
+
phaseAfterUnit = nextState.phase;
|
|
1616
1778
|
ctx.ui.notify(buildStepCompleteMessage(nextState), "info");
|
|
1617
1779
|
} catch (e) {
|
|
1618
1780
|
debugLog("postUnit", { phase: "step-wizard-notify", error: String(e) });
|
|
1619
1781
|
ctx.ui.notify(STEP_COMPLETE_FALLBACK_MESSAGE, "info");
|
|
1620
1782
|
}
|
|
1621
|
-
return
|
|
1783
|
+
return shouldReturnStepWizardAfterUnit(s.currentUnit?.type, phaseAfterUnit)
|
|
1784
|
+
? "step-wizard"
|
|
1785
|
+
: "continue";
|
|
1622
1786
|
}
|
|
1623
1787
|
|
|
1624
1788
|
return "continue";
|