gsd-pi 2.77.0-dev.1d17f366c → 2.77.0-dev.2daa994b6
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/dist/headless.js +25 -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/gsd/auto/phases.js +5 -18
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +37 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +79 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
- package/dist/resources/extensions/gsd/auto-start.js +75 -24
- package/dist/resources/extensions/gsd/auto.js +34 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +7 -1
- 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/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/forensics.js +106 -0
- package/dist/resources/extensions/gsd/gsd-db.js +1 -1
- package/dist/resources/extensions/gsd/guided-flow.js +2 -4
- 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/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +6 -0
- 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 +5 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- 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/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 +334 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +51 -0
- 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 +17 -17
- 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/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 +17 -17
- 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 +1 -3
- 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/workflow-tools.test.ts +80 -39
- package/packages/native/package.json +1 -1
- 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/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/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 +29 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- 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 +39 -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/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/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/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 +36 -12
- 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/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +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 +41 -12
- 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/image.test.ts +10 -5
- 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/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +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/tests/stream-adapter.test.ts +80 -72
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +33 -1
- package/src/resources/extensions/gsd/auto/phases.ts +6 -17
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +40 -8
- package/src/resources/extensions/gsd/auto-post-unit.ts +81 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
- package/src/resources/extensions/gsd/auto-start.ts +97 -4
- package/src/resources/extensions/gsd/auto.ts +37 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +9 -1
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +7 -1
- 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/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/forensics.ts +118 -1
- package/src/resources/extensions/gsd/git-service.ts +16 -0
- package/src/resources/extensions/gsd/gsd-db.ts +1 -1
- package/src/resources/extensions/gsd/guided-flow.ts +2 -4
- 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/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +6 -0
- 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 +5 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- 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/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +25 -292
- 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-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 +8 -4
- 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/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/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/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/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/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 +1 -1
- 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/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/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/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 +22 -16
- 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/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/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/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/smart-entry-draft.test.ts +2 -1
- 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-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/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -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/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +492 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -0
- 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/{vidAVJkURvTJ0_V2-64ro → gYYky7yfxW8txb9vU2TrJ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{vidAVJkURvTJ0_V2-64ro → gYYky7yfxW8txb9vU2TrJ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// GSD-2 — UnitContextManifest (#4782 phase 1).
|
|
2
|
+
//
|
|
3
|
+
// Declarative description of what context each auto-mode unit type needs
|
|
4
|
+
// in its system prompt. Establishes the contract that later phases will
|
|
5
|
+
// use to drive a single composeSystemPromptForUnit() — replacing the
|
|
6
|
+
// per-unit-type branching currently spread across `auto-prompts.ts`.
|
|
7
|
+
//
|
|
8
|
+
// **Phase 1 ships the type + the data + a CI coverage guard.** It adds
|
|
9
|
+
// zero wiring — no caller reads a manifest yet. Every unit type gets a
|
|
10
|
+
// manifest that describes today's behavior as faithfully as possible, so
|
|
11
|
+
// when the composer lands in phase 2 the migration can proceed manifest-
|
|
12
|
+
// by-manifest without behavior change.
|
|
13
|
+
//
|
|
14
|
+
// Phased rollout tracking:
|
|
15
|
+
// - Phase 1 (this PR): schema + manifests + coverage test.
|
|
16
|
+
// - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
|
|
17
|
+
// unit type (e.g. reassess-roadmap) as the pilot.
|
|
18
|
+
// - Phase 3: migrate remaining unit types, tighten manifests per
|
|
19
|
+
// empirical usage, introduce skipWhen predicates absorbing the
|
|
20
|
+
// reassess opt-in gate from #4778.
|
|
21
|
+
// - Phase 4: introduce pipeline variants as declared sequences,
|
|
22
|
+
// absorbing the scope-classifier gates from #4781.
|
|
23
|
+
//
|
|
24
|
+
// Naming:
|
|
25
|
+
// - Artifact keys are STABLE strings (not paths). Path resolution is
|
|
26
|
+
// the composer's job; manifests describe intent, not disk layout.
|
|
27
|
+
// - Char budgets are nominal — blown budgets log a telemetry event,
|
|
28
|
+
// they do not truncate or error (the composer decides fallback).
|
|
29
|
+
// ─── Artifact registry ────────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Stable identifiers for every artifact class a unit might inline, excerpt,
|
|
32
|
+
* or reference on-demand. Adding a new artifact class requires (a) a key
|
|
33
|
+
* here, (b) path/body resolution in the composer, and (c) updates to any
|
|
34
|
+
* manifest that should surface it.
|
|
35
|
+
*/
|
|
36
|
+
export const ARTIFACT_KEYS = [
|
|
37
|
+
// Milestone-scoped
|
|
38
|
+
"roadmap",
|
|
39
|
+
"milestone-context",
|
|
40
|
+
"milestone-summary",
|
|
41
|
+
"milestone-validation",
|
|
42
|
+
"milestone-research",
|
|
43
|
+
"milestone-plan",
|
|
44
|
+
// Slice-scoped
|
|
45
|
+
"slice-context",
|
|
46
|
+
"slice-research",
|
|
47
|
+
"slice-plan",
|
|
48
|
+
"slice-summary",
|
|
49
|
+
"slice-uat",
|
|
50
|
+
"slice-assessment",
|
|
51
|
+
// Task-scoped
|
|
52
|
+
"task-plan",
|
|
53
|
+
"task-summary",
|
|
54
|
+
"prior-task-summaries",
|
|
55
|
+
"dependency-summaries",
|
|
56
|
+
// Project-scoped
|
|
57
|
+
"requirements",
|
|
58
|
+
"decisions",
|
|
59
|
+
"project",
|
|
60
|
+
"templates",
|
|
61
|
+
];
|
|
62
|
+
// ─── Manifests ────────────────────────────────────────────────────────────
|
|
63
|
+
// Phase 1 policy: every manifest encodes today's behavior. Skills = "all"
|
|
64
|
+
// unless the unit type was already narrowed via the existing skill-manifest
|
|
65
|
+
// resolver (#4779). Memory/knowledge policies reflect the defaults in
|
|
66
|
+
// `bootstrap/system-context.ts`. Artifact classifications follow what
|
|
67
|
+
// `auto-prompts.ts` inlines today for each unit type.
|
|
68
|
+
const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
|
|
69
|
+
const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
|
|
70
|
+
const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
|
|
71
|
+
/**
|
|
72
|
+
* Canonical unit types handled by auto-mode dispatch. The coverage test
|
|
73
|
+
* enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
|
|
74
|
+
* a new unit type lands.
|
|
75
|
+
*/
|
|
76
|
+
export const KNOWN_UNIT_TYPES = [
|
|
77
|
+
"research-milestone",
|
|
78
|
+
"plan-milestone",
|
|
79
|
+
"discuss-milestone",
|
|
80
|
+
"validate-milestone",
|
|
81
|
+
"complete-milestone",
|
|
82
|
+
"research-slice",
|
|
83
|
+
"plan-slice",
|
|
84
|
+
"refine-slice",
|
|
85
|
+
"replan-slice",
|
|
86
|
+
"complete-slice",
|
|
87
|
+
"reassess-roadmap",
|
|
88
|
+
"execute-task",
|
|
89
|
+
"reactive-execute",
|
|
90
|
+
"run-uat",
|
|
91
|
+
"gate-evaluate",
|
|
92
|
+
"rewrite-docs",
|
|
93
|
+
];
|
|
94
|
+
export const UNIT_MANIFESTS = {
|
|
95
|
+
// ─── Milestone-scoped ────────────────────────────────────────────────
|
|
96
|
+
"research-milestone": {
|
|
97
|
+
skills: { mode: "all" },
|
|
98
|
+
knowledge: "full",
|
|
99
|
+
memory: "prompt-relevant",
|
|
100
|
+
codebaseMap: true,
|
|
101
|
+
preferences: "active-only",
|
|
102
|
+
artifacts: {
|
|
103
|
+
// Phase 3 migration (#4782): matches today's actual
|
|
104
|
+
// buildResearchMilestonePrompt inlining order.
|
|
105
|
+
inline: ["milestone-context", "project", "requirements", "decisions", "templates"],
|
|
106
|
+
excerpt: [],
|
|
107
|
+
onDemand: [],
|
|
108
|
+
},
|
|
109
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
110
|
+
},
|
|
111
|
+
"plan-milestone": {
|
|
112
|
+
skills: { mode: "all" },
|
|
113
|
+
knowledge: "full",
|
|
114
|
+
memory: "prompt-relevant",
|
|
115
|
+
codebaseMap: true,
|
|
116
|
+
preferences: "active-only",
|
|
117
|
+
artifacts: {
|
|
118
|
+
inline: ["project", "requirements", "decisions", "milestone-research", "templates"],
|
|
119
|
+
excerpt: [],
|
|
120
|
+
onDemand: [],
|
|
121
|
+
},
|
|
122
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
123
|
+
},
|
|
124
|
+
"discuss-milestone": {
|
|
125
|
+
skills: { mode: "all" },
|
|
126
|
+
knowledge: "full",
|
|
127
|
+
memory: "prompt-relevant",
|
|
128
|
+
codebaseMap: true,
|
|
129
|
+
preferences: "active-only",
|
|
130
|
+
artifacts: {
|
|
131
|
+
inline: ["project", "requirements", "decisions", "milestone-context", "templates"],
|
|
132
|
+
excerpt: [],
|
|
133
|
+
onDemand: [],
|
|
134
|
+
},
|
|
135
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
136
|
+
},
|
|
137
|
+
"validate-milestone": {
|
|
138
|
+
skills: { mode: "all" },
|
|
139
|
+
knowledge: "scoped",
|
|
140
|
+
memory: "prompt-relevant",
|
|
141
|
+
codebaseMap: false,
|
|
142
|
+
preferences: "active-only",
|
|
143
|
+
artifacts: {
|
|
144
|
+
inline: ["roadmap", "slice-summary", "slice-uat", "requirements", "decisions", "templates"],
|
|
145
|
+
excerpt: [],
|
|
146
|
+
onDemand: [],
|
|
147
|
+
},
|
|
148
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
149
|
+
},
|
|
150
|
+
"complete-milestone": {
|
|
151
|
+
skills: { mode: "all" },
|
|
152
|
+
knowledge: "scoped",
|
|
153
|
+
memory: "prompt-relevant",
|
|
154
|
+
codebaseMap: false,
|
|
155
|
+
preferences: "active-only",
|
|
156
|
+
artifacts: {
|
|
157
|
+
// #4780 landed slice-summary as excerpt for this unit; phase 2 of
|
|
158
|
+
// the architecture will read this manifest as the source of truth
|
|
159
|
+
// and retire the special-case wiring in auto-prompts.ts.
|
|
160
|
+
inline: ["roadmap", "milestone-context", "requirements", "decisions", "project", "templates"],
|
|
161
|
+
excerpt: ["slice-summary"],
|
|
162
|
+
onDemand: ["slice-summary"],
|
|
163
|
+
},
|
|
164
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
165
|
+
},
|
|
166
|
+
// ─── Slice-scoped ────────────────────────────────────────────────────
|
|
167
|
+
"research-slice": {
|
|
168
|
+
skills: { mode: "all" },
|
|
169
|
+
knowledge: "full",
|
|
170
|
+
memory: "prompt-relevant",
|
|
171
|
+
codebaseMap: true,
|
|
172
|
+
preferences: "active-only",
|
|
173
|
+
artifacts: {
|
|
174
|
+
inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
|
|
175
|
+
excerpt: [],
|
|
176
|
+
onDemand: [],
|
|
177
|
+
},
|
|
178
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
179
|
+
},
|
|
180
|
+
"plan-slice": {
|
|
181
|
+
skills: { mode: "all" },
|
|
182
|
+
knowledge: "full",
|
|
183
|
+
memory: "prompt-relevant",
|
|
184
|
+
codebaseMap: true,
|
|
185
|
+
preferences: "active-only",
|
|
186
|
+
artifacts: {
|
|
187
|
+
inline: ["roadmap", "slice-research", "dependency-summaries", "requirements", "decisions", "templates"],
|
|
188
|
+
excerpt: [],
|
|
189
|
+
onDemand: [],
|
|
190
|
+
},
|
|
191
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
192
|
+
},
|
|
193
|
+
"refine-slice": {
|
|
194
|
+
skills: { mode: "all" },
|
|
195
|
+
knowledge: "scoped",
|
|
196
|
+
memory: "prompt-relevant",
|
|
197
|
+
codebaseMap: true,
|
|
198
|
+
preferences: "active-only",
|
|
199
|
+
artifacts: {
|
|
200
|
+
inline: ["slice-plan", "slice-research", "dependency-summaries", "templates"],
|
|
201
|
+
excerpt: [],
|
|
202
|
+
onDemand: [],
|
|
203
|
+
},
|
|
204
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
205
|
+
},
|
|
206
|
+
"replan-slice": {
|
|
207
|
+
skills: { mode: "all" },
|
|
208
|
+
knowledge: "scoped",
|
|
209
|
+
memory: "prompt-relevant",
|
|
210
|
+
codebaseMap: true,
|
|
211
|
+
preferences: "active-only",
|
|
212
|
+
artifacts: {
|
|
213
|
+
inline: ["slice-plan", "slice-research", "dependency-summaries", "prior-task-summaries", "templates"],
|
|
214
|
+
excerpt: [],
|
|
215
|
+
onDemand: [],
|
|
216
|
+
},
|
|
217
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
218
|
+
},
|
|
219
|
+
"complete-slice": {
|
|
220
|
+
skills: { mode: "all" },
|
|
221
|
+
knowledge: "scoped",
|
|
222
|
+
memory: "prompt-relevant",
|
|
223
|
+
codebaseMap: false,
|
|
224
|
+
preferences: "active-only",
|
|
225
|
+
artifacts: {
|
|
226
|
+
// Phase 3 migration (#4782): matches today's actual
|
|
227
|
+
// buildCompleteSlicePrompt inlining order. Overrides prepend +
|
|
228
|
+
// knowledge splice stay in the builder imperatively (see RFC
|
|
229
|
+
// #4924 — computed/prepend blocks are phase-4 composer work).
|
|
230
|
+
inline: ["roadmap", "slice-context", "slice-plan", "requirements", "prior-task-summaries", "templates"],
|
|
231
|
+
excerpt: [],
|
|
232
|
+
onDemand: [],
|
|
233
|
+
},
|
|
234
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
235
|
+
},
|
|
236
|
+
"reassess-roadmap": {
|
|
237
|
+
skills: { mode: "all" },
|
|
238
|
+
knowledge: "scoped",
|
|
239
|
+
memory: "critical-only",
|
|
240
|
+
codebaseMap: false,
|
|
241
|
+
preferences: "none",
|
|
242
|
+
artifacts: {
|
|
243
|
+
// Phase 2 pilot (#4782): manifest now matches today's actual
|
|
244
|
+
// buildReassessRoadmapPrompt behavior for equivalence. Phase 3
|
|
245
|
+
// will tighten this list once the composer reports real telemetry.
|
|
246
|
+
inline: ["roadmap", "slice-context", "slice-summary", "project", "requirements", "decisions"],
|
|
247
|
+
excerpt: [],
|
|
248
|
+
onDemand: [],
|
|
249
|
+
},
|
|
250
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
251
|
+
},
|
|
252
|
+
// ─── Task-scoped ─────────────────────────────────────────────────────
|
|
253
|
+
"execute-task": {
|
|
254
|
+
skills: { mode: "all" },
|
|
255
|
+
knowledge: "scoped",
|
|
256
|
+
memory: "prompt-relevant",
|
|
257
|
+
codebaseMap: true,
|
|
258
|
+
preferences: "active-only",
|
|
259
|
+
artifacts: {
|
|
260
|
+
inline: ["task-plan", "slice-plan", "prior-task-summaries", "templates"],
|
|
261
|
+
excerpt: [],
|
|
262
|
+
onDemand: ["slice-research"],
|
|
263
|
+
},
|
|
264
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
265
|
+
},
|
|
266
|
+
"reactive-execute": {
|
|
267
|
+
skills: { mode: "all" },
|
|
268
|
+
knowledge: "scoped",
|
|
269
|
+
memory: "prompt-relevant",
|
|
270
|
+
codebaseMap: true,
|
|
271
|
+
preferences: "active-only",
|
|
272
|
+
artifacts: {
|
|
273
|
+
inline: ["slice-plan", "prior-task-summaries", "templates"],
|
|
274
|
+
excerpt: [],
|
|
275
|
+
onDemand: ["slice-research"],
|
|
276
|
+
},
|
|
277
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
278
|
+
},
|
|
279
|
+
// ─── Ancillary units ─────────────────────────────────────────────────
|
|
280
|
+
"run-uat": {
|
|
281
|
+
skills: { mode: "all" },
|
|
282
|
+
knowledge: "critical-only",
|
|
283
|
+
memory: "critical-only",
|
|
284
|
+
codebaseMap: false,
|
|
285
|
+
preferences: "active-only",
|
|
286
|
+
artifacts: {
|
|
287
|
+
// Phase 3 migration (#4782): manifest matches today's actual
|
|
288
|
+
// buildRunUatPrompt inlining. Prior phase-1 entry listed
|
|
289
|
+
// `slice-plan` aspirationally — the real builder inlines the UAT
|
|
290
|
+
// file, the slice SUMMARY (optional), and the project row.
|
|
291
|
+
inline: ["slice-uat", "slice-summary", "project"],
|
|
292
|
+
excerpt: [],
|
|
293
|
+
onDemand: [],
|
|
294
|
+
},
|
|
295
|
+
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
296
|
+
},
|
|
297
|
+
"gate-evaluate": {
|
|
298
|
+
skills: { mode: "all" },
|
|
299
|
+
knowledge: "critical-only",
|
|
300
|
+
memory: "critical-only",
|
|
301
|
+
codebaseMap: false,
|
|
302
|
+
preferences: "active-only",
|
|
303
|
+
artifacts: {
|
|
304
|
+
inline: ["slice-plan", "prior-task-summaries"],
|
|
305
|
+
excerpt: [],
|
|
306
|
+
onDemand: [],
|
|
307
|
+
},
|
|
308
|
+
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
309
|
+
},
|
|
310
|
+
"rewrite-docs": {
|
|
311
|
+
skills: { mode: "all" },
|
|
312
|
+
knowledge: "scoped",
|
|
313
|
+
memory: "prompt-relevant",
|
|
314
|
+
codebaseMap: true,
|
|
315
|
+
preferences: "active-only",
|
|
316
|
+
artifacts: {
|
|
317
|
+
inline: ["project", "requirements", "decisions", "templates"],
|
|
318
|
+
excerpt: [],
|
|
319
|
+
onDemand: [],
|
|
320
|
+
},
|
|
321
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
// ─── Lookup helper ────────────────────────────────────────────────────────
|
|
325
|
+
/**
|
|
326
|
+
* Return the manifest for a unit type, or null when the type is unknown.
|
|
327
|
+
*
|
|
328
|
+
* Callers MUST treat null as "fall through to today's default behavior"
|
|
329
|
+
* rather than erroring — unknown unit types may be experimental and
|
|
330
|
+
* should not crash the composer.
|
|
331
|
+
*/
|
|
332
|
+
export function resolveManifest(unitType) {
|
|
333
|
+
return UNIT_MANIFESTS[unitType] ?? null;
|
|
334
|
+
}
|
|
@@ -20,6 +20,7 @@ import { join, resolve, sep } from "node:path";
|
|
|
20
20
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
21
21
|
import { logWarning } from "./workflow-logger.js";
|
|
22
22
|
import { nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
|
|
23
|
+
import { emitCanonicalRootRedirect } from "./worktree-telemetry.js";
|
|
23
24
|
// ─── Path Helpers ──────────────────────────────────────────────────────────
|
|
24
25
|
function normalizePathForComparison(path) {
|
|
25
26
|
const normalized = path
|
|
@@ -84,6 +85,56 @@ export function isInsideWorktreesDir(basePath, targetPath) {
|
|
|
84
85
|
// not merely be a prefix match (e.g. ".gsd/worktrees-extra" must not match).
|
|
85
86
|
return resolved === wtDir || resolved.startsWith(wtDir + sep);
|
|
86
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Return the canonical path from which a milestone's artifacts should be read.
|
|
90
|
+
*
|
|
91
|
+
* If a live git worktree exists for this milestone at `.gsd/worktrees/<MID>/`
|
|
92
|
+
* (directory present AND a `.git` file indicating a registered worktree),
|
|
93
|
+
* returns that worktree path. Otherwise returns `basePath` unchanged.
|
|
94
|
+
*
|
|
95
|
+
* Readers that cross the session/worktree boundary (validators, the bootstrap
|
|
96
|
+
* audit, cross-session state queries) should route through this helper so they
|
|
97
|
+
* don't silently read stale project-root state while live work sits in the
|
|
98
|
+
* worktree. Writers and tools whose contract is "operate on the path I was
|
|
99
|
+
* given" should NOT use this helper — they preserve the legacy behavior.
|
|
100
|
+
*
|
|
101
|
+
* A stale worktree directory (no `.git` file) is treated as absent. The
|
|
102
|
+
* createWorktree() path already cleans these up, but readers must not trust
|
|
103
|
+
* them in the window before cleanup runs.
|
|
104
|
+
*
|
|
105
|
+
* Fixes #4761. Used by the #4762 audit for the pre-completion orphan case.
|
|
106
|
+
*/
|
|
107
|
+
export function resolveCanonicalMilestoneRoot(basePath, milestoneId) {
|
|
108
|
+
if (!milestoneId || /[\/\\]|\.\./.test(milestoneId))
|
|
109
|
+
return basePath;
|
|
110
|
+
const wtPath = worktreePath(basePath, milestoneId);
|
|
111
|
+
if (!existsSync(wtPath))
|
|
112
|
+
return basePath;
|
|
113
|
+
// A registered git worktree has a .git *file* (not directory) containing
|
|
114
|
+
// "gitdir: <path>". A standalone .git directory indicates a copied repo
|
|
115
|
+
// or nested standalone repo — not a worktree registered with this project —
|
|
116
|
+
// and must not be treated as the canonical root.
|
|
117
|
+
const gitPath = join(wtPath, ".git");
|
|
118
|
+
if (!existsSync(gitPath))
|
|
119
|
+
return basePath;
|
|
120
|
+
try {
|
|
121
|
+
const stat = lstatSync(gitPath);
|
|
122
|
+
if (!stat.isFile())
|
|
123
|
+
return basePath;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return basePath;
|
|
127
|
+
}
|
|
128
|
+
// #4764 — record the redirect so we can measure how often the #4761 fix
|
|
129
|
+
// would have mattered. Best-effort; emit is silent on any failure.
|
|
130
|
+
try {
|
|
131
|
+
emitCanonicalRootRedirect(basePath, milestoneId, wtPath);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
logWarning("worktree", `canonical-root-redirect telemetry failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
135
|
+
}
|
|
136
|
+
return wtPath;
|
|
137
|
+
}
|
|
87
138
|
// ─── Core Operations ───────────────────────────────────────────────────────
|
|
88
139
|
/**
|
|
89
140
|
* Create a new git worktree under .gsd/worktrees/<name>/ with branch worktree/<name>.
|
|
@@ -17,6 +17,9 @@ import { randomUUID } from "node:crypto";
|
|
|
17
17
|
import { join } from "node:path";
|
|
18
18
|
import { debugLog } from "./debug-logger.js";
|
|
19
19
|
import { emitJournalEvent } from "./journal.js";
|
|
20
|
+
import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
|
|
21
|
+
import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
|
|
22
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
20
23
|
// ─── Path Helpers ──────────────────────────────────────────────────────────
|
|
21
24
|
/**
|
|
22
25
|
* Worktree marker segment — present in any path produced by worktreePath().
|
|
@@ -194,6 +197,20 @@ export class WorktreeResolver {
|
|
|
194
197
|
eventType: "worktree-enter",
|
|
195
198
|
data: { milestoneId, wtPath, created: !existingPath },
|
|
196
199
|
});
|
|
200
|
+
// #4764 — record creation/enter as a lifecycle event so the telemetry
|
|
201
|
+
// aggregator can pair it with the eventual worktree-merged event.
|
|
202
|
+
try {
|
|
203
|
+
emitWorktreeCreated(this.s.originalBasePath || this.s.basePath, milestoneId, {
|
|
204
|
+
reason: existingPath ? "enter-milestone" : "create-milestone",
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch (telemetryErr) {
|
|
208
|
+
debugLog("WorktreeResolver", {
|
|
209
|
+
action: "enterMilestone",
|
|
210
|
+
phase: "telemetry-emit",
|
|
211
|
+
error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
197
214
|
ctx.notify(`Entered worktree for ${milestoneId} at ${wtPath}`, "info");
|
|
198
215
|
}
|
|
199
216
|
catch (err) {
|
|
@@ -289,6 +306,9 @@ export class WorktreeResolver {
|
|
|
289
306
|
*/
|
|
290
307
|
mergeAndExit(milestoneId, ctx) {
|
|
291
308
|
this.validateMilestoneId(milestoneId);
|
|
309
|
+
// #4764 — telemetry: record start timestamp so we can emit merge duration.
|
|
310
|
+
const mergeStartedAt = new Date().toISOString();
|
|
311
|
+
const mergeStartMs = Date.now();
|
|
292
312
|
// If worktree creation failed earlier, skip merge — work is on current branch (#2483)
|
|
293
313
|
if (this.s.isolationDegraded) {
|
|
294
314
|
debugLog("WorktreeResolver", {
|
|
@@ -328,14 +348,68 @@ export class WorktreeResolver {
|
|
|
328
348
|
});
|
|
329
349
|
return;
|
|
330
350
|
}
|
|
351
|
+
let actuallyMerged = false;
|
|
331
352
|
if (mode === "worktree" || inWorktree) {
|
|
332
|
-
this._mergeWorktreeMode(milestoneId, ctx);
|
|
353
|
+
actuallyMerged = this._mergeWorktreeMode(milestoneId, ctx);
|
|
333
354
|
}
|
|
334
355
|
else if (mode === "branch") {
|
|
335
|
-
this._mergeBranchMode(milestoneId, ctx);
|
|
356
|
+
actuallyMerged = this._mergeBranchMode(milestoneId, ctx);
|
|
357
|
+
}
|
|
358
|
+
// The remainder of this function emits telemetry and runs re-squash.
|
|
359
|
+
// Both are gated on actuallyMerged — if the _merge* helper took a
|
|
360
|
+
// no-merge path (missing originalBase, no roadmap, wrong branch) the
|
|
361
|
+
// milestone branch was intentionally left unmerged and we must not
|
|
362
|
+
// emit a worktree-merged event or collapse commits on main.
|
|
363
|
+
if (!actuallyMerged) {
|
|
364
|
+
// Always clear the start-SHA tracker to avoid leaking across sessions.
|
|
365
|
+
this.s.milestoneStartShas.delete(milestoneId);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
// #4765 — when collapse_cadence=slice AND milestone_resquash=true, the
|
|
369
|
+
// N per-slice commits on main should be collapsed into one milestone
|
|
370
|
+
// commit. Done AFTER the primary merge-and-teardown so the branch and
|
|
371
|
+
// worktree are already cleaned up; we operate on main directly.
|
|
372
|
+
try {
|
|
373
|
+
const startSha = this.s.milestoneStartShas.get(milestoneId);
|
|
374
|
+
if (startSha) {
|
|
375
|
+
const prefs = loadEffectiveGSDPreferences(this.s.originalBasePath || this.s.basePath)?.preferences;
|
|
376
|
+
if (getCollapseCadence(prefs) === "slice" && getMilestoneResquash(prefs)) {
|
|
377
|
+
const result = resquashMilestoneOnMain(this.s.originalBasePath || this.s.basePath, milestoneId, startSha);
|
|
378
|
+
if (result.resquashed) {
|
|
379
|
+
ctx.notify(`slice-cadence: re-squashed slice commits for ${milestoneId} into a single milestone commit.`, "info");
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
this.s.milestoneStartShas.delete(milestoneId);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
debugLog("WorktreeResolver", {
|
|
387
|
+
action: "mergeAndExit",
|
|
388
|
+
milestoneId,
|
|
389
|
+
phase: "resquash",
|
|
390
|
+
error: err instanceof Error ? err.message : String(err),
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
// #4764 — record merge completion. Only reaches here when an actual
|
|
394
|
+
// merge ran; failure paths throw out of _merge* before this point and
|
|
395
|
+
// no-merge paths returned above.
|
|
396
|
+
try {
|
|
397
|
+
emitWorktreeMerged(this.s.originalBasePath || this.s.basePath, milestoneId, {
|
|
398
|
+
reason: "milestone-complete",
|
|
399
|
+
startedAt: mergeStartedAt,
|
|
400
|
+
durationMs: Date.now() - mergeStartMs,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
catch (telemetryErr) {
|
|
404
|
+
debugLog("WorktreeResolver", {
|
|
405
|
+
action: "mergeAndExit",
|
|
406
|
+
phase: "telemetry-emit",
|
|
407
|
+
error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
|
|
408
|
+
});
|
|
336
409
|
}
|
|
337
410
|
}
|
|
338
|
-
/** Worktree-mode merge: read roadmap, merge, teardown, reset paths.
|
|
411
|
+
/** Worktree-mode merge: read roadmap, merge, teardown, reset paths.
|
|
412
|
+
* Returns true when a squash-merge actually ran (false on skip paths). */
|
|
339
413
|
_mergeWorktreeMode(milestoneId, ctx) {
|
|
340
414
|
const originalBase = this.s.originalBasePath;
|
|
341
415
|
if (!originalBase) {
|
|
@@ -346,8 +420,9 @@ export class WorktreeResolver {
|
|
|
346
420
|
skipped: true,
|
|
347
421
|
reason: "missing-original-base",
|
|
348
422
|
});
|
|
349
|
-
return;
|
|
423
|
+
return false;
|
|
350
424
|
}
|
|
425
|
+
let merged = false;
|
|
351
426
|
try {
|
|
352
427
|
const { synced } = this.deps.syncWorktreeStateBack(originalBase, this.s.basePath, milestoneId);
|
|
353
428
|
if (synced.length > 0) {
|
|
@@ -378,6 +453,7 @@ export class WorktreeResolver {
|
|
|
378
453
|
if (roadmapPath) {
|
|
379
454
|
const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
|
|
380
455
|
const mergeResult = this.deps.mergeMilestoneToMain(originalBase, milestoneId, roadmapContent);
|
|
456
|
+
merged = true;
|
|
381
457
|
// #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
|
|
382
458
|
// cleanup internally (step 12), but it can silently fail on Windows
|
|
383
459
|
// or when the worktree directory is locked. Perform a secondary
|
|
@@ -470,8 +546,10 @@ export class WorktreeResolver {
|
|
|
470
546
|
result: "done",
|
|
471
547
|
basePath: this.s.basePath,
|
|
472
548
|
});
|
|
549
|
+
return merged;
|
|
473
550
|
}
|
|
474
|
-
/** Branch-mode merge: check current branch, merge if on milestone branch.
|
|
551
|
+
/** Branch-mode merge: check current branch, merge if on milestone branch.
|
|
552
|
+
* Returns true when a merge actually ran (false on skip paths). */
|
|
475
553
|
_mergeBranchMode(milestoneId, ctx) {
|
|
476
554
|
try {
|
|
477
555
|
const currentBranch = this.deps.getCurrentBranch(this.s.basePath);
|
|
@@ -486,7 +564,7 @@ export class WorktreeResolver {
|
|
|
486
564
|
currentBranch,
|
|
487
565
|
milestoneBranch,
|
|
488
566
|
});
|
|
489
|
-
return;
|
|
567
|
+
return false;
|
|
490
568
|
}
|
|
491
569
|
const roadmapPath = this.deps.resolveMilestoneFile(this.s.basePath, milestoneId, "ROADMAP");
|
|
492
570
|
if (!roadmapPath) {
|
|
@@ -497,7 +575,7 @@ export class WorktreeResolver {
|
|
|
497
575
|
skipped: true,
|
|
498
576
|
reason: "no-roadmap",
|
|
499
577
|
});
|
|
500
|
-
return;
|
|
578
|
+
return false;
|
|
501
579
|
}
|
|
502
580
|
const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
|
|
503
581
|
const mergeResult = this.deps.mergeMilestoneToMain(this.s.basePath, milestoneId, roadmapContent);
|
|
@@ -516,6 +594,7 @@ export class WorktreeResolver {
|
|
|
516
594
|
mode: "branch",
|
|
517
595
|
result: "success",
|
|
518
596
|
});
|
|
597
|
+
return true;
|
|
519
598
|
}
|
|
520
599
|
catch (err) {
|
|
521
600
|
const msg = err instanceof Error ? err.message : String(err);
|