gsd-pi 2.77.0-dev.eaa4973bc → 2.78.0-dev.aeeb2ca00
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 +53 -17
- package/dist/claude-cli-check.js +46 -10
- package/dist/headless.js +49 -4
- 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 +72 -16
- 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 +11 -11
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- 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/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/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 +75 -16
- 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/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 → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
|
@@ -1,97 +1,81 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* zombie-gsd-state.test.ts — #2942
|
|
3
|
+
*
|
|
4
|
+
* A partially initialized `.gsd/` (symlink exists but neither `PREFERENCES.md`
|
|
5
|
+
* nor `milestones/` is present) previously caused the init-wizard gate in
|
|
6
|
+
* `showSmartEntry` to be skipped. The fix introduces
|
|
7
|
+
* `hasGsdBootstrapArtifacts`, which requires at least one bootstrap artifact
|
|
8
|
+
* to be present before treating the project as initialized.
|
|
9
|
+
*
|
|
10
|
+
* These tests exercise that helper directly over synthetic filesystems and
|
|
11
|
+
* injected predicates — replacing the old source-grep assertions that only
|
|
12
|
+
* verified the function's *text* shape.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { test } from "node:test";
|
|
16
|
+
import assert from "node:assert/strict";
|
|
17
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
2
18
|
import { join } from "node:path";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
join(import.meta.dirname, "..", "auto-start.ts"),
|
|
67
|
-
"utf-8",
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
// After ensureGsdSymlink, the code that creates milestones/ must check for
|
|
71
|
-
// the milestones directory specifically (not .gsd/ which ensureGsdSymlink already created).
|
|
72
|
-
const symlinkIdx = autoStartSrc.indexOf("ensureGsdSymlink(base)");
|
|
73
|
-
assertTrue(symlinkIdx >= 0, "auto-start.ts calls ensureGsdSymlink(base)");
|
|
74
|
-
|
|
75
|
-
const afterSymlink = symlinkIdx >= 0
|
|
76
|
-
? autoStartSrc.slice(symlinkIdx, autoStartSrc.indexOf("Initialize GitServiceImpl", symlinkIdx))
|
|
77
|
-
: "";
|
|
78
|
-
|
|
79
|
-
// The milestones bootstrap must check milestones path, not gsdDir
|
|
80
|
-
// Old (dead) code: if (!existsSync(gsdDir)) { mkdirSync(join(gsdDir, "milestones"), ...) }
|
|
81
|
-
// Fixed code should check: if (!existsSync(milestonesPath)) or similar
|
|
82
|
-
assertTrue(
|
|
83
|
-
afterSymlink.includes("milestones") && afterSymlink.includes("mkdirSync"),
|
|
84
|
-
"auto-start.ts creates milestones/ directory after ensureGsdSymlink (#2942)",
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
// The guard for milestones/ creation should NOT be `!existsSync(gsdDir)` —
|
|
88
|
-
// that's dead code since ensureGsdSymlink already created gsdDir.
|
|
89
|
-
// It should check for the milestones/ dir directly.
|
|
90
|
-
const mkdirRegion = afterSymlink.slice(0, afterSymlink.indexOf("mkdirSync") + 200);
|
|
91
|
-
assertMatch(
|
|
92
|
-
mkdirRegion,
|
|
93
|
-
/existsSync\([^)]*milestones/,
|
|
94
|
-
"milestones bootstrap checks milestones path existence, not .gsd/ (#2942)",
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
report();
|
|
19
|
+
import { tmpdir } from "node:os";
|
|
20
|
+
|
|
21
|
+
import { hasGsdBootstrapArtifacts } from "../detection.ts";
|
|
22
|
+
|
|
23
|
+
function makeGsdDir(t: { after: (fn: () => void) => void }): string {
|
|
24
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-zombie-state-"));
|
|
25
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
26
|
+
return dir;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
test("#2942: missing .gsd/ directory entirely → treated as un-bootstrapped", () => {
|
|
30
|
+
assert.equal(
|
|
31
|
+
hasGsdBootstrapArtifacts("/nonexistent/path/does/not/exist/.gsd"),
|
|
32
|
+
false,
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("#2942: zombie .gsd/ (empty directory) must NOT count as bootstrapped", (t) => {
|
|
37
|
+
const gsd = makeGsdDir(t);
|
|
38
|
+
// Only the directory exists — neither PREFERENCES.md nor milestones/
|
|
39
|
+
assert.equal(
|
|
40
|
+
hasGsdBootstrapArtifacts(gsd),
|
|
41
|
+
false,
|
|
42
|
+
"an empty .gsd/ is a zombie state — init wizard must still run",
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("#2942: .gsd/ with PREFERENCES.md counts as bootstrapped", (t) => {
|
|
47
|
+
const gsd = makeGsdDir(t);
|
|
48
|
+
writeFileSync(join(gsd, "PREFERENCES.md"), "# prefs\n");
|
|
49
|
+
assert.equal(hasGsdBootstrapArtifacts(gsd), true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("#2942: .gsd/ with milestones/ directory counts as bootstrapped", (t) => {
|
|
53
|
+
const gsd = makeGsdDir(t);
|
|
54
|
+
mkdirSync(join(gsd, "milestones"));
|
|
55
|
+
assert.equal(hasGsdBootstrapArtifacts(gsd), true);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("#2942: both artifacts present → bootstrapped", (t) => {
|
|
59
|
+
const gsd = makeGsdDir(t);
|
|
60
|
+
writeFileSync(join(gsd, "PREFERENCES.md"), "# prefs\n");
|
|
61
|
+
mkdirSync(join(gsd, "milestones"));
|
|
62
|
+
assert.equal(hasGsdBootstrapArtifacts(gsd), true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("#2942: injected existsFn — zombie via predicate is rejected", () => {
|
|
66
|
+
// Only the .gsd/ directory exists; artifacts are missing.
|
|
67
|
+
const existsFn = (p: string) => p === "/proj/.gsd";
|
|
68
|
+
assert.equal(hasGsdBootstrapArtifacts("/proj/.gsd", existsFn), false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("#2942: injected existsFn — PREFERENCES.md alone is enough", () => {
|
|
72
|
+
const existsFn = (p: string) =>
|
|
73
|
+
p === "/proj/.gsd" || p === "/proj/.gsd/PREFERENCES.md";
|
|
74
|
+
assert.equal(hasGsdBootstrapArtifacts("/proj/.gsd", existsFn), true);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("#2942: injected existsFn — milestones/ alone is enough", () => {
|
|
78
|
+
const existsFn = (p: string) =>
|
|
79
|
+
p === "/proj/.gsd" || p === "/proj/.gsd/milestones";
|
|
80
|
+
assert.equal(hasGsdBootstrapArtifacts("/proj/.gsd", existsFn), true);
|
|
81
|
+
});
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
getMilestoneSlices,
|
|
19
19
|
} from "../gsd-db.js";
|
|
20
20
|
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
21
|
+
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
21
22
|
import { saveFile, clearParseCache } from "../files.js";
|
|
22
23
|
import { invalidateStateCache } from "../state.js";
|
|
23
24
|
import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
|
|
@@ -100,14 +101,19 @@ export async function handleValidateMilestone(
|
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
// ── Resolve paths and render markdown ────────────────────────────────
|
|
104
|
+
// #4761: route through the canonical-root resolver so that when a live
|
|
105
|
+
// worktree exists for this milestone, validation reads/writes the
|
|
106
|
+
// worktree's artifacts instead of stale project-root state.
|
|
103
107
|
const validationMd = renderValidationMarkdown(params);
|
|
104
108
|
|
|
109
|
+
const canonicalBase = resolveCanonicalMilestoneRoot(basePath, params.milestoneId);
|
|
110
|
+
|
|
105
111
|
let validationPath: string;
|
|
106
|
-
const milestoneDir = resolveMilestonePath(
|
|
112
|
+
const milestoneDir = resolveMilestonePath(canonicalBase, params.milestoneId);
|
|
107
113
|
if (milestoneDir) {
|
|
108
114
|
validationPath = join(milestoneDir, `${params.milestoneId}-VALIDATION.md`);
|
|
109
115
|
} else {
|
|
110
|
-
const gsdDir = join(
|
|
116
|
+
const gsdDir = join(canonicalBase, ".gsd");
|
|
111
117
|
const manualDir = join(gsdDir, "milestones", params.milestoneId);
|
|
112
118
|
validationPath = join(manualDir, `${params.milestoneId}-VALIDATION.md`);
|
|
113
119
|
}
|
|
@@ -695,8 +695,8 @@ export interface CompleteSliceParams {
|
|
|
695
695
|
|
|
696
696
|
export type GateId = "Q3" | "Q4" | "Q5" | "Q6" | "Q7" | "Q8" | "MV01" | "MV02" | "MV03" | "MV04";
|
|
697
697
|
export type GateScope = "slice" | "task" | "milestone";
|
|
698
|
-
export type GateStatus = "pending" | "complete"
|
|
699
|
-
export type GateVerdict = "pass" | "flag" | "omitted"
|
|
698
|
+
export type GateStatus = "pending" | "complete";
|
|
699
|
+
export type GateVerdict = "pass" | "flag" | "omitted";
|
|
700
700
|
|
|
701
701
|
export interface GateRow {
|
|
702
702
|
milestone_id: string;
|
|
@@ -705,7 +705,7 @@ export interface GateRow {
|
|
|
705
705
|
scope: GateScope;
|
|
706
706
|
task_id: string;
|
|
707
707
|
status: GateStatus;
|
|
708
|
-
verdict: GateVerdict;
|
|
708
|
+
verdict: GateVerdict | null;
|
|
709
709
|
rationale: string;
|
|
710
710
|
findings: string;
|
|
711
711
|
evaluated_at: string | null;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// GSD-2 — UnitContextComposer (#4782 phase 2).
|
|
2
|
+
//
|
|
3
|
+
// Reads a unit type's manifest and orchestrates artifact inlining through
|
|
4
|
+
// a caller-provided resolver. Returns a joined context block suitable for
|
|
5
|
+
// substitution into the unit's prompt template.
|
|
6
|
+
//
|
|
7
|
+
// Design rationale:
|
|
8
|
+
// - Pure dependency on the manifest module — no circular import with
|
|
9
|
+
// `auto-prompts.ts` where the per-artifact-key resolver lives.
|
|
10
|
+
// - Caller-supplied resolver means the composer can be unit-tested with
|
|
11
|
+
// trivial mocks; production wiring in `auto-prompts.ts` dispatches to
|
|
12
|
+
// the existing `inlineFile` / `inline*FromDb` helpers.
|
|
13
|
+
// - Null-returning resolvers are skipped silently: they model the
|
|
14
|
+
// "artifact is optional / missing / not applicable to this milestone"
|
|
15
|
+
// case. The composer never errors on a missing artifact.
|
|
16
|
+
//
|
|
17
|
+
// Scope: phase 2 pilot shipped `composeInlinedContext` for static-key
|
|
18
|
+
// inlining. Phase 3.5 (#4924) adds the v2 surface — `composeUnitContext`
|
|
19
|
+
// — which also handles excerpts, computed artifacts, and prepended blocks.
|
|
20
|
+
// `composeInlinedContext` stays for backward compatibility with the
|
|
21
|
+
// already-migrated simple builders.
|
|
22
|
+
//
|
|
23
|
+
// ─── Composer boundary invariant (#4924) ─────────────────────────────────
|
|
24
|
+
//
|
|
25
|
+
// The composer is allowed to:
|
|
26
|
+
// - order named sections per the manifest's declared sequence
|
|
27
|
+
// - resolve registered artifacts (static / computed / excerpt / on-demand)
|
|
28
|
+
// - apply typed policies (knowledge / memory / codebase-map / preferences)
|
|
29
|
+
//
|
|
30
|
+
// The composer must NOT grow:
|
|
31
|
+
// - arbitrary conditionals on unit state
|
|
32
|
+
// - loops over caller-supplied data
|
|
33
|
+
// - string templating beyond section composition (join + separator)
|
|
34
|
+
//
|
|
35
|
+
// Logic that needs those belongs in a typed computed-artifact builder
|
|
36
|
+
// owned by the unit, not in the composer. Reviews must enforce this — it
|
|
37
|
+
// is the difference between an orchestrator and a runaway DSL.
|
|
38
|
+
|
|
39
|
+
import {
|
|
40
|
+
resolveManifest,
|
|
41
|
+
type ArtifactKey,
|
|
42
|
+
type BaseResolverContext,
|
|
43
|
+
type ComputedArtifactId,
|
|
44
|
+
type ComputedArtifactRegistry,
|
|
45
|
+
type UnitContextManifest,
|
|
46
|
+
} from "./unit-context-manifest.js";
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Async function mapping an artifact key to its inlined-content string,
|
|
50
|
+
* or `null` when the artifact does not apply to the current milestone
|
|
51
|
+
* (missing file, empty table, etc).
|
|
52
|
+
*/
|
|
53
|
+
export type ArtifactResolver = (key: ArtifactKey) => Promise<string | null>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Produce the inlined-context portion of a unit's system prompt by
|
|
57
|
+
* walking the manifest's `artifacts.inline` list in order and calling
|
|
58
|
+
* the provided resolver for each key.
|
|
59
|
+
*
|
|
60
|
+
* Returns an empty string when the unit type has no manifest registered,
|
|
61
|
+
* so callers can guard their wiring with a simple truthy check. Unknown
|
|
62
|
+
* unit types do not error — this mirrors `resolveManifest`'s contract.
|
|
63
|
+
*
|
|
64
|
+
* The separator between inlined blocks matches the in-tree convention
|
|
65
|
+
* (`\n\n---\n\n`) so composer output slots into existing prompt templates
|
|
66
|
+
* without visible diff.
|
|
67
|
+
*/
|
|
68
|
+
export async function composeInlinedContext(
|
|
69
|
+
unitType: string,
|
|
70
|
+
resolveArtifact: ArtifactResolver,
|
|
71
|
+
): Promise<string> {
|
|
72
|
+
const manifest: UnitContextManifest | null = resolveManifest(unitType);
|
|
73
|
+
if (!manifest) return "";
|
|
74
|
+
|
|
75
|
+
const blocks: string[] = [];
|
|
76
|
+
for (const key of manifest.artifacts.inline) {
|
|
77
|
+
const body = await resolveArtifact(key);
|
|
78
|
+
if (body !== null && body.length > 0) {
|
|
79
|
+
blocks.push(body);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return blocks.join("\n\n---\n\n");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Convenience helper returning the manifest's declared budget so callers
|
|
87
|
+
* can telemetry a mismatch between actual prompt size and declared budget.
|
|
88
|
+
* Returns null for unknown unit types.
|
|
89
|
+
*/
|
|
90
|
+
export function manifestBudgetChars(unitType: string): number | null {
|
|
91
|
+
const manifest = resolveManifest(unitType);
|
|
92
|
+
return manifest ? manifest.maxSystemPromptChars : null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ─── v2 surface (#4924) ───────────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Resolver for excerpt-class artifacts. Returns the compact block body
|
|
99
|
+
* (per-unit excerpt rendering — e.g. `buildSliceSummaryExcerpt` for the
|
|
100
|
+
* complete-milestone closer) or `null` to omit. Mirrors `ArtifactResolver`
|
|
101
|
+
* shape so consumers can reuse the same registry pattern.
|
|
102
|
+
*/
|
|
103
|
+
export type ExcerptResolver = (key: ArtifactKey) => Promise<string | null>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Inputs to the v2 composer entrypoint. The base context is required;
|
|
107
|
+
* each resolver/registry is optional and absent ones are treated as
|
|
108
|
+
* "manifest declares no entries of that class for this unit."
|
|
109
|
+
*/
|
|
110
|
+
export interface ComposeUnitContextOptions {
|
|
111
|
+
readonly base: BaseResolverContext;
|
|
112
|
+
readonly resolveArtifact?: ArtifactResolver;
|
|
113
|
+
readonly resolveExcerpt?: ExcerptResolver;
|
|
114
|
+
readonly computed?: ComputedArtifactRegistry;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Composer output. Kept structured (rather than a single joined string)
|
|
119
|
+
* because some builders need to splice the prepend block above their own
|
|
120
|
+
* preamble while keeping the main context block in its existing position.
|
|
121
|
+
*
|
|
122
|
+
* Both fields are joined with the in-tree `\n\n---\n\n` separator. Empty
|
|
123
|
+
* string means "no content for this section" — callers branch on truthy
|
|
124
|
+
* to decide whether to render any wrapper headers.
|
|
125
|
+
*/
|
|
126
|
+
export interface ComposedUnitContext {
|
|
127
|
+
readonly prepend: string;
|
|
128
|
+
readonly inline: string;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const SECTION_SEPARATOR = "\n\n---\n\n";
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Compose all manifest-declared context for a unit type using the v2
|
|
135
|
+
* surface. Walks `prepend` first (computed-only), then the `inline` list
|
|
136
|
+
* (static keys via `resolveArtifact`), then `excerpt` (via `resolveExcerpt`),
|
|
137
|
+
* then `artifacts.computed` (via the typed registry). Order within each
|
|
138
|
+
* section follows the manifest's declared sequence.
|
|
139
|
+
*
|
|
140
|
+
* Unknown unit types return empty strings for both sections — callers can
|
|
141
|
+
* fall back to existing imperative wiring without a special case.
|
|
142
|
+
*
|
|
143
|
+
* Resolver / registry omissions: if the manifest declares an entry but no
|
|
144
|
+
* resolver / registry entry is provided, the composer skips it silently.
|
|
145
|
+
* This matches the v1 contract where a null body is a no-op, and lets
|
|
146
|
+
* partial migrations land without forcing every consumer to register
|
|
147
|
+
* every artifact class up-front.
|
|
148
|
+
*/
|
|
149
|
+
export async function composeUnitContext(
|
|
150
|
+
unitType: string,
|
|
151
|
+
opts: ComposeUnitContextOptions,
|
|
152
|
+
): Promise<ComposedUnitContext> {
|
|
153
|
+
const manifest: UnitContextManifest | null = resolveManifest(unitType);
|
|
154
|
+
if (!manifest) return { prepend: "", inline: "" };
|
|
155
|
+
|
|
156
|
+
// Single-source `unitType`: the manifest is resolved against the
|
|
157
|
+
// function arg, but computed builders read it from `base.unitType`.
|
|
158
|
+
// If those ever diverge (caller passes one type to composeUnitContext
|
|
159
|
+
// but a different one in opts.base), the composer would silently
|
|
160
|
+
// mix one unit's manifest with another unit's computed context.
|
|
161
|
+
// Normalize here so the composer dispatches a consistent identity
|
|
162
|
+
// through to every builder.
|
|
163
|
+
const normalizedOpts: ComposeUnitContextOptions = {
|
|
164
|
+
...opts,
|
|
165
|
+
base: { ...opts.base, unitType },
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const prependBlocks = await runComputed(manifest.prepend ?? [], normalizedOpts);
|
|
169
|
+
const inlineBlocks: string[] = [];
|
|
170
|
+
|
|
171
|
+
for (const key of manifest.artifacts.inline) {
|
|
172
|
+
if (!normalizedOpts.resolveArtifact) break;
|
|
173
|
+
const body = await normalizedOpts.resolveArtifact(key);
|
|
174
|
+
if (body && body.length > 0) inlineBlocks.push(body);
|
|
175
|
+
}
|
|
176
|
+
for (const key of manifest.artifacts.excerpt) {
|
|
177
|
+
if (!normalizedOpts.resolveExcerpt) break;
|
|
178
|
+
const body = await normalizedOpts.resolveExcerpt(key);
|
|
179
|
+
if (body && body.length > 0) inlineBlocks.push(body);
|
|
180
|
+
}
|
|
181
|
+
inlineBlocks.push(...await runComputed(manifest.artifacts.computed ?? [], normalizedOpts));
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
prepend: prependBlocks.join(SECTION_SEPARATOR),
|
|
185
|
+
inline: inlineBlocks.join(SECTION_SEPARATOR),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Invoke the registered builder for each declared computed id, in order.
|
|
191
|
+
* Missing registry entries (manifest declares the id but caller didn't
|
|
192
|
+
* register it) are skipped silently — see composeUnitContext rationale.
|
|
193
|
+
*/
|
|
194
|
+
async function runComputed(
|
|
195
|
+
ids: readonly ComputedArtifactId[],
|
|
196
|
+
opts: ComposeUnitContextOptions,
|
|
197
|
+
): Promise<string[]> {
|
|
198
|
+
if (ids.length === 0 || !opts.computed) return [];
|
|
199
|
+
// Type safety lives at the registration boundary (caller-supplied
|
|
200
|
+
// `computed` is typed against ComputedArtifactInputs[K] per id). Inside
|
|
201
|
+
// the composer we only dispatch — view the registry through a widened
|
|
202
|
+
// local shape so the loop compiles when the registry is empty (which
|
|
203
|
+
// it is in the v2-contract foundation PR before any computed ids are
|
|
204
|
+
// registered, making `keyof ComputedArtifactInputs` resolve to `never`).
|
|
205
|
+
type AnyEntry = {
|
|
206
|
+
build: (inputs: unknown, base: BaseResolverContext) => Promise<string | null>;
|
|
207
|
+
inputs: unknown;
|
|
208
|
+
};
|
|
209
|
+
const registry = opts.computed as Record<string, AnyEntry | undefined>;
|
|
210
|
+
const out: string[] = [];
|
|
211
|
+
for (const id of ids) {
|
|
212
|
+
const entry = registry[id];
|
|
213
|
+
if (!entry) continue;
|
|
214
|
+
const body = await entry.build(entry.inputs, opts.base);
|
|
215
|
+
if (body && body.length > 0) out.push(body);
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|