gsd-pi 2.77.0-dev.eaa4973bc → 2.78.0
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 +1 -1
- package/dist/claude-cli-check.js +5 -1
- package/dist/headless.js +49 -4
- package/dist/loader.js +0 -0
- package/dist/resource-loader.d.ts +40 -0
- package/dist/resource-loader.js +32 -13
- package/dist/resources/extensions/browser-tools/capture.js +9 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/index.js +3 -2
- package/dist/resources/extensions/gsd/auto/loop.js +124 -2
- package/dist/resources/extensions/gsd/auto/phases.js +57 -39
- package/dist/resources/extensions/gsd/auto/session.js +6 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +142 -29
- package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +150 -64
- package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
- package/dist/resources/extensions/gsd/auto-start.js +107 -29
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
- package/dist/resources/extensions/gsd/auto.js +76 -21
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
- package/dist/resources/extensions/gsd/component-loader.js +447 -0
- package/dist/resources/extensions/gsd/component-types.js +69 -0
- package/dist/resources/extensions/gsd/context-store.js +23 -7
- package/dist/resources/extensions/gsd/detection.js +49 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/forensics.js +106 -0
- package/dist/resources/extensions/gsd/gate-registry.js +2 -2
- package/dist/resources/extensions/gsd/git-constants.js +28 -1
- package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
- package/dist/resources/extensions/gsd/git-service.js +126 -2
- package/dist/resources/extensions/gsd/gsd-db.js +6 -3
- package/dist/resources/extensions/gsd/guided-flow.js +39 -13
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
- package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +6 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- package/dist/resources/extensions/gsd/session-lock.js +19 -10
- package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
- package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
- package/dist/resources/extensions/gsd/state.js +69 -58
- package/dist/resources/extensions/gsd/sync-lock.js +98 -42
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
- package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
- package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
- package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
- package/dist/resources/extensions/gsd/uok/writer.js +82 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +85 -8
- package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
- package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
- package/dist/resources/extensions/mcp-client/index.js +3 -1
- package/dist/resources/extensions/ollama/index.js +5 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -5
- 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 +12 -12
- 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/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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_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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- 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/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +2 -3
- package/packages/daemon/package.json +2 -2
- package/packages/daemon/src/logger.ts +4 -3
- package/packages/mcp-server/dist/server.d.ts +24 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +88 -87
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/mcp-server.test.ts +25 -3
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +131 -105
- package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
- package/packages/mcp-server/src/workflow-tools.ts +19 -6
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +2 -2
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
- package/packages/native/src/__tests__/ps.test.mjs +14 -8
- package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
- package/packages/native/src/__tests__/truncate.test.mjs +17 -2
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
- package/packages/pi-agent-core/src/agent.test.ts +96 -102
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +9 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +43 -70
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +36 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- package/packages/pi-ai/src/models/capability-patches.ts +10 -2
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openai.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +46 -73
- package/packages/pi-ai/src/models.test.ts +48 -11
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
- 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.test.js +20 -13
- 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/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
- 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 +125 -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-state.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -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 +105 -13
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
- package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +37 -11
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +14 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +19 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +1 -1
- package/packages/pi-tui/dist/editor-component.d.ts +2 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/packages/pi-tui/dist/editor-component.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +42 -11
- package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
- package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
- package/packages/pi-tui/src/components/editor.ts +22 -0
- package/packages/pi-tui/src/components/image.test.ts +10 -5
- package/packages/pi-tui/src/editor-component.ts +3 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-client.test.js +101 -51
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +15 -1
- package/src/resources/extensions/browser-tools/capture.ts +12 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
- package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
- package/src/resources/extensions/github-sync/templates.ts +151 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
- package/src/resources/extensions/google-search/index.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +142 -2
- package/src/resources/extensions/gsd/auto/phases.ts +62 -38
- package/src/resources/extensions/gsd/auto/session.ts +7 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +156 -29
- package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +163 -73
- package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
- package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
- package/src/resources/extensions/gsd/auto-start.ts +127 -9
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
- package/src/resources/extensions/gsd/auto.ts +90 -23
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
- package/src/resources/extensions/gsd/component-loader.ts +598 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/context-store.ts +25 -8
- package/src/resources/extensions/gsd/detection.ts +58 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/forensics.ts +118 -1
- package/src/resources/extensions/gsd/gate-registry.ts +2 -2
- package/src/resources/extensions/gsd/git-constants.ts +30 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
- package/src/resources/extensions/gsd/git-service.ts +149 -2
- package/src/resources/extensions/gsd/gsd-db.ts +6 -3
- package/src/resources/extensions/gsd/guided-flow.ts +57 -14
- package/src/resources/extensions/gsd/journal.ts +11 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +6 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- package/src/resources/extensions/gsd/session-lock.ts +20 -10
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +76 -66
- package/src/resources/extensions/gsd/sync-lock.ts +97 -39
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +133 -292
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
- package/src/resources/extensions/gsd/types.ts +3 -3
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
- package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +108 -7
- package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
- package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
- package/src/resources/extensions/mcp-client/index.ts +3 -1
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
- package/src/resources/extensions/ollama/index.ts +5 -1
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
- package/src/resources/extensions/remote-questions/manager.ts +36 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
- package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
- /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → C1zT2kEfoLhDdbWPWKrXd}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → C1zT2kEfoLhDdbWPWKrXd}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// GSD-2 — #4782 phase 3: run-uat migrated to compose context via manifest.
|
|
2
|
+
// Regression test: prompt still carries the declared artifacts in the
|
|
3
|
+
// expected shape after the migration.
|
|
4
|
+
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
|
|
11
|
+
import { buildRunUatPrompt } from "../auto-prompts.ts";
|
|
12
|
+
import { invalidateAllCaches } from "../cache.ts";
|
|
13
|
+
import {
|
|
14
|
+
openDatabase,
|
|
15
|
+
closeDatabase,
|
|
16
|
+
insertMilestone,
|
|
17
|
+
upsertMilestonePlanning,
|
|
18
|
+
insertSlice,
|
|
19
|
+
insertArtifact,
|
|
20
|
+
} from "../gsd-db.ts";
|
|
21
|
+
|
|
22
|
+
function makeBase(): string {
|
|
23
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-runuat-composer-"));
|
|
24
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
|
|
25
|
+
return base;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function cleanup(base: string): void {
|
|
29
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
30
|
+
invalidateAllCaches();
|
|
31
|
+
rmSync(base, { recursive: true, force: true });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function seed(base: string, mid: string): void {
|
|
35
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
36
|
+
insertMilestone({ id: mid, title: "Test", status: "active", depends_on: [] });
|
|
37
|
+
upsertMilestonePlanning(mid, {
|
|
38
|
+
title: "Test Milestone",
|
|
39
|
+
status: "active",
|
|
40
|
+
vision: "Demo the composer migration",
|
|
41
|
+
successCriteria: ["Prompt compiles", "UAT passes"],
|
|
42
|
+
keyRisks: [],
|
|
43
|
+
proofStrategy: [],
|
|
44
|
+
verificationContract: "",
|
|
45
|
+
verificationIntegration: "",
|
|
46
|
+
verificationOperational: "",
|
|
47
|
+
verificationUat: "",
|
|
48
|
+
definitionOfDone: [],
|
|
49
|
+
requirementCoverage: "",
|
|
50
|
+
boundaryMapMarkdown: "",
|
|
51
|
+
});
|
|
52
|
+
insertSlice({
|
|
53
|
+
id: "S01",
|
|
54
|
+
milestoneId: mid,
|
|
55
|
+
title: "First",
|
|
56
|
+
status: "complete",
|
|
57
|
+
risk: "low",
|
|
58
|
+
depends: [],
|
|
59
|
+
demo: "",
|
|
60
|
+
sequence: 1,
|
|
61
|
+
});
|
|
62
|
+
// Seed PROJECT.md so inlineProjectFromDb resolves — the run-uat manifest
|
|
63
|
+
// declares "project" as the third inline artifact (#4925 review).
|
|
64
|
+
insertArtifact({
|
|
65
|
+
path: "PROJECT.md",
|
|
66
|
+
artifact_type: "project",
|
|
67
|
+
milestone_id: null,
|
|
68
|
+
slice_id: null,
|
|
69
|
+
task_id: null,
|
|
70
|
+
full_content: "# Project\n\nRun-UAT composer fixture project.\n",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
test("#4782 phase 3: buildRunUatPrompt inlines slice UAT, slice summary, project via composer", async (t) => {
|
|
75
|
+
const base = makeBase();
|
|
76
|
+
t.after(() => cleanup(base));
|
|
77
|
+
invalidateAllCaches();
|
|
78
|
+
|
|
79
|
+
seed(base, "M001");
|
|
80
|
+
|
|
81
|
+
// Write UAT + SUMMARY files. Deliberately diverge the on-disk UAT body
|
|
82
|
+
// from the in-memory uatContent the caller passes — if the resolver
|
|
83
|
+
// ever re-reads disk (the bug fixed in fcf3bfbe), this test fails
|
|
84
|
+
// because the prompt would contain "stale on-disk body" instead of
|
|
85
|
+
// "fresh in-memory snapshot" (#4925 follow-up review).
|
|
86
|
+
const uatRel = ".gsd/milestones/M001/slices/S01/S01-UAT.md";
|
|
87
|
+
writeFileSync(join(base, uatRel), "# S01 UAT\n\n- stale on-disk body\n");
|
|
88
|
+
writeFileSync(
|
|
89
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md"),
|
|
90
|
+
"---\nid: S01\nparent: M001\n---\n# S01 Summary\n**One-liner**\n\n## What Happened\nShip.\n",
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const uatContent = "# S01 UAT\n\n- Check X\n- Check Y\n (fresh in-memory snapshot)\n";
|
|
94
|
+
const prompt = await buildRunUatPrompt("M001", "S01", uatRel, uatContent, base);
|
|
95
|
+
|
|
96
|
+
// Context wrapper present
|
|
97
|
+
assert.match(prompt, /## Inlined Context \(preloaded — do not re-read these files\)/);
|
|
98
|
+
|
|
99
|
+
// Artifacts from the manifest inline list, in declared order:
|
|
100
|
+
// slice-uat → slice-summary → project (#4925 review).
|
|
101
|
+
const uatIdx = prompt.indexOf("### S01 UAT");
|
|
102
|
+
const summaryIdx = prompt.indexOf("### S01 Summary");
|
|
103
|
+
const projectIdx = prompt.indexOf("### Project");
|
|
104
|
+
assert.ok(uatIdx > -1, "slice UAT block missing");
|
|
105
|
+
assert.ok(summaryIdx > -1, "slice summary block missing");
|
|
106
|
+
assert.ok(projectIdx > -1, "project block missing — manifest declares project as 3rd inline");
|
|
107
|
+
assert.ok(
|
|
108
|
+
uatIdx < summaryIdx && summaryIdx < projectIdx,
|
|
109
|
+
`manifest order violated: uat (${uatIdx}) < summary (${summaryIdx}) < project (${projectIdx})`,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// In-memory uatContent inlined — drift assertion: stale disk content
|
|
113
|
+
// must NOT appear, fresh snapshot MUST appear (#4925 follow-up review).
|
|
114
|
+
assert.match(prompt, /fresh in-memory snapshot/);
|
|
115
|
+
assert.ok(!prompt.includes("stale on-disk body"), "resolver re-read disk instead of using uatContent snapshot");
|
|
116
|
+
|
|
117
|
+
// Summary body content inlined
|
|
118
|
+
assert.match(prompt, /What Happened[\s\S]*Ship/);
|
|
119
|
+
|
|
120
|
+
// Project body content inlined
|
|
121
|
+
assert.match(prompt, /Run-UAT composer fixture project/);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("#4782 phase 3: buildRunUatPrompt omits optional slice summary when file is missing", async (t) => {
|
|
125
|
+
const base = makeBase();
|
|
126
|
+
t.after(() => cleanup(base));
|
|
127
|
+
invalidateAllCaches();
|
|
128
|
+
|
|
129
|
+
seed(base, "M001");
|
|
130
|
+
|
|
131
|
+
const uatRel = ".gsd/milestones/M001/slices/S01/S01-UAT.md";
|
|
132
|
+
writeFileSync(join(base, uatRel), "# S01 UAT\n");
|
|
133
|
+
// No SUMMARY.md written — composer should skip the slice-summary key.
|
|
134
|
+
|
|
135
|
+
const prompt = await buildRunUatPrompt("M001", "S01", uatRel, "# S01 UAT\n", base);
|
|
136
|
+
|
|
137
|
+
// UAT still present
|
|
138
|
+
assert.match(prompt, /### S01 UAT/);
|
|
139
|
+
// No empty "S01 Summary" section — section body would be blank without a file
|
|
140
|
+
assert.ok(!prompt.includes("### S01 Summary"));
|
|
141
|
+
// Project still present (third inline artifact, not optional) and follows
|
|
142
|
+
// UAT directly with the skipped summary collapsed (#4925 review).
|
|
143
|
+
const uatIdx = prompt.indexOf("### S01 UAT");
|
|
144
|
+
const projectIdx = prompt.indexOf("### Project");
|
|
145
|
+
assert.ok(projectIdx > uatIdx, `project must follow UAT when summary is omitted (uat=${uatIdx}, project=${projectIdx})`);
|
|
146
|
+
// No double separator from a skipped block
|
|
147
|
+
assert.ok(!prompt.includes("---\n\n---"));
|
|
148
|
+
});
|
|
@@ -31,6 +31,10 @@ describe("supportsServiceTier", () => {
|
|
|
31
31
|
assert.equal(supportsServiceTier("vibeproxy-openai/gpt-5.4"), true);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
+
test("returns false for gpt-5.5 until service_tier payload support is verified", () => {
|
|
35
|
+
assert.equal(supportsServiceTier("gpt-5.5"), false);
|
|
36
|
+
});
|
|
37
|
+
|
|
34
38
|
test("returns false for provider-only identifier without gpt-5.4 model suffix", () => {
|
|
35
39
|
assert.equal(supportsServiceTier("vibeproxy-openai"), false);
|
|
36
40
|
});
|
|
@@ -243,6 +243,35 @@ describe('session-lock-regression', async () => {
|
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
+
// ─── 7d. Releasing after ownership loss preserves newer owner ─────────
|
|
247
|
+
test('releaseSessionLock preserves newer owner after PID mismatch', (t) => {
|
|
248
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-session-lock-'));
|
|
249
|
+
mkdirSync(join(base, '.gsd'), { recursive: true });
|
|
250
|
+
t.after(() => {
|
|
251
|
+
rmSync(base, { recursive: true, force: true });
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const acquired = acquireSessionLock(base);
|
|
255
|
+
assert.ok(acquired.acquired, 'initial lock acquired');
|
|
256
|
+
|
|
257
|
+
const lockFile = join(gsdRoot(base), 'auto.lock');
|
|
258
|
+
const newerOwner = {
|
|
259
|
+
pid: process.pid + 1000,
|
|
260
|
+
startedAt: new Date().toISOString(),
|
|
261
|
+
unitType: 'execute-task',
|
|
262
|
+
unitId: 'M001/S01/T02',
|
|
263
|
+
unitStartedAt: new Date().toISOString(),
|
|
264
|
+
};
|
|
265
|
+
writeFileSync(lockFile, JSON.stringify(newerOwner, null, 2));
|
|
266
|
+
|
|
267
|
+
releaseSessionLock(base);
|
|
268
|
+
|
|
269
|
+
assert.ok(existsSync(lockFile), 'foreign lock file must not be deleted by stale owner release');
|
|
270
|
+
const after = JSON.parse(readFileSync(lockFile, 'utf-8'));
|
|
271
|
+
assert.deepStrictEqual(after.pid, newerOwner.pid, 'newer owner PID is preserved');
|
|
272
|
+
assert.deepStrictEqual(after.unitId, newerOwner.unitId, 'newer owner metadata is preserved');
|
|
273
|
+
});
|
|
274
|
+
|
|
246
275
|
// ─── 8. Acquire after release is possible ─────────────────────────────
|
|
247
276
|
console.log('\n=== 8. acquire after release → re-acquirable ===');
|
|
248
277
|
{
|
|
@@ -11,6 +11,7 @@ import assert from "node:assert/strict";
|
|
|
11
11
|
import { readFileSync } from "node:fs";
|
|
12
12
|
import { join, dirname } from "node:path";
|
|
13
13
|
import { fileURLToPath } from "node:url";
|
|
14
|
+
import { extractSourceRegion } from "./test-helpers.ts";
|
|
14
15
|
|
|
15
16
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
17
|
const SESSION_TS_PATH = join(__dirname, "..", "auto", "session.ts");
|
|
@@ -52,7 +53,7 @@ test("SidecarItem type is exported from session.ts", () => {
|
|
|
52
53
|
test("SidecarItem has required kind field with hook/triage/quick-task union", () => {
|
|
53
54
|
const source = getSessionTsSource();
|
|
54
55
|
const ifaceIdx = source.indexOf("export interface SidecarItem");
|
|
55
|
-
const ifaceBlock = source
|
|
56
|
+
const ifaceBlock = extractSourceRegion(source, "export interface SidecarItem");
|
|
56
57
|
assert.ok(
|
|
57
58
|
ifaceBlock.includes('"hook"') && ifaceBlock.includes('"triage"') && ifaceBlock.includes('"quick-task"'),
|
|
58
59
|
"SidecarItem.kind must be a union of 'hook' | 'triage' | 'quick-task'",
|
|
@@ -77,7 +78,7 @@ test("AutoSession resets sidecarQueue in reset()", () => {
|
|
|
77
78
|
const source = getSessionTsSource();
|
|
78
79
|
const resetIdx = source.indexOf("reset(): void");
|
|
79
80
|
assert.ok(resetIdx > -1, "AutoSession must have a reset() method");
|
|
80
|
-
const resetBlock = source
|
|
81
|
+
const resetBlock = extractSourceRegion(source, "reset(): void");
|
|
81
82
|
assert.ok(
|
|
82
83
|
resetBlock.includes("sidecarQueue"),
|
|
83
84
|
"reset() must clear sidecarQueue",
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
* Two tests:
|
|
7
7
|
* 1. Auto-mode files must have zero empty catch blocks (fully migrated).
|
|
8
8
|
* 2. All GSD files must not use raw stderr/console in catch blocks.
|
|
9
|
+
*
|
|
10
|
+
* Implementation note (#4836): the previous implementation walked every
|
|
11
|
+
* `{` / `}` character in the source to infer catch-block boundaries. That
|
|
12
|
+
* ignored string literals, template interpolations, regexes, and comments,
|
|
13
|
+
* producing both false positives and false negatives. The current
|
|
14
|
+
* implementation uses the TypeScript compiler API to walk real
|
|
15
|
+
* `CatchClause` nodes, so lexical accidents cannot flip the verdict.
|
|
9
16
|
*/
|
|
10
17
|
|
|
11
18
|
import { describe, test } from "node:test";
|
|
@@ -13,6 +20,7 @@ import assert from "node:assert/strict";
|
|
|
13
20
|
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
14
21
|
import { join, dirname, relative } from "node:path";
|
|
15
22
|
import { fileURLToPath } from "node:url";
|
|
23
|
+
import ts from "typescript";
|
|
16
24
|
|
|
17
25
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
26
|
const gsdDir = join(__dirname, "..");
|
|
@@ -73,12 +81,6 @@ const MIGRATED_FILES = new Set([
|
|
|
73
81
|
"auto-verification.ts",
|
|
74
82
|
]);
|
|
75
83
|
|
|
76
|
-
/** Patterns that indicate a catch block already uses workflow-logger */
|
|
77
|
-
const LOGGER_PATTERNS = [
|
|
78
|
-
/logWarning\s*\(/,
|
|
79
|
-
/logError\s*\(/,
|
|
80
|
-
];
|
|
81
|
-
|
|
82
84
|
function getAutoModeFiles(): string[] {
|
|
83
85
|
const files: string[] = [];
|
|
84
86
|
|
|
@@ -124,103 +126,61 @@ function getGsdSourceFiles(): string[] {
|
|
|
124
126
|
return files;
|
|
125
127
|
}
|
|
126
128
|
|
|
127
|
-
|
|
128
|
-
* Scan a file for empty catch blocks — catches whose body contains
|
|
129
|
-
* only whitespace and/or comments but no executable statements.
|
|
130
|
-
*/
|
|
131
|
-
function findEmptyCatches(filePath: string): Array<{ line: number; text: string }> {
|
|
129
|
+
function parseSourceFile(filePath: string): ts.SourceFile {
|
|
132
130
|
const content = readFileSync(filePath, "utf-8");
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
for (let i = 0; i < lines.length; i++) {
|
|
137
|
-
const line = lines[i];
|
|
138
|
-
|
|
139
|
-
// Match catch block opening
|
|
140
|
-
if (!/\}\s*catch\s*(\([^)]*\))?\s*\{/.test(line)) continue;
|
|
141
|
-
|
|
142
|
-
// Inline single-line catch: } catch { ... }
|
|
143
|
-
const inlineMatch = line.match(/\}\s*catch\s*(\([^)]*\))?\s*\{(.*)\}\s*;?\s*$/);
|
|
144
|
-
if (inlineMatch) {
|
|
145
|
-
const body = inlineMatch[2].trim();
|
|
146
|
-
const stripped = body.replace(/\/\*.*?\*\//g, "").replace(/\/\/.*/g, "").trim();
|
|
147
|
-
if (!stripped) {
|
|
148
|
-
results.push({ line: i + 1, text: line.trim() });
|
|
149
|
-
}
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Multi-line catch — scan until matching }
|
|
154
|
-
let j = i + 1;
|
|
155
|
-
let depth = 1;
|
|
156
|
-
const bodyLines: string[] = [];
|
|
157
|
-
while (j < lines.length && depth > 0) {
|
|
158
|
-
for (const ch of lines[j]) {
|
|
159
|
-
if (ch === "{") depth++;
|
|
160
|
-
else if (ch === "}") depth--;
|
|
161
|
-
}
|
|
162
|
-
bodyLines.push(lines[j].trim());
|
|
163
|
-
j++;
|
|
164
|
-
}
|
|
131
|
+
return ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, /*setParentNodes*/ true, ts.ScriptKind.TS);
|
|
132
|
+
}
|
|
165
133
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
);
|
|
134
|
+
function forEachCatchClause(sf: ts.SourceFile, visit: (cc: ts.CatchClause) => void): void {
|
|
135
|
+
const walk = (node: ts.Node): void => {
|
|
136
|
+
if (ts.isCatchClause(node)) visit(node);
|
|
137
|
+
ts.forEachChild(node, walk);
|
|
138
|
+
};
|
|
139
|
+
walk(sf);
|
|
140
|
+
}
|
|
169
141
|
|
|
170
|
-
|
|
171
|
-
|
|
142
|
+
/**
|
|
143
|
+
* A catch block is "empty" if its Block has zero statements. Comments
|
|
144
|
+
* inside the block are trivia and are not Statement nodes, so a
|
|
145
|
+
* comment-only body still counts as empty — matching the intent of the
|
|
146
|
+
* old regex check but without its lexical blind spots.
|
|
147
|
+
*/
|
|
148
|
+
function findEmptyCatches(filePath: string): Array<{ line: number }> {
|
|
149
|
+
const sf = parseSourceFile(filePath);
|
|
150
|
+
const results: Array<{ line: number }> = [];
|
|
151
|
+
forEachCatchClause(sf, (cc) => {
|
|
152
|
+
if (cc.block.statements.length === 0) {
|
|
153
|
+
const { line } = sf.getLineAndCharacterOfPosition(cc.getStart(sf));
|
|
154
|
+
results.push({ line: line + 1 });
|
|
172
155
|
}
|
|
173
|
-
}
|
|
174
|
-
|
|
156
|
+
});
|
|
175
157
|
return results;
|
|
176
158
|
}
|
|
177
159
|
|
|
178
160
|
/**
|
|
179
|
-
*
|
|
180
|
-
* console.error/warn
|
|
161
|
+
* A catch block uses "raw stderr/console" if its body text calls
|
|
162
|
+
* process.stderr.write or console.error/warn *and* does NOT also call
|
|
163
|
+
* logWarning / logError.
|
|
164
|
+
*
|
|
165
|
+
* We test against the block's statement subtree text — derived from the
|
|
166
|
+
* AST node range, not a naive substring of the whole file — so string
|
|
167
|
+
* literals outside the block can never leak into the decision.
|
|
181
168
|
*/
|
|
182
|
-
function findRawStderrCatches(filePath: string): Array<{ line: number
|
|
183
|
-
const
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (!LOGGER_PATTERNS.some((p) => p.test(body))) {
|
|
196
|
-
if (/process\.stderr\.write/.test(body) || /console\.(error|warn)/.test(body)) {
|
|
197
|
-
results.push({ line: i + 1, text: line.trim() });
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
continue;
|
|
169
|
+
function findRawStderrCatches(filePath: string): Array<{ line: number }> {
|
|
170
|
+
const sf = parseSourceFile(filePath);
|
|
171
|
+
const results: Array<{ line: number }> = [];
|
|
172
|
+
forEachCatchClause(sf, (cc) => {
|
|
173
|
+
const bodyText = cc.block.getText(sf);
|
|
174
|
+
const usesLogger = /\blogWarning\s*\(|\blogError\s*\(/.test(bodyText);
|
|
175
|
+
if (usesLogger) return;
|
|
176
|
+
if (
|
|
177
|
+
/\bprocess\.stderr\.write\b/.test(bodyText) ||
|
|
178
|
+
/\bconsole\.(?:error|warn)\b/.test(bodyText)
|
|
179
|
+
) {
|
|
180
|
+
const { line } = sf.getLineAndCharacterOfPosition(cc.getStart(sf));
|
|
181
|
+
results.push({ line: line + 1 });
|
|
201
182
|
}
|
|
202
|
-
|
|
203
|
-
// Multi-line catch
|
|
204
|
-
let j = i + 1;
|
|
205
|
-
let depth = 1;
|
|
206
|
-
const bodyLines: string[] = [];
|
|
207
|
-
while (j < lines.length && depth > 0) {
|
|
208
|
-
for (const ch of lines[j]) {
|
|
209
|
-
if (ch === "{") depth++;
|
|
210
|
-
else if (ch === "}") depth--;
|
|
211
|
-
}
|
|
212
|
-
bodyLines.push(lines[j]);
|
|
213
|
-
j++;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const bodyText = bodyLines.slice(0, -1).join("\n");
|
|
217
|
-
if (!LOGGER_PATTERNS.some((p) => p.test(bodyText))) {
|
|
218
|
-
if (/process\.stderr\.write/.test(bodyText) || /console\.(error|warn)/.test(bodyText)) {
|
|
219
|
-
results.push({ line: i + 1, text: line.trim() });
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
183
|
+
});
|
|
224
184
|
return results;
|
|
225
185
|
}
|
|
226
186
|
|
|
@@ -248,7 +208,7 @@ describe("workflow-logger coverage (#3348)", () => {
|
|
|
248
208
|
|
|
249
209
|
const empties = findEmptyCatches(file);
|
|
250
210
|
for (const empty of empties) {
|
|
251
|
-
violations.push(`${rel}:${empty.line}
|
|
211
|
+
violations.push(`${rel}:${empty.line}`);
|
|
252
212
|
}
|
|
253
213
|
}
|
|
254
214
|
|
|
@@ -271,7 +231,7 @@ describe("workflow-logger coverage (#3348)", () => {
|
|
|
271
231
|
|
|
272
232
|
const issues = findRawStderrCatches(file);
|
|
273
233
|
for (const issue of issues) {
|
|
274
|
-
violations.push(`${rel}:${issue.line}
|
|
234
|
+
violations.push(`${rel}:${issue.line}`);
|
|
275
235
|
}
|
|
276
236
|
}
|
|
277
237
|
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* single-writer-v3-tool-surface — Verifies the MCP tool surface that closes
|
|
3
|
+
* the remaining gaps from .plans/single-writer-engine-v3-control-plane.md:
|
|
4
|
+
*
|
|
5
|
+
* 1. The 8 mutating workflow tools (plan/complete/replan/reassess) expose
|
|
6
|
+
* actorName + triggerReason as optional schema params, so an agent can
|
|
7
|
+
* self-identify (Stream 2: actor identity passthrough).
|
|
8
|
+
*
|
|
9
|
+
* 2. The 3 reversibility handlers (reopen-task/slice/milestone) are
|
|
10
|
+
* registered as MCP tools with both canonical and alias names
|
|
11
|
+
* (Stream 3: reversibility tools).
|
|
12
|
+
*
|
|
13
|
+
* 3. The reopen tools accept the documented core params plus optional
|
|
14
|
+
* reason/actorName/triggerReason without rejecting valid payloads.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { test } from "node:test";
|
|
18
|
+
import assert from "node:assert/strict";
|
|
19
|
+
import { registerDbTools } from "../bootstrap/db-tools.ts";
|
|
20
|
+
import { Value } from "@sinclair/typebox/value";
|
|
21
|
+
|
|
22
|
+
function makeMockPi() {
|
|
23
|
+
const tools: any[] = [];
|
|
24
|
+
return {
|
|
25
|
+
registerTool: (tool: any) => tools.push(tool),
|
|
26
|
+
tools,
|
|
27
|
+
} as any;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const pi = makeMockPi();
|
|
31
|
+
registerDbTools(pi);
|
|
32
|
+
|
|
33
|
+
function getTool(name: string) {
|
|
34
|
+
return pi.tools.find((t: any) => t.name === name);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function getRequiredProps(tool: any): string[] {
|
|
38
|
+
return tool.parameters.required ?? [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getProps(tool: any): string[] {
|
|
42
|
+
return Object.keys(tool.parameters.properties ?? {});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─── Stream 2: actor identity exposure on 8 mutating workflow tools ─────────
|
|
46
|
+
|
|
47
|
+
const ACTOR_TOOLS = [
|
|
48
|
+
"gsd_plan_milestone",
|
|
49
|
+
"gsd_plan_slice",
|
|
50
|
+
"gsd_plan_task",
|
|
51
|
+
"gsd_task_complete",
|
|
52
|
+
"gsd_slice_complete",
|
|
53
|
+
"gsd_complete_milestone",
|
|
54
|
+
"gsd_replan_slice",
|
|
55
|
+
"gsd_reassess_roadmap",
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
for (const name of ACTOR_TOOLS) {
|
|
59
|
+
test(`${name} — exposes actorName and triggerReason as optional`, () => {
|
|
60
|
+
const tool = getTool(name);
|
|
61
|
+
assert.ok(tool, `${name} must be registered`);
|
|
62
|
+
|
|
63
|
+
const props = new Set(getProps(tool));
|
|
64
|
+
const required = new Set(getRequiredProps(tool));
|
|
65
|
+
|
|
66
|
+
assert.ok(props.has("actorName"), `${name} must expose actorName param`);
|
|
67
|
+
assert.ok(props.has("triggerReason"), `${name} must expose triggerReason param`);
|
|
68
|
+
assert.ok(!required.has("actorName"), `${name}.actorName must be optional`);
|
|
69
|
+
assert.ok(!required.has("triggerReason"), `${name}.triggerReason must be optional`);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─── Stream 3: reopen tools registered with canonical + alias names ─────────
|
|
74
|
+
|
|
75
|
+
const REOPEN_TOOLS = [
|
|
76
|
+
{ canonical: "gsd_task_reopen", alias: "gsd_reopen_task" },
|
|
77
|
+
{ canonical: "gsd_slice_reopen", alias: "gsd_reopen_slice" },
|
|
78
|
+
{ canonical: "gsd_milestone_reopen", alias: "gsd_reopen_milestone" },
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
for (const { canonical, alias } of REOPEN_TOOLS) {
|
|
82
|
+
test(`${canonical} — registered with alias ${alias}`, () => {
|
|
83
|
+
const canonicalTool = getTool(canonical);
|
|
84
|
+
const aliasTool = getTool(alias);
|
|
85
|
+
assert.ok(canonicalTool, `${canonical} must be registered`);
|
|
86
|
+
assert.ok(aliasTool, `${alias} must be registered as alias`);
|
|
87
|
+
assert.ok(typeof canonicalTool.execute === "function", `${canonical} must have an execute function`);
|
|
88
|
+
assert.ok(typeof aliasTool.execute === "function", `${alias} must have an execute function`);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ─── Reopen tool schemas accept minimal core params ──────────────────────────
|
|
93
|
+
|
|
94
|
+
test("gsd_task_reopen — validates with only milestoneId/sliceId/taskId", () => {
|
|
95
|
+
const tool = getTool("gsd_task_reopen");
|
|
96
|
+
assert.ok(tool);
|
|
97
|
+
const minimal = { milestoneId: "M001", sliceId: "S01", taskId: "T01" };
|
|
98
|
+
const errors = [...Value.Errors(tool.parameters, minimal)];
|
|
99
|
+
assert.strictEqual(errors.length, 0, `core params should validate; got: ${errors.map(e => `${e.path}: ${e.message}`).join(", ")}`);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("gsd_task_reopen — accepts reason + actor fields", () => {
|
|
103
|
+
const tool = getTool("gsd_task_reopen");
|
|
104
|
+
assert.ok(tool);
|
|
105
|
+
const full = {
|
|
106
|
+
milestoneId: "M001",
|
|
107
|
+
sliceId: "S01",
|
|
108
|
+
taskId: "T01",
|
|
109
|
+
reason: "regression discovered",
|
|
110
|
+
actorName: "executor-01",
|
|
111
|
+
triggerReason: "post-completion verification failure",
|
|
112
|
+
};
|
|
113
|
+
const errors = [...Value.Errors(tool.parameters, full)];
|
|
114
|
+
assert.strictEqual(errors.length, 0, `full payload should validate; got: ${errors.map(e => `${e.path}: ${e.message}`).join(", ")}`);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("gsd_slice_reopen — validates with only milestoneId/sliceId", () => {
|
|
118
|
+
const tool = getTool("gsd_slice_reopen");
|
|
119
|
+
assert.ok(tool);
|
|
120
|
+
const minimal = { milestoneId: "M001", sliceId: "S01" };
|
|
121
|
+
const errors = [...Value.Errors(tool.parameters, minimal)];
|
|
122
|
+
assert.strictEqual(errors.length, 0, `core params should validate; got: ${errors.map(e => `${e.path}: ${e.message}`).join(", ")}`);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test("gsd_milestone_reopen — validates with only milestoneId", () => {
|
|
126
|
+
const tool = getTool("gsd_milestone_reopen");
|
|
127
|
+
assert.ok(tool);
|
|
128
|
+
const minimal = { milestoneId: "M001" };
|
|
129
|
+
const errors = [...Value.Errors(tool.parameters, minimal)];
|
|
130
|
+
assert.strictEqual(errors.length, 0, `core params should validate; got: ${errors.map(e => `${e.path}: ${e.message}`).join(", ")}`);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// ─── MCP_WORKFLOW_TOOL_SURFACE includes the reopen tools ─────────────────────
|
|
134
|
+
|
|
135
|
+
test("workflow MCP surface includes the reopen tools", async () => {
|
|
136
|
+
const { getWorkflowTransportSupportError } = await import("../workflow-mcp.ts");
|
|
137
|
+
// The error builder reports tools that are required-but-missing from the surface.
|
|
138
|
+
// If the reopen tools are missing from the surface, the error message will list them.
|
|
139
|
+
// We probe by asking for a "claude-code" provider (which uses externalCli + local://)
|
|
140
|
+
// with our reopen tools as required, and assert the surface has them.
|
|
141
|
+
const err = getWorkflowTransportSupportError(
|
|
142
|
+
"claude-code",
|
|
143
|
+
["gsd_task_reopen", "gsd_slice_reopen", "gsd_milestone_reopen"],
|
|
144
|
+
{ authMode: "externalCli", baseUrl: "local://test" },
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// err is null when surface satisfies required tools, OR a non-null error mentioning
|
|
148
|
+
// unrelated infra setup (like "workflow MCP server not configured"). Either way,
|
|
149
|
+
// the error must NOT name our three reopen tools as missing from the surface.
|
|
150
|
+
if (err !== null) {
|
|
151
|
+
assert.ok(
|
|
152
|
+
!err.includes("gsd_task_reopen") &&
|
|
153
|
+
!err.includes("gsd_slice_reopen") &&
|
|
154
|
+
!err.includes("gsd_milestone_reopen"),
|
|
155
|
+
`surface should include all three reopen tools, but error reports them missing: ${err}`,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
});
|