gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82
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/detect-stuck.js +1 -1
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +122 -40
- package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
- package/dist/resources/extensions/gsd/auto/phases.js +146 -49
- 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-budget.js +9 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
- package/dist/resources/extensions/gsd/auto-start.js +99 -16
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +146 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
- package/dist/resources/extensions/gsd/auto.js +135 -74
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -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 +267 -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 +16 -4
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
- package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
- 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 +10 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
- package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
- 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-conflict-state.js +21 -0
- package/dist/resources/extensions/gsd/git-service.js +152 -15
- 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 +121 -2
- 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 +54 -19
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
- package/dist/resources/extensions/gsd/preferences.js +35 -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/repo-identity.js +39 -22
- 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/session-lock.js +15 -2
- package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
- 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 +28 -7
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- 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 +15 -9
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
- package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
- 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/validate-milestone.js +32 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
- package/dist/resources/extensions/gsd/tui/render-kit.js +33 -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/watch/header-renderer.js +34 -25
- 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 +86 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -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/shared/next-action-ui.js +13 -5
- 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 +8 -8
- 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 +8 -8
- 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/dist/welcome-screen.js +7 -8
- 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/src/__tests__/stream-process.test.mjs +32 -12
- 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/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.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 +82 -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/dynamic-border.test.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
- 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 +91 -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__/loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
- 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 +72 -4
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +3 -0
- package/packages/pi-tui/dist/components/loader.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 +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +117 -33
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
- package/packages/pi-tui/src/components/loader.ts +3 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +116 -33
- 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 +19 -6
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +123 -40
- package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
- package/src/resources/extensions/gsd/auto/phases.ts +172 -60
- 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-budget.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
- package/src/resources/extensions/gsd/auto-start.ts +109 -14
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +174 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
- package/src/resources/extensions/gsd/auto.ts +172 -81
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -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 +284 -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 +17 -4
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
- package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
- 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 +10 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
- package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +2 -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-conflict-state.ts +23 -0
- package/src/resources/extensions/gsd/git-service.ts +182 -16
- 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 +139 -2
- 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 +67 -19
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -4
- package/src/resources/extensions/gsd/preferences-types.ts +35 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
- package/src/resources/extensions/gsd/preferences.ts +39 -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/repo-identity.ts +45 -25
- 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/session-lock.ts +15 -2
- package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
- 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 +33 -7
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- 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/artifact-retry-cap.test.ts +1 -1
- 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 +775 -34
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
- 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 +136 -13
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
- 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-workers.test.ts +29 -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 +170 -3
- 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 +55 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -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 +139 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -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/exec-sandbox.test.ts +99 -1
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
- 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-git.test.ts +36 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
- 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/merge-self-branch-guard.test.ts +21 -40
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
- 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 +8 -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 +147 -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-missing-models-crash.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
- 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/repo-identity-worktree.test.ts +28 -1
- 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-lock-regression.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -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 +94 -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/tui-render-kit.test.ts +22 -0
- 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-write-order.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -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 +153 -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 +73 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -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 +18 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
- package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
- 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/validate-milestone.ts +31 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
- package/src/resources/extensions/gsd/tui/render-kit.ts +44 -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/watch/header-renderer.ts +35 -24
- 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 +98 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -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/next-action-ui.ts +11 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -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 → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_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,12 @@ 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";
|
|
50
|
+
import { getLedger } from "./metrics.js";
|
|
51
|
+
import { getUnitCostSpikeAction } from "./auto-budget.js";
|
|
43
52
|
|
|
44
53
|
export interface VerificationContext {
|
|
45
54
|
s: AutoSession;
|
|
@@ -49,10 +58,69 @@ export interface VerificationContext {
|
|
|
49
58
|
|
|
50
59
|
export type VerificationResult = "continue" | "retry" | "pause";
|
|
51
60
|
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
function getCurrentUnitCostStats(unitId: string): { unitCostUsd: number; rollingAvgUsd: number } {
|
|
62
|
+
const ledger = getLedger();
|
|
63
|
+
if (!ledger || !Array.isArray(ledger.units) || ledger.units.length === 0) {
|
|
64
|
+
return { unitCostUsd: 0, rollingAvgUsd: 0 };
|
|
65
|
+
}
|
|
66
|
+
let unitCostUsd = 0;
|
|
67
|
+
let totalCost = 0;
|
|
68
|
+
let totalUnits = 0;
|
|
69
|
+
for (const unit of ledger.units) {
|
|
70
|
+
const cost = typeof unit?.cost === "number" ? unit.cost : 0;
|
|
71
|
+
if (!Number.isFinite(cost) || cost < 0) continue;
|
|
72
|
+
totalCost += cost;
|
|
73
|
+
totalUnits++;
|
|
74
|
+
if (unit?.id === unitId) unitCostUsd += cost;
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
unitCostUsd,
|
|
78
|
+
rollingAvgUsd: totalUnits > 0 ? totalCost / totalUnits : 0,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function resolveVerificationTargets(
|
|
83
|
+
basePath: string,
|
|
84
|
+
prefs: GSDPreferences | undefined,
|
|
85
|
+
task: TaskRow | null,
|
|
86
|
+
slice: SliceRow | null,
|
|
87
|
+
): VerificationTarget[] {
|
|
88
|
+
const registry = createRepositoryRegistryFromPreferences(basePath, prefs);
|
|
89
|
+
const explicitIds =
|
|
90
|
+
task?.target_repositories?.length
|
|
91
|
+
? task.target_repositories
|
|
92
|
+
: slice?.target_repositories?.length
|
|
93
|
+
? slice.target_repositories
|
|
94
|
+
: null;
|
|
95
|
+
const requestedIds = explicitIds ?? ["project"];
|
|
96
|
+
|
|
97
|
+
const targets: VerificationTarget[] = [];
|
|
98
|
+
const seen = new Set<string>();
|
|
99
|
+
for (const id of requestedIds) {
|
|
100
|
+
if (seen.has(id)) continue;
|
|
101
|
+
seen.add(id);
|
|
102
|
+
const repo = registry.byId.get(id);
|
|
103
|
+
if (!repo) {
|
|
104
|
+
if (explicitIds) {
|
|
105
|
+
throw new Error(`unknown verification target repository: ${id}`);
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
targets.push({
|
|
110
|
+
id: repo.id,
|
|
111
|
+
cwd: repo.root,
|
|
112
|
+
// Top-level verification commands override per-repo defaults.
|
|
113
|
+
preferenceCommands: prefs?.verification_commands?.length
|
|
114
|
+
? undefined
|
|
115
|
+
: repo.verification,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!explicitIds && targets.length === 0) {
|
|
120
|
+
const project = registry.byId.get("project");
|
|
121
|
+
if (project) targets.push({ id: "project", cwd: project.root });
|
|
122
|
+
}
|
|
123
|
+
return targets;
|
|
56
124
|
}
|
|
57
125
|
|
|
58
126
|
/**
|
|
@@ -110,11 +178,31 @@ async function runValidateMilestonePostCheck(
|
|
|
110
178
|
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
111
179
|
if (!mid) return "continue";
|
|
112
180
|
|
|
181
|
+
const setToolFailureRetry = (message: string): VerificationResult => {
|
|
182
|
+
const retryKey = verificationRetryKey(s.currentUnit!.type, s.currentUnit!.id);
|
|
183
|
+
const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
|
|
184
|
+
s.verificationRetryCount.set(retryKey, attempt);
|
|
185
|
+
s.pendingVerificationRetry = {
|
|
186
|
+
unitId: s.currentUnit!.id,
|
|
187
|
+
failureContext: message,
|
|
188
|
+
attempt,
|
|
189
|
+
};
|
|
190
|
+
return "retry";
|
|
191
|
+
};
|
|
192
|
+
|
|
113
193
|
const validationFile = resolveMilestoneFile(s.basePath, mid, "VALIDATION");
|
|
114
|
-
if (!validationFile)
|
|
194
|
+
if (!validationFile) {
|
|
195
|
+
return setToolFailureRetry(
|
|
196
|
+
"You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.",
|
|
197
|
+
);
|
|
198
|
+
}
|
|
115
199
|
|
|
116
200
|
const validationContent = await loadFile(validationFile);
|
|
117
|
-
if (!validationContent)
|
|
201
|
+
if (!validationContent) {
|
|
202
|
+
return setToolFailureRetry(
|
|
203
|
+
"You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.",
|
|
204
|
+
);
|
|
205
|
+
}
|
|
118
206
|
|
|
119
207
|
const verdict = extractVerdict(validationContent);
|
|
120
208
|
if (verdict !== "needs-remediation") {
|
|
@@ -196,7 +284,7 @@ async function countIncompleteSlices(basePath: string, milestoneId: string): Pro
|
|
|
196
284
|
/**
|
|
197
285
|
* Run the verification gate for the current execute-task unit.
|
|
198
286
|
* Returns:
|
|
199
|
-
* - "continue" —
|
|
287
|
+
* - "continue" — host-owned verification passed, proceed normally
|
|
200
288
|
* - "retry" — gate failed with retries remaining, s.pendingVerificationRetry set for loop re-iteration
|
|
201
289
|
* - "pause" — gate failed with retries exhausted, pauseAuto already called
|
|
202
290
|
*/
|
|
@@ -226,18 +314,29 @@ export async function runPostUnitVerification(
|
|
|
226
314
|
// Read task plan verify field
|
|
227
315
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
|
|
228
316
|
let taskPlanVerify: string | undefined;
|
|
317
|
+
let taskRow: TaskRow | null = null;
|
|
318
|
+
let sliceRow: SliceRow | null = null;
|
|
229
319
|
if (mid && sid && tid) {
|
|
230
320
|
if (isDbAvailable()) {
|
|
231
|
-
|
|
321
|
+
taskRow = getTask(mid, sid, tid);
|
|
322
|
+
sliceRow = getSlice(mid, sid);
|
|
323
|
+
taskPlanVerify = taskRow?.verify;
|
|
232
324
|
}
|
|
233
325
|
// When DB unavailable, taskPlanVerify stays undefined — gate runs without task-specific checks
|
|
234
326
|
}
|
|
235
327
|
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
328
|
+
const verificationTargets = resolveVerificationTargets(s.basePath, prefs, taskRow, sliceRow);
|
|
329
|
+
const result = verificationTargets.length <= 1
|
|
330
|
+
? runVerificationGate({
|
|
331
|
+
cwd: verificationTargets[0]?.cwd ?? s.basePath,
|
|
332
|
+
preferenceCommands: prefs?.verification_commands ?? verificationTargets[0]?.preferenceCommands,
|
|
333
|
+
taskPlanVerify,
|
|
334
|
+
})
|
|
335
|
+
: runVerificationGateForTargets({
|
|
336
|
+
targets: verificationTargets,
|
|
337
|
+
preferenceCommands: prefs?.verification_commands,
|
|
338
|
+
taskPlanVerify,
|
|
339
|
+
});
|
|
241
340
|
|
|
242
341
|
// Capture runtime errors
|
|
243
342
|
const runtimeErrors = await captureRuntimeErrors();
|
|
@@ -260,6 +359,11 @@ export async function runPostUnitVerification(
|
|
|
260
359
|
}
|
|
261
360
|
}
|
|
262
361
|
|
|
362
|
+
const verdict = decideVerificationVerdict(s.currentUnit.type, result);
|
|
363
|
+
if (!verdict.passed) {
|
|
364
|
+
result.passed = false;
|
|
365
|
+
}
|
|
366
|
+
|
|
263
367
|
if (uokFlags.gates) {
|
|
264
368
|
const gateRunner = new UokGateRunner();
|
|
265
369
|
gateRunner.register({
|
|
@@ -272,10 +376,12 @@ export async function runPostUnitVerification(
|
|
|
272
376
|
: "verification",
|
|
273
377
|
rationale: result.passed
|
|
274
378
|
? "verification checks passed"
|
|
275
|
-
:
|
|
379
|
+
: verdict.reason === "no-host-checks"
|
|
380
|
+
? "no runnable host-owned verification checks discovered"
|
|
381
|
+
: "verification checks failed",
|
|
276
382
|
findings: result.passed
|
|
277
383
|
? ""
|
|
278
|
-
: formatFailureContext(result),
|
|
384
|
+
: verdict.failureContext || formatFailureContext(result),
|
|
279
385
|
}),
|
|
280
386
|
});
|
|
281
387
|
|
|
@@ -343,13 +449,18 @@ export async function runPostUnitVerification(
|
|
|
343
449
|
writeVerificationJSON(result, tasksDir, tid, s.currentUnit.id);
|
|
344
450
|
} else {
|
|
345
451
|
const nextAttempt = attempt + 1;
|
|
452
|
+
const includeRetryMetadata =
|
|
453
|
+
!result.passed &&
|
|
454
|
+
verdict.retryable &&
|
|
455
|
+
autoFixEnabled &&
|
|
456
|
+
nextAttempt <= maxRetries;
|
|
346
457
|
writeVerificationJSON(
|
|
347
458
|
result,
|
|
348
459
|
tasksDir,
|
|
349
460
|
tid,
|
|
350
461
|
s.currentUnit.id,
|
|
351
|
-
nextAttempt,
|
|
352
|
-
maxRetries,
|
|
462
|
+
includeRetryMetadata ? nextAttempt : undefined,
|
|
463
|
+
includeRetryMetadata ? maxRetries : undefined,
|
|
353
464
|
);
|
|
354
465
|
}
|
|
355
466
|
}
|
|
@@ -358,26 +469,6 @@ export async function runPostUnitVerification(
|
|
|
358
469
|
}
|
|
359
470
|
}
|
|
360
471
|
|
|
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
472
|
// ── Post-execution checks (run after main verification passes for execute-task units) ──
|
|
382
473
|
let postExecChecks: PostExecutionCheckJSON[] | undefined;
|
|
383
474
|
let postExecBlockingFailure = false;
|
|
@@ -389,8 +480,7 @@ export async function runPostUnitVerification(
|
|
|
389
480
|
|
|
390
481
|
if (enhancedEnabled && postEnabled && isDbAvailable()) {
|
|
391
482
|
try {
|
|
392
|
-
//
|
|
393
|
-
const taskRow = getTask(mid, sid, tid);
|
|
483
|
+
// Reuse the already-loaded task row for post-execution checks.
|
|
394
484
|
if (taskRow && taskRow.key_files && taskRow.key_files.length > 0) {
|
|
395
485
|
// Get all tasks in the slice
|
|
396
486
|
const allTasks = getSliceTasks(mid, sid);
|
|
@@ -572,6 +662,17 @@ export async function runPostUnitVerification(
|
|
|
572
662
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
573
663
|
s.pendingVerificationRetry = null;
|
|
574
664
|
return "continue";
|
|
665
|
+
} else if (verdict.reason === "no-host-checks") {
|
|
666
|
+
s.verificationRetryCount.delete(retryKey);
|
|
667
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
668
|
+
s.pendingVerificationRetry = null;
|
|
669
|
+
ctx.ui.notify(
|
|
670
|
+
"Verification gate FAILED — no runnable host-owned verification checks were discovered. Pausing for human review.",
|
|
671
|
+
"error",
|
|
672
|
+
);
|
|
673
|
+
process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
|
|
674
|
+
await pauseAuto(ctx, pi);
|
|
675
|
+
return "pause";
|
|
575
676
|
} else if (postExecBlockingFailure) {
|
|
576
677
|
// Post-execution failures are cross-task consistency issues — retrying the same task won't fix them.
|
|
577
678
|
// Skip retry and pause immediately for human review.
|
|
@@ -585,11 +686,38 @@ export async function runPostUnitVerification(
|
|
|
585
686
|
await pauseAuto(ctx, pi);
|
|
586
687
|
return "pause";
|
|
587
688
|
} else if (autoFixEnabled && attempt + 1 <= maxRetries) {
|
|
689
|
+
const { unitCostUsd, rollingAvgUsd } = getCurrentUnitCostStats(s.currentUnit.id);
|
|
690
|
+
const perUnitCapUsd =
|
|
691
|
+
typeof prefs?.per_unit_cost_cap_usd === "number" && Number.isFinite(prefs.per_unit_cost_cap_usd) && prefs.per_unit_cost_cap_usd > 0
|
|
692
|
+
? prefs.per_unit_cost_cap_usd
|
|
693
|
+
: 5.0;
|
|
694
|
+
if (unitCostUsd >= perUnitCapUsd) {
|
|
695
|
+
s.verificationRetryCount.delete(retryKey);
|
|
696
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
697
|
+
s.pendingVerificationRetry = null;
|
|
698
|
+
ctx.ui.notify(
|
|
699
|
+
`Unit ${s.currentUnit.id} hit per-unit cap $${perUnitCapUsd.toFixed(2)} — pausing auto-mode.`,
|
|
700
|
+
"error",
|
|
701
|
+
);
|
|
702
|
+
await pauseAuto(ctx, pi);
|
|
703
|
+
return "pause";
|
|
704
|
+
}
|
|
705
|
+
if (getUnitCostSpikeAction(unitCostUsd, rollingAvgUsd, 3.0) === "pause") {
|
|
706
|
+
s.verificationRetryCount.delete(retryKey);
|
|
707
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
708
|
+
s.pendingVerificationRetry = null;
|
|
709
|
+
ctx.ui.notify(
|
|
710
|
+
`Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) — pausing auto-mode.`,
|
|
711
|
+
"error",
|
|
712
|
+
);
|
|
713
|
+
await pauseAuto(ctx, pi);
|
|
714
|
+
return "pause";
|
|
715
|
+
}
|
|
588
716
|
const nextAttempt = attempt + 1;
|
|
589
717
|
s.verificationRetryCount.set(retryKey, nextAttempt);
|
|
590
718
|
s.pendingVerificationRetry = {
|
|
591
719
|
unitId: s.currentUnit.id,
|
|
592
|
-
failureContext: formatFailureContext(result),
|
|
720
|
+
failureContext: verdict.failureContext || formatFailureContext(result),
|
|
593
721
|
attempt: nextAttempt,
|
|
594
722
|
};
|
|
595
723
|
const failedCmds = result.checks
|
|
@@ -623,9 +751,13 @@ export async function runPostUnitVerification(
|
|
|
623
751
|
return "pause";
|
|
624
752
|
}
|
|
625
753
|
} catch (err) {
|
|
626
|
-
// Gate errors are non-fatal
|
|
627
754
|
logWarning("engine", `verification-gate error: ${(err as Error).message}`);
|
|
628
|
-
|
|
755
|
+
ctx.ui.notify(
|
|
756
|
+
`Verification gate errored before producing an authoritative verdict: ${(err as Error).message}`,
|
|
757
|
+
"error",
|
|
758
|
+
);
|
|
759
|
+
await pauseAuto(ctx, pi);
|
|
760
|
+
return "pause";
|
|
629
761
|
}
|
|
630
762
|
}
|
|
631
763
|
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
normalizeWorktreePathForCompare,
|
|
53
53
|
resolveWorktreeProjectRoot,
|
|
54
54
|
} from "./worktree-root.js";
|
|
55
|
-
import { MergeConflictError, createDraftPR, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
55
|
+
import { MergeConflictError, createDraftPR, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
56
56
|
import { buildPrEvidence } from "./pr-evidence.js";
|
|
57
57
|
import { debugLog } from "./debug-logger.js";
|
|
58
58
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
@@ -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 ────────────────────────────────────────────────────────────
|
|
@@ -1596,22 +1721,11 @@ export function mergeMilestoneToMain(
|
|
|
1596
1721
|
const previousCwd = process.cwd();
|
|
1597
1722
|
process.chdir(originalBasePath_);
|
|
1598
1723
|
|
|
1599
|
-
// 4. Resolve integration branch
|
|
1600
|
-
//
|
|
1601
|
-
// "main": repos using "master" or a custom default branch would fail at
|
|
1602
|
-
// checkout and leave the user with a broken merge state (#1668).
|
|
1724
|
+
// 4. Resolve integration branch via shared resolver so stale/invalid
|
|
1725
|
+
// milestone metadata can recover to configured/detected fallbacks.
|
|
1603
1726
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
1604
|
-
const
|
|
1605
|
-
|
|
1606
|
-
milestoneId,
|
|
1607
|
-
);
|
|
1608
|
-
// Validate prefs.main_branch exists before using it — a stale preference
|
|
1609
|
-
// (e.g. "master" when repo uses "main") causes merge failure (#3589).
|
|
1610
|
-
const validatedPrefBranch = prefs.main_branch && nativeBranchExists(originalBasePath_, prefs.main_branch)
|
|
1611
|
-
? prefs.main_branch
|
|
1612
|
-
: undefined;
|
|
1613
|
-
const mainBranch =
|
|
1614
|
-
integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
|
|
1727
|
+
const branchResolution = resolveMilestoneIntegrationBranch(originalBasePath_, milestoneId, prefs);
|
|
1728
|
+
const mainBranch = branchResolution.effectiveBranch ?? nativeDetectMainBranch(originalBasePath_);
|
|
1615
1729
|
|
|
1616
1730
|
// Fail closed when the resolved integration branch is the milestone branch
|
|
1617
1731
|
// itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
|
|
@@ -1625,9 +1739,8 @@ export function mergeMilestoneToMain(
|
|
|
1625
1739
|
throw new GSDError(
|
|
1626
1740
|
GSD_GIT_ERROR,
|
|
1627
1741
|
`Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
|
|
1628
|
-
`"${milestoneBranch}" — refusing to self-merge.
|
|
1629
|
-
`
|
|
1630
|
-
`before retrying milestone completion.`,
|
|
1742
|
+
`"${milestoneBranch}" — refusing to self-merge. ${branchResolution.reason}. ` +
|
|
1743
|
+
`Repair milestone integration metadata before retrying milestone completion.`,
|
|
1631
1744
|
);
|
|
1632
1745
|
}
|
|
1633
1746
|
|
|
@@ -1739,6 +1852,66 @@ export function mergeMilestoneToMain(
|
|
|
1739
1852
|
}
|
|
1740
1853
|
}
|
|
1741
1854
|
|
|
1855
|
+
// Already regular-merged milestones can skip the squash path and proceed to cleanup (#5831).
|
|
1856
|
+
if (nativeIsAncestor(originalBasePath_, milestoneBranch, mainBranch)) {
|
|
1857
|
+
const codeChanges = nativeDiffNumstat(
|
|
1858
|
+
originalBasePath_,
|
|
1859
|
+
mainBranch,
|
|
1860
|
+
milestoneBranch,
|
|
1861
|
+
).filter((entry) => !entry.path.startsWith(".gsd/"));
|
|
1862
|
+
if (codeChanges.length > 0) {
|
|
1863
|
+
const regularMergeChangedPaths = findRegularMergeChangedPaths(
|
|
1864
|
+
originalBasePath_,
|
|
1865
|
+
milestoneBranch,
|
|
1866
|
+
mainBranch,
|
|
1867
|
+
);
|
|
1868
|
+
const unanchoredCodeChanges = codeChanges.filter((entry) =>
|
|
1869
|
+
regularMergeChangedPaths.has(entry.path)
|
|
1870
|
+
);
|
|
1871
|
+
if (unanchoredCodeChanges.length > 0) {
|
|
1872
|
+
process.chdir(previousCwd);
|
|
1873
|
+
throw new GSDError(
|
|
1874
|
+
GSD_GIT_ERROR,
|
|
1875
|
+
`Milestone branch "${milestoneBranch}" is reachable from "${mainBranch}" ` +
|
|
1876
|
+
`but has ${unanchoredCodeChanges.length} milestone-touched code file(s) not on current "${mainBranch}". ` +
|
|
1877
|
+
`Aborting worktree teardown to prevent data loss.`,
|
|
1878
|
+
);
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
debugLog("mergeMilestoneToMain", {
|
|
1882
|
+
action: "skip-squash-already-merged",
|
|
1883
|
+
milestoneId,
|
|
1884
|
+
milestoneBranch,
|
|
1885
|
+
mainBranch,
|
|
1886
|
+
});
|
|
1887
|
+
try {
|
|
1888
|
+
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
1889
|
+
} catch (err) {
|
|
1890
|
+
logWarning("worktree", `clearProjectRootStateFiles failed during already-merged cleanup: ${err instanceof Error ? err.message : String(err)}`);
|
|
1891
|
+
}
|
|
1892
|
+
try {
|
|
1893
|
+
removeWorktree(originalBasePath_, milestoneId, {
|
|
1894
|
+
branch: milestoneBranch,
|
|
1895
|
+
deleteBranch: false,
|
|
1896
|
+
});
|
|
1897
|
+
} catch (err) {
|
|
1898
|
+
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1899
|
+
}
|
|
1900
|
+
try {
|
|
1901
|
+
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
1902
|
+
} catch (err) {
|
|
1903
|
+
logWarning("worktree", `git branch-delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1904
|
+
}
|
|
1905
|
+
setActiveWorkspace(null);
|
|
1906
|
+
nudgeGitBranchCache(previousCwd);
|
|
1907
|
+
try {
|
|
1908
|
+
process.chdir(originalBasePath_);
|
|
1909
|
+
} catch (err) {
|
|
1910
|
+
logWarning("worktree", `chdir to project root after already-merged cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1911
|
+
}
|
|
1912
|
+
return { commitMessage, pushed: false, prCreated: false, codeFilesChanged: true };
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1742
1915
|
// 7. Shelter queued milestone directories before the squash merge (#2505).
|
|
1743
1916
|
// The milestone branch may contain copies of queued milestone dirs (via
|
|
1744
1917
|
// copyPlanningArtifacts), so `git merge --squash` rejects when those same
|
|
@@ -1874,14 +2047,6 @@ export function mergeMilestoneToMain(
|
|
|
1874
2047
|
logWarning("worktree", `git stash failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1875
2048
|
}
|
|
1876
2049
|
|
|
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
2050
|
// 7b. Clean up stale merge state before attempting squash merge (#2912).
|
|
1886
2051
|
// A leftover MERGE_HEAD (from a previous failed merge, libgit2 native path,
|
|
1887
2052
|
// or interrupted operation) causes `git merge --squash` to refuse with
|
|
@@ -1891,6 +2056,13 @@ export function mergeMilestoneToMain(
|
|
|
1891
2056
|
|
|
1892
2057
|
// 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
|
|
1893
2058
|
const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
2059
|
+
if (needsDbCycle && dbPathToReopen) {
|
|
2060
|
+
try {
|
|
2061
|
+
openDatabase(dbPathToReopen);
|
|
2062
|
+
} catch (err) {
|
|
2063
|
+
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2064
|
+
}
|
|
2065
|
+
}
|
|
1894
2066
|
|
|
1895
2067
|
if (!mergeResult.success) {
|
|
1896
2068
|
// Dirty working tree — the merge was rejected before it started (e.g.
|