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
|
@@ -20,6 +20,7 @@ import { parseUnitId } from "./unit-id.js";
|
|
|
20
20
|
import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd-db.js";
|
|
21
21
|
import type { TaskRow } from "./db-task-slice-rows.js";
|
|
22
22
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
23
|
+
import type { GSDPreferences } from "./preferences-types.js";
|
|
23
24
|
import { extractVerdict } from "./verdict-parser.js";
|
|
24
25
|
import { isClosedStatus } from "./status-guards.js";
|
|
25
26
|
import { loadFile } from "./files.js";
|
|
@@ -27,10 +28,12 @@ import { parseRoadmap } from "./parsers-legacy.js";
|
|
|
27
28
|
import { isMilestoneComplete } from "./state.js";
|
|
28
29
|
import {
|
|
29
30
|
runVerificationGate,
|
|
31
|
+
runVerificationGateForTargets,
|
|
30
32
|
formatFailureContext,
|
|
31
33
|
captureRuntimeErrors,
|
|
32
34
|
runDependencyAudit,
|
|
33
35
|
} from "./verification-gate.js";
|
|
36
|
+
import type { VerificationTarget } from "./verification-gate.js";
|
|
34
37
|
import { writeVerificationJSON, type PostExecutionCheckJSON, type EvidenceJSON } from "./verification-evidence.js";
|
|
35
38
|
import { logWarning } from "./workflow-logger.js";
|
|
36
39
|
import { runPostExecutionChecks, type PostExecutionResult } from "./post-execution-checks.js";
|
|
@@ -40,6 +43,10 @@ import { join } from "node:path";
|
|
|
40
43
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
41
44
|
import { UokGateRunner } from "./uok/gate-runner.js";
|
|
42
45
|
import { verificationRetryKey } from "./auto/verification-retry-policy.js";
|
|
46
|
+
import { decideVerificationVerdict } from "./verification-verdict.js";
|
|
47
|
+
import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
|
|
48
|
+
import type { SliceRow } from "./db-task-slice-rows.js";
|
|
49
|
+
import { getSlice } from "./gsd-db.js";
|
|
43
50
|
|
|
44
51
|
export interface VerificationContext {
|
|
45
52
|
s: AutoSession;
|
|
@@ -49,10 +56,48 @@ export interface VerificationContext {
|
|
|
49
56
|
|
|
50
57
|
export type VerificationResult = "continue" | "retry" | "pause";
|
|
51
58
|
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
function resolveVerificationTargets(
|
|
60
|
+
basePath: string,
|
|
61
|
+
prefs: GSDPreferences | undefined,
|
|
62
|
+
task: TaskRow | null,
|
|
63
|
+
slice: SliceRow | null,
|
|
64
|
+
): VerificationTarget[] {
|
|
65
|
+
const registry = createRepositoryRegistryFromPreferences(basePath, prefs);
|
|
66
|
+
const explicitIds =
|
|
67
|
+
task?.target_repositories?.length
|
|
68
|
+
? task.target_repositories
|
|
69
|
+
: slice?.target_repositories?.length
|
|
70
|
+
? slice.target_repositories
|
|
71
|
+
: null;
|
|
72
|
+
const requestedIds = explicitIds ?? ["project"];
|
|
73
|
+
|
|
74
|
+
const targets: VerificationTarget[] = [];
|
|
75
|
+
const seen = new Set<string>();
|
|
76
|
+
for (const id of requestedIds) {
|
|
77
|
+
if (seen.has(id)) continue;
|
|
78
|
+
seen.add(id);
|
|
79
|
+
const repo = registry.byId.get(id);
|
|
80
|
+
if (!repo) {
|
|
81
|
+
if (explicitIds) {
|
|
82
|
+
throw new Error(`unknown verification target repository: ${id}`);
|
|
83
|
+
}
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
targets.push({
|
|
87
|
+
id: repo.id,
|
|
88
|
+
cwd: repo.root,
|
|
89
|
+
// Top-level verification commands override per-repo defaults.
|
|
90
|
+
preferenceCommands: prefs?.verification_commands?.length
|
|
91
|
+
? undefined
|
|
92
|
+
: repo.verification,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!explicitIds && targets.length === 0) {
|
|
97
|
+
const project = registry.byId.get("project");
|
|
98
|
+
if (project) targets.push({ id: "project", cwd: project.root });
|
|
99
|
+
}
|
|
100
|
+
return targets;
|
|
56
101
|
}
|
|
57
102
|
|
|
58
103
|
/**
|
|
@@ -110,11 +155,31 @@ async function runValidateMilestonePostCheck(
|
|
|
110
155
|
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
111
156
|
if (!mid) return "continue";
|
|
112
157
|
|
|
158
|
+
const setToolFailureRetry = (message: string): VerificationResult => {
|
|
159
|
+
const retryKey = verificationRetryKey(s.currentUnit!.type, s.currentUnit!.id);
|
|
160
|
+
const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
|
|
161
|
+
s.verificationRetryCount.set(retryKey, attempt);
|
|
162
|
+
s.pendingVerificationRetry = {
|
|
163
|
+
unitId: s.currentUnit!.id,
|
|
164
|
+
failureContext: message,
|
|
165
|
+
attempt,
|
|
166
|
+
};
|
|
167
|
+
return "retry";
|
|
168
|
+
};
|
|
169
|
+
|
|
113
170
|
const validationFile = resolveMilestoneFile(s.basePath, mid, "VALIDATION");
|
|
114
|
-
if (!validationFile)
|
|
171
|
+
if (!validationFile) {
|
|
172
|
+
return setToolFailureRetry(
|
|
173
|
+
"You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.",
|
|
174
|
+
);
|
|
175
|
+
}
|
|
115
176
|
|
|
116
177
|
const validationContent = await loadFile(validationFile);
|
|
117
|
-
if (!validationContent)
|
|
178
|
+
if (!validationContent) {
|
|
179
|
+
return setToolFailureRetry(
|
|
180
|
+
"You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.",
|
|
181
|
+
);
|
|
182
|
+
}
|
|
118
183
|
|
|
119
184
|
const verdict = extractVerdict(validationContent);
|
|
120
185
|
if (verdict !== "needs-remediation") {
|
|
@@ -196,7 +261,7 @@ async function countIncompleteSlices(basePath: string, milestoneId: string): Pro
|
|
|
196
261
|
/**
|
|
197
262
|
* Run the verification gate for the current execute-task unit.
|
|
198
263
|
* Returns:
|
|
199
|
-
* - "continue" —
|
|
264
|
+
* - "continue" — host-owned verification passed, proceed normally
|
|
200
265
|
* - "retry" — gate failed with retries remaining, s.pendingVerificationRetry set for loop re-iteration
|
|
201
266
|
* - "pause" — gate failed with retries exhausted, pauseAuto already called
|
|
202
267
|
*/
|
|
@@ -226,18 +291,29 @@ export async function runPostUnitVerification(
|
|
|
226
291
|
// Read task plan verify field
|
|
227
292
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
|
|
228
293
|
let taskPlanVerify: string | undefined;
|
|
294
|
+
let taskRow: TaskRow | null = null;
|
|
295
|
+
let sliceRow: SliceRow | null = null;
|
|
229
296
|
if (mid && sid && tid) {
|
|
230
297
|
if (isDbAvailable()) {
|
|
231
|
-
|
|
298
|
+
taskRow = getTask(mid, sid, tid);
|
|
299
|
+
sliceRow = getSlice(mid, sid);
|
|
300
|
+
taskPlanVerify = taskRow?.verify;
|
|
232
301
|
}
|
|
233
302
|
// When DB unavailable, taskPlanVerify stays undefined — gate runs without task-specific checks
|
|
234
303
|
}
|
|
235
304
|
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
305
|
+
const verificationTargets = resolveVerificationTargets(s.basePath, prefs, taskRow, sliceRow);
|
|
306
|
+
const result = verificationTargets.length <= 1
|
|
307
|
+
? runVerificationGate({
|
|
308
|
+
cwd: verificationTargets[0]?.cwd ?? s.basePath,
|
|
309
|
+
preferenceCommands: prefs?.verification_commands ?? verificationTargets[0]?.preferenceCommands,
|
|
310
|
+
taskPlanVerify,
|
|
311
|
+
})
|
|
312
|
+
: runVerificationGateForTargets({
|
|
313
|
+
targets: verificationTargets,
|
|
314
|
+
preferenceCommands: prefs?.verification_commands,
|
|
315
|
+
taskPlanVerify,
|
|
316
|
+
});
|
|
241
317
|
|
|
242
318
|
// Capture runtime errors
|
|
243
319
|
const runtimeErrors = await captureRuntimeErrors();
|
|
@@ -260,6 +336,11 @@ export async function runPostUnitVerification(
|
|
|
260
336
|
}
|
|
261
337
|
}
|
|
262
338
|
|
|
339
|
+
const verdict = decideVerificationVerdict(s.currentUnit.type, result);
|
|
340
|
+
if (!verdict.passed) {
|
|
341
|
+
result.passed = false;
|
|
342
|
+
}
|
|
343
|
+
|
|
263
344
|
if (uokFlags.gates) {
|
|
264
345
|
const gateRunner = new UokGateRunner();
|
|
265
346
|
gateRunner.register({
|
|
@@ -272,10 +353,12 @@ export async function runPostUnitVerification(
|
|
|
272
353
|
: "verification",
|
|
273
354
|
rationale: result.passed
|
|
274
355
|
? "verification checks passed"
|
|
275
|
-
:
|
|
356
|
+
: verdict.reason === "no-host-checks"
|
|
357
|
+
? "no runnable host-owned verification checks discovered"
|
|
358
|
+
: "verification checks failed",
|
|
276
359
|
findings: result.passed
|
|
277
360
|
? ""
|
|
278
|
-
: formatFailureContext(result),
|
|
361
|
+
: verdict.failureContext || formatFailureContext(result),
|
|
279
362
|
}),
|
|
280
363
|
});
|
|
281
364
|
|
|
@@ -343,13 +426,18 @@ export async function runPostUnitVerification(
|
|
|
343
426
|
writeVerificationJSON(result, tasksDir, tid, s.currentUnit.id);
|
|
344
427
|
} else {
|
|
345
428
|
const nextAttempt = attempt + 1;
|
|
429
|
+
const includeRetryMetadata =
|
|
430
|
+
!result.passed &&
|
|
431
|
+
verdict.retryable &&
|
|
432
|
+
autoFixEnabled &&
|
|
433
|
+
nextAttempt <= maxRetries;
|
|
346
434
|
writeVerificationJSON(
|
|
347
435
|
result,
|
|
348
436
|
tasksDir,
|
|
349
437
|
tid,
|
|
350
438
|
s.currentUnit.id,
|
|
351
|
-
nextAttempt,
|
|
352
|
-
maxRetries,
|
|
439
|
+
includeRetryMetadata ? nextAttempt : undefined,
|
|
440
|
+
includeRetryMetadata ? maxRetries : undefined,
|
|
353
441
|
);
|
|
354
442
|
}
|
|
355
443
|
}
|
|
@@ -358,26 +446,6 @@ export async function runPostUnitVerification(
|
|
|
358
446
|
}
|
|
359
447
|
}
|
|
360
448
|
|
|
361
|
-
const advisoryFailure =
|
|
362
|
-
!result.passed &&
|
|
363
|
-
(result.discoverySource === "package-json" ||
|
|
364
|
-
result.checks.some((check) =>
|
|
365
|
-
isInfraVerificationFailure(check.stderr),
|
|
366
|
-
));
|
|
367
|
-
|
|
368
|
-
if (advisoryFailure) {
|
|
369
|
-
s.verificationRetryCount.delete(retryKey);
|
|
370
|
-
s.verificationRetryFailureHashes.delete(retryKey);
|
|
371
|
-
s.pendingVerificationRetry = null;
|
|
372
|
-
ctx.ui.notify(
|
|
373
|
-
result.discoverySource === "package-json"
|
|
374
|
-
? "Verification failed in auto-discovered package.json checks — treating as advisory."
|
|
375
|
-
: "Verification failed due to infrastructure/runtime environment issues — treating as advisory.",
|
|
376
|
-
"warning",
|
|
377
|
-
);
|
|
378
|
-
return "continue";
|
|
379
|
-
}
|
|
380
|
-
|
|
381
449
|
// ── Post-execution checks (run after main verification passes for execute-task units) ──
|
|
382
450
|
let postExecChecks: PostExecutionCheckJSON[] | undefined;
|
|
383
451
|
let postExecBlockingFailure = false;
|
|
@@ -389,8 +457,7 @@ export async function runPostUnitVerification(
|
|
|
389
457
|
|
|
390
458
|
if (enhancedEnabled && postEnabled && isDbAvailable()) {
|
|
391
459
|
try {
|
|
392
|
-
//
|
|
393
|
-
const taskRow = getTask(mid, sid, tid);
|
|
460
|
+
// Reuse the already-loaded task row for post-execution checks.
|
|
394
461
|
if (taskRow && taskRow.key_files && taskRow.key_files.length > 0) {
|
|
395
462
|
// Get all tasks in the slice
|
|
396
463
|
const allTasks = getSliceTasks(mid, sid);
|
|
@@ -572,6 +639,17 @@ export async function runPostUnitVerification(
|
|
|
572
639
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
573
640
|
s.pendingVerificationRetry = null;
|
|
574
641
|
return "continue";
|
|
642
|
+
} else if (verdict.reason === "no-host-checks") {
|
|
643
|
+
s.verificationRetryCount.delete(retryKey);
|
|
644
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
645
|
+
s.pendingVerificationRetry = null;
|
|
646
|
+
ctx.ui.notify(
|
|
647
|
+
"Verification gate FAILED — no runnable host-owned verification checks were discovered. Pausing for human review.",
|
|
648
|
+
"error",
|
|
649
|
+
);
|
|
650
|
+
process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
|
|
651
|
+
await pauseAuto(ctx, pi);
|
|
652
|
+
return "pause";
|
|
575
653
|
} else if (postExecBlockingFailure) {
|
|
576
654
|
// Post-execution failures are cross-task consistency issues — retrying the same task won't fix them.
|
|
577
655
|
// Skip retry and pause immediately for human review.
|
|
@@ -589,7 +667,7 @@ export async function runPostUnitVerification(
|
|
|
589
667
|
s.verificationRetryCount.set(retryKey, nextAttempt);
|
|
590
668
|
s.pendingVerificationRetry = {
|
|
591
669
|
unitId: s.currentUnit.id,
|
|
592
|
-
failureContext: formatFailureContext(result),
|
|
670
|
+
failureContext: verdict.failureContext || formatFailureContext(result),
|
|
593
671
|
attempt: nextAttempt,
|
|
594
672
|
};
|
|
595
673
|
const failedCmds = result.checks
|
|
@@ -623,9 +701,13 @@ export async function runPostUnitVerification(
|
|
|
623
701
|
return "pause";
|
|
624
702
|
}
|
|
625
703
|
} catch (err) {
|
|
626
|
-
// Gate errors are non-fatal
|
|
627
704
|
logWarning("engine", `verification-gate error: ${(err as Error).message}`);
|
|
628
|
-
|
|
705
|
+
ctx.ui.notify(
|
|
706
|
+
`Verification gate errored before producing an authoritative verdict: ${(err as Error).message}`,
|
|
707
|
+
"error",
|
|
708
|
+
);
|
|
709
|
+
await pauseAuto(ctx, pi);
|
|
710
|
+
return "pause";
|
|
629
711
|
}
|
|
630
712
|
}
|
|
631
713
|
|
|
@@ -252,7 +252,17 @@ function gitPathspecForWorktreePath(basePath: string, targetPath: string): strin
|
|
|
252
252
|
let base = basePath;
|
|
253
253
|
let target = targetPath;
|
|
254
254
|
try {
|
|
255
|
-
base =
|
|
255
|
+
base = execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
256
|
+
cwd: basePath,
|
|
257
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
258
|
+
encoding: "utf-8",
|
|
259
|
+
}).trim() || basePath;
|
|
260
|
+
} catch {
|
|
261
|
+
/* keep original */
|
|
262
|
+
void base;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
base = realpathSync.native(base);
|
|
256
266
|
} catch {
|
|
257
267
|
/* keep original */
|
|
258
268
|
void base;
|
|
@@ -269,6 +279,10 @@ function gitPathspecForWorktreePath(basePath: string, targetPath: string): strin
|
|
|
269
279
|
return rel.replaceAll("\\", "/");
|
|
270
280
|
}
|
|
271
281
|
|
|
282
|
+
export function _gitPathspecForWorktreePath(basePath: string, targetPath: string): string | null {
|
|
283
|
+
return gitPathspecForWorktreePath(basePath, targetPath);
|
|
284
|
+
}
|
|
285
|
+
|
|
272
286
|
function gitRemoteExists(basePath: string, remote: string): boolean {
|
|
273
287
|
try {
|
|
274
288
|
execFileSync("git", ["remote", "get-url", remote], {
|
|
@@ -282,6 +296,50 @@ function gitRemoteExists(basePath: string, remote: string): boolean {
|
|
|
282
296
|
}
|
|
283
297
|
}
|
|
284
298
|
|
|
299
|
+
function findRegularMergeChangedPaths(basePath: string, milestoneBranch: string, mainBranch: string): Set<string> {
|
|
300
|
+
const changedPaths = new Set<string>();
|
|
301
|
+
let mergeLog = "";
|
|
302
|
+
try {
|
|
303
|
+
mergeLog = execFileSync("git", ["rev-list", "--merges", "--parents", mainBranch], {
|
|
304
|
+
cwd: basePath,
|
|
305
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
306
|
+
encoding: "utf-8",
|
|
307
|
+
}).trim();
|
|
308
|
+
} catch (err) {
|
|
309
|
+
logWarning("worktree", `regular merge lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
310
|
+
return changedPaths;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
for (const line of mergeLog.split("\n").filter(Boolean)) {
|
|
314
|
+
const [mergeCommit, firstParent, ...otherParents] = line.split(" ");
|
|
315
|
+
if (!mergeCommit || !firstParent || otherParents.length === 0) continue;
|
|
316
|
+
const mergedMilestone = otherParents.some((parent) => {
|
|
317
|
+
try {
|
|
318
|
+
return nativeIsAncestor(basePath, milestoneBranch, parent);
|
|
319
|
+
} catch {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
if (!mergedMilestone) continue;
|
|
324
|
+
|
|
325
|
+
try {
|
|
326
|
+
const output = execFileSync("git", ["diff", "--name-only", firstParent, mergeCommit], {
|
|
327
|
+
cwd: basePath,
|
|
328
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
329
|
+
encoding: "utf-8",
|
|
330
|
+
}).trim();
|
|
331
|
+
for (const path of output.split("\n").filter(Boolean)) {
|
|
332
|
+
if (!path.startsWith(".gsd/")) changedPaths.add(path);
|
|
333
|
+
}
|
|
334
|
+
} catch (err) {
|
|
335
|
+
logWarning("worktree", `regular merge diff lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
336
|
+
}
|
|
337
|
+
return changedPaths;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return changedPaths;
|
|
341
|
+
}
|
|
342
|
+
|
|
285
343
|
function clearProjectRootStateFiles(basePath: string, milestoneId: string): void {
|
|
286
344
|
const gsdDir = gsdRoot(basePath);
|
|
287
345
|
// Phase C pt 2: auto.lock removed from this list — the file is gone
|
|
@@ -643,7 +701,8 @@ export function syncGsdStateToWorktree(
|
|
|
643
701
|
// If both resolve to the same directory (symlink), no sync needed
|
|
644
702
|
if (isSamePath(mainGsd, wtGsd)) return { synced };
|
|
645
703
|
|
|
646
|
-
if (!existsSync(mainGsd)
|
|
704
|
+
if (!existsSync(mainGsd)) return { synced };
|
|
705
|
+
mkdirSync(wtGsd, { recursive: true });
|
|
647
706
|
|
|
648
707
|
// Sync root-level .gsd/ files (DECISIONS, REQUIREMENTS, PROJECT, KNOWLEDGE, etc.)
|
|
649
708
|
for (const f of ROOT_STATE_FILES) {
|
|
@@ -949,7 +1008,73 @@ export function enterBranchModeForMilestone(
|
|
|
949
1008
|
});
|
|
950
1009
|
}
|
|
951
1010
|
|
|
952
|
-
|
|
1011
|
+
checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
export function checkoutBranchWithStashGuard(
|
|
1015
|
+
basePath: string,
|
|
1016
|
+
branch: string,
|
|
1017
|
+
reason: string,
|
|
1018
|
+
): void {
|
|
1019
|
+
let stashMarker: string | null = null;
|
|
1020
|
+
let stashed = false;
|
|
1021
|
+
|
|
1022
|
+
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
1023
|
+
if (status.length > 0) {
|
|
1024
|
+
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
1025
|
+
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
1026
|
+
cwd: basePath,
|
|
1027
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1028
|
+
encoding: "utf-8",
|
|
1029
|
+
});
|
|
1030
|
+
execFileSync(
|
|
1031
|
+
"git",
|
|
1032
|
+
["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`],
|
|
1033
|
+
{
|
|
1034
|
+
cwd: basePath,
|
|
1035
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1036
|
+
encoding: "utf-8",
|
|
1037
|
+
},
|
|
1038
|
+
);
|
|
1039
|
+
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
1040
|
+
cwd: basePath,
|
|
1041
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1042
|
+
encoding: "utf-8",
|
|
1043
|
+
});
|
|
1044
|
+
stashed = stashListAfter !== stashListBefore;
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
// Checkout and stash-restore are split so we can distinguish two failure
|
|
1048
|
+
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
1049
|
+
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
1050
|
+
// the working-tree changes remain in the stash list. We surface a distinct
|
|
1051
|
+
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
1052
|
+
try {
|
|
1053
|
+
nativeCheckoutBranch(basePath, branch);
|
|
1054
|
+
} catch (checkoutErr) {
|
|
1055
|
+
if (stashed) {
|
|
1056
|
+
try {
|
|
1057
|
+
popStashByRef(basePath, stashMarker);
|
|
1058
|
+
} catch (restoreErr) {
|
|
1059
|
+
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
throw checkoutErr;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
if (stashed) {
|
|
1066
|
+
try {
|
|
1067
|
+
popStashByRef(basePath, stashMarker);
|
|
1068
|
+
} catch (popErr) {
|
|
1069
|
+
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
1070
|
+
const wrapped = new Error(
|
|
1071
|
+
`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`,
|
|
1072
|
+
);
|
|
1073
|
+
const ref = (popErr as { stashRef?: string } | null)?.stashRef;
|
|
1074
|
+
if (ref) (wrapped as { stashRef?: string }).stashRef = ref;
|
|
1075
|
+
throw wrapped;
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
953
1078
|
}
|
|
954
1079
|
|
|
955
1080
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
@@ -1739,6 +1864,66 @@ export function mergeMilestoneToMain(
|
|
|
1739
1864
|
}
|
|
1740
1865
|
}
|
|
1741
1866
|
|
|
1867
|
+
// Already regular-merged milestones can skip the squash path and proceed to cleanup (#5831).
|
|
1868
|
+
if (nativeIsAncestor(originalBasePath_, milestoneBranch, mainBranch)) {
|
|
1869
|
+
const codeChanges = nativeDiffNumstat(
|
|
1870
|
+
originalBasePath_,
|
|
1871
|
+
mainBranch,
|
|
1872
|
+
milestoneBranch,
|
|
1873
|
+
).filter((entry) => !entry.path.startsWith(".gsd/"));
|
|
1874
|
+
if (codeChanges.length > 0) {
|
|
1875
|
+
const regularMergeChangedPaths = findRegularMergeChangedPaths(
|
|
1876
|
+
originalBasePath_,
|
|
1877
|
+
milestoneBranch,
|
|
1878
|
+
mainBranch,
|
|
1879
|
+
);
|
|
1880
|
+
const unanchoredCodeChanges = codeChanges.filter((entry) =>
|
|
1881
|
+
regularMergeChangedPaths.has(entry.path)
|
|
1882
|
+
);
|
|
1883
|
+
if (unanchoredCodeChanges.length > 0) {
|
|
1884
|
+
process.chdir(previousCwd);
|
|
1885
|
+
throw new GSDError(
|
|
1886
|
+
GSD_GIT_ERROR,
|
|
1887
|
+
`Milestone branch "${milestoneBranch}" is reachable from "${mainBranch}" ` +
|
|
1888
|
+
`but has ${unanchoredCodeChanges.length} milestone-touched code file(s) not on current "${mainBranch}". ` +
|
|
1889
|
+
`Aborting worktree teardown to prevent data loss.`,
|
|
1890
|
+
);
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
debugLog("mergeMilestoneToMain", {
|
|
1894
|
+
action: "skip-squash-already-merged",
|
|
1895
|
+
milestoneId,
|
|
1896
|
+
milestoneBranch,
|
|
1897
|
+
mainBranch,
|
|
1898
|
+
});
|
|
1899
|
+
try {
|
|
1900
|
+
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
1901
|
+
} catch (err) {
|
|
1902
|
+
logWarning("worktree", `clearProjectRootStateFiles failed during already-merged cleanup: ${err instanceof Error ? err.message : String(err)}`);
|
|
1903
|
+
}
|
|
1904
|
+
try {
|
|
1905
|
+
removeWorktree(originalBasePath_, milestoneId, {
|
|
1906
|
+
branch: milestoneBranch,
|
|
1907
|
+
deleteBranch: false,
|
|
1908
|
+
});
|
|
1909
|
+
} catch (err) {
|
|
1910
|
+
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1911
|
+
}
|
|
1912
|
+
try {
|
|
1913
|
+
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
1914
|
+
} catch (err) {
|
|
1915
|
+
logWarning("worktree", `git branch-delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1916
|
+
}
|
|
1917
|
+
setActiveWorkspace(null);
|
|
1918
|
+
nudgeGitBranchCache(previousCwd);
|
|
1919
|
+
try {
|
|
1920
|
+
process.chdir(originalBasePath_);
|
|
1921
|
+
} catch (err) {
|
|
1922
|
+
logWarning("worktree", `chdir to project root after already-merged cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1923
|
+
}
|
|
1924
|
+
return { commitMessage, pushed: false, prCreated: false, codeFilesChanged: true };
|
|
1925
|
+
}
|
|
1926
|
+
|
|
1742
1927
|
// 7. Shelter queued milestone directories before the squash merge (#2505).
|
|
1743
1928
|
// The milestone branch may contain copies of queued milestone dirs (via
|
|
1744
1929
|
// copyPlanningArtifacts), so `git merge --squash` rejects when those same
|
|
@@ -1874,14 +2059,6 @@ export function mergeMilestoneToMain(
|
|
|
1874
2059
|
logWarning("worktree", `git stash failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1875
2060
|
}
|
|
1876
2061
|
|
|
1877
|
-
if (needsDbCycle && dbPathToReopen) {
|
|
1878
|
-
try {
|
|
1879
|
-
openDatabase(dbPathToReopen);
|
|
1880
|
-
} catch (err) {
|
|
1881
|
-
logWarning("worktree", `post-stash db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1882
|
-
}
|
|
1883
|
-
}
|
|
1884
|
-
|
|
1885
2062
|
// 7b. Clean up stale merge state before attempting squash merge (#2912).
|
|
1886
2063
|
// A leftover MERGE_HEAD (from a previous failed merge, libgit2 native path,
|
|
1887
2064
|
// or interrupted operation) causes `git merge --squash` to refuse with
|
|
@@ -1891,6 +2068,13 @@ export function mergeMilestoneToMain(
|
|
|
1891
2068
|
|
|
1892
2069
|
// 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
|
|
1893
2070
|
const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
2071
|
+
if (needsDbCycle && dbPathToReopen) {
|
|
2072
|
+
try {
|
|
2073
|
+
openDatabase(dbPathToReopen);
|
|
2074
|
+
} catch (err) {
|
|
2075
|
+
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2076
|
+
}
|
|
2077
|
+
}
|
|
1894
2078
|
|
|
1895
2079
|
if (!mergeResult.success) {
|
|
1896
2080
|
// Dirty working tree — the merge was rejected before it started (e.g.
|