gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7
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-ui.js +13 -6
- 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 +13 -2
- package/dist/resources/extensions/gsd/auto/phases.js +104 -38
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
- 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 +71 -20
- 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 +90 -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 +107 -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 +10 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
- 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 +10 -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 +14 -11
- 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-composer.js +2 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -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 +83 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +33 -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 +10 -10
- 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/required-server-files.json +1 -1
- 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 +10 -10
- 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/dist/web/standalone/server.js +1 -1
- 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/__tests__/tool-execution.test.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.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/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.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/__tests__/tool-execution.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- 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 +13 -2
- package/src/resources/extensions/gsd/auto/phases.ts +127 -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/unit-runner-events.ts +6 -2
- 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 +74 -20
- 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 +99 -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 +100 -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 +11 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
- 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 +9 -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 +14 -11
- 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-abort-pause-regression.test.ts +10 -1
- 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 +197 -11
- 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 +104 -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 +111 -1
- 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 +78 -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 +21 -1
- 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 +86 -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-composer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -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 +57 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -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-composer.ts +3 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
- 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 +93 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
- 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 → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_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
|
*/
|
|
@@ -23,12 +23,12 @@ import { rebuildState } from "./doctor.js";
|
|
|
23
23
|
import { parseUnitId } from "./unit-id.js";
|
|
24
24
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
25
25
|
import { runTurnGitAction, } from "./git-service.js";
|
|
26
|
-
import { verifyExpectedArtifact, resolveExpectedArtifactPath, writeBlockerPlaceholder, diagnoseExpectedArtifact, } from "./auto-recovery.js";
|
|
26
|
+
import { verifyExpectedArtifact, resolveExpectedArtifactPath, writeBlockerPlaceholder, diagnoseExpectedArtifact, diagnoseWorktreeIntegrityFailure, } from "./auto-recovery.js";
|
|
27
27
|
import { regenerateIfMissing } from "./workflow-projections.js";
|
|
28
28
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
29
29
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
30
30
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
31
|
-
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
31
|
+
import { isDbAvailable, getDbPath, refreshOpenDatabaseFromDisk, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
32
32
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
33
33
|
import { consumeSignal } from "./session-status-io.js";
|
|
34
34
|
import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
|
|
@@ -37,8 +37,7 @@ import { debugLog } from "./debug-logger.js";
|
|
|
37
37
|
import { runSafely } from "./auto-utils.js";
|
|
38
38
|
import { getEvidence, clearEvidenceFromDisk } from "./safety/evidence-collector.js";
|
|
39
39
|
import { validateFileChanges } from "./safety/file-change-validator.js";
|
|
40
|
-
|
|
41
|
-
// import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
|
|
40
|
+
import { crossReferenceEvidence } from "./safety/evidence-cross-ref.js";
|
|
42
41
|
import { validateContent } from "./safety/content-validator.js";
|
|
43
42
|
import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
|
|
44
43
|
import { resolveExpectedArtifactPath as resolveArtifactForContent } from "./auto-artifact-paths.js";
|
|
@@ -76,6 +75,17 @@ function formatPreExecutionCheckDetail(check) {
|
|
|
76
75
|
}
|
|
77
76
|
const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
|
|
78
77
|
const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
|
|
78
|
+
const GIT_ACTION_FAILURE_LOG_REL_PATH = ".gsd/git-action-failures.log";
|
|
79
|
+
function persistGitActionFailure(basePath, action, message) {
|
|
80
|
+
const logPath = join(basePath, GIT_ACTION_FAILURE_LOG_REL_PATH);
|
|
81
|
+
const logDir = join(basePath, ".gsd");
|
|
82
|
+
const timestamp = new Date().toISOString();
|
|
83
|
+
const body = message.trim() || "unknown git failure";
|
|
84
|
+
const entry = `[${timestamp}] action=${action}\n${body}\n\n`;
|
|
85
|
+
mkdirSync(logDir, { recursive: true });
|
|
86
|
+
appendFileSync(logPath, entry, "utf-8");
|
|
87
|
+
return logPath;
|
|
88
|
+
}
|
|
79
89
|
function stripKnownIdPrefix(value, id) {
|
|
80
90
|
const raw = String(value ?? "").trim();
|
|
81
91
|
if (!raw)
|
|
@@ -126,7 +136,7 @@ async function buildTaskCommitContextForUnit(basePath, unitId) {
|
|
|
126
136
|
sliceId: sid,
|
|
127
137
|
sliceTitle: stripKnownIdPrefix(slice?.title, sid),
|
|
128
138
|
oneLiner: summary?.oneLiner || task?.one_liner || undefined,
|
|
129
|
-
keyFiles: summary?.frontmatter.key_files?.filter(f => !f.includes("{{")) ??
|
|
139
|
+
keyFiles: summary?.frontmatter.key_files?.filter(f => !f.includes("{{") && f.trim() !== "(none)") ??
|
|
130
140
|
task?.key_files ??
|
|
131
141
|
undefined,
|
|
132
142
|
issueNumber: ghIssueNumber,
|
|
@@ -171,6 +181,9 @@ export function _shouldDispatchQuickTaskForTest(state) {
|
|
|
171
181
|
!!state.currentUnit &&
|
|
172
182
|
state.currentUnit.type !== "quick-task";
|
|
173
183
|
}
|
|
184
|
+
export function shouldDeferCloseoutGitAction(unitType) {
|
|
185
|
+
return unitType === "execute-task";
|
|
186
|
+
}
|
|
174
187
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
175
188
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
176
189
|
* next actual task commit via `smartStage()`. */
|
|
@@ -181,7 +194,7 @@ const LIFECYCLE_ONLY_UNITS = new Set([
|
|
|
181
194
|
"reassess-roadmap", "rewrite-docs",
|
|
182
195
|
]);
|
|
183
196
|
import { describeNextUnit, } from "./auto-dashboard.js";
|
|
184
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
197
|
+
import { appendFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs";
|
|
185
198
|
import { join, relative } from "node:path";
|
|
186
199
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
187
200
|
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
@@ -292,14 +305,27 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
|
|
|
292
305
|
* looping indefinitely (#2007).
|
|
293
306
|
*/
|
|
294
307
|
export const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
|
|
295
|
-
export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
|
|
308
|
+
export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).";
|
|
296
309
|
export function buildStepCompleteMessage(nextState) {
|
|
297
310
|
if (nextState.phase === "complete") {
|
|
298
311
|
return "Step complete — milestone finished. Run /gsd status to review, or start the next milestone.";
|
|
299
312
|
}
|
|
300
313
|
const next = describeNextUnit(nextState);
|
|
301
314
|
return `Step complete. Next: ${next.label}\n`
|
|
302
|
-
+ `Run /clear, then /gsd to continue (or /gsd auto to run continuously).`;
|
|
315
|
+
+ `Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).`;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Decide whether step mode should stop at the step wizard after a unit finishes.
|
|
319
|
+
*
|
|
320
|
+
* @param currentUnitType The just-finished unit type, such as "execute-task" or
|
|
321
|
+
* "complete-milestone"; may be null/undefined when no current unit is known.
|
|
322
|
+
* @param phaseAfterUnit The freshly derived next phase, such as "executing" or
|
|
323
|
+
* "complete"; may be null/undefined if state derivation failed.
|
|
324
|
+
* @returns true to show the step wizard; false to keep the loop running so
|
|
325
|
+
* terminal milestone completion can reach the merge/finalization path.
|
|
326
|
+
*/
|
|
327
|
+
export function shouldReturnStepWizardAfterUnit(currentUnitType, phaseAfterUnit) {
|
|
328
|
+
return currentUnitType !== "complete-milestone" && phaseAfterUnit !== "complete";
|
|
303
329
|
}
|
|
304
330
|
export const USER_DRIVEN_DEEP_UNITS = new Set([
|
|
305
331
|
"discuss-project",
|
|
@@ -316,6 +342,10 @@ function artifactValidationKind(unitType) {
|
|
|
316
342
|
return null;
|
|
317
343
|
}
|
|
318
344
|
function describeArtifactVerificationFailure(unitType, unitId, basePath) {
|
|
345
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(basePath);
|
|
346
|
+
if (worktreeFailure) {
|
|
347
|
+
return `${worktreeFailure} Unit: ${unitType} ${unitId}.`;
|
|
348
|
+
}
|
|
319
349
|
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
320
350
|
if (!artifactPath) {
|
|
321
351
|
return `Artifact verification failed: ${unitType} "${unitId}" has no resolvable artifact path.`;
|
|
@@ -360,6 +390,162 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
|
|
|
360
390
|
return null;
|
|
361
391
|
}
|
|
362
392
|
}
|
|
393
|
+
/**
|
|
394
|
+
* Execute the turn-level git action (commit, snapshot, or status-only).
|
|
395
|
+
*
|
|
396
|
+
* @param opts.softFailure - Defaults to false. When true, retry git failures,
|
|
397
|
+
* warn, and continue without pausing auto-mode; use for best-effort deferred
|
|
398
|
+
* closeout work where a git failure should not block the run.
|
|
399
|
+
*/
|
|
400
|
+
async function runCloseoutGitAction(pctx, unit, opts) {
|
|
401
|
+
const { s, ctx, pi, pauseAuto } = pctx;
|
|
402
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
403
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
404
|
+
const turnAction = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
|
|
405
|
+
const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
|
|
406
|
+
const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
|
|
407
|
+
s.lastGitActionFailure = null;
|
|
408
|
+
s.lastGitActionStatus = null;
|
|
409
|
+
try {
|
|
410
|
+
let taskContext;
|
|
411
|
+
let targetRepositories;
|
|
412
|
+
if (turnAction === "commit" && unit.type === "execute-task") {
|
|
413
|
+
taskContext = await buildTaskCommitContextForUnit(s.basePath, unit.id);
|
|
414
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unit.id);
|
|
415
|
+
if (mid && sid && tid && isDbAvailable()) {
|
|
416
|
+
targetRepositories = getTask(mid, sid, tid)?.target_repositories;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
420
|
+
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
421
|
+
// `false` result causes autoCommit to skip staging entirely.
|
|
422
|
+
_resetHasChangesCache();
|
|
423
|
+
const skipLifecycleCommit = turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(unit.type);
|
|
424
|
+
if (skipLifecycleCommit) {
|
|
425
|
+
debugLog("postUnit", {
|
|
426
|
+
phase: "git-action-skipped",
|
|
427
|
+
reason: "lifecycle-only-unit",
|
|
428
|
+
unitType: unit.type,
|
|
429
|
+
unitId: unit.id,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
const maxAttempts = opts?.softFailure ? 3 : 1;
|
|
434
|
+
let gitResult = runTurnGitAction({
|
|
435
|
+
basePath: s.basePath,
|
|
436
|
+
action: turnAction,
|
|
437
|
+
unitType: unit.type,
|
|
438
|
+
unitId: unit.id,
|
|
439
|
+
taskContext,
|
|
440
|
+
targetRepositories,
|
|
441
|
+
});
|
|
442
|
+
for (let attempt = 1; gitResult.status === "failed" && attempt < maxAttempts; attempt++) {
|
|
443
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
|
|
444
|
+
gitResult = runTurnGitAction({
|
|
445
|
+
basePath: s.basePath,
|
|
446
|
+
action: turnAction,
|
|
447
|
+
unitType: unit.type,
|
|
448
|
+
unitId: unit.id,
|
|
449
|
+
taskContext,
|
|
450
|
+
targetRepositories,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
if (uokFlags.gitops) {
|
|
454
|
+
writeTurnGitTransaction({
|
|
455
|
+
basePath: s.basePath,
|
|
456
|
+
traceId,
|
|
457
|
+
turnId,
|
|
458
|
+
unitType: unit.type,
|
|
459
|
+
unitId: unit.id,
|
|
460
|
+
stage: "publish",
|
|
461
|
+
action: turnAction,
|
|
462
|
+
push: uokFlags.gitopsTurnPush,
|
|
463
|
+
status: gitResult.status,
|
|
464
|
+
error: gitResult.error,
|
|
465
|
+
metadata: {
|
|
466
|
+
dirty: gitResult.dirty,
|
|
467
|
+
dirtyRepositories: gitResult.dirtyRepositories,
|
|
468
|
+
commitMessage: gitResult.commitMessage,
|
|
469
|
+
commitMessages: gitResult.commitMessages,
|
|
470
|
+
commitErrors: gitResult.commitErrors,
|
|
471
|
+
skippedRepositories: gitResult.skippedRepositories,
|
|
472
|
+
snapshotLabel: gitResult.snapshotLabel,
|
|
473
|
+
},
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
if (gitResult.status === "failed") {
|
|
477
|
+
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
478
|
+
s.lastGitActionStatus = "failed";
|
|
479
|
+
const fullError = gitResult.error ?? "unknown error";
|
|
480
|
+
const failureLogPath = persistGitActionFailure(s.basePath, turnAction, fullError);
|
|
481
|
+
if (uokFlags.gitops && uokFlags.gates) {
|
|
482
|
+
const parsed = parseUnitId(unit.id);
|
|
483
|
+
const gateRunner = new UokGateRunner();
|
|
484
|
+
gateRunner.register({
|
|
485
|
+
id: "closeout-git-action",
|
|
486
|
+
type: "closeout",
|
|
487
|
+
execute: async () => ({
|
|
488
|
+
outcome: "fail",
|
|
489
|
+
failureClass: "git",
|
|
490
|
+
rationale: `turn git action "${turnAction}" failed`,
|
|
491
|
+
findings: fullError,
|
|
492
|
+
}),
|
|
493
|
+
});
|
|
494
|
+
await gateRunner.run("closeout-git-action", {
|
|
495
|
+
basePath: s.basePath,
|
|
496
|
+
traceId,
|
|
497
|
+
turnId,
|
|
498
|
+
milestoneId: parsed.milestone ?? undefined,
|
|
499
|
+
sliceId: parsed.slice ?? undefined,
|
|
500
|
+
taskId: parsed.task ?? undefined,
|
|
501
|
+
unitType: unit.type,
|
|
502
|
+
unitId: unit.id,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
const failureMsg = `Git ${turnAction} failed: ${fullError.split("\n")[0]} (full details: ${failureLogPath})`;
|
|
506
|
+
ctx.ui.notify(failureMsg, opts?.softFailure ? "warning" : "error");
|
|
507
|
+
debugLog("postUnit", {
|
|
508
|
+
phase: opts?.softFailure ? "git-action-failed-soft" : "git-action-failed-blocking",
|
|
509
|
+
action: turnAction,
|
|
510
|
+
error: fullError,
|
|
511
|
+
failureLogPath,
|
|
512
|
+
});
|
|
513
|
+
if (opts?.softFailure) {
|
|
514
|
+
return "continue";
|
|
515
|
+
}
|
|
516
|
+
await pauseAuto(ctx, pi);
|
|
517
|
+
return "dispatched";
|
|
518
|
+
}
|
|
519
|
+
s.lastGitActionStatus = "ok";
|
|
520
|
+
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
521
|
+
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
522
|
+
}
|
|
523
|
+
else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
524
|
+
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
catch (e) {
|
|
529
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
530
|
+
s.lastGitActionFailure = message;
|
|
531
|
+
s.lastGitActionStatus = "failed";
|
|
532
|
+
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
533
|
+
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, opts?.softFailure ? "warning" : "error");
|
|
534
|
+
if (opts?.softFailure) {
|
|
535
|
+
return "continue";
|
|
536
|
+
}
|
|
537
|
+
if (uokFlags.gitops) {
|
|
538
|
+
await pauseAuto(ctx, pi);
|
|
539
|
+
return "dispatched";
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// GitHub sync (non-blocking, opt-in)
|
|
543
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
544
|
+
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
545
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
546
|
+
});
|
|
547
|
+
return "continue";
|
|
548
|
+
}
|
|
363
549
|
/**
|
|
364
550
|
* Pre-verification processing: parallel worker signal check, cache invalidation,
|
|
365
551
|
* auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
|
|
@@ -370,7 +556,7 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
|
|
|
370
556
|
* - "retry" — artifact verification failed, s.pendingVerificationRetry set for loop re-iteration
|
|
371
557
|
*/
|
|
372
558
|
export async function postUnitPreVerification(pctx, opts) {
|
|
373
|
-
const { s, ctx, pi,
|
|
559
|
+
const { s, ctx, pi, stopAuto, pauseAuto } = pctx;
|
|
374
560
|
// ── Parallel worker signal check ──
|
|
375
561
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
376
562
|
if (milestoneLock) {
|
|
@@ -392,125 +578,29 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
392
578
|
if (!opts?.skipSettleDelay) {
|
|
393
579
|
await new Promise(r => setTimeout(r, 100));
|
|
394
580
|
}
|
|
395
|
-
const
|
|
396
|
-
|
|
581
|
+
const dbPath = getDbPath();
|
|
582
|
+
if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
|
|
583
|
+
const refreshed = refreshOpenDatabaseFromDisk();
|
|
584
|
+
if (!refreshed) {
|
|
585
|
+
logWarning("db", "post-unit database refresh failed; derived state may be stale");
|
|
586
|
+
}
|
|
587
|
+
}
|
|
397
588
|
// Turn-level git action (commit | snapshot | status-only)
|
|
398
589
|
if (s.currentUnit) {
|
|
399
590
|
const unit = s.currentUnit;
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
let taskContext;
|
|
407
|
-
if (turnAction === "commit" && s.currentUnit.type === "execute-task") {
|
|
408
|
-
taskContext = await buildTaskCommitContextForUnit(s.basePath, s.currentUnit.id);
|
|
409
|
-
}
|
|
410
|
-
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
411
|
-
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
412
|
-
// `false` result causes autoCommit to skip staging entirely, leaving
|
|
413
|
-
// code files only in the working tree where they are destroyed by
|
|
414
|
-
// `git worktree remove --force` during teardown.
|
|
415
|
-
_resetHasChangesCache();
|
|
416
|
-
const skipLifecycleCommit = turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type);
|
|
417
|
-
if (skipLifecycleCommit) {
|
|
418
|
-
debugLog("postUnit", {
|
|
419
|
-
phase: "git-action-skipped",
|
|
420
|
-
reason: "lifecycle-only-unit",
|
|
421
|
-
unitType: s.currentUnit.type,
|
|
422
|
-
unitId: s.currentUnit.id,
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
const gitResult = runTurnGitAction({
|
|
427
|
-
basePath: s.basePath,
|
|
428
|
-
action: turnAction,
|
|
429
|
-
unitType: s.currentUnit.type,
|
|
430
|
-
unitId: s.currentUnit.id,
|
|
431
|
-
taskContext,
|
|
432
|
-
});
|
|
433
|
-
if (uokFlags.gitops) {
|
|
434
|
-
writeTurnGitTransaction({
|
|
435
|
-
basePath: s.basePath,
|
|
436
|
-
traceId,
|
|
437
|
-
turnId,
|
|
438
|
-
unitType: unit.type,
|
|
439
|
-
unitId: unit.id,
|
|
440
|
-
stage: "publish",
|
|
441
|
-
action: turnAction,
|
|
442
|
-
push: uokFlags.gitopsTurnPush,
|
|
443
|
-
status: gitResult.status,
|
|
444
|
-
error: gitResult.error,
|
|
445
|
-
metadata: {
|
|
446
|
-
dirty: gitResult.dirty,
|
|
447
|
-
commitMessage: gitResult.commitMessage,
|
|
448
|
-
snapshotLabel: gitResult.snapshotLabel,
|
|
449
|
-
},
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
if (gitResult.status === "failed") {
|
|
453
|
-
s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
|
|
454
|
-
s.lastGitActionStatus = "failed";
|
|
455
|
-
if (uokFlags.gitops && uokFlags.gates) {
|
|
456
|
-
const parsed = parseUnitId(unit.id);
|
|
457
|
-
const gateRunner = new UokGateRunner();
|
|
458
|
-
gateRunner.register({
|
|
459
|
-
id: "closeout-git-action",
|
|
460
|
-
type: "closeout",
|
|
461
|
-
execute: async () => ({
|
|
462
|
-
outcome: "fail",
|
|
463
|
-
failureClass: "git",
|
|
464
|
-
rationale: `turn git action "${turnAction}" failed`,
|
|
465
|
-
findings: gitResult.error ?? "unknown git failure",
|
|
466
|
-
}),
|
|
467
|
-
});
|
|
468
|
-
await gateRunner.run("closeout-git-action", {
|
|
469
|
-
basePath: s.basePath,
|
|
470
|
-
traceId,
|
|
471
|
-
turnId,
|
|
472
|
-
milestoneId: parsed.milestone ?? undefined,
|
|
473
|
-
sliceId: parsed.slice ?? undefined,
|
|
474
|
-
taskId: parsed.task ?? undefined,
|
|
475
|
-
unitType: unit.type,
|
|
476
|
-
unitId: unit.id,
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
|
|
480
|
-
ctx.ui.notify(failureMsg, "error");
|
|
481
|
-
debugLog("postUnit", {
|
|
482
|
-
phase: "git-action-failed-blocking",
|
|
483
|
-
action: turnAction,
|
|
484
|
-
error: gitResult.error ?? "unknown error",
|
|
485
|
-
});
|
|
486
|
-
await pauseAuto(ctx, pi);
|
|
487
|
-
return "dispatched";
|
|
488
|
-
}
|
|
489
|
-
s.lastGitActionStatus = "ok";
|
|
490
|
-
if (turnAction === "commit" && gitResult.commitMessage) {
|
|
491
|
-
ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
|
|
492
|
-
}
|
|
493
|
-
else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
|
|
494
|
-
ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
|
|
495
|
-
}
|
|
496
|
-
}
|
|
591
|
+
if (shouldDeferCloseoutGitAction(unit.type)) {
|
|
592
|
+
debugLog("postUnit", {
|
|
593
|
+
phase: "git-action-deferred-until-verification",
|
|
594
|
+
unitType: unit.type,
|
|
595
|
+
unitId: unit.id,
|
|
596
|
+
});
|
|
497
597
|
}
|
|
498
|
-
|
|
499
|
-
const
|
|
500
|
-
|
|
501
|
-
s.lastGitActionStatus = "failed";
|
|
502
|
-
debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
|
|
503
|
-
ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, uokFlags.gitops ? "error" : "warning");
|
|
504
|
-
if (uokFlags.gitops) {
|
|
505
|
-
await pauseAuto(ctx, pi);
|
|
598
|
+
else {
|
|
599
|
+
const gitActionResult = await runCloseoutGitAction(pctx, unit);
|
|
600
|
+
if (gitActionResult === "dispatched") {
|
|
506
601
|
return "dispatched";
|
|
507
602
|
}
|
|
508
603
|
}
|
|
509
|
-
// GitHub sync (non-blocking, opt-in)
|
|
510
|
-
await runSafely("postUnit", "github-sync", async () => {
|
|
511
|
-
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
512
|
-
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
513
|
-
});
|
|
514
604
|
// Prune dead bg-shell processes
|
|
515
605
|
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
516
606
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
@@ -723,7 +813,7 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
723
813
|
const safetyConfig = resolveSafetyHarnessConfig(prefs?.safety_harness);
|
|
724
814
|
if (safetyConfig.enabled) {
|
|
725
815
|
const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
|
|
726
|
-
// File change validation (execute-task only, after
|
|
816
|
+
// File change validation (execute-task only, after unit execution)
|
|
727
817
|
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid && isDbAvailable()) {
|
|
728
818
|
try {
|
|
729
819
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
@@ -756,12 +846,35 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
756
846
|
const bashCalls = actual.filter(e => e.kind === "bash");
|
|
757
847
|
if (sMid && sSid && sTid && isDbAvailable()) {
|
|
758
848
|
const taskRow = getTask(sMid, sSid, sTid);
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
849
|
+
if (taskRow?.status === "complete") {
|
|
850
|
+
const claimedEvidence = getVerificationEvidence(sMid, sSid, sTid)
|
|
851
|
+
.map((row) => ({
|
|
852
|
+
command: row.command,
|
|
853
|
+
exitCode: row.exit_code,
|
|
854
|
+
verdict: row.verdict,
|
|
855
|
+
createdAt: row.created_at,
|
|
856
|
+
}))
|
|
857
|
+
.filter((row) => typeof row.command === "string" && row.command.trim().length > 0);
|
|
858
|
+
const mismatches = crossReferenceEvidence(claimedEvidence, actual);
|
|
859
|
+
for (const mismatch of mismatches) {
|
|
860
|
+
const logMessage = `evidence-xref: ${mismatch.reason}`;
|
|
861
|
+
if (mismatch.severity === "error") {
|
|
862
|
+
logError("safety", logMessage);
|
|
863
|
+
}
|
|
864
|
+
else {
|
|
865
|
+
logWarning("safety", logMessage);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
if (claimedEvidence.length > 0 && bashCalls.length === 0) {
|
|
869
|
+
logWarning("safety", "task claimed verification command evidence but no execution tool calls were recorded");
|
|
870
|
+
ctx.ui.notify(`Safety: task ${sTid} claimed command evidence but no execution tool calls were recorded`, "warning");
|
|
871
|
+
}
|
|
872
|
+
const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
|
|
873
|
+
if (blockingMismatch) {
|
|
874
|
+
ctx.ui.notify(`Safety: task ${sTid} claimed passing verification that failed in recorded execution`, "error");
|
|
875
|
+
await pauseAuto(ctx, pi);
|
|
876
|
+
return "dispatched";
|
|
877
|
+
}
|
|
765
878
|
}
|
|
766
879
|
}
|
|
767
880
|
}
|
|
@@ -919,9 +1032,25 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
919
1032
|
s.verificationRetryCount.delete(retryKey);
|
|
920
1033
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
921
1034
|
writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
|
|
922
|
-
ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)
|
|
1035
|
+
ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)`, "warning");
|
|
923
1036
|
// Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
|
|
924
1037
|
}
|
|
1038
|
+
else if (!triggerArtifactVerified && diagnoseWorktreeIntegrityFailure(s.basePath)) {
|
|
1039
|
+
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
1040
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(s.basePath);
|
|
1041
|
+
s.pendingVerificationRetry = null;
|
|
1042
|
+
s.verificationRetryCount.delete(retryKey);
|
|
1043
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
1044
|
+
debugLog("postUnit", {
|
|
1045
|
+
phase: "worktree-integrity-failure",
|
|
1046
|
+
unitType: s.currentUnit.type,
|
|
1047
|
+
unitId: s.currentUnit.id,
|
|
1048
|
+
basePath: s.basePath,
|
|
1049
|
+
});
|
|
1050
|
+
ctx.ui.notify(`${worktreeFailure} Retry ${s.currentUnit.id} after repair.`, "error");
|
|
1051
|
+
await pauseAuto(ctx, pi);
|
|
1052
|
+
return "dispatched";
|
|
1053
|
+
}
|
|
925
1054
|
else if (!triggerArtifactVerified && !isDbAvailable()) {
|
|
926
1055
|
debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
|
|
927
1056
|
const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
@@ -992,6 +1121,12 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
992
1121
|
export async function postUnitPostVerification(pctx) {
|
|
993
1122
|
const { s, ctx, pi, buildSnapshotOpts, lockBase, stopAuto, pauseAuto, updateProgressWidget } = pctx;
|
|
994
1123
|
if (s.currentUnit) {
|
|
1124
|
+
if (shouldDeferCloseoutGitAction(s.currentUnit.type)) {
|
|
1125
|
+
const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit, { softFailure: true });
|
|
1126
|
+
if (gitActionResult === "dispatched") {
|
|
1127
|
+
return "stopped";
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
995
1130
|
try {
|
|
996
1131
|
const codebasePrefs = loadEffectiveGSDPreferences()?.preferences?.codebase;
|
|
997
1132
|
const refresh = ensureCodebaseMapFresh(s.basePath, codebasePrefs
|
|
@@ -1161,7 +1296,9 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1161
1296
|
// s.canonicalProjectRoot is the project root and lacks files that a
|
|
1162
1297
|
// prior slice wrote to the worktree but hasn't merged to main yet.
|
|
1163
1298
|
const preExecutionBasePath = s.basePath;
|
|
1164
|
-
const result = await runPreExecutionChecks(tasks, preExecutionBasePath
|
|
1299
|
+
const result = await runPreExecutionChecks(tasks, preExecutionBasePath, {
|
|
1300
|
+
additionalRoots: [s.canonicalProjectRoot],
|
|
1301
|
+
});
|
|
1165
1302
|
// Log summary to stderr in existing verification output format
|
|
1166
1303
|
const emoji = result.status === "pass" ? "✅" : result.status === "warn" ? "⚠️" : "❌";
|
|
1167
1304
|
process.stderr.write(`gsd-pre-exec: ${emoji} Pre-execution checks ${result.status} for ${mid}/${sid} (${result.durationMs}ms)\n`);
|
|
@@ -1171,12 +1308,12 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1171
1308
|
process.stderr.write(`gsd-pre-exec: ${checkEmoji} [${check.category}] ${check.target}: ${check.message}\n`);
|
|
1172
1309
|
}
|
|
1173
1310
|
// Write evidence JSON to slice artifacts directory
|
|
1174
|
-
const slicePath = resolveSlicePath(
|
|
1311
|
+
const slicePath = resolveSlicePath(s.canonicalProjectRoot, mid, sid);
|
|
1175
1312
|
const evidenceFileName = `${sid}-PRE-EXEC-VERIFY.json`;
|
|
1176
1313
|
let evidencePath = join(".gsd", "milestones", mid, "slices", sid, evidenceFileName);
|
|
1177
1314
|
if (slicePath) {
|
|
1178
1315
|
writePreExecutionEvidence(result, slicePath, mid, sid);
|
|
1179
|
-
evidencePath = relative(
|
|
1316
|
+
evidencePath = relative(s.canonicalProjectRoot, join(slicePath, evidenceFileName)) || evidenceFileName;
|
|
1180
1317
|
}
|
|
1181
1318
|
if (uokFlags.gates) {
|
|
1182
1319
|
const failedChecks = result.checks
|
|
@@ -1356,18 +1493,22 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1356
1493
|
}
|
|
1357
1494
|
}
|
|
1358
1495
|
// Step mode → show wizard instead of dispatch.
|
|
1359
|
-
// Without this notify(), /gsd
|
|
1360
|
-
//
|
|
1496
|
+
// Without this notify(), /gsd next finishes a unit and silently exits the
|
|
1497
|
+
// loop, leaving the user with no next-step command.
|
|
1361
1498
|
if (s.stepMode) {
|
|
1499
|
+
let phaseAfterUnit = null;
|
|
1362
1500
|
try {
|
|
1363
1501
|
const nextState = await deriveState(s.canonicalProjectRoot);
|
|
1502
|
+
phaseAfterUnit = nextState.phase;
|
|
1364
1503
|
ctx.ui.notify(buildStepCompleteMessage(nextState), "info");
|
|
1365
1504
|
}
|
|
1366
1505
|
catch (e) {
|
|
1367
1506
|
debugLog("postUnit", { phase: "step-wizard-notify", error: String(e) });
|
|
1368
1507
|
ctx.ui.notify(STEP_COMPLETE_FALLBACK_MESSAGE, "info");
|
|
1369
1508
|
}
|
|
1370
|
-
return
|
|
1509
|
+
return shouldReturnStepWizardAfterUnit(s.currentUnit?.type, phaseAfterUnit)
|
|
1510
|
+
? "step-wizard"
|
|
1511
|
+
: "continue";
|
|
1371
1512
|
}
|
|
1372
1513
|
return "continue";
|
|
1373
1514
|
}
|
|
@@ -2697,14 +2697,40 @@ export async function buildReactiveExecutePrompt(mid, midTitle, sid, sTitle, rea
|
|
|
2697
2697
|
readyTaskListLines.push(`- **${tid}: ${tTitle}**`);
|
|
2698
2698
|
// Build dependency-scoped carry-forward paths for this task
|
|
2699
2699
|
const depPaths = await getDependencyTaskSummaryPaths(mid, sid, tid, node?.dependsOn ?? [], base);
|
|
2700
|
-
|
|
2701
|
-
const
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2700
|
+
const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
|
|
2701
|
+
const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
|
|
2702
|
+
const taskPlanRelPath = `${relSlicePath(base, mid, sid)}/tasks/${tid}-PLAN.md`;
|
|
2703
|
+
const taskPlanInline = taskPlanContent
|
|
2704
|
+
? [
|
|
2705
|
+
"## Inlined Task Plan (authoritative local execution contract)",
|
|
2706
|
+
`Source: \`${taskPlanRelPath}\``,
|
|
2707
|
+
"",
|
|
2708
|
+
taskPlanContent.trim(),
|
|
2709
|
+
].join("\n")
|
|
2710
|
+
: [
|
|
2711
|
+
"## Inlined Task Plan (authoritative local execution contract)",
|
|
2712
|
+
`Task plan not found at dispatch time. Read \`${taskPlanRelPath}\` before executing.`,
|
|
2713
|
+
].join("\n");
|
|
2714
|
+
const carryForwardSection = await buildCarryForwardSection(depPaths, base);
|
|
2715
|
+
const taskSummaryPath = `${relSlicePath(base, mid, sid)}/tasks/${tid}-SUMMARY.md`;
|
|
2716
|
+
const taskPrompt = [
|
|
2717
|
+
`## UNIT: Execute Task ${tid} ("${tTitle}")`,
|
|
2718
|
+
"",
|
|
2719
|
+
"Work only in the repository root.",
|
|
2720
|
+
"Implement from the inlined task plan below. Verify changes, then call `gsd_task_complete`.",
|
|
2721
|
+
"Do not run git commands.",
|
|
2722
|
+
"",
|
|
2723
|
+
carryForwardSection,
|
|
2724
|
+
"",
|
|
2725
|
+
taskPlanInline,
|
|
2726
|
+
"",
|
|
2727
|
+
"## Completion Contract",
|
|
2728
|
+
`- Call \`gsd_task_complete\` with camelCase fields: \`milestoneId\`, \`sliceId\`, \`taskId\`, \`oneLiner\`, \`narrative\`, \`verification\`, and \`verificationEvidence\`.`,
|
|
2729
|
+
`- Do not manually write \`${taskSummaryPath}\` or edit PLAN checkboxes; the completion tool is canonical.`,
|
|
2730
|
+
`- Use \`blocker_discovered: true\` only if the task cannot be completed due to a real blocker.`,
|
|
2731
|
+
"",
|
|
2732
|
+
`When done, say: "Task ${tid} complete."`,
|
|
2733
|
+
].join("\n");
|
|
2708
2734
|
const modelSuffix = subagentModel ? ` with model: "${subagentModel}"` : "";
|
|
2709
2735
|
subagentSections.push([
|
|
2710
2736
|
`### ${tid}: ${tTitle}`,
|
|
@@ -2777,7 +2803,7 @@ export async function buildParallelResearchSlicesPrompt(mid, midTitle, slices, b
|
|
|
2777
2803
|
subagentSections.push([
|
|
2778
2804
|
`### ${slice.id}: ${slice.title}`,
|
|
2779
2805
|
"",
|
|
2780
|
-
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`
|
|
2806
|
+
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`scout\`):`,
|
|
2781
2807
|
"",
|
|
2782
2808
|
"```",
|
|
2783
2809
|
slicePrompt,
|
|
@@ -2846,7 +2872,7 @@ export async function buildGateEvaluatePrompt(mid, midTitle, sid, sTitle, base,
|
|
|
2846
2872
|
subagentSections.push([
|
|
2847
2873
|
`### ${def.id}: ${def.question}`,
|
|
2848
2874
|
"",
|
|
2849
|
-
`Use this as the prompt for a \`subagent\` call${modelSuffix}:`,
|
|
2875
|
+
`Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`tester\`):`,
|
|
2850
2876
|
"",
|
|
2851
2877
|
"```",
|
|
2852
2878
|
subPrompt,
|