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
|
@@ -13,6 +13,12 @@ import { RuleRegistry, setRegistry, resetRegistry } from "../rule-registry.js";
|
|
|
13
13
|
import type { UnifiedRule } from "../rule-types.js";
|
|
14
14
|
import { supportsStructuredQuestions } from "../workflow-mcp.js";
|
|
15
15
|
|
|
16
|
+
function assertBlockedResult(
|
|
17
|
+
result: Awaited<ReturnType<ReturnType<typeof createAutoOrchestrator>["advance"]>>,
|
|
18
|
+
): asserts result is Extract<typeof result, { kind: "blocked" }> {
|
|
19
|
+
assert.equal(result.kind, "blocked");
|
|
20
|
+
}
|
|
21
|
+
|
|
16
22
|
function makeState(): GSDState {
|
|
17
23
|
return {
|
|
18
24
|
activeMilestone: { id: "M001", title: "Milestone" },
|
|
@@ -92,19 +98,18 @@ function makeDeps(overrides: Partial<AutoOrchestratorDeps> = {}): { deps: AutoOr
|
|
|
92
98
|
return { deps: { ...deps, ...overrides }, calls };
|
|
93
99
|
}
|
|
94
100
|
|
|
95
|
-
test("start()
|
|
101
|
+
test("start() enters running phase without dispatching", async () => {
|
|
96
102
|
const { deps, calls } = makeDeps();
|
|
97
103
|
const orchestrator = createAutoOrchestrator(deps);
|
|
98
104
|
|
|
99
105
|
const result = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
|
|
100
106
|
|
|
101
|
-
assert.equal(result.kind, "
|
|
102
|
-
assert.deepEqual(result.unit, { unitType: "execute-task", unitId: "T01" });
|
|
107
|
+
assert.equal(result.kind, "started");
|
|
103
108
|
const status = orchestrator.getStatus();
|
|
104
109
|
assert.equal(status.phase, "running");
|
|
105
|
-
assert.
|
|
110
|
+
assert.equal(status.activeUnit, undefined);
|
|
106
111
|
assert.ok(calls.includes("journal:start"));
|
|
107
|
-
assert.ok(calls.includes("journal:advance"));
|
|
112
|
+
assert.ok(!calls.includes("journal:advance"));
|
|
108
113
|
});
|
|
109
114
|
|
|
110
115
|
test("advance() returns blocked when health gate denies", async () => {
|
|
@@ -119,13 +124,13 @@ test("advance() returns blocked when health gate denies", async () => {
|
|
|
119
124
|
|
|
120
125
|
const result = await orchestrator.advance();
|
|
121
126
|
|
|
122
|
-
|
|
127
|
+
assertBlockedResult(result);
|
|
123
128
|
assert.equal(result.reason, "doctor-block");
|
|
124
129
|
assert.equal(result.action, "pause");
|
|
125
130
|
assert.ok(calls.includes("gate:pre-dispatch-health-gate:manual-attention"));
|
|
126
131
|
});
|
|
127
132
|
|
|
128
|
-
test("advance() returns blocked
|
|
133
|
+
test("advance() returns blocked pause when resources are stale", async () => {
|
|
129
134
|
const { deps, calls } = makeDeps({
|
|
130
135
|
health: {
|
|
131
136
|
checkResourcesStale: () => "resources changed since session start",
|
|
@@ -137,14 +142,89 @@ test("advance() returns blocked stop when resources are stale", async () => {
|
|
|
137
142
|
|
|
138
143
|
const result = await orchestrator.advance();
|
|
139
144
|
|
|
140
|
-
|
|
145
|
+
assertBlockedResult(result);
|
|
141
146
|
assert.equal(result.reason, "resources changed since session start");
|
|
142
|
-
assert.equal(result.action, "
|
|
147
|
+
assert.equal(result.action, "pause");
|
|
143
148
|
assert.ok(calls.includes("gate:resource-version-guard:fail"));
|
|
144
149
|
assert.ok(!calls.includes("health.pre"));
|
|
145
150
|
assert.ok(!calls.includes("state.reconcile"));
|
|
146
151
|
});
|
|
147
152
|
|
|
153
|
+
test("advance() pre-dispatch parity: gate emissions and control-flow action match legacy branches", async () => {
|
|
154
|
+
type Scenario = {
|
|
155
|
+
name: string;
|
|
156
|
+
staleMsg: string | null;
|
|
157
|
+
gateResult: Awaited<ReturnType<AutoOrchestratorDeps["health"]["preAdvanceGate"]>>;
|
|
158
|
+
expectedKind: "advanced" | "blocked";
|
|
159
|
+
expectedAction?: "pause" | "stop";
|
|
160
|
+
expectedReason?: string;
|
|
161
|
+
expectedGates: string[];
|
|
162
|
+
};
|
|
163
|
+
const scenarios: Scenario[] = [
|
|
164
|
+
{
|
|
165
|
+
name: "pass",
|
|
166
|
+
staleMsg: null,
|
|
167
|
+
gateResult: { kind: "pass" },
|
|
168
|
+
expectedKind: "advanced",
|
|
169
|
+
expectedGates: [
|
|
170
|
+
"resource-version-guard:policy:pass:none:resource version guard passed:",
|
|
171
|
+
"pre-dispatch-health-gate:execution:pass:none:pre-dispatch health gate passed:",
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "resource-stale",
|
|
176
|
+
staleMsg: "resources changed since session start",
|
|
177
|
+
gateResult: { kind: "pass" },
|
|
178
|
+
expectedKind: "blocked",
|
|
179
|
+
expectedAction: "pause",
|
|
180
|
+
expectedReason: "resources changed since session start",
|
|
181
|
+
expectedGates: [
|
|
182
|
+
"resource-version-guard:policy:fail:policy:resource version guard blocked dispatch:resources changed since session start",
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "health-gate-fail",
|
|
187
|
+
staleMsg: null,
|
|
188
|
+
gateResult: { kind: "fail", reason: "doctor-block" },
|
|
189
|
+
expectedKind: "blocked",
|
|
190
|
+
expectedAction: "pause",
|
|
191
|
+
expectedReason: "doctor-block",
|
|
192
|
+
expectedGates: [
|
|
193
|
+
"resource-version-guard:policy:pass:none:resource version guard passed:",
|
|
194
|
+
"pre-dispatch-health-gate:execution:manual-attention:manual-attention:pre-dispatch health gate blocked dispatch:doctor-block",
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
|
|
199
|
+
for (const scenario of scenarios) {
|
|
200
|
+
const gateEvents: string[] = [];
|
|
201
|
+
const { deps } = makeDeps({
|
|
202
|
+
health: {
|
|
203
|
+
checkResourcesStale: () => scenario.staleMsg,
|
|
204
|
+
async preAdvanceGate() { return scenario.gateResult; },
|
|
205
|
+
async postAdvanceRecord() {},
|
|
206
|
+
},
|
|
207
|
+
uokGate: {
|
|
208
|
+
async emit(input) {
|
|
209
|
+
gateEvents.push(
|
|
210
|
+
`${input.gateId}:${input.gateType}:${input.outcome}:${input.failureClass}:${input.rationale}:${input.findings ?? ""}`,
|
|
211
|
+
);
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
const orchestrator = createAutoOrchestrator(deps);
|
|
216
|
+
const result = await orchestrator.advance();
|
|
217
|
+
|
|
218
|
+
assert.equal(result.kind, scenario.expectedKind, `${scenario.name} result kind`);
|
|
219
|
+
if (scenario.expectedKind === "blocked") {
|
|
220
|
+
assertBlockedResult(result);
|
|
221
|
+
assert.equal(result.action, scenario.expectedAction, `${scenario.name} blocked action`);
|
|
222
|
+
assert.equal(result.reason, scenario.expectedReason, `${scenario.name} blocked reason`);
|
|
223
|
+
}
|
|
224
|
+
assert.deepEqual(gateEvents, scenario.expectedGates, `${scenario.name} gate parity`);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
148
228
|
test("advance() continues past pre-dispatch health gate when it throws", async () => {
|
|
149
229
|
const { deps, calls } = makeDeps({
|
|
150
230
|
health: {
|
|
@@ -223,7 +303,7 @@ test("advance() blocks before dispatch when State Reconciliation blocks", async
|
|
|
223
303
|
|
|
224
304
|
const result = await orchestrator.advance();
|
|
225
305
|
|
|
226
|
-
|
|
306
|
+
assertBlockedResult(result);
|
|
227
307
|
assert.equal(result.reason, "state drift blocked");
|
|
228
308
|
assert.equal(result.action, "pause");
|
|
229
309
|
assert.ok(!calls.includes("dispatch.decide"));
|
|
@@ -243,7 +323,7 @@ test("advance() blocks before Runtime persistence when Tool Contract fails", asy
|
|
|
243
323
|
|
|
244
324
|
const result = await orchestrator.advance();
|
|
245
325
|
|
|
246
|
-
|
|
326
|
+
assertBlockedResult(result);
|
|
247
327
|
assert.equal(result.reason, "unknown Unit");
|
|
248
328
|
assert.equal(result.action, "pause");
|
|
249
329
|
assert.ok(!calls.includes("worktree.prepare"));
|
|
@@ -266,7 +346,7 @@ test("advance() blocks before Runtime persistence when Worktree Safety fails", a
|
|
|
266
346
|
|
|
267
347
|
const result = await orchestrator.advance();
|
|
268
348
|
|
|
269
|
-
|
|
349
|
+
assertBlockedResult(result);
|
|
270
350
|
assert.equal(result.reason, "worktree invalid");
|
|
271
351
|
assert.equal(result.action, "pause");
|
|
272
352
|
assert.ok(!calls.includes("journal:advance"));
|
|
@@ -274,6 +354,26 @@ test("advance() blocks before Runtime persistence when Worktree Safety fails", a
|
|
|
274
354
|
assert.ok(calls.includes("journal:advance-blocked"));
|
|
275
355
|
});
|
|
276
356
|
|
|
357
|
+
test("advance() allows non-worktree isolation prepare result", async () => {
|
|
358
|
+
const { deps, calls } = makeDeps({
|
|
359
|
+
worktree: {
|
|
360
|
+
async prepareForUnit() {
|
|
361
|
+
calls.push("worktree.prepare");
|
|
362
|
+
return { ok: true, reason: "isolation-not-worktree" };
|
|
363
|
+
},
|
|
364
|
+
async syncAfterUnit() { calls.push("worktree.sync"); },
|
|
365
|
+
async cleanupOnStop() { calls.push("worktree.cleanup"); },
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
const orchestrator = createAutoOrchestrator(deps);
|
|
369
|
+
|
|
370
|
+
const result = await orchestrator.advance();
|
|
371
|
+
|
|
372
|
+
assert.equal(result.kind, "advanced");
|
|
373
|
+
assert.ok(calls.includes("journal:advance"));
|
|
374
|
+
assert.ok(calls.includes("worktree.sync"));
|
|
375
|
+
});
|
|
376
|
+
|
|
277
377
|
test("advance() stops when dispatch has no next unit", async () => {
|
|
278
378
|
const { deps } = makeDeps({
|
|
279
379
|
dispatch: {
|
|
@@ -288,6 +388,42 @@ test("advance() stops when dispatch has no next unit", async () => {
|
|
|
288
388
|
assert.equal(orchestrator.getStatus().phase, "stopped");
|
|
289
389
|
});
|
|
290
390
|
|
|
391
|
+
test("advance() surfaces dispatch blocker reason instead of generic no remaining units", async () => {
|
|
392
|
+
const { deps, calls } = makeDeps({
|
|
393
|
+
dispatch: {
|
|
394
|
+
async decideNextUnit() {
|
|
395
|
+
return {
|
|
396
|
+
kind: "blocked",
|
|
397
|
+
reason: "Milestone M001 validation verdict is needs-remediation but all slices are complete.",
|
|
398
|
+
action: "pause",
|
|
399
|
+
};
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
const orchestrator = createAutoOrchestrator(deps);
|
|
404
|
+
|
|
405
|
+
const result = await orchestrator.advance();
|
|
406
|
+
|
|
407
|
+
assert.equal(result.kind, "blocked");
|
|
408
|
+
if (result.kind !== "blocked") return;
|
|
409
|
+
assert.equal(result.reason, "Milestone M001 validation verdict is needs-remediation but all slices are complete.");
|
|
410
|
+
assert.equal(result.action, "pause");
|
|
411
|
+
assert.ok(calls.includes("journal:advance-blocked"));
|
|
412
|
+
assert.ok(!calls.includes("journal:advance-stopped"));
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
test("resume() enters running phase without dispatching", async () => {
|
|
416
|
+
const { deps, calls } = makeDeps();
|
|
417
|
+
const orchestrator = createAutoOrchestrator(deps);
|
|
418
|
+
|
|
419
|
+
const result = await orchestrator.resume();
|
|
420
|
+
|
|
421
|
+
assert.equal(result.kind, "resumed");
|
|
422
|
+
assert.equal(orchestrator.getStatus().phase, "running");
|
|
423
|
+
assert.ok(!calls.includes("journal:advance"));
|
|
424
|
+
assert.ok(!calls.includes("dispatch.decide"));
|
|
425
|
+
});
|
|
426
|
+
|
|
291
427
|
test("advance() uses recovery on error", async () => {
|
|
292
428
|
const { deps, calls } = makeDeps({
|
|
293
429
|
runtime: {
|
|
@@ -319,19 +455,19 @@ test("advance() is idempotent for the same active unit", async () => {
|
|
|
319
455
|
assert.deepEqual(first.unit, { unitType: "execute-task", unitId: "T01" });
|
|
320
456
|
assert.equal(second.kind, "blocked");
|
|
321
457
|
assert.equal(second.reason, "idempotent advance: unit already active");
|
|
322
|
-
assert.equal(second.action, "
|
|
458
|
+
assert.equal(second.action, "pause");
|
|
323
459
|
|
|
324
460
|
const prepareCalls = calls.filter((c) => c === "worktree.prepare").length;
|
|
325
461
|
assert.equal(prepareCalls, 1);
|
|
326
462
|
});
|
|
327
463
|
|
|
328
|
-
test("resume() re-enters running
|
|
464
|
+
test("resume() re-enters running phase", async () => {
|
|
329
465
|
const { deps } = makeDeps();
|
|
330
466
|
const orchestrator = createAutoOrchestrator(deps);
|
|
331
467
|
|
|
332
468
|
const result = await orchestrator.resume();
|
|
333
469
|
|
|
334
|
-
assert.equal(result.kind, "
|
|
470
|
+
assert.equal(result.kind, "resumed");
|
|
335
471
|
assert.equal(orchestrator.getStatus().phase, "running");
|
|
336
472
|
});
|
|
337
473
|
|
|
@@ -342,10 +478,12 @@ test("resume() clears idempotent lock and allows re-advance", async () => {
|
|
|
342
478
|
const first = await orchestrator.advance();
|
|
343
479
|
const blocked = await orchestrator.advance();
|
|
344
480
|
const resumed = await orchestrator.resume();
|
|
481
|
+
const next = await orchestrator.advance();
|
|
345
482
|
|
|
346
483
|
assert.equal(first.kind, "advanced");
|
|
347
484
|
assert.equal(blocked.kind, "blocked");
|
|
348
|
-
assert.equal(resumed.kind, "
|
|
485
|
+
assert.equal(resumed.kind, "resumed");
|
|
486
|
+
assert.equal(next.kind, "advanced");
|
|
349
487
|
});
|
|
350
488
|
|
|
351
489
|
test("transitionCount increases across lifecycle transitions", async () => {
|
|
@@ -460,9 +598,11 @@ test("start() clears prior idempotent lock", async () => {
|
|
|
460
598
|
await orchestrator.advance();
|
|
461
599
|
const blocked = await orchestrator.advance();
|
|
462
600
|
const restarted = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
|
|
601
|
+
const next = await orchestrator.advance();
|
|
463
602
|
|
|
464
603
|
assert.equal(blocked.kind, "blocked");
|
|
465
|
-
assert.equal(restarted.kind, "
|
|
604
|
+
assert.equal(restarted.kind, "started");
|
|
605
|
+
assert.equal(next.kind, "advanced");
|
|
466
606
|
});
|
|
467
607
|
|
|
468
608
|
test("error path emits error notification", async () => {
|
|
@@ -614,7 +754,7 @@ test("stuck-loop: ring saturated with same unit blocks with action 'stop' and st
|
|
|
614
754
|
assert.equal(r.kind, "blocked", `round ${i} should be blocked`);
|
|
615
755
|
if (r.kind !== "blocked") return;
|
|
616
756
|
assert.equal(r.reason, "idempotent advance: unit already active");
|
|
617
|
-
assert.equal(r.action, "
|
|
757
|
+
assert.equal(r.action, "pause");
|
|
618
758
|
}
|
|
619
759
|
|
|
620
760
|
// The final call (ring now holds STUCK_WINDOW_SIZE copies) returns stuck-loop.
|
|
@@ -637,7 +777,7 @@ test("stuck-loop: idempotency block continues to fire with its own reason before
|
|
|
637
777
|
assert.equal(first.kind, "advanced");
|
|
638
778
|
assert.equal(second.kind, "blocked");
|
|
639
779
|
assert.equal(second.reason, "idempotent advance: unit already active");
|
|
640
|
-
assert.equal(second.action, "
|
|
780
|
+
assert.equal(second.action, "pause");
|
|
641
781
|
});
|
|
642
782
|
|
|
643
783
|
test("stuck-loop: start() resets the ring so a fresh saturation cycle is required", async () => {
|
|
@@ -651,13 +791,12 @@ test("stuck-loop: start() resets the ring so a fresh saturation cycle is require
|
|
|
651
791
|
}
|
|
652
792
|
|
|
653
793
|
const restarted = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
|
|
654
|
-
assert.equal(restarted.kind, "
|
|
794
|
+
assert.equal(restarted.kind, "started");
|
|
655
795
|
|
|
656
|
-
// Immediately after start(), the next advance
|
|
657
|
-
//
|
|
796
|
+
// Immediately after start(), the next advance should succeed because start()
|
|
797
|
+
// no longer pre-dispatches and the ring was reset.
|
|
658
798
|
const next = await orchestrator.advance();
|
|
659
|
-
assert.equal(next.kind, "
|
|
660
|
-
assert.equal(next.reason, "idempotent advance: unit already active");
|
|
799
|
+
assert.equal(next.kind, "advanced");
|
|
661
800
|
});
|
|
662
801
|
|
|
663
802
|
test("stuck-loop: resume() resets the ring", async () => {
|
|
@@ -669,11 +808,10 @@ test("stuck-loop: resume() resets the ring", async () => {
|
|
|
669
808
|
}
|
|
670
809
|
|
|
671
810
|
const resumed = await orchestrator.resume();
|
|
672
|
-
assert.equal(resumed.kind, "
|
|
811
|
+
assert.equal(resumed.kind, "resumed");
|
|
673
812
|
|
|
674
813
|
const next = await orchestrator.advance();
|
|
675
|
-
assert.equal(next.kind, "
|
|
676
|
-
assert.equal(next.reason, "idempotent advance: unit already active");
|
|
814
|
+
assert.equal(next.kind, "advanced");
|
|
677
815
|
});
|
|
678
816
|
|
|
679
817
|
test("stuck-loop: stop() resets the ring", async () => {
|
|
@@ -797,7 +935,9 @@ test("wired DispatchAdapter forwards session-derived dispatch inputs identically
|
|
|
797
935
|
assert.equal(adapterCtx.midTitle, directCtx.midTitle);
|
|
798
936
|
|
|
799
937
|
// Dispatch action equality: both flows reach the same dispatch decision.
|
|
800
|
-
|
|
938
|
+
if (!adapterResult || !("unitType" in adapterResult)) {
|
|
939
|
+
assert.fail("expected adapter result to be a dispatch decision");
|
|
940
|
+
}
|
|
801
941
|
assert.equal(adapterResult.unitType, "execute-task");
|
|
802
942
|
assert.equal(adapterResult.unitId, "T01");
|
|
803
943
|
assert.equal(adapterResult.reason, "test-capture");
|
|
@@ -853,9 +993,11 @@ test("wired DispatchAdapter prefers caller-supplied dispatch inputs over ctx-der
|
|
|
853
993
|
getActiveTools: () => [],
|
|
854
994
|
} as any;
|
|
855
995
|
const adapter = createWiredDispatchAdapter(ctx, pi, "/tmp/parity-fixture");
|
|
996
|
+
const session = { basePath: "/tmp/session-fixture" } as any;
|
|
856
997
|
|
|
857
998
|
const result = await adapter.decideNextUnit({
|
|
858
999
|
stateSnapshot,
|
|
1000
|
+
session,
|
|
859
1001
|
structuredQuestionsAvailable: "true",
|
|
860
1002
|
sessionContextWindow: 500_000,
|
|
861
1003
|
sessionProvider: "openai",
|
|
@@ -868,6 +1010,81 @@ test("wired DispatchAdapter prefers caller-supplied dispatch inputs over ctx-der
|
|
|
868
1010
|
assert.equal(captured[0].sessionContextWindow, 500_000);
|
|
869
1011
|
assert.equal(captured[0].sessionProvider, "openai");
|
|
870
1012
|
assert.equal(captured[0].modelRegistry, overrideModelRegistry);
|
|
1013
|
+
assert.equal(captured[0].session, session);
|
|
1014
|
+
assert.equal(captured[0].basePath, "/tmp/session-fixture");
|
|
1015
|
+
} finally {
|
|
1016
|
+
resetRegistry();
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
|
|
1020
|
+
test("wired DispatchAdapter forwards constructor session when advance input omits session", async () => {
|
|
1021
|
+
const stateSnapshot = makeState();
|
|
1022
|
+
const captured: DispatchContext[] = [];
|
|
1023
|
+
const captureRule: UnifiedRule = {
|
|
1024
|
+
name: "test-session-fallback",
|
|
1025
|
+
when: "dispatch",
|
|
1026
|
+
evaluation: "first-match",
|
|
1027
|
+
where: async (ctx: DispatchContext) => {
|
|
1028
|
+
captured.push(ctx);
|
|
1029
|
+
return {
|
|
1030
|
+
action: "dispatch" as const,
|
|
1031
|
+
unitType: "execute-task",
|
|
1032
|
+
unitId: "T01",
|
|
1033
|
+
prompt: "session-fallback-fixture",
|
|
1034
|
+
};
|
|
1035
|
+
},
|
|
1036
|
+
then: (r: unknown) => r,
|
|
1037
|
+
};
|
|
1038
|
+
setRegistry(new RuleRegistry([captureRule]));
|
|
1039
|
+
|
|
1040
|
+
try {
|
|
1041
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as any;
|
|
1042
|
+
const pi = { getActiveTools: () => [] } as any;
|
|
1043
|
+
const session = {
|
|
1044
|
+
basePath: "/tmp/worktree-fixture",
|
|
1045
|
+
originalBasePath: "/tmp/project-fixture",
|
|
1046
|
+
currentMilestoneId: "M001",
|
|
1047
|
+
} as any;
|
|
1048
|
+
const adapter = createWiredDispatchAdapter(ctx, pi, "/tmp/project-fixture", session);
|
|
1049
|
+
|
|
1050
|
+
const result = await adapter.decideNextUnit({ stateSnapshot });
|
|
1051
|
+
|
|
1052
|
+
assert.ok(result);
|
|
1053
|
+
assert.equal(captured.length, 1, "expected one captured dispatch context");
|
|
1054
|
+
assert.equal(captured[0].session, session);
|
|
1055
|
+
assert.equal(captured[0].basePath, "/tmp/worktree-fixture");
|
|
1056
|
+
} finally {
|
|
1057
|
+
resetRegistry();
|
|
1058
|
+
}
|
|
1059
|
+
});
|
|
1060
|
+
|
|
1061
|
+
test("wired DispatchAdapter preserves stop reason as a blocked decision", async () => {
|
|
1062
|
+
const stateSnapshot = makeState();
|
|
1063
|
+
const stopRule: UnifiedRule = {
|
|
1064
|
+
name: "test-stop",
|
|
1065
|
+
when: "dispatch",
|
|
1066
|
+
evaluation: "first-match",
|
|
1067
|
+
where: async () => ({
|
|
1068
|
+
action: "stop" as const,
|
|
1069
|
+
reason: "remediation blocker",
|
|
1070
|
+
level: "warning" as const,
|
|
1071
|
+
}),
|
|
1072
|
+
then: (r: unknown) => r,
|
|
1073
|
+
};
|
|
1074
|
+
setRegistry(new RuleRegistry([stopRule]));
|
|
1075
|
+
|
|
1076
|
+
try {
|
|
1077
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as any;
|
|
1078
|
+
const pi = { getActiveTools: () => [] } as any;
|
|
1079
|
+
const adapter = createWiredDispatchAdapter(ctx, pi, "/tmp/parity-fixture");
|
|
1080
|
+
|
|
1081
|
+
const result = await adapter.decideNextUnit({ stateSnapshot });
|
|
1082
|
+
|
|
1083
|
+
assert.deepEqual(result, {
|
|
1084
|
+
kind: "blocked",
|
|
1085
|
+
reason: "remediation blocker",
|
|
1086
|
+
action: "pause",
|
|
1087
|
+
});
|
|
871
1088
|
} finally {
|
|
872
1089
|
resetRegistry();
|
|
873
1090
|
}
|
|
@@ -6,7 +6,7 @@ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "nod
|
|
|
6
6
|
import { tmpdir } from "node:os";
|
|
7
7
|
import { join } from "node:path";
|
|
8
8
|
|
|
9
|
-
import { cleanupAfterLoopExit, rerootCommandSession, stopAuto } from "../auto.ts";
|
|
9
|
+
import { cleanupAfterLoopExit, pauseAuto, rerootCommandSession, stopAuto } from "../auto.ts";
|
|
10
10
|
import { autoSession } from "../auto-runtime-state.ts";
|
|
11
11
|
import { closeDatabase, insertMilestone, insertSlice, openDatabase } from "../gsd-db.ts";
|
|
12
12
|
import { WorktreeLifecycle } from "../worktree-lifecycle.ts";
|
|
@@ -43,7 +43,53 @@ test("cleanupAfterLoopExit preserves paused auto badge after provider pause", as
|
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
test("cleanupAfterLoopExit
|
|
46
|
+
test("cleanupAfterLoopExit preserves paused worktree session and visible failure output", async (t) => {
|
|
47
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-paused-session-preserve-"));
|
|
48
|
+
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
49
|
+
const previousCwd = process.cwd();
|
|
50
|
+
const newSessionWorkspaces: string[] = [];
|
|
51
|
+
let restoreCalls = 0;
|
|
52
|
+
|
|
53
|
+
t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function () {
|
|
54
|
+
restoreCalls += 1;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
mkdirSync(worktree, { recursive: true });
|
|
58
|
+
process.chdir(worktree);
|
|
59
|
+
autoSession.reset();
|
|
60
|
+
autoSession.active = true;
|
|
61
|
+
autoSession.paused = true;
|
|
62
|
+
autoSession.basePath = worktree;
|
|
63
|
+
autoSession.originalBasePath = base;
|
|
64
|
+
autoSession.cmdCtx = {
|
|
65
|
+
newSession: async ({ workspaceRoot }: { workspaceRoot: string }) => {
|
|
66
|
+
newSessionWorkspaces.push(workspaceRoot);
|
|
67
|
+
return { cancelled: false };
|
|
68
|
+
},
|
|
69
|
+
} as any;
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
await cleanupAfterLoopExit({
|
|
73
|
+
ui: {
|
|
74
|
+
setStatus: () => {},
|
|
75
|
+
setWidget: () => {},
|
|
76
|
+
notify: () => {},
|
|
77
|
+
},
|
|
78
|
+
} as any);
|
|
79
|
+
|
|
80
|
+
assert.equal(restoreCalls, 0, "paused cleanup must not restore out of the active worktree");
|
|
81
|
+
assert.deepEqual(newSessionWorkspaces, [], "paused cleanup must not start a blank rerooted session");
|
|
82
|
+
assert.equal(autoSession.basePath, worktree);
|
|
83
|
+
assert.equal(realpathSync(process.cwd()), realpathSync(worktree));
|
|
84
|
+
assert.equal(autoSession.paused, true);
|
|
85
|
+
} finally {
|
|
86
|
+
autoSession.reset();
|
|
87
|
+
process.chdir(previousCwd);
|
|
88
|
+
rmSync(base, { recursive: true, force: true });
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("cleanupAfterLoopExit clears status and progress widget without replacing outcome surface", async () => {
|
|
47
93
|
const statusCalls: unknown[] = [];
|
|
48
94
|
const widgetCalls: unknown[] = [];
|
|
49
95
|
|
|
@@ -64,8 +110,8 @@ test("cleanupAfterLoopExit clears status without replacing the last auto surface
|
|
|
64
110
|
assert.deepEqual(statusCalls, [["gsd-auto", undefined]]);
|
|
65
111
|
assert.equal(
|
|
66
112
|
widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
|
|
67
|
-
|
|
68
|
-
"cleanup must
|
|
113
|
+
true,
|
|
114
|
+
"cleanup must clear the stale auto progress widget",
|
|
69
115
|
);
|
|
70
116
|
assert.equal(
|
|
71
117
|
widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-outcome"),
|
|
@@ -79,7 +125,7 @@ test("cleanupAfterLoopExit clears status without replacing the last auto surface
|
|
|
79
125
|
}
|
|
80
126
|
});
|
|
81
127
|
|
|
82
|
-
test("cleanupAfterLoopExit
|
|
128
|
+
test("cleanupAfterLoopExit clears progress widget after stopAuto reset", async () => {
|
|
83
129
|
const statusCalls: unknown[] = [];
|
|
84
130
|
const widgetCalls: unknown[] = [];
|
|
85
131
|
|
|
@@ -103,8 +149,8 @@ test("cleanupAfterLoopExit preserves completion roll-up after stopAuto reset", a
|
|
|
103
149
|
assert.deepEqual(statusCalls, [["gsd-auto", undefined]]);
|
|
104
150
|
assert.equal(
|
|
105
151
|
widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
|
|
106
|
-
|
|
107
|
-
"completion cleanup must
|
|
152
|
+
true,
|
|
153
|
+
"completion cleanup must clear the stale progress widget",
|
|
108
154
|
);
|
|
109
155
|
assert.equal(
|
|
110
156
|
widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-outcome"),
|
|
@@ -117,6 +163,98 @@ test("cleanupAfterLoopExit preserves completion roll-up after stopAuto reset", a
|
|
|
117
163
|
}
|
|
118
164
|
});
|
|
119
165
|
|
|
166
|
+
test("pauseAuto preserves artifact retry counts across pause/resume", async () => {
|
|
167
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-pause-retry-count-"));
|
|
168
|
+
const previousCwd = process.cwd();
|
|
169
|
+
const retryKey = "execute-task:M001/S01/T01";
|
|
170
|
+
|
|
171
|
+
autoSession.reset();
|
|
172
|
+
autoSession.active = true;
|
|
173
|
+
autoSession.verificationRetryCount.set(retryKey, 2);
|
|
174
|
+
autoSession.pendingVerificationRetry = {
|
|
175
|
+
unitId: "M001/S01/T01",
|
|
176
|
+
failureContext: "Missing expected artifact (attempt 2/3).",
|
|
177
|
+
attempt: 2,
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
try {
|
|
181
|
+
process.chdir(base);
|
|
182
|
+
await pauseAuto();
|
|
183
|
+
|
|
184
|
+
assert.equal(autoSession.paused, true);
|
|
185
|
+
assert.equal(autoSession.pendingVerificationRetry, null);
|
|
186
|
+
assert.equal(autoSession.verificationRetryCount.get(retryKey), 2);
|
|
187
|
+
} finally {
|
|
188
|
+
autoSession.reset();
|
|
189
|
+
process.chdir(previousCwd);
|
|
190
|
+
rmSync(base, { recursive: true, force: true });
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("cleanupAfterLoopExit preserves step-mode surface and worktree session after completed step", async (t) => {
|
|
195
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-step-surface-"));
|
|
196
|
+
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
197
|
+
const previousCwd = process.cwd();
|
|
198
|
+
const statusCalls: unknown[] = [];
|
|
199
|
+
const widgetCalls: unknown[] = [];
|
|
200
|
+
const newSessionWorkspaces: string[] = [];
|
|
201
|
+
let restoreCalls = 0;
|
|
202
|
+
|
|
203
|
+
t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function () {
|
|
204
|
+
restoreCalls += 1;
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
mkdirSync(worktree, { recursive: true });
|
|
208
|
+
process.chdir(worktree);
|
|
209
|
+
autoSession.reset();
|
|
210
|
+
autoSession.active = true;
|
|
211
|
+
autoSession.paused = false;
|
|
212
|
+
autoSession.stepMode = true;
|
|
213
|
+
autoSession.preserveStepSurfaceAfterLoopExit = true;
|
|
214
|
+
autoSession.basePath = worktree;
|
|
215
|
+
autoSession.originalBasePath = base;
|
|
216
|
+
autoSession.cmdCtx = {
|
|
217
|
+
newSession: async ({ workspaceRoot }: { workspaceRoot: string }) => {
|
|
218
|
+
newSessionWorkspaces.push(workspaceRoot);
|
|
219
|
+
return { cancelled: false };
|
|
220
|
+
},
|
|
221
|
+
} as any;
|
|
222
|
+
|
|
223
|
+
try {
|
|
224
|
+
await cleanupAfterLoopExit({
|
|
225
|
+
hasUI: true,
|
|
226
|
+
ui: {
|
|
227
|
+
setStatus: (...args: unknown[]) => statusCalls.push(args),
|
|
228
|
+
setWidget: (...args: unknown[]) => widgetCalls.push(args),
|
|
229
|
+
setHeader: () => {},
|
|
230
|
+
notify: () => {},
|
|
231
|
+
},
|
|
232
|
+
} as any);
|
|
233
|
+
|
|
234
|
+
assert.deepEqual(statusCalls, [], "step-mode cleanup must leave the NEXT badge visible");
|
|
235
|
+
assert.equal(
|
|
236
|
+
widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
|
|
237
|
+
false,
|
|
238
|
+
"step-mode cleanup must not clear the completed step progress surface",
|
|
239
|
+
);
|
|
240
|
+
assert.equal(
|
|
241
|
+
widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-health"),
|
|
242
|
+
false,
|
|
243
|
+
"step-mode cleanup must not replace the progress surface with idle health",
|
|
244
|
+
);
|
|
245
|
+
assert.deepEqual(newSessionWorkspaces, [], "step-mode cleanup must not re-root the visible command session");
|
|
246
|
+
assert.equal(restoreCalls, 0, "step-mode cleanup must not restore out of the active worktree");
|
|
247
|
+
assert.equal(autoSession.active, false);
|
|
248
|
+
assert.equal(autoSession.preserveStepSurfaceAfterLoopExit, false);
|
|
249
|
+
assert.equal(autoSession.basePath, worktree);
|
|
250
|
+
assert.equal(realpathSync(process.cwd()), realpathSync(worktree));
|
|
251
|
+
} finally {
|
|
252
|
+
autoSession.reset();
|
|
253
|
+
process.chdir(previousCwd);
|
|
254
|
+
rmSync(base, { recursive: true, force: true });
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
|
|
120
258
|
test("cleanupAfterLoopExit restores project root through lifecycle and preserves chdir", async (t) => {
|
|
121
259
|
const base = mkdtempSync(join(tmpdir(), "gsd-cleanup-lifecycle-"));
|
|
122
260
|
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
@@ -159,14 +297,15 @@ test("cleanupAfterLoopExit keeps cleanup best-effort when lifecycle restore thro
|
|
|
159
297
|
const previousCwd = process.cwd();
|
|
160
298
|
let restoreCalls = 0;
|
|
161
299
|
// ADR-016 phase 3 (#5693): the real `restoreToProjectRoot` assigns
|
|
162
|
-
// `s.basePath = s.originalBasePath` BEFORE any throwable work
|
|
300
|
+
// `s.basePath = s.originalBasePath` AND chdir's BEFORE any throwable work
|
|
163
301
|
// (rebuildGitService, cache invalidation). Mirror that ordering in the
|
|
164
|
-
// mock so the throw scenario reflects production: basePath
|
|
165
|
-
// even when the verb throws partway through.
|
|
302
|
+
// mock so the throw scenario reflects production: basePath and cwd are
|
|
303
|
+
// restored even when the verb throws partway through.
|
|
166
304
|
t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function (this: WorktreeLifecycle) {
|
|
167
305
|
restoreCalls += 1;
|
|
168
|
-
|
|
169
|
-
|
|
306
|
+
const sRef = this as unknown as { s: { basePath: string; originalBasePath: string } };
|
|
307
|
+
sRef.s.basePath = sRef.s.originalBasePath;
|
|
308
|
+
try { process.chdir(sRef.s.basePath); } catch { /* mirror real verb's best-effort */ }
|
|
170
309
|
throw new Error("restore failed");
|
|
171
310
|
});
|
|
172
311
|
|