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
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import { describe, it } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { join, dirname } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
|
|
7
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const gsdDir = join(__dirname, "..");
|
|
9
3
|
|
|
10
4
|
/**
|
|
11
5
|
* Regression tests for #2826: hook/* completed-unit keys were parsed
|
|
@@ -15,17 +9,13 @@ const gsdDir = join(__dirname, "..");
|
|
|
15
9
|
* The root cause: `key.indexOf("/")` splits "hook/telegram-progress/M007/S01"
|
|
16
10
|
* into unitType="hook" + unitId="telegram-progress/M007/S01" instead of
|
|
17
11
|
* unitType="hook/telegram-progress" + unitId="M007/S01".
|
|
12
|
+
*
|
|
13
|
+
* These tests exercise the real `splitCompletedKey` helper — the previous
|
|
14
|
+
* source-grep "does not use indexOf" blocks were dropped under #4825 as
|
|
15
|
+
* they over-specified implementation shape.
|
|
18
16
|
*/
|
|
19
17
|
|
|
20
18
|
describe("splitCompletedKey (#2826)", () => {
|
|
21
|
-
it("is exported from forensics.ts", () => {
|
|
22
|
-
const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
23
|
-
assert.ok(
|
|
24
|
-
source.includes("export function splitCompletedKey"),
|
|
25
|
-
"forensics.ts must export splitCompletedKey helper",
|
|
26
|
-
);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
19
|
it("splits simple unit types correctly", async () => {
|
|
30
20
|
const { splitCompletedKey } = await import("../forensics.ts");
|
|
31
21
|
const result = splitCompletedKey("execute-task/M007/S01/T01");
|
|
@@ -64,44 +54,3 @@ describe("splitCompletedKey (#2826)", () => {
|
|
|
64
54
|
assert.strictEqual(splitCompletedKey("hook/someName"), null);
|
|
65
55
|
});
|
|
66
56
|
});
|
|
67
|
-
|
|
68
|
-
describe("forensics detectMissingArtifacts uses splitCompletedKey (#2826)", () => {
|
|
69
|
-
it("does not use indexOf for key splitting", () => {
|
|
70
|
-
const source = readFileSync(join(gsdDir, "forensics.ts"), "utf-8");
|
|
71
|
-
// Extract only the detectMissingArtifacts function body
|
|
72
|
-
const fnStart = source.indexOf("function detectMissingArtifacts");
|
|
73
|
-
assert.ok(fnStart !== -1, "detectMissingArtifacts must exist");
|
|
74
|
-
const fnBody = source.slice(fnStart, source.indexOf("\n}\n", fnStart) + 3);
|
|
75
|
-
|
|
76
|
-
assert.ok(
|
|
77
|
-
!fnBody.includes('key.indexOf("/")'),
|
|
78
|
-
"detectMissingArtifacts must not use key.indexOf('/') — use splitCompletedKey instead",
|
|
79
|
-
);
|
|
80
|
-
assert.ok(
|
|
81
|
-
fnBody.includes("splitCompletedKey"),
|
|
82
|
-
"detectMissingArtifacts must use splitCompletedKey helper",
|
|
83
|
-
);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
describe("doctor-runtime-checks uses splitCompletedKey (#2826)", () => {
|
|
88
|
-
it("does not use indexOf for key splitting in orphaned-key check", () => {
|
|
89
|
-
const source = readFileSync(
|
|
90
|
-
join(gsdDir, "doctor-runtime-checks.ts"),
|
|
91
|
-
"utf-8",
|
|
92
|
-
);
|
|
93
|
-
// Find the orphaned completed-units section
|
|
94
|
-
const sectionStart = source.indexOf("Orphaned completed-units");
|
|
95
|
-
assert.ok(sectionStart !== -1, "orphaned completed-units section must exist");
|
|
96
|
-
const sectionBody = source.slice(sectionStart, source.indexOf("} catch", sectionStart));
|
|
97
|
-
|
|
98
|
-
assert.ok(
|
|
99
|
-
!sectionBody.includes('key.indexOf("/")'),
|
|
100
|
-
"doctor orphaned-key check must not use key.indexOf('/') — use splitCompletedKey instead",
|
|
101
|
-
);
|
|
102
|
-
assert.ok(
|
|
103
|
-
sectionBody.includes("splitCompletedKey"),
|
|
104
|
-
"doctor orphaned-key check must use splitCompletedKey helper",
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
});
|
package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts
CHANGED
|
@@ -21,10 +21,9 @@ import {
|
|
|
21
21
|
realpathSync,
|
|
22
22
|
readFileSync,
|
|
23
23
|
} from "node:fs";
|
|
24
|
-
import { join
|
|
24
|
+
import { join } from "node:path";
|
|
25
25
|
import { tmpdir } from "node:os";
|
|
26
26
|
import { execSync } from "node:child_process";
|
|
27
|
-
import { fileURLToPath } from "node:url";
|
|
28
27
|
|
|
29
28
|
import {
|
|
30
29
|
createAutoWorktree,
|
|
@@ -33,8 +32,6 @@ import {
|
|
|
33
32
|
mergeMilestoneToMain,
|
|
34
33
|
} from "../../auto-worktree.ts";
|
|
35
34
|
|
|
36
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
37
|
-
|
|
38
35
|
function run(command: string, cwd: string): string {
|
|
39
36
|
return execSync(command, {
|
|
40
37
|
cwd,
|
|
@@ -75,58 +72,12 @@ function createMilestoneArtifacts(dir: string, mid: string): void {
|
|
|
75
72
|
writeFileSync(join(msDir, `${mid}-ROADMAP.md`), roadmap);
|
|
76
73
|
}
|
|
77
74
|
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"utf-8",
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
// Find the "incomplete.length === 0" block
|
|
88
|
-
const incompleteIdx = loopSrc.indexOf("incomplete.length === 0");
|
|
89
|
-
assert.ok(
|
|
90
|
-
incompleteIdx > -1,
|
|
91
|
-
"auto/phases.ts should have 'incomplete.length === 0' check",
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
// The merge call must appear BETWEEN the incomplete check and the stopAuto call.
|
|
95
|
-
const blockAfterIncomplete = loopSrc.slice(
|
|
96
|
-
incompleteIdx,
|
|
97
|
-
incompleteIdx + 3000,
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
assert.ok(
|
|
101
|
-
blockAfterIncomplete.includes("deps.resolver.mergeAndExit"),
|
|
102
|
-
"auto/phases.ts should call resolver.mergeAndExit in the 'all milestones complete' path",
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
// The merge should come before stopAuto in this block
|
|
106
|
-
const mergePos = blockAfterIncomplete.indexOf("deps.resolver.mergeAndExit");
|
|
107
|
-
const stopPos = blockAfterIncomplete.indexOf("stopAuto");
|
|
108
|
-
assert.ok(
|
|
109
|
-
mergePos < stopPos,
|
|
110
|
-
"resolver.mergeAndExit should be called before stopAuto in the 'all complete' path",
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
const helperIdx = resolverSrc.indexOf("mergeAndExit(milestoneId");
|
|
114
|
-
assert.ok(
|
|
115
|
-
helperIdx > -1,
|
|
116
|
-
"WorktreeResolver.mergeAndExit helper should exist",
|
|
117
|
-
);
|
|
118
|
-
const helperBlock = resolverSrc.slice(helperIdx, helperIdx + 2600);
|
|
119
|
-
assert.ok(
|
|
120
|
-
helperBlock.includes('mode === "worktree"') ||
|
|
121
|
-
helperBlock.includes('mode: "worktree"'),
|
|
122
|
-
"WorktreeResolver.mergeAndExit should handle worktree mode",
|
|
123
|
-
);
|
|
124
|
-
assert.ok(
|
|
125
|
-
helperBlock.includes('mode === "branch"') ||
|
|
126
|
-
helperBlock.includes('mode: "branch"'),
|
|
127
|
-
"WorktreeResolver.mergeAndExit should handle branch mode",
|
|
128
|
-
);
|
|
129
|
-
});
|
|
75
|
+
// Note: the prior phases.ts / worktree-resolver.ts source-grep block was
|
|
76
|
+
// removed under #4825 — it asserted `deps.resolver.mergeAndExit` appears
|
|
77
|
+
// before `stopAuto` via indexOf positions in the source text, which broke
|
|
78
|
+
// on any helper refactor without catching a real regression. The two
|
|
79
|
+
// integration tests below exercise the merge-before-stop behaviour end
|
|
80
|
+
// to end through real git worktrees.
|
|
130
81
|
|
|
131
82
|
// ─── Integration: single milestone completes → merged to main ────────────────
|
|
132
83
|
|
|
@@ -161,11 +161,27 @@ describe('doctor-proactive', async () => {
|
|
|
161
161
|
});
|
|
162
162
|
|
|
163
163
|
test('escalation: no double escalation', () => {
|
|
164
|
-
//
|
|
164
|
+
// Self-contained: drive the escalated state from scratch in this test.
|
|
165
|
+
// Previously this relied on module-singleton state left over from the
|
|
166
|
+
// preceding 'escalation: at threshold' test, which silently broke under
|
|
167
|
+
// filtered/parallel/reordered runs (the fallback `shouldEscalate: false`
|
|
168
|
+
// path was satisfied by the wrong reason — see #4828).
|
|
169
|
+
resetProactiveHealing();
|
|
170
|
+
for (let i = 0; i < 5; i++) {
|
|
171
|
+
recordHealthSnapshot(0, 0, 0); // older clean snapshots
|
|
172
|
+
}
|
|
173
|
+
for (let i = 0; i < 5; i++) {
|
|
174
|
+
recordHealthSnapshot(2, 1, 0); // recent error snapshots → degrading trend
|
|
175
|
+
}
|
|
176
|
+
// First check: trigger escalation.
|
|
177
|
+
const first = checkHealEscalation(2, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
|
|
178
|
+
assert.deepStrictEqual(first.shouldEscalate, true, "precondition: first call escalates");
|
|
179
|
+
|
|
180
|
+
// Second check: same session, must NOT double-escalate.
|
|
165
181
|
recordHealthSnapshot(2, 0, 0);
|
|
166
182
|
const result = checkHealEscalation(2, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
|
|
167
183
|
assert.deepStrictEqual(result.shouldEscalate, false, "no double escalation in same session");
|
|
168
|
-
assert.ok(result.reason.includes("already escalated"),
|
|
184
|
+
assert.ok(result.reason.includes("already escalated"), `reason must explain no-re-escalation (got: ${result.reason})`);
|
|
169
185
|
});
|
|
170
186
|
|
|
171
187
|
test('escalation: deferred when improving', () => {
|
package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts
CHANGED
|
@@ -140,12 +140,18 @@ for (let i = 1; i <= COMPLETED_COUNT; i++) {
|
|
|
140
140
|
|
|
141
141
|
// ─── Test: the overall context should be reasonable in size ──────────────
|
|
142
142
|
|
|
143
|
-
//
|
|
144
|
-
//
|
|
143
|
+
// Invariant (not absolute budget): the per-completed-milestone line
|
|
144
|
+
// contribution should stay small and CONSTANT (not proportional to the
|
|
145
|
+
// size of its CONTEXT.md / SUMMARY.md). With 50 lines of fixture text
|
|
146
|
+
// per completed CONTEXT.md, a naive loader would produce >=50 lines per
|
|
147
|
+
// completed milestone (>1250 lines for 25 milestones). The fix emits a
|
|
148
|
+
// short summary section plus separator per completed milestone, which
|
|
149
|
+
// stays well under 10 lines/milestone regardless of CONTEXT.md size.
|
|
145
150
|
const contextLines = context.split("\n").length;
|
|
151
|
+
const avgLinesPerCompletedMilestone = contextLines / COMPLETED_COUNT;
|
|
146
152
|
assertTrue(
|
|
147
|
-
|
|
148
|
-
`
|
|
153
|
+
avgLinesPerCompletedMilestone < 10,
|
|
154
|
+
`Completed milestones should not inflate the context: got ${contextLines} lines across ${COMPLETED_COUNT} completed milestones (~${avgLinesPerCompletedMilestone.toFixed(1)}/milestone)`,
|
|
149
155
|
);
|
|
150
156
|
|
|
151
157
|
// ─── Cleanup ──────────────────────────────────────────────────────────────
|
|
@@ -1155,7 +1155,7 @@ describe("dispatch guard integration", () => {
|
|
|
1155
1155
|
assert.ok(existsSync(validationPath), "VALIDATION file should be written");
|
|
1156
1156
|
const content = readFileSync(validationPath, "utf-8");
|
|
1157
1157
|
assert.ok(content.includes("verdict: pass"), "should contain pass verdict");
|
|
1158
|
-
assert.ok(content.includes("
|
|
1158
|
+
assert.ok(content.includes("`skip_milestone_validation` preference"), "should note it was skipped via the preference path (#4781)");
|
|
1159
1159
|
});
|
|
1160
1160
|
|
|
1161
1161
|
test("rewrite-docs circuit breaker: exceeding MAX attempts resolves all overrides", async () => {
|
|
@@ -8,6 +8,7 @@ import assert from "node:assert/strict";
|
|
|
8
8
|
import { readFileSync } from "node:fs";
|
|
9
9
|
import { join, dirname } from "node:path";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { extractSourceRegion } from "./test-helpers.ts";
|
|
11
12
|
|
|
12
13
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
14
|
|
|
@@ -62,7 +63,7 @@ describe("interactive routing bypass (#3962)", () => {
|
|
|
62
63
|
);
|
|
63
64
|
// The function should check isAutoMode before routing synthesis
|
|
64
65
|
const fnIdx = modelSelectionSrc.indexOf("function resolvePreferredModelConfig");
|
|
65
|
-
const fnBody = modelSelectionSrc
|
|
66
|
+
const fnBody = extractSourceRegion(modelSelectionSrc, "function resolvePreferredModelConfig");
|
|
66
67
|
assert.ok(
|
|
67
68
|
fnBody.includes("isAutoMode"),
|
|
68
69
|
"resolvePreferredModelConfig should accept isAutoMode parameter",
|
|
@@ -137,8 +138,13 @@ describe("model downgrade notifications always visible (#3962)", () => {
|
|
|
137
138
|
const escalatedIdx = modelSelectionSrc.indexOf("if (escalated)");
|
|
138
139
|
assert.ok(escalatedIdx > 0, "escalation block should exist");
|
|
139
140
|
|
|
140
|
-
// Get the block from "if (escalated)" to the next
|
|
141
|
-
|
|
141
|
+
// Get the block from "if (escalated)" to the next distinctive marker
|
|
142
|
+
// (the capability-override loading that immediately follows).
|
|
143
|
+
const block = extractSourceRegion(
|
|
144
|
+
modelSelectionSrc,
|
|
145
|
+
"if (escalated)",
|
|
146
|
+
"// Load user capability overrides",
|
|
147
|
+
);
|
|
142
148
|
assert.ok(
|
|
143
149
|
block.includes("Tier escalation:"),
|
|
144
150
|
"escalation block should contain the notification",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { mkdirSync,
|
|
3
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
@@ -126,11 +126,8 @@ test("guided-flow stale paused-session scenario is suppressed when no resumable
|
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
assert.ok(source.includes('unlinkSync(join(gsdRoot(basePath), "runtime", "paused-session.json"))'));
|
|
135
|
-
assert.ok(source.includes('pendingAutoStartMap.set(basePath,'));
|
|
136
|
-
});
|
|
129
|
+
// Note: the prior source-grep test that scanned guided-flow.ts for five
|
|
130
|
+
// string literals was removed under #4827. The invariants it encoded
|
|
131
|
+
// (step-aware resume + stale paused-session cleanup + pendingAutoStartMap
|
|
132
|
+
// side effect) should be covered by a runtime drive of guided-flow —
|
|
133
|
+
// tracked as a follow-up.
|
|
@@ -15,7 +15,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync, realpathSy
|
|
|
15
15
|
import { join } from 'node:path';
|
|
16
16
|
import { tmpdir } from 'node:os';
|
|
17
17
|
import { GSD_ROOT_FILES, resolveGsdRootFile } from '../paths.ts';
|
|
18
|
-
import { inlineGsdRootFile } from '../auto-prompts.ts';
|
|
18
|
+
import { inlineGsdRootFile, inlineKnowledgeBudgeted } from '../auto-prompts.ts';
|
|
19
19
|
import { appendKnowledge } from '../files.ts';
|
|
20
20
|
import { loadKnowledgeBlock } from '../bootstrap/system-context.ts';
|
|
21
21
|
|
|
@@ -248,3 +248,95 @@ test('loadKnowledgeBlock: reports globalSizeKb above 4KB threshold', () => {
|
|
|
248
248
|
|
|
249
249
|
rmSync(tmp, { recursive: true, force: true });
|
|
250
250
|
});
|
|
251
|
+
|
|
252
|
+
// ─── inlineKnowledgeBudgeted — issue #4719 ─────────────────────────────────
|
|
253
|
+
// Milestone-phase prompts must not inject the full KNOWLEDGE.md. The budgeted
|
|
254
|
+
// helper scopes by milestone-level keywords and caps the injected size.
|
|
255
|
+
|
|
256
|
+
test('inlineKnowledgeBudgeted: returns scoped H3 entries for single-H2 file', async () => {
|
|
257
|
+
const tmp = realpathSync(mkdtempSync(join(tmpdir(), 'gsd-knowledge-')));
|
|
258
|
+
const gsdDir = join(tmp, '.gsd');
|
|
259
|
+
mkdirSync(gsdDir, { recursive: true });
|
|
260
|
+
|
|
261
|
+
const content = `# Project Knowledge
|
|
262
|
+
|
|
263
|
+
## Patterns
|
|
264
|
+
|
|
265
|
+
### Database: prepared statements
|
|
266
|
+
Always use prepared statements with SQLite.
|
|
267
|
+
|
|
268
|
+
### API: versioned paths
|
|
269
|
+
Use /v1/resource style versioning.
|
|
270
|
+
|
|
271
|
+
### Testing: node:test
|
|
272
|
+
Prefer node:test over external frameworks.
|
|
273
|
+
`;
|
|
274
|
+
writeFileSync(join(gsdDir, 'KNOWLEDGE.md'), content);
|
|
275
|
+
|
|
276
|
+
const result = await inlineKnowledgeBudgeted(tmp, ['database']);
|
|
277
|
+
assert.ok(result !== null, 'should return content');
|
|
278
|
+
assert.ok(result!.includes('Database: prepared statements'), 'includes matching H3');
|
|
279
|
+
assert.ok(!result!.includes('API: versioned paths'), 'excludes non-matching H3');
|
|
280
|
+
|
|
281
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test('inlineKnowledgeBudgeted: caps payload below budget for large files', async () => {
|
|
285
|
+
const tmp = realpathSync(mkdtempSync(join(tmpdir(), 'gsd-knowledge-')));
|
|
286
|
+
const gsdDir = join(tmp, '.gsd');
|
|
287
|
+
mkdirSync(gsdDir, { recursive: true });
|
|
288
|
+
|
|
289
|
+
// Build a 200KB KNOWLEDGE with 500 H3 entries all matching 'shared'
|
|
290
|
+
const entries = Array.from({ length: 500 }, (_, i) =>
|
|
291
|
+
`### Entry ${i}: shared topic\n${'filler text '.repeat(30)}\n`,
|
|
292
|
+
).join('\n');
|
|
293
|
+
const content = `# Project Knowledge\n\n## Patterns\n\n${entries}`;
|
|
294
|
+
writeFileSync(join(gsdDir, 'KNOWLEDGE.md'), content);
|
|
295
|
+
|
|
296
|
+
const BUDGET_CHARS = 30_000;
|
|
297
|
+
const result = await inlineKnowledgeBudgeted(tmp, ['shared'], { maxChars: BUDGET_CHARS });
|
|
298
|
+
assert.ok(result !== null, 'should return content');
|
|
299
|
+
// Allow some overhead for header formatting, but must stay close to budget
|
|
300
|
+
assert.ok(
|
|
301
|
+
result!.length <= BUDGET_CHARS + 500,
|
|
302
|
+
`payload ${result!.length} chars should be <= budget ${BUDGET_CHARS} (+overhead)`,
|
|
303
|
+
);
|
|
304
|
+
// Far smaller than the raw file
|
|
305
|
+
assert.ok(
|
|
306
|
+
result!.length < content.length / 4,
|
|
307
|
+
`payload should be much smaller than full content (${content.length} chars)`,
|
|
308
|
+
);
|
|
309
|
+
assert.match(
|
|
310
|
+
result!,
|
|
311
|
+
/\[\.\.\.truncated \d+ chars; rerun with narrower scope if needed\]/,
|
|
312
|
+
'should include truncation note when budget is exceeded',
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
test('inlineKnowledgeBudgeted: returns null when no KNOWLEDGE.md exists', async () => {
|
|
319
|
+
const tmp = realpathSync(mkdtempSync(join(tmpdir(), 'gsd-knowledge-')));
|
|
320
|
+
const gsdDir = join(tmp, '.gsd');
|
|
321
|
+
mkdirSync(gsdDir, { recursive: true });
|
|
322
|
+
|
|
323
|
+
const result = await inlineKnowledgeBudgeted(tmp, ['database']);
|
|
324
|
+
assert.strictEqual(result, null);
|
|
325
|
+
|
|
326
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
test('inlineKnowledgeBudgeted: returns null when no entries match', async () => {
|
|
330
|
+
const tmp = realpathSync(mkdtempSync(join(tmpdir(), 'gsd-knowledge-')));
|
|
331
|
+
const gsdDir = join(tmp, '.gsd');
|
|
332
|
+
mkdirSync(gsdDir, { recursive: true });
|
|
333
|
+
writeFileSync(
|
|
334
|
+
join(gsdDir, 'KNOWLEDGE.md'),
|
|
335
|
+
'# Project Knowledge\n\n## Patterns\n\n### Database\nuse it\n',
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
const result = await inlineKnowledgeBudgeted(tmp, ['nonexistent']);
|
|
339
|
+
assert.strictEqual(result, null);
|
|
340
|
+
|
|
341
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
342
|
+
});
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
3
|
|
|
5
4
|
import {
|
|
6
5
|
_buildMcpChildEnvForTest,
|
|
7
6
|
_buildMcpTrustConfirmOptionsForTest,
|
|
8
7
|
} from "../../mcp-client/index.ts";
|
|
9
8
|
|
|
9
|
+
// Note: four source-grep tests that scanned `mcp-client/index.ts` for
|
|
10
|
+
// Map<> shapes, catch-block structure, and closeAll body were removed
|
|
11
|
+
// under #4827. They encoded implementation shape rather than behaviour —
|
|
12
|
+
// any refactor (extracted helper, different Map key type, rearranged
|
|
13
|
+
// cleanup order) broke the greps without a real regression. Runtime
|
|
14
|
+
// coverage of connectServer/closeAll with a mocked failing transport
|
|
15
|
+
// is tracked as a follow-up.
|
|
16
|
+
|
|
10
17
|
test("MCP stdio child env only includes safe inherited keys plus explicit config env", () => {
|
|
11
18
|
const previousSecret = process.env.SECRET_MCP_TEST_TOKEN;
|
|
12
19
|
const previousPath = process.env.PATH;
|
|
@@ -38,39 +45,3 @@ test("MCP stdio trust confirmation is abort-aware", () => {
|
|
|
38
45
|
assert.equal(options.timeout, 120_000);
|
|
39
46
|
assert.equal(options.signal, controller.signal);
|
|
40
47
|
});
|
|
41
|
-
|
|
42
|
-
test("MCP client uses a single in-flight connection per canonical server", () => {
|
|
43
|
-
const source = readFileSync(new URL("../../mcp-client/index.ts", import.meta.url), "utf8");
|
|
44
|
-
|
|
45
|
-
assert.match(source, /const pendingConnections = new Map<string, Promise<Client>>\(\)/);
|
|
46
|
-
assert.match(source, /const pending = pendingConnections\.get\(config\.name\)/);
|
|
47
|
-
assert.match(source, /pendingConnections\.set\(config\.name, connectionPromise\)/);
|
|
48
|
-
assert.match(source, /pendingConnections\.delete\(config\.name\)/);
|
|
49
|
-
assert.match(source, /env: config\.env \?\? \{\}/);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test("MCP stdio trust is persisted only after a successful connection", () => {
|
|
53
|
-
const source = readFileSync(new URL("../../mcp-client/index.ts", import.meta.url), "utf8");
|
|
54
|
-
const connectIndex = source.indexOf("await client.connect(transport");
|
|
55
|
-
const trustIndex = source.indexOf("trustedStdioServers.add(approvedTrustKey)");
|
|
56
|
-
|
|
57
|
-
assert.ok(connectIndex > -1, "connectServer should await client.connect");
|
|
58
|
-
assert.ok(trustIndex > connectIndex, "trust should be recorded after client.connect succeeds");
|
|
59
|
-
assert.doesNotMatch(source, /assertTrustedStdioServer[\s\S]*trustedStdioServers\.add\(trustKey\)/);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("MCP client closes transports after failed connection attempts", () => {
|
|
63
|
-
const source = readFileSync(new URL("../../mcp-client/index.ts", import.meta.url), "utf8");
|
|
64
|
-
|
|
65
|
-
assert.match(source, /catch \(err\) \{[\s\S]*await transport\.close\(\)/);
|
|
66
|
-
assert.match(source, /catch \(err\) \{[\s\S]*await client\.close\(\)/);
|
|
67
|
-
assert.match(source, /catch \(err\) \{[\s\S]*throw err/);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("MCP client clears process-local trust and closes transports on session cleanup", () => {
|
|
71
|
-
const source = readFileSync(new URL("../../mcp-client/index.ts", import.meta.url), "utf8");
|
|
72
|
-
|
|
73
|
-
assert.match(source, /async function closeAll\(\)[\s\S]*await conn\.transport\.close\(\)/);
|
|
74
|
-
assert.match(source, /async function closeAll\(\)[\s\S]*pendingConnections\.clear\(\)/);
|
|
75
|
-
assert.match(source, /async function closeAll\(\)[\s\S]*trustedStdioServers\.clear\(\)/);
|
|
76
|
-
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseMemoryResponse,
|
|
1
|
+
import { parseMemoryResponse, buildMemoryLLMCall } from '../memory-extractor.ts';
|
|
2
2
|
import {
|
|
3
3
|
openDatabase,
|
|
4
4
|
closeDatabase,
|
|
@@ -159,16 +159,6 @@ test('integration: mixed action lifecycle', () => {
|
|
|
159
159
|
closeDatabase();
|
|
160
160
|
});
|
|
161
161
|
|
|
162
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
163
|
-
// memory-extractor: _resetExtractionState
|
|
164
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
165
|
-
|
|
166
|
-
test('memory-extractor: reset extraction state', () => {
|
|
167
|
-
// Just verify it doesn't throw
|
|
168
|
-
_resetExtractionState();
|
|
169
|
-
assert.ok(true, '_resetExtractionState should not throw');
|
|
170
|
-
});
|
|
171
|
-
|
|
172
162
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
173
163
|
// memory-extractor: buildMemoryLLMCall resolves OAuth API key via modelRegistry
|
|
174
164
|
// Regression test for #2959 — OAuth users had broken memory extraction
|
|
@@ -200,8 +190,8 @@ test('memory-extractor: buildMemoryLLMCall resolves API key from modelRegistry f
|
|
|
200
190
|
assert.ok(llmCallFn !== null, 'buildMemoryLLMCall should return a function when models are available');
|
|
201
191
|
|
|
202
192
|
// The function should have resolved the API key eagerly via modelRegistry.getApiKey.
|
|
203
|
-
//
|
|
204
|
-
await
|
|
193
|
+
// Await the exposed promise deterministically instead of polling via setTimeout.
|
|
194
|
+
await llmCallFn!.apiKeyReady;
|
|
205
195
|
assert.ok(getApiKeyCalled, 'buildMemoryLLMCall must call modelRegistry.getApiKey() to resolve OAuth tokens');
|
|
206
196
|
});
|
|
207
197
|
|
|
@@ -246,8 +236,8 @@ test('memory-extractor: buildMemoryLLMCall prefers haiku model', async () => {
|
|
|
246
236
|
const llmCallFn = buildMemoryLLMCall(ctx);
|
|
247
237
|
assert.ok(llmCallFn !== null, 'should return a function');
|
|
248
238
|
|
|
249
|
-
//
|
|
250
|
-
await
|
|
239
|
+
// Await the exposed API-key-ready promise deterministically.
|
|
240
|
+
await llmCallFn!.apiKeyReady;
|
|
251
241
|
assert.strictEqual(resolvedModelId, 'claude-3-5-haiku-20241022',
|
|
252
242
|
'should resolve API key for haiku model, not sonnet');
|
|
253
243
|
});
|