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
|
@@ -29,7 +29,7 @@ import { execFileSync } from "node:child_process";
|
|
|
29
29
|
import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
|
|
30
30
|
import { makeUI } from "../shared/tui.js";
|
|
31
31
|
import { GLYPH, INDENT } from "../shared/mod.js";
|
|
32
|
-
import { padRightVisible,
|
|
32
|
+
import { padRightVisible, renderPanel, renderProgressBar, rightAlign, wrapVisibleText } from "./tui/render-kit.js";
|
|
33
33
|
import { computeProgressScore } from "./progress-score.js";
|
|
34
34
|
import {
|
|
35
35
|
getGlobalGSDPreferencesPath,
|
|
@@ -120,6 +120,26 @@ export interface AutoOutcomeSurfaceSnapshot {
|
|
|
120
120
|
startedAt?: number;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
export function buildPhaseHandoffOutcome(input: {
|
|
124
|
+
unitType: string;
|
|
125
|
+
unitId: string;
|
|
126
|
+
agentEndMessages?: unknown[] | null;
|
|
127
|
+
}): AutoOutcomeSurfaceSnapshot {
|
|
128
|
+
const phase = unitPhaseLabel(input.unitType);
|
|
129
|
+
const detail =
|
|
130
|
+
extractLastAssistantSummary(input.agentEndMessages) ??
|
|
131
|
+
`Completed ${unitVerb(input.unitType)} ${input.unitId}.`;
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
status: "complete",
|
|
135
|
+
title: `${phase} complete`,
|
|
136
|
+
detail,
|
|
137
|
+
unitLabel: `${unitVerb(input.unitType)} ${input.unitId}`,
|
|
138
|
+
nextAction: "Preparing the next phase. Review this handoff while the next session starts.",
|
|
139
|
+
commands: ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history"],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
123
143
|
// ─── Unit Description Helpers ─────────────────────────────────────────────────
|
|
124
144
|
|
|
125
145
|
export function unitVerb(unitType: string): string {
|
|
@@ -631,7 +651,6 @@ export function updateProgressWidget(
|
|
|
631
651
|
tierBadge?: string,
|
|
632
652
|
): void {
|
|
633
653
|
if (!ctx.hasUI) return;
|
|
634
|
-
ctx.ui.setWidget("gsd-outcome", undefined);
|
|
635
654
|
|
|
636
655
|
// Welcome header is a startup-only banner — permanently suppress it once
|
|
637
656
|
// auto-mode activates. The dashboard widget owns all status from here.
|
|
@@ -1099,12 +1118,14 @@ export function setAutoOutcomeWidget(
|
|
|
1099
1118
|
: snapshot.status === "blocked" ? "!"
|
|
1100
1119
|
: snapshot.status === "paused" ? "||"
|
|
1101
1120
|
: "●";
|
|
1102
|
-
|
|
1121
|
+
// renderPanel indents body lines by 2; mirror that for wrap width.
|
|
1122
|
+
const innerWidth = Math.max(8, width - 2);
|
|
1103
1123
|
const maxLines = 7;
|
|
1104
1124
|
const lines: string[] = [];
|
|
1105
1125
|
const elapsed = snapshot.startedAt ? formatAutoElapsed(snapshot.startedAt) : "";
|
|
1106
1126
|
const heading = `${theme.fg(color, icon)} ${theme.fg("accent", theme.bold("GSD"))} ${theme.fg("text", snapshot.title)}`;
|
|
1107
|
-
|
|
1127
|
+
// Elapsed rides inline after the title on the header rule.
|
|
1128
|
+
const title = elapsed ? `${heading} ${theme.fg("dim", elapsed)}` : heading;
|
|
1108
1129
|
const commands = snapshot.commands?.filter(Boolean) ?? [];
|
|
1109
1130
|
const commandLine = commands.length > 0 ? theme.fg("dim", commands.join(" · ")) : null;
|
|
1110
1131
|
|
|
@@ -1130,7 +1151,7 @@ export function setAutoOutcomeWidget(
|
|
|
1130
1151
|
lines.push(commandLine);
|
|
1131
1152
|
}
|
|
1132
1153
|
|
|
1133
|
-
return
|
|
1154
|
+
return renderPanel(theme, title, lines, width, { ruleColor: color });
|
|
1134
1155
|
},
|
|
1135
1156
|
invalidate(): void {},
|
|
1136
1157
|
dispose(): void {},
|
|
@@ -1145,3 +1166,55 @@ function normalizeRollupText(value: string | null | undefined): string | null {
|
|
|
1145
1166
|
if (!clean || clean === "(none)" || clean === "None." || clean === "Not provided.") return null;
|
|
1146
1167
|
return clean;
|
|
1147
1168
|
}
|
|
1169
|
+
|
|
1170
|
+
function isAssistantMessage(value: unknown): boolean {
|
|
1171
|
+
if (!value || typeof value !== "object") return false;
|
|
1172
|
+
const record = value as Record<string, unknown>;
|
|
1173
|
+
if (record.role === "assistant") return true;
|
|
1174
|
+
|
|
1175
|
+
const message = record.message;
|
|
1176
|
+
if (message && typeof message === "object") {
|
|
1177
|
+
return (message as Record<string, unknown>).role === "assistant";
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
return false;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
function extractLastAssistantSummary(messages: unknown[] | null | undefined): string | null {
|
|
1184
|
+
if (!messages || messages.length === 0) return null;
|
|
1185
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1186
|
+
if (!isAssistantMessage(messages[i])) continue;
|
|
1187
|
+
const text = extractMessageText(messages[i]);
|
|
1188
|
+
const clean = normalizeRollupText(text);
|
|
1189
|
+
if (clean) return truncateToWidth(clean, 220, "…");
|
|
1190
|
+
}
|
|
1191
|
+
return null;
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
function extractMessageText(value: unknown): string | null {
|
|
1195
|
+
if (typeof value === "string") return value;
|
|
1196
|
+
if (!value || typeof value !== "object") return null;
|
|
1197
|
+
|
|
1198
|
+
const record = value as Record<string, unknown>;
|
|
1199
|
+
if (typeof record.content === "string") return record.content;
|
|
1200
|
+
|
|
1201
|
+
const message = record.message;
|
|
1202
|
+
if (message && typeof message === "object") {
|
|
1203
|
+
return extractMessageText(message);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
const content = record.content;
|
|
1207
|
+
if (Array.isArray(content)) {
|
|
1208
|
+
const parts = content
|
|
1209
|
+
.map((part) => {
|
|
1210
|
+
if (typeof part === "string") return part;
|
|
1211
|
+
if (!part || typeof part !== "object") return "";
|
|
1212
|
+
const partRecord = part as Record<string, unknown>;
|
|
1213
|
+
return typeof partRecord.text === "string" ? partRecord.text : "";
|
|
1214
|
+
})
|
|
1215
|
+
.filter(Boolean);
|
|
1216
|
+
return parts.length > 0 ? parts.join(" ") : null;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
return null;
|
|
1220
|
+
}
|
|
@@ -280,6 +280,7 @@ export async function dispatchDirectPhase(
|
|
|
280
280
|
unitType,
|
|
281
281
|
authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
|
|
282
282
|
baseUrl: ctx.model?.baseUrl,
|
|
283
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
283
284
|
},
|
|
284
285
|
);
|
|
285
286
|
if (compatibilityError) {
|
|
@@ -28,13 +28,16 @@ import {
|
|
|
28
28
|
resolveSliceFile,
|
|
29
29
|
resolveSlicePath,
|
|
30
30
|
resolveTaskFile,
|
|
31
|
+
relTaskFile,
|
|
31
32
|
relSliceFile,
|
|
32
33
|
buildMilestoneFileName,
|
|
33
34
|
buildSliceFileName,
|
|
35
|
+
buildTaskFileName,
|
|
36
|
+
gsdProjectionRoot,
|
|
34
37
|
} from "./paths.js";
|
|
35
38
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
36
39
|
import { validateArtifact } from "./schemas/validate.js";
|
|
37
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
|
|
40
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
38
41
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
39
42
|
import { join } from "node:path";
|
|
40
43
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
@@ -83,6 +86,11 @@ import {
|
|
|
83
86
|
import { annotateBackgroundable } from "./delegation-policy.js";
|
|
84
87
|
import { invalidateAllCaches } from "./cache.js";
|
|
85
88
|
import { insertMilestoneValidationGates } from "./milestone-validation-gates.js";
|
|
89
|
+
import { nativeHasChanges, nativeIsRepo, _resetHasChangesCache } from "./native-git-bridge.js";
|
|
90
|
+
import { debugLog, isDebugEnabled } from "./debug-logger.js";
|
|
91
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
92
|
+
import { listUnmergedGitPaths } from "./git-conflict-state.js";
|
|
93
|
+
import { runTurnGitAction } from "./git-service.js";
|
|
86
94
|
|
|
87
95
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
88
96
|
|
|
@@ -154,6 +162,54 @@ export interface DispatchRule {
|
|
|
154
162
|
match: (ctx: DispatchContext) => Promise<DispatchAction | null>;
|
|
155
163
|
}
|
|
156
164
|
|
|
165
|
+
function commitPendingMilestoneCloseoutChanges(basePath: string, mid: string): DispatchAction | null {
|
|
166
|
+
if (!nativeIsRepo(basePath)) return null;
|
|
167
|
+
|
|
168
|
+
const conflictedPaths = listUnmergedGitPaths(basePath);
|
|
169
|
+
if (conflictedPaths === null) {
|
|
170
|
+
return {
|
|
171
|
+
action: "stop",
|
|
172
|
+
reason: `Cannot complete milestone ${mid}: failed to evaluate unresolved Git conflicts. Resolve Git/worktree state manually before closing.`,
|
|
173
|
+
level: "error",
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (conflictedPaths.length > 0) {
|
|
177
|
+
return {
|
|
178
|
+
action: "stop",
|
|
179
|
+
reason: `Cannot complete milestone ${mid}: unresolved Git conflicts detected in ${conflictedPaths.join(", ")}. Resolve conflicts before closing.`,
|
|
180
|
+
level: "error",
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
_resetHasChangesCache();
|
|
185
|
+
if (!nativeHasChanges(basePath)) return null;
|
|
186
|
+
|
|
187
|
+
const gitResult = runTurnGitAction({
|
|
188
|
+
basePath,
|
|
189
|
+
action: "commit",
|
|
190
|
+
unitType: "complete-milestone-preflight",
|
|
191
|
+
unitId: mid,
|
|
192
|
+
});
|
|
193
|
+
if (gitResult.status !== "ok") {
|
|
194
|
+
return {
|
|
195
|
+
action: "stop",
|
|
196
|
+
reason: `Cannot complete milestone ${mid}: failed to commit pending changes before closing: ${gitResult.error ?? "unknown git error"}.`,
|
|
197
|
+
level: "warning",
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
_resetHasChangesCache();
|
|
202
|
+
if (nativeHasChanges(basePath)) {
|
|
203
|
+
return {
|
|
204
|
+
action: "stop",
|
|
205
|
+
reason: `Cannot complete milestone ${mid}: uncommitted changes remain after the pre-completion commit. Commit or stash before closing.`,
|
|
206
|
+
level: "warning",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
|
|
157
213
|
export type DeepProjectStage =
|
|
158
214
|
DeepProjectSetupStage;
|
|
159
215
|
|
|
@@ -231,6 +287,22 @@ export function shouldRunDeepProjectSetup(
|
|
|
231
287
|
return hasPendingDeepStage(prefs, basePath);
|
|
232
288
|
}
|
|
233
289
|
|
|
290
|
+
function resolveArtifactBasePath(
|
|
291
|
+
basePath: string,
|
|
292
|
+
mid: string,
|
|
293
|
+
session: import("./auto/session.js").AutoSession | undefined,
|
|
294
|
+
): string {
|
|
295
|
+
if (
|
|
296
|
+
session?.basePath &&
|
|
297
|
+
session.currentMilestoneId === mid &&
|
|
298
|
+
existsSync(session.basePath)
|
|
299
|
+
) {
|
|
300
|
+
return session.basePath;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return resolveCanonicalMilestoneRoot(basePath, mid);
|
|
304
|
+
}
|
|
305
|
+
|
|
234
306
|
function missingSliceStop(mid: string, phase: string): DispatchAction {
|
|
235
307
|
return {
|
|
236
308
|
action: "stop",
|
|
@@ -239,6 +311,42 @@ function missingSliceStop(mid: string, phase: string): DispatchAction {
|
|
|
239
311
|
};
|
|
240
312
|
}
|
|
241
313
|
|
|
314
|
+
function isRegistryMilestoneComplete(state: GSDState, mid: string): boolean {
|
|
315
|
+
return state.registry.some((milestone) =>
|
|
316
|
+
milestone.id === mid && milestone.status === "complete"
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function hasMilestonePassedDiscuss(basePath: string, mid: string): boolean {
|
|
321
|
+
if (isDbAvailable()) {
|
|
322
|
+
try {
|
|
323
|
+
const slices = getMilestoneSlices(mid);
|
|
324
|
+
for (const slice of slices) {
|
|
325
|
+
const planPath = resolveSliceFile(basePath, mid, slice.id, "PLAN");
|
|
326
|
+
if (planPath && existsSync(planPath)) return true;
|
|
327
|
+
}
|
|
328
|
+
} catch (err) {
|
|
329
|
+
// Fall through to filesystem checks when DB access is degraded.
|
|
330
|
+
logWarning(
|
|
331
|
+
"dispatch",
|
|
332
|
+
`discuss-progress DB check failed for ${mid}, falling back to filesystem: ${err instanceof Error ? err.message : String(err)}`,
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const milestonePath = resolveMilestonePath(basePath, mid);
|
|
337
|
+
if (milestonePath) {
|
|
338
|
+
const slicesDir = join(milestonePath, "slices");
|
|
339
|
+
if (existsSync(slicesDir)) {
|
|
340
|
+
for (const sliceEntry of readdirSync(slicesDir, { withFileTypes: true })) {
|
|
341
|
+
if (!sliceEntry.isDirectory()) continue;
|
|
342
|
+
const planPath = join(slicesDir, sliceEntry.name, `${sliceEntry.name}-PLAN.md`);
|
|
343
|
+
if (existsSync(planPath)) return true;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return hasImplementationArtifacts(basePath, mid) === "present";
|
|
348
|
+
}
|
|
349
|
+
|
|
242
350
|
/**
|
|
243
351
|
* Check for milestone slices missing SUMMARY files.
|
|
244
352
|
* Returns array of missing slice IDs, or empty array if all present or DB unavailable.
|
|
@@ -395,6 +503,8 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
395
503
|
match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
|
|
396
504
|
if (!EXECUTION_ENTRY_PHASES.has(state.phase)) return null;
|
|
397
505
|
if (!MILESTONE_ID_RE.test(mid)) return null;
|
|
506
|
+
if (isRegistryMilestoneComplete(state, mid)) return null;
|
|
507
|
+
if (hasMilestonePassedDiscuss(basePath, mid)) return null;
|
|
398
508
|
// Align with the plan-v2 gate's lookup semantics: whitespace-only counts
|
|
399
509
|
// as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
|
|
400
510
|
if (hasFinalizedMilestoneContext(basePath, mid)) return null;
|
|
@@ -450,9 +560,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
450
560
|
const attempts = incrementUatCount(basePath, mid, sliceId);
|
|
451
561
|
if (attempts > MAX_UAT_ATTEMPTS) {
|
|
452
562
|
return {
|
|
453
|
-
action: "
|
|
454
|
-
reason: `run-uat for ${mid}/${sliceId} has been dispatched ${attempts - 1} times without producing a verdict. Verification commands may be broken — fix the UAT spec or manually write an ASSESSMENT verdict.`,
|
|
455
|
-
level: "warning" as const,
|
|
563
|
+
action: "skip" as const,
|
|
456
564
|
};
|
|
457
565
|
}
|
|
458
566
|
const uatFile = resolveSliceFile(basePath, mid, sliceId, "UAT")!;
|
|
@@ -500,11 +608,10 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
500
608
|
const { verdict, uatType } = result;
|
|
501
609
|
|
|
502
610
|
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
};
|
|
611
|
+
// Do not hard-stop auto-mode on non-PASS verdicts. Allow progression
|
|
612
|
+
// so follow-up slices can remediate, while complete-milestone still
|
|
613
|
+
// enforces manual UAT PASS sign-off before closure.
|
|
614
|
+
continue;
|
|
508
615
|
}
|
|
509
616
|
}
|
|
510
617
|
return null;
|
|
@@ -709,6 +816,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
709
816
|
name: "pre-planning (no context) → discuss-milestone",
|
|
710
817
|
match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
|
|
711
818
|
if (state.phase !== "pre-planning") return null;
|
|
819
|
+
if (isRegistryMilestoneComplete(state, mid)) return null;
|
|
712
820
|
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
713
821
|
const hasContext = !!(contextFile && (await loadFile(contextFile)));
|
|
714
822
|
if (hasContext) return null; // fall through to next rule
|
|
@@ -760,7 +868,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
760
868
|
},
|
|
761
869
|
},
|
|
762
870
|
{
|
|
763
|
-
name: "planning (require_slice_discussion) → pause for discussion
|
|
871
|
+
name: "planning (require_slice_discussion) → pause for discussion",
|
|
764
872
|
match: async ({ state, mid, basePath, prefs }) => {
|
|
765
873
|
if (state.phase !== "planning") return null;
|
|
766
874
|
if (!prefs?.phases?.require_slice_discussion) return null;
|
|
@@ -1150,20 +1258,50 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1150
1258
|
},
|
|
1151
1259
|
{
|
|
1152
1260
|
name: "executing → execute-task (recover missing task plan → plan-slice)",
|
|
1153
|
-
match: async ({ state, mid, midTitle, basePath, sessionContextWindow, modelRegistry, sessionProvider }) => {
|
|
1261
|
+
match: async ({ state, mid, midTitle, basePath, session, sessionContextWindow, modelRegistry, sessionProvider }) => {
|
|
1154
1262
|
if (state.phase !== "executing" || !state.activeTask) return null;
|
|
1155
1263
|
if (!state.activeSlice) return missingSliceStop(mid, state.phase);
|
|
1156
1264
|
const sid = state.activeSlice!.id;
|
|
1157
1265
|
const sTitle = state.activeSlice!.title;
|
|
1158
1266
|
const tid = state.activeTask.id;
|
|
1267
|
+
const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
|
|
1159
1268
|
|
|
1160
1269
|
// Guard: if the slice plan exists but the individual task plan files are
|
|
1161
1270
|
// missing, the planner created S##-PLAN.md with task entries but never
|
|
1162
1271
|
// wrote the tasks/ directory files. Dispatch plan-slice to regenerate
|
|
1163
1272
|
// them rather than hard-stopping — fixes the infinite-loop described in
|
|
1164
1273
|
// issue #909.
|
|
1165
|
-
const taskPlanPath = resolveTaskFile(
|
|
1166
|
-
|
|
1274
|
+
const taskPlanPath = resolveTaskFile(artifactBasePath, mid, sid, tid, "PLAN");
|
|
1275
|
+
const projectionTaskPlanPath = join(
|
|
1276
|
+
gsdProjectionRoot(artifactBasePath),
|
|
1277
|
+
"milestones",
|
|
1278
|
+
mid,
|
|
1279
|
+
"slices",
|
|
1280
|
+
sid,
|
|
1281
|
+
"tasks",
|
|
1282
|
+
buildTaskFileName(tid, "PLAN"),
|
|
1283
|
+
);
|
|
1284
|
+
if ((!taskPlanPath || !existsSync(taskPlanPath)) && !existsSync(projectionTaskPlanPath)) {
|
|
1285
|
+
if (isDebugEnabled()) {
|
|
1286
|
+
const expectedTaskPlanPath = join(artifactBasePath, relTaskFile(artifactBasePath, mid, sid, tid, "PLAN"));
|
|
1287
|
+
const originalProjectRoot = session?.originalBasePath || basePath;
|
|
1288
|
+
const activeMilestoneWorktreePath = session?.basePath || basePath;
|
|
1289
|
+
const expectedTaskPlanExists = existsSync(expectedTaskPlanPath);
|
|
1290
|
+
debugLog("dispatch-missing-task-plan-recovery", {
|
|
1291
|
+
selectedDispatchRule: "executing → execute-task (recover missing task plan → plan-slice)",
|
|
1292
|
+
basePathUsedForArtifactChecks: artifactBasePath,
|
|
1293
|
+
milestoneRoot: artifactBasePath,
|
|
1294
|
+
originalProjectRoot,
|
|
1295
|
+
activeMilestoneWorktreePath,
|
|
1296
|
+
hasRootWorktreeMismatch: originalProjectRoot !== activeMilestoneWorktreePath,
|
|
1297
|
+
expectedTaskPlanPath,
|
|
1298
|
+
projectionTaskPlanPath,
|
|
1299
|
+
expectedTaskPlanExists,
|
|
1300
|
+
// Retained for compatibility with existing diagnostic parsers.
|
|
1301
|
+
artifactExists: expectedTaskPlanExists,
|
|
1302
|
+
projectionArtifactExists: existsSync(projectionTaskPlanPath),
|
|
1303
|
+
});
|
|
1304
|
+
}
|
|
1167
1305
|
return {
|
|
1168
1306
|
action: "dispatch",
|
|
1169
1307
|
unitType: "plan-slice",
|
|
@@ -1240,7 +1378,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1240
1378
|
buildMilestoneFileName(mid, "VALIDATION"),
|
|
1241
1379
|
);
|
|
1242
1380
|
const skipSource = trivialVariant
|
|
1243
|
-
? "trivial-scope pipeline variant
|
|
1381
|
+
? "trivial-scope pipeline variant"
|
|
1244
1382
|
: "`skip_milestone_validation` preference";
|
|
1245
1383
|
const skipValidationReason = trivialVariant ? "trivial-scope" : "preference";
|
|
1246
1384
|
const content = [
|
|
@@ -1308,7 +1446,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1308
1446
|
},
|
|
1309
1447
|
{
|
|
1310
1448
|
name: "completing-milestone → complete-milestone",
|
|
1311
|
-
match: async ({ state, mid, midTitle, basePath }) => {
|
|
1449
|
+
match: async ({ state, mid, midTitle, basePath, prefs }) => {
|
|
1312
1450
|
if (state.phase !== "completing-milestone") return null;
|
|
1313
1451
|
|
|
1314
1452
|
// Defense-in-depth (#4324): skip dispatch if the DB already marks
|
|
@@ -1322,19 +1460,64 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1322
1460
|
}
|
|
1323
1461
|
}
|
|
1324
1462
|
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
//
|
|
1463
|
+
const closeoutGitStop = commitPendingMilestoneCloseoutChanges(basePath, mid);
|
|
1464
|
+
if (closeoutGitStop) return closeoutGitStop;
|
|
1465
|
+
|
|
1466
|
+
// Safety guard (#6132): when UAT dispatch is enabled, enforce a PASS
|
|
1467
|
+
// verdict for each closed slice before milestone closure.
|
|
1468
|
+
if (prefs?.uat_dispatch) {
|
|
1469
|
+
let closedSliceIds: string[];
|
|
1470
|
+
if (isDbAvailable()) {
|
|
1471
|
+
closedSliceIds = getMilestoneSlices(mid)
|
|
1472
|
+
.filter(s => isClosedStatus(s.status))
|
|
1473
|
+
.map(s => s.id);
|
|
1474
|
+
} else {
|
|
1475
|
+
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
1476
|
+
const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
1477
|
+
if (!roadmapContent) {
|
|
1478
|
+
return {
|
|
1479
|
+
action: "stop",
|
|
1480
|
+
reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because ROADMAP is unavailable while DB is not accessible.`,
|
|
1481
|
+
level: "warning",
|
|
1482
|
+
};
|
|
1483
|
+
}
|
|
1484
|
+
const roadmap = parseRoadmap(roadmapContent);
|
|
1485
|
+
closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
for (const sliceId of closedSliceIds) {
|
|
1489
|
+
const result = await readUatGateVerdict(basePath, mid, sliceId);
|
|
1490
|
+
if (!result) {
|
|
1491
|
+
return {
|
|
1492
|
+
action: "stop",
|
|
1493
|
+
reason: `Cannot complete milestone ${mid}: missing UAT PASS verdict for ${sliceId}. Manual UAT sign-off (PASS) is required before milestone closure.`,
|
|
1494
|
+
level: "warning",
|
|
1495
|
+
};
|
|
1496
|
+
}
|
|
1497
|
+
const { verdict, uatType } = result;
|
|
1498
|
+
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
1499
|
+
return {
|
|
1500
|
+
action: "stop",
|
|
1501
|
+
reason: `Cannot complete milestone ${mid}: UAT verdict for ${sliceId} is "${verdict}". Manual UAT sign-off (PASS) is required before milestone closure.`,
|
|
1502
|
+
level: "warning",
|
|
1503
|
+
};
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
// Safety guard (#2675, #5747, #5920): block completion when VALIDATION
|
|
1509
|
+
// verdict is anything other than pass. The state machine treats these
|
|
1510
|
+
// verdicts as terminal, but completing-milestone should NOT proceed —
|
|
1511
|
+
// remediation or human attention is needed.
|
|
1329
1512
|
const validationFile = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
1330
1513
|
if (validationFile) {
|
|
1331
1514
|
const validationContent = await loadFile(validationFile);
|
|
1332
1515
|
if (validationContent) {
|
|
1333
1516
|
const verdict = extractVerdict(validationContent);
|
|
1334
|
-
if (verdict
|
|
1517
|
+
if (verdict !== "pass") {
|
|
1335
1518
|
return {
|
|
1336
1519
|
action: "stop",
|
|
1337
|
-
reason: `Cannot complete milestone ${mid}: VALIDATION verdict is "
|
|
1520
|
+
reason: `Cannot complete milestone ${mid}: VALIDATION verdict is "${verdict}". Address the validation findings and re-run validation, or run \`/gsd verdict pass --rationale "..."\` to override.`,
|
|
1338
1521
|
level: "warning",
|
|
1339
1522
|
};
|
|
1340
1523
|
}
|
|
@@ -1351,16 +1534,12 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1351
1534
|
};
|
|
1352
1535
|
}
|
|
1353
1536
|
|
|
1354
|
-
// Safety
|
|
1355
|
-
// artifacts
|
|
1356
|
-
//
|
|
1537
|
+
// Safety signal (#1703, #5097): detect milestones with only .gsd/
|
|
1538
|
+
// artifacts. This no longer hard-blocks completion because some
|
|
1539
|
+
// milestones are intentionally planning/documentation-only.
|
|
1357
1540
|
const artifactCheck = hasImplementationArtifacts(basePath, mid);
|
|
1358
1541
|
if (artifactCheck === "absent") {
|
|
1359
|
-
|
|
1360
|
-
action: "stop",
|
|
1361
|
-
reason: `Cannot complete milestone ${mid}: no implementation files found outside .gsd/. The milestone has only plan files — actual code changes are required.`,
|
|
1362
|
-
level: "error",
|
|
1363
|
-
};
|
|
1542
|
+
logWarning("dispatch", `Milestone ${mid} has no implementation files outside .gsd/ — continuing complete-milestone dispatch (planning-only/documentation-only milestone).`);
|
|
1364
1543
|
}
|
|
1365
1544
|
if (artifactCheck === "unknown") {
|
|
1366
1545
|
logWarning("dispatch", `Implementation artifact check inconclusive for ${mid} — proceeding (git context unavailable)`);
|
|
@@ -615,10 +615,11 @@ export async function selectAndApplyModel(
|
|
|
615
615
|
* Handles formats: "provider/model", "bare-id", "org/model-name" (OpenRouter).
|
|
616
616
|
*/
|
|
617
617
|
export function resolveModelId<T extends { id: string; provider: string }>(
|
|
618
|
-
modelId: string,
|
|
618
|
+
modelId: string | undefined,
|
|
619
619
|
availableModels: T[],
|
|
620
620
|
currentProvider: string | undefined,
|
|
621
621
|
): T | undefined {
|
|
622
|
+
if (!modelId) return undefined;
|
|
622
623
|
const slashIdx = modelId.indexOf("/");
|
|
623
624
|
|
|
624
625
|
if (slashIdx !== -1) {
|