gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.1b44e695b
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 +134 -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 +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +144 -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 +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +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 +46 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-service.js +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-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
- package/dist/resources/extensions/gsd/preferences.js +6 -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/unit-context-composer.js +2 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +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 +7 -7
- 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 +7 -7
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +4 -4
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +13 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +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/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__/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 +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 +160 -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 +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +164 -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 +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +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 +45 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-service.ts +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-types.ts +35 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
- package/src/resources/extensions/gsd/preferences.ts +9 -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 +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 +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 +111 -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-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/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-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/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/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +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 → Z8H5evS-hDo0qdP22XJPA}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → Z8H5evS-hDo0qdP22XJPA}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Host-owned verification verdict policy for auto-mode units.
|
|
3
|
+
export function decideVerificationVerdict(unitType, result) {
|
|
4
|
+
if (unitType === "execute-task" && result.discoverySource === "none" && result.checks.length === 0) {
|
|
5
|
+
return {
|
|
6
|
+
passed: false,
|
|
7
|
+
reason: "no-host-checks",
|
|
8
|
+
retryable: false,
|
|
9
|
+
failureContext: "No runnable host-owned verification command was discovered. Add project verification_commands or a runnable task-plan Verify command before completing this execute-task.",
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
if (!result.passed) {
|
|
13
|
+
return {
|
|
14
|
+
passed: false,
|
|
15
|
+
reason: "checks-failed",
|
|
16
|
+
retryable: true,
|
|
17
|
+
failureContext: "",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
passed: true,
|
|
22
|
+
reason: "passed",
|
|
23
|
+
retryable: false,
|
|
24
|
+
failureContext: "",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -83,6 +83,7 @@ export function snapshotState() {
|
|
|
83
83
|
proof_level: r["proof_level"] ?? "",
|
|
84
84
|
integration_closure: r["integration_closure"] ?? "",
|
|
85
85
|
observability_impact: r["observability_impact"] ?? "",
|
|
86
|
+
target_repositories: JSON.parse(r["target_repositories"] || "[]"),
|
|
86
87
|
sequence: toNumeric(r["sequence"], 0),
|
|
87
88
|
replan_triggered_at: r["replan_triggered_at"] ?? null,
|
|
88
89
|
is_sketch: toNumeric(r["is_sketch"], 0),
|
|
@@ -114,6 +115,7 @@ export function snapshotState() {
|
|
|
114
115
|
expected_output: JSON.parse(r["expected_output"] || "[]"),
|
|
115
116
|
observability_impact: r["observability_impact"] ?? "",
|
|
116
117
|
full_plan_md: r["full_plan_md"] ?? "",
|
|
118
|
+
target_repositories: JSON.parse(r["target_repositories"] || "[]"),
|
|
117
119
|
sequence: toNumeric(r["sequence"], 0),
|
|
118
120
|
blocker_source: r["blocker_source"] ?? "",
|
|
119
121
|
escalation_pending: toNumeric(r["escalation_pending"], 0),
|
|
@@ -322,6 +322,16 @@ function hasAskUserQuestionsTool(activeTools) {
|
|
|
322
322
|
return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === "ask_user_questions";
|
|
323
323
|
});
|
|
324
324
|
}
|
|
325
|
+
function hasRequiredTool(requiredTool, activeTools) {
|
|
326
|
+
return activeTools.some((toolName) => {
|
|
327
|
+
if (toolName === requiredTool)
|
|
328
|
+
return true;
|
|
329
|
+
if (!toolName.startsWith("mcp__"))
|
|
330
|
+
return false;
|
|
331
|
+
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
332
|
+
return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === requiredTool;
|
|
333
|
+
});
|
|
334
|
+
}
|
|
325
335
|
function workflowMcpStructuredQuestionsOptIn(env = process.env) {
|
|
326
336
|
const value = env.GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS;
|
|
327
337
|
return value === "1" || value === "true";
|
|
@@ -352,8 +362,14 @@ export function getWorkflowTransportSupportError(provider, requiredTools, option
|
|
|
352
362
|
if (!launch) {
|
|
353
363
|
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: the GSD workflow MCP server is not configured or discoverable. Detected Claude Code model but no workflow MCP. Please run /gsd mcp init . from your project root. You can also configure GSD_WORKFLOW_MCP_COMMAND, build packages/mcp-server/dist/cli.js, or install gsd-mcp-server on PATH.`;
|
|
354
364
|
}
|
|
355
|
-
const
|
|
365
|
+
const uniqueRequired = [...new Set(requiredTools)];
|
|
366
|
+
const missing = (options.activeTools && options.activeTools.length > 0)
|
|
367
|
+
? uniqueRequired.filter((tool) => !hasRequiredTool(tool, options.activeTools))
|
|
368
|
+
: uniqueRequired.filter((tool) => !MCP_WORKFLOW_TOOL_SURFACE.has(tool));
|
|
356
369
|
if (missing.length === 0)
|
|
357
370
|
return null;
|
|
371
|
+
if (options.activeTools && options.activeTools.length > 0) {
|
|
372
|
+
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the active runtime toolset currently exposes only ${options.activeTools.slice().sort().join(", ")}.`;
|
|
373
|
+
}
|
|
358
374
|
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${Array.from(MCP_WORKFLOW_TOOL_SURFACE).sort().join(", ")}.`;
|
|
359
375
|
}
|
|
@@ -150,11 +150,11 @@ export function renderSummaryContent(taskRow, sliceId, milestoneId, evidence) {
|
|
|
150
150
|
}
|
|
151
151
|
// ── Frontmatter (YAML list format, matches parseSummary() expectations) ──
|
|
152
152
|
const keyFilesYaml = taskRow.key_files && taskRow.key_files.length > 0
|
|
153
|
-
? taskRow.key_files.map(f => ` - ${f}`).join("\n")
|
|
154
|
-
: "
|
|
153
|
+
? `\n${taskRow.key_files.map(f => ` - ${f}`).join("\n")}`
|
|
154
|
+
: " []";
|
|
155
155
|
const keyDecisionsYaml = taskRow.key_decisions && taskRow.key_decisions.length > 0
|
|
156
|
-
? taskRow.key_decisions.map(d => ` - ${d}`).join("\n")
|
|
157
|
-
: "
|
|
156
|
+
? `\n${taskRow.key_decisions.map(d => ` - ${d}`).join("\n")}`
|
|
157
|
+
: " []";
|
|
158
158
|
// Derive verification_result from evidence if available
|
|
159
159
|
const evidenceList = evidence ?? [];
|
|
160
160
|
const allPassed = evidenceList.length > 0 &&
|
|
@@ -182,10 +182,8 @@ export function renderSummaryContent(taskRow, sliceId, milestoneId, evidence) {
|
|
|
182
182
|
id: ${taskRow.id}
|
|
183
183
|
parent: ${sliceId}
|
|
184
184
|
milestone: ${milestoneId}
|
|
185
|
-
key_files
|
|
186
|
-
|
|
187
|
-
key_decisions:
|
|
188
|
-
${keyDecisionsYaml}
|
|
185
|
+
key_files:${keyFilesYaml}
|
|
186
|
+
key_decisions:${keyDecisionsYaml}
|
|
189
187
|
duration: ${taskRow.duration || ""}
|
|
190
188
|
verification_result: ${verificationResult}
|
|
191
189
|
completed_at: ${taskRow.completed_at || ""}
|
|
@@ -20,6 +20,7 @@ import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
|
20
20
|
import { randomUUID } from "node:crypto";
|
|
21
21
|
import { join } from "node:path";
|
|
22
22
|
import { debugLog } from "./debug-logger.js";
|
|
23
|
+
import { logWarning } from "./workflow-logger.js";
|
|
23
24
|
import { emitJournalEvent } from "./journal.js";
|
|
24
25
|
import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
|
|
25
26
|
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare, } from "./worktree-root.js";
|
|
@@ -48,6 +49,11 @@ import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
|
48
49
|
// is the only Module that calls them, and they live alongside the Module's
|
|
49
50
|
// other primitives in `auto-worktree.ts`.
|
|
50
51
|
import { autoWorktreeBranch, createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, getAutoWorktreePath, isInAutoWorktree, teardownAutoWorktree, } from "./auto-worktree.js";
|
|
52
|
+
const recentWorktreeMergeFailures = new Map();
|
|
53
|
+
const MERGE_FAILURE_DEDUPE_MS = 60_000;
|
|
54
|
+
export function resetRecentWorktreeMergeFailuresForTest() {
|
|
55
|
+
recentWorktreeMergeFailures.clear();
|
|
56
|
+
}
|
|
51
57
|
/**
|
|
52
58
|
* Internal sentinel — thrown by `_mergeBranchMode` when it has already
|
|
53
59
|
* emitted a user-visible error. The outer `mergeAndExit` catches the type
|
|
@@ -197,18 +203,9 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
|
|
|
197
203
|
cause: invalidMilestoneIdError(milestoneId),
|
|
198
204
|
};
|
|
199
205
|
}
|
|
200
|
-
if (s.isolationDegraded) {
|
|
201
|
-
debugLog("WorktreeLifecycle", {
|
|
202
|
-
action: "enterMilestone",
|
|
203
|
-
milestoneId,
|
|
204
|
-
skipped: true,
|
|
205
|
-
reason: "isolation-degraded",
|
|
206
|
-
});
|
|
207
|
-
return { ok: false, reason: "isolation-degraded" };
|
|
208
|
-
}
|
|
209
206
|
// Phase B: claim a milestone lease before any worktree mutation. Two
|
|
210
207
|
// workers cannot enter the same milestone concurrently. Best-effort:
|
|
211
|
-
//
|
|
208
|
+
// warn if no worker registered (single-worker fallback) or skip if DB
|
|
212
209
|
// unavailable; reuse existing lease if we already hold it on this
|
|
213
210
|
// milestone (re-entry within the same session).
|
|
214
211
|
if (s.workerId) {
|
|
@@ -288,11 +285,43 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
|
|
|
288
285
|
}
|
|
289
286
|
}
|
|
290
287
|
}
|
|
288
|
+
else {
|
|
289
|
+
logWarning("worktree", `enterMilestone(${milestoneId}) ran before auto worker registration; milestone lease was not claimed.`);
|
|
290
|
+
}
|
|
291
291
|
// Resolve the project root for worktree operations via shared helper.
|
|
292
292
|
// Handles the case where originalBasePath is falsy and basePath is itself
|
|
293
293
|
// a worktree path — prevents double-nested worktree paths (#3729).
|
|
294
294
|
const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
295
295
|
const mode = getIsolationMode(basePath);
|
|
296
|
+
if (s.isolationDegraded) {
|
|
297
|
+
if (mode === "worktree") {
|
|
298
|
+
try {
|
|
299
|
+
lifecycleEnterBranchMode(deps, basePath, milestoneId);
|
|
300
|
+
s.basePath = basePath;
|
|
301
|
+
rebuildGitService(s, deps);
|
|
302
|
+
invalidateAllCaches();
|
|
303
|
+
ctx.notify(`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`, "warning");
|
|
304
|
+
return { ok: true, mode: "branch", path: basePath };
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
debugLog("WorktreeLifecycle", {
|
|
308
|
+
action: "enterMilestone",
|
|
309
|
+
milestoneId,
|
|
310
|
+
skipped: true,
|
|
311
|
+
reason: "isolation-degraded",
|
|
312
|
+
fallback: "branch-failed",
|
|
313
|
+
error: err instanceof Error ? err.message : String(err),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
debugLog("WorktreeLifecycle", {
|
|
318
|
+
action: "enterMilestone",
|
|
319
|
+
milestoneId,
|
|
320
|
+
skipped: true,
|
|
321
|
+
reason: "isolation-degraded",
|
|
322
|
+
});
|
|
323
|
+
return { ok: false, reason: "isolation-degraded" };
|
|
324
|
+
}
|
|
296
325
|
if (mode === "none") {
|
|
297
326
|
debugLog("WorktreeLifecycle", {
|
|
298
327
|
action: "enterMilestone",
|
|
@@ -477,6 +506,28 @@ function rebuildGitService(s, deps) {
|
|
|
477
506
|
// GitService cast.
|
|
478
507
|
s.gitService = deps.gitServiceFactory(s.basePath);
|
|
479
508
|
}
|
|
509
|
+
function emitWorktreeMergeFailedOnce(basePath, milestoneId, err) {
|
|
510
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
511
|
+
const errorCategory = err instanceof Error ? err.name : "Error";
|
|
512
|
+
const now = Date.now();
|
|
513
|
+
const key = `${basePath}\0${milestoneId}\0${errorCategory}`;
|
|
514
|
+
const previous = recentWorktreeMergeFailures.get(key);
|
|
515
|
+
if (previous && now - previous < MERGE_FAILURE_DEDUPE_MS)
|
|
516
|
+
return;
|
|
517
|
+
for (const [candidate, ts] of recentWorktreeMergeFailures) {
|
|
518
|
+
if (now - ts >= MERGE_FAILURE_DEDUPE_MS) {
|
|
519
|
+
recentWorktreeMergeFailures.delete(candidate);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
emitJournalEvent(basePath, {
|
|
523
|
+
ts: new Date().toISOString(),
|
|
524
|
+
flowId: randomUUID(),
|
|
525
|
+
seq: 0,
|
|
526
|
+
eventType: "worktree-merge-failed",
|
|
527
|
+
data: { milestoneId, error: msg },
|
|
528
|
+
});
|
|
529
|
+
recentWorktreeMergeFailures.set(key, now);
|
|
530
|
+
}
|
|
480
531
|
// ─── Session-less merge entry (ADR-016 phase 2 / A1) ─────────────────────
|
|
481
532
|
/**
|
|
482
533
|
* Worktree-mode merge body. Session-less — operates on a `MergeContext`.
|
|
@@ -590,13 +641,7 @@ function _mergeWorktreeModeImpl(deps, mctx) {
|
|
|
590
641
|
error: msg,
|
|
591
642
|
fallback: "chdir-to-project-root",
|
|
592
643
|
});
|
|
593
|
-
|
|
594
|
-
ts: new Date().toISOString(),
|
|
595
|
-
flowId: randomUUID(),
|
|
596
|
-
seq: 0,
|
|
597
|
-
eventType: "worktree-merge-failed",
|
|
598
|
-
data: { milestoneId, error: msg },
|
|
599
|
-
});
|
|
644
|
+
emitWorktreeMergeFailedOnce(originalBasePath || worktreeBasePath, milestoneId, err);
|
|
600
645
|
// Surface a clear, actionable error. Worktree and milestone branch
|
|
601
646
|
// are intentionally preserved — nothing has been deleted. User can
|
|
602
647
|
// retry /gsd dispatch complete-milestone or merge manually once the
|
|
@@ -752,6 +797,9 @@ function _mergeBranchModeImpl(deps, mctx) {
|
|
|
752
797
|
export function mergeMilestoneStandalone(deps, mctx) {
|
|
753
798
|
const { originalBasePath, worktreeBasePath, milestoneId, notify } = mctx;
|
|
754
799
|
validateMilestoneId(milestoneId);
|
|
800
|
+
if (!originalBasePath && !worktreeBasePath) {
|
|
801
|
+
throw new Error(`Internal error: mergeMilestoneStandalone(${milestoneId}) requires originalBasePath or worktreeBasePath.`);
|
|
802
|
+
}
|
|
755
803
|
if (mctx.isolationDegraded) {
|
|
756
804
|
if (originalBasePath) {
|
|
757
805
|
try {
|
|
@@ -1198,17 +1246,36 @@ export class WorktreeLifecycle {
|
|
|
1198
1246
|
}
|
|
1199
1247
|
}
|
|
1200
1248
|
/**
|
|
1201
|
-
* Restore `s.basePath` to `s.originalBasePath
|
|
1202
|
-
* No-op when `originalBasePath` is empty (fresh
|
|
1249
|
+
* Restore `s.basePath` to `s.originalBasePath`, chdir process cwd, and
|
|
1250
|
+
* rebuild `s.gitService`. No-op when `originalBasePath` is empty (fresh
|
|
1251
|
+
* sessions).
|
|
1203
1252
|
*
|
|
1204
1253
|
* Used by error/cleanup paths that need the session to behave as if the
|
|
1205
1254
|
* worktree was never entered. Does NOT teardown the worktree directory —
|
|
1206
1255
|
* callers that need teardown go through `exitMilestone({ merge: false })`.
|
|
1256
|
+
*
|
|
1257
|
+
* ADR-016 phase 3 (#5693): chdir lives inside the verb so callers do not
|
|
1258
|
+
* pair `restoreToProjectRoot()` with a redundant `process.chdir`. The
|
|
1259
|
+
* chdir runs BEFORE the throwable work (`rebuildGitService`, cache
|
|
1260
|
+
* invalidation) so that cleanup-path cwd is restored even if the
|
|
1261
|
+
* downstream rebuild throws. The chdir itself is best-effort; failure is
|
|
1262
|
+
* logged via debugLog and swallowed.
|
|
1207
1263
|
*/
|
|
1208
1264
|
restoreToProjectRoot() {
|
|
1209
1265
|
if (!this.s.originalBasePath)
|
|
1210
1266
|
return;
|
|
1211
1267
|
this.s.basePath = this.s.originalBasePath;
|
|
1268
|
+
try {
|
|
1269
|
+
process.chdir(this.s.basePath);
|
|
1270
|
+
}
|
|
1271
|
+
catch (err) {
|
|
1272
|
+
debugLog("WorktreeLifecycle", {
|
|
1273
|
+
action: "restoreToProjectRoot",
|
|
1274
|
+
result: "chdir-failed",
|
|
1275
|
+
basePath: this.s.basePath,
|
|
1276
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1277
|
+
});
|
|
1278
|
+
}
|
|
1212
1279
|
rebuildGitService(this.s, this.deps);
|
|
1213
1280
|
invalidateAllCaches();
|
|
1214
1281
|
}
|
|
@@ -177,7 +177,16 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
177
177
|
const gitFilePath = join(wtPath, ".git");
|
|
178
178
|
if (!existsSync(gitFilePath)) {
|
|
179
179
|
logWarning("reconcile", `Removing stale worktree directory (no .git file): ${wtPath}`, { worktree: name });
|
|
180
|
-
|
|
180
|
+
try {
|
|
181
|
+
rmSync(wtPath, { recursive: true, force: true });
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
const code = error?.code;
|
|
185
|
+
if (code === "EPERM" || code === "EBUSY") {
|
|
186
|
+
throw new GSDError(GSD_GIT_ERROR, `Cannot remove stale worktree directory at ${wtPath} (${code}: directory may be locked by another process). Close editors/antivirus/git tools using this path and retry.`, { cause: error });
|
|
187
|
+
}
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
181
190
|
}
|
|
182
191
|
else {
|
|
183
192
|
throw new GSDError(GSD_STALE_STATE, `Worktree "${name}" already exists at ${wtPath}`);
|
|
@@ -491,7 +500,7 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
491
500
|
const nestedGitPath = join(nestedDir, ".git");
|
|
492
501
|
try {
|
|
493
502
|
rmSync(nestedGitPath, { recursive: true, force: true });
|
|
494
|
-
logWarning("reconcile", `Removed nested .git directory from scaffolded project to prevent data loss
|
|
503
|
+
logWarning("reconcile", `Removed nested .git directory from scaffolded project to prevent data loss`, { worktree: name, nestedRepo: nestedDir });
|
|
495
504
|
}
|
|
496
505
|
catch {
|
|
497
506
|
logWarning("reconcile", `Failed to remove nested .git directory — files may be lost as orphaned gitlink`, { worktree: name, nestedRepo: nestedDir });
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Project/App: GSD-2
|
|
2
2
|
// File Purpose: Worktree Safety module contract for validating source-writing Unit roots.
|
|
3
3
|
import { existsSync, lstatSync } from "node:fs";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
4
5
|
import { join, resolve } from "node:path";
|
|
5
6
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
6
7
|
import { listWorktrees } from "./worktree-manager.js";
|
|
@@ -17,6 +18,12 @@ const defaultDeps = {
|
|
|
17
18
|
branch: worktree.branch,
|
|
18
19
|
}));
|
|
19
20
|
},
|
|
21
|
+
pruneRegisteredWorktrees(projectRoot) {
|
|
22
|
+
execFileSync("git", ["worktree", "prune"], {
|
|
23
|
+
cwd: projectRoot,
|
|
24
|
+
stdio: "pipe",
|
|
25
|
+
});
|
|
26
|
+
},
|
|
20
27
|
getCurrentBranch,
|
|
21
28
|
};
|
|
22
29
|
function isValidMilestoneId(milestoneId) {
|
|
@@ -32,6 +39,7 @@ function errorMessage(error) {
|
|
|
32
39
|
return error instanceof Error ? error.message : String(error);
|
|
33
40
|
}
|
|
34
41
|
export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
42
|
+
const unregisteredRecoveryFailed = new Set();
|
|
35
43
|
return {
|
|
36
44
|
validateUnitRoot(input) {
|
|
37
45
|
if (input.writeScope === "planning-only") {
|
|
@@ -50,9 +58,16 @@ export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
|
50
58
|
}
|
|
51
59
|
const projectRoot = resolve(input.projectRoot);
|
|
52
60
|
const unitRoot = resolve(input.unitRoot);
|
|
53
|
-
const
|
|
61
|
+
const isolationMode = input.isolationMode ?? "worktree";
|
|
62
|
+
const expectedRoot = isolationMode === "worktree"
|
|
63
|
+
? join(projectRoot, ".gsd", "worktrees", milestoneId)
|
|
64
|
+
: projectRoot;
|
|
54
65
|
if (!samePath(unitRoot, expectedRoot)) {
|
|
55
|
-
return failure("invalid-root",
|
|
66
|
+
return failure("invalid-root", isolationMode === "worktree"
|
|
67
|
+
? `Unit root ${unitRoot} is not the expected worktree root for ${milestoneId}.`
|
|
68
|
+
: `Unit root ${unitRoot} is not the project root while isolation mode is ${isolationMode}.`, isolationMode === "worktree"
|
|
69
|
+
? "Prepare the Unit in its canonical milestone worktree before allowing source writes."
|
|
70
|
+
: "Run the Unit from the project root when worktree isolation is disabled.", { expectedRoot, unitRoot });
|
|
56
71
|
}
|
|
57
72
|
if (!deps.existsSync(unitRoot)) {
|
|
58
73
|
return failure("worktree-missing", `Worktree root ${unitRoot} does not exist.`, "Create or recover the milestone worktree before dispatching the source-writing Unit.", { unitRoot });
|
|
@@ -68,7 +83,7 @@ export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
|
68
83
|
catch (error) {
|
|
69
84
|
return failure("worktree-git-probe-failed", `Unable to inspect .git marker for worktree root ${unitRoot}.`, "Recover or recreate the milestone worktree before dispatching the source-writing Unit.", { gitMarker, error: errorMessage(error) });
|
|
70
85
|
}
|
|
71
|
-
if (!gitMarkerStat.isFile()) {
|
|
86
|
+
if (isolationMode === "worktree" && !gitMarkerStat.isFile()) {
|
|
72
87
|
return failure("worktree-git-marker-not-file", `Worktree root ${unitRoot} has a .git directory, not a registered worktree .git file.`, "Use a registered GSD worktree instead of a copied or nested repository.", { gitMarker });
|
|
73
88
|
}
|
|
74
89
|
let registered;
|
|
@@ -79,7 +94,31 @@ export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
|
79
94
|
return failure("worktree-git-probe-failed", `Unable to list registered worktrees for project root ${projectRoot}.`, "Recover or recreate the milestone worktree before dispatching the source-writing Unit.", { projectRoot, error: errorMessage(error) });
|
|
80
95
|
}
|
|
81
96
|
if (registered && !registered.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
82
|
-
|
|
97
|
+
const wasPreviouslyTracked = unregisteredRecoveryFailed.has(unitRoot);
|
|
98
|
+
let attemptedPrune = false;
|
|
99
|
+
if (!wasPreviouslyTracked && deps.pruneRegisteredWorktrees) {
|
|
100
|
+
attemptedPrune = true;
|
|
101
|
+
try {
|
|
102
|
+
deps.pruneRegisteredWorktrees(projectRoot);
|
|
103
|
+
const rechecked = deps.listRegisteredWorktrees?.(projectRoot);
|
|
104
|
+
if (rechecked?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
105
|
+
unregisteredRecoveryFailed.delete(unitRoot);
|
|
106
|
+
registered = rechecked;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
unregisteredRecoveryFailed.add(unitRoot);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
unregisteredRecoveryFailed.add(unitRoot);
|
|
114
|
+
return failure("worktree-git-probe-failed", `Unable to recover unregistered worktree root ${unitRoot}.`, "Run 'git worktree prune', then recreate the milestone worktree before dispatching the source-writing Unit.", { projectRoot, unitRoot, error: errorMessage(error) });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
118
|
+
return failure("worktree-unregistered", `Worktree root ${unitRoot} is not registered with git worktree list.`, attemptedPrune || wasPreviouslyTracked
|
|
119
|
+
? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
|
|
120
|
+
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) });
|
|
121
|
+
}
|
|
83
122
|
}
|
|
84
123
|
if (input.emptyWorktreeWithProjectContent) {
|
|
85
124
|
return failure("empty-worktree-with-project-content", `Worktree root ${unitRoot} has no project content, but the project root does.`, "Resolve untracked project-root content or recreate the worktree so source writes stay isolated.", { unitRoot, projectRoot });
|
|
@@ -100,6 +100,34 @@ function forceOverwriteAssessmentsWithVerdict(srcMilestoneDir, dstMilestoneDir)
|
|
|
100
100
|
logWarning("worktree", `assessment sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
|
+
function syncTopLevelMilestoneArtifacts(srcMilestonesDir, dstMilestonesDir) {
|
|
104
|
+
if (!existsSync(srcMilestonesDir))
|
|
105
|
+
return;
|
|
106
|
+
try {
|
|
107
|
+
for (const milestoneEntry of readdirSync(srcMilestonesDir, { withFileTypes: true })) {
|
|
108
|
+
if (!milestoneEntry.isDirectory())
|
|
109
|
+
continue;
|
|
110
|
+
const srcMilestoneDir = join(srcMilestonesDir, milestoneEntry.name);
|
|
111
|
+
const dstMilestoneDir = join(dstMilestonesDir, milestoneEntry.name);
|
|
112
|
+
try {
|
|
113
|
+
mkdirSync(dstMilestoneDir, { recursive: true });
|
|
114
|
+
for (const fileEntry of readdirSync(srcMilestoneDir, { withFileTypes: true })) {
|
|
115
|
+
if (!fileEntry.isFile())
|
|
116
|
+
continue;
|
|
117
|
+
if (!fileEntry.name.endsWith(".md") && !fileEntry.name.endsWith(".json"))
|
|
118
|
+
continue;
|
|
119
|
+
safeCopy(join(srcMilestoneDir, fileEntry.name), join(dstMilestoneDir, fileEntry.name), { force: false });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
logWarning("worktree", `milestone top-level artifact sync failed (${milestoneEntry.name}): ${err instanceof Error ? err.message : String(err)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
logWarning("worktree", `milestone artifact scan failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
103
131
|
/**
|
|
104
132
|
* Root-level .gsd/ files copied from worktree back to project root for
|
|
105
133
|
* post-merge diagnostics. Markdown projections are NOT in this list — DB
|
|
@@ -142,6 +170,9 @@ export function _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestone
|
|
|
142
170
|
// by validate-milestone) get clobbered by stale project root copies,
|
|
143
171
|
// causing an infinite re-validation loop (#1886).
|
|
144
172
|
safeCopyRecursive(join(prGsd, "milestones", milestoneId), join(wtGsd, "milestones", milestoneId), { force: false });
|
|
173
|
+
// Additively project missing top-level milestone files for all milestones
|
|
174
|
+
// so worktree-bound units can verify future-milestone context artifacts.
|
|
175
|
+
syncTopLevelMilestoneArtifacts(join(prGsd, "milestones"), join(wtGsd, "milestones"));
|
|
145
176
|
// Force-sync ASSESSMENT files that have a verdict from project root (#2821).
|
|
146
177
|
// The additive-only copy above preserves worktree-local files, but
|
|
147
178
|
// ASSESSMENT files are special: after run-uat writes a verdict and post-unit
|
|
@@ -32,6 +32,37 @@ function baseEntry(eventType, data) {
|
|
|
32
32
|
data,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
+
export function normalizeAutoExitReason(rawReason) {
|
|
36
|
+
const reason = rawReason ?? "stop";
|
|
37
|
+
const reasonLc = reason.toLowerCase();
|
|
38
|
+
return reasonLc.startsWith("blocked:")
|
|
39
|
+
? "blocked"
|
|
40
|
+
: reasonLc.startsWith("merge conflict")
|
|
41
|
+
? "merge-conflict"
|
|
42
|
+
: reasonLc.startsWith("merge error") || reasonLc.startsWith("merge failed")
|
|
43
|
+
? "merge-failed"
|
|
44
|
+
: reasonLc.startsWith("slice-parallel dispatched")
|
|
45
|
+
? "stop"
|
|
46
|
+
: reasonLc.startsWith("slice-merge-conflict")
|
|
47
|
+
? "slice-merge-conflict"
|
|
48
|
+
: reasonLc.startsWith("provider error")
|
|
49
|
+
? "provider-error"
|
|
50
|
+
: reasonLc.startsWith("session creation")
|
|
51
|
+
? "session-failed"
|
|
52
|
+
: reasonLc.startsWith("operation aborted") || reasonLc.includes("stream aborted")
|
|
53
|
+
? "stream-aborted"
|
|
54
|
+
: reasonLc.startsWith("auto-mode stopped")
|
|
55
|
+
? "unit-aborted"
|
|
56
|
+
: reasonLc.includes("pausing auto-mode after") && reasonLc.includes("retries")
|
|
57
|
+
? "verification-exhausted"
|
|
58
|
+
: reasonLc === "all milestones complete"
|
|
59
|
+
? "all-complete"
|
|
60
|
+
: reasonLc === "no active milestone"
|
|
61
|
+
? "no-active-milestone"
|
|
62
|
+
: reasonLc === "stop" || reasonLc === "pause"
|
|
63
|
+
? reasonLc
|
|
64
|
+
: "other";
|
|
65
|
+
}
|
|
35
66
|
// ─── Emitters ────────────────────────────────────────────────────────────
|
|
36
67
|
export function emitWorktreeCreated(projectRoot, milestoneId, meta = {}) {
|
|
37
68
|
emitJournalEvent(projectRoot, baseEntry("worktree-created", {
|
|
@@ -68,6 +99,7 @@ export function emitWorktreeOrphaned(projectRoot, milestoneId, meta) {
|
|
|
68
99
|
export function emitAutoExit(projectRoot, meta) {
|
|
69
100
|
emitJournalEvent(projectRoot, baseEntry("auto-exit", {
|
|
70
101
|
reason: meta.reason,
|
|
102
|
+
rawReason: meta.rawReason,
|
|
71
103
|
flowId: meta.flowId,
|
|
72
104
|
milestoneId: meta.milestoneId,
|
|
73
105
|
milestoneMerged: meta.milestoneMerged,
|