gsd-pi 2.77.0-dev.c9c8932c6 → 2.77.0-dev.cfd69e714
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/claude-cli-check.js +5 -1
- package/dist/cli-web-branch.d.ts +1 -0
- package/dist/cli-web-branch.js +3 -0
- package/dist/cli.js +24 -2
- package/dist/headless.js +49 -4
- package/dist/provider-migrations.d.ts +18 -0
- package/dist/provider-migrations.js +14 -0
- package/dist/resource-loader.d.ts +40 -0
- package/dist/resource-loader.js +32 -13
- package/dist/resources/extensions/browser-tools/capture.js +9 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +495 -27
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/index.js +3 -2
- package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
- package/dist/resources/extensions/gsd/auto/loop.js +124 -2
- package/dist/resources/extensions/gsd/auto/phases.js +57 -39
- package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
- package/dist/resources/extensions/gsd/auto/session.js +6 -2
- package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +166 -29
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +181 -64
- package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
- package/dist/resources/extensions/gsd/auto-start.js +107 -29
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +180 -34
- package/dist/resources/extensions/gsd/auto.js +80 -21
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
- package/dist/resources/extensions/gsd/component-loader.js +447 -0
- package/dist/resources/extensions/gsd/component-types.js +69 -0
- package/dist/resources/extensions/gsd/context-store.js +23 -7
- package/dist/resources/extensions/gsd/detection.js +49 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/file-lock.js +49 -9
- package/dist/resources/extensions/gsd/forensics.js +106 -0
- package/dist/resources/extensions/gsd/gate-registry.js +2 -2
- package/dist/resources/extensions/gsd/git-constants.js +28 -1
- package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
- package/dist/resources/extensions/gsd/git-service.js +127 -2
- package/dist/resources/extensions/gsd/gitignore.js +1 -0
- package/dist/resources/extensions/gsd/gsd-db.js +6 -3
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow.js +39 -13
- package/dist/resources/extensions/gsd/journal.js +17 -2
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
- package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
- package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +6 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/reports.js +5 -4
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- package/dist/resources/extensions/gsd/session-lock.js +19 -10
- package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
- package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
- package/dist/resources/extensions/gsd/state.js +69 -58
- package/dist/resources/extensions/gsd/sync-lock.js +98 -42
- package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +31 -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 +370 -0
- package/dist/resources/extensions/gsd/uok/audit.js +18 -2
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
- package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
- package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
- package/dist/resources/extensions/gsd/uok/writer.js +82 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
- package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
- package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
- package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
- package/dist/resources/extensions/mcp-client/auth.js +10 -1
- package/dist/resources/extensions/mcp-client/index.js +121 -10
- package/dist/resources/extensions/ollama/index.js +5 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -5
- package/dist/resources/skills/create-skill/SKILL.md +2 -2
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +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 +12 -12
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-1832629448831fdc.js → webpack-2e68521d7c82f7c2.js} +1 -1
- package/package.json +4 -5
- package/packages/daemon/src/logger.ts +4 -3
- package/packages/mcp-server/README.md +3 -3
- package/packages/mcp-server/dist/env-writer.d.ts +1 -0
- package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
- package/packages/mcp-server/dist/env-writer.js +74 -6
- package/packages/mcp-server/dist/env-writer.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +24 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +111 -87
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/env-writer.test.ts +79 -1
- package/packages/mcp-server/src/env-writer.ts +76 -6
- package/packages/mcp-server/src/mcp-server.test.ts +25 -3
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +158 -105
- package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
- package/packages/mcp-server/src/workflow-tools.ts +19 -6
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +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/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +9 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +43 -70
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +36 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- package/packages/pi-ai/src/models/capability-patches.ts +10 -2
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openai.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +46 -73
- package/packages/pi-ai/src/models.test.ts +48 -11
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +21 -16
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
- 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/sdk.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
- 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__/provider-display-name.test.js +15 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.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/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/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/compaction-orchestrator.test.ts +154 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +24 -17
- 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/sdk.test.ts +25 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
- 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__/provider-display-name.test.ts +17 -7
- 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/footer.ts +14 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +14 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +19 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +1 -1
- package/packages/pi-tui/dist/editor-component.d.ts +2 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/packages/pi-tui/dist/editor-component.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +20 -0
- package/packages/pi-tui/dist/stdin-buffer.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 +62 -6
- package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
- package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
- package/packages/pi-tui/src/components/editor.ts +22 -0
- package/packages/pi-tui/src/components/image.test.ts +10 -5
- package/packages/pi-tui/src/editor-component.ts +3 -0
- package/packages/pi-tui/src/stdin-buffer.ts +26 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-client.test.js +101 -51
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
- package/packages/rpc-client/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/readiness.ts +5 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +532 -29
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +941 -91
- package/src/resources/extensions/github-sync/templates.ts +151 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
- package/src/resources/extensions/google-search/index.ts +3 -2
- package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
- package/src/resources/extensions/gsd/auto/loop.ts +142 -2
- package/src/resources/extensions/gsd/auto/phases.ts +62 -38
- package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
- package/src/resources/extensions/gsd/auto/session.ts +7 -2
- package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +176 -29
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +193 -73
- package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
- package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
- package/src/resources/extensions/gsd/auto-start.ts +127 -9
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +190 -31
- package/src/resources/extensions/gsd/auto.ts +95 -23
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
- package/src/resources/extensions/gsd/component-loader.ts +598 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/context-store.ts +25 -8
- package/src/resources/extensions/gsd/detection.ts +58 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/file-lock.ts +84 -11
- package/src/resources/extensions/gsd/forensics.ts +118 -1
- package/src/resources/extensions/gsd/gate-registry.ts +2 -2
- package/src/resources/extensions/gsd/git-constants.ts +30 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
- package/src/resources/extensions/gsd/git-service.ts +150 -2
- package/src/resources/extensions/gsd/gitignore.ts +1 -0
- package/src/resources/extensions/gsd/gsd-db.ts +6 -3
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +57 -14
- package/src/resources/extensions/gsd/journal.ts +38 -3
- package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
- package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +6 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/reports.ts +5 -4
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- package/src/resources/extensions/gsd/session-lock.ts +20 -10
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +76 -66
- package/src/resources/extensions/gsd/sync-lock.ts +97 -39
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -285
- package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
- 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/rewrite-docs-abandon-detect.test.ts +195 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
- package/src/resources/extensions/gsd/types.ts +3 -3
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
- package/src/resources/extensions/gsd/uok/audit.ts +20 -2
- package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
- package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
- package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
- package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
- package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
- package/src/resources/extensions/mcp-client/auth.ts +12 -1
- package/src/resources/extensions/mcp-client/index.ts +132 -11
- 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/src/resources/skills/create-skill/SKILL.md +2 -2
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2826.d445fb428ef41fa1.js +0 -9
- 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/{H51SzzS_EEgdBsDVhrLBv → SvCJDZPQW104bR1KnBQg1}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{H51SzzS_EEgdBsDVhrLBv → SvCJDZPQW104bR1KnBQg1}/_ssgManifest.js +0 -0
|
@@ -59,3 +59,156 @@ export function createTestContext() {
|
|
|
59
59
|
|
|
60
60
|
return { assertEq, assertTrue, assertMatch, assertNoMatch, report };
|
|
61
61
|
}
|
|
62
|
+
|
|
63
|
+
// ─── Source-inspection helpers (DEPRECATED — do not add new callers) ──────────
|
|
64
|
+
//
|
|
65
|
+
// `extractSourceRegion` was introduced in #4773 / #4774 as a more-durable
|
|
66
|
+
// replacement for hand-rolled `src.slice(idx, idx + N)` patterns. Issue
|
|
67
|
+
// #4784 surfaced that the helper is the wrong target: its use case —
|
|
68
|
+
// testing that an identifier or phrase exists in production source text
|
|
69
|
+
// — is the source-grep antipattern that causes false coverage in the
|
|
70
|
+
// first place. Tests should exercise behaviour (call the function,
|
|
71
|
+
// assert on its return value or observable effects) rather than check
|
|
72
|
+
// whether specific identifier strings remain in source.
|
|
73
|
+
//
|
|
74
|
+
// CONTRIBUTING.md forbids new callers of this helper. Existing callers
|
|
75
|
+
// are being migrated one file at a time; the helper is slated for
|
|
76
|
+
// removal once the last caller is converted.
|
|
77
|
+
//
|
|
78
|
+
// Do not add new callers. If you are tempted to, file an issue
|
|
79
|
+
// describing the behavioural invariant you want to test and we will
|
|
80
|
+
// find a runtime assertion instead.
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @deprecated Use a real behaviour test against the function under
|
|
84
|
+
* inspection instead. See #4784 and CONTRIBUTING.md > "Test behaviour,
|
|
85
|
+
* not source shape". No new callers.
|
|
86
|
+
*
|
|
87
|
+
* Extract a region of source between a start anchor and either an explicit
|
|
88
|
+
* end anchor or, if none is given, a set of reasonable structural
|
|
89
|
+
* terminators (next `private `/`export `/`function `/`class `/`interface `/
|
|
90
|
+
* `//` section separator). Falls back to end-of-source if none match.
|
|
91
|
+
*
|
|
92
|
+
* @param src The source text.
|
|
93
|
+
* @param startAnchor Literal substring that marks the start of the region.
|
|
94
|
+
* Typically a function name, a section header comment, or
|
|
95
|
+
* a distinctive statement.
|
|
96
|
+
* @param endAnchor Optional. Either a literal substring that marks the end,
|
|
97
|
+
* or `{ fromIdx: number }` to find the *next* occurrence
|
|
98
|
+
* of `startAnchor` at or after `fromIdx` (useful when the
|
|
99
|
+
* anchor appears multiple times and a positional search
|
|
100
|
+
* is required). When omitted, structural terminators are
|
|
101
|
+
* used.
|
|
102
|
+
*
|
|
103
|
+
* Returns the extracted region (including the start anchor), or an empty
|
|
104
|
+
* string if `startAnchor` is not found.
|
|
105
|
+
*/
|
|
106
|
+
export function extractSourceRegion(
|
|
107
|
+
src: string,
|
|
108
|
+
startAnchor: string,
|
|
109
|
+
endAnchor?: string | { fromIdx: number },
|
|
110
|
+
): string {
|
|
111
|
+
const fromIdx = typeof endAnchor === "object" && endAnchor !== null
|
|
112
|
+
? endAnchor.fromIdx
|
|
113
|
+
: 0;
|
|
114
|
+
const endLiteral = typeof endAnchor === "string" ? endAnchor : undefined;
|
|
115
|
+
|
|
116
|
+
const startIdx = src.indexOf(startAnchor, fromIdx);
|
|
117
|
+
if (startIdx < 0) return "";
|
|
118
|
+
|
|
119
|
+
if (endLiteral) {
|
|
120
|
+
const endIdx = src.indexOf(endLiteral, startIdx + startAnchor.length);
|
|
121
|
+
return endIdx > 0 ? src.slice(startIdx, endIdx) : src.slice(startIdx);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Heuristic terminators — the next sibling declaration/section.
|
|
125
|
+
const terminators = [
|
|
126
|
+
"\n private ",
|
|
127
|
+
"\n public ",
|
|
128
|
+
"\n protected ",
|
|
129
|
+
"\n static ",
|
|
130
|
+
"\nexport function ",
|
|
131
|
+
"\nexport async function ",
|
|
132
|
+
"\nfunction ",
|
|
133
|
+
"\nasync function ",
|
|
134
|
+
"\nexport class ",
|
|
135
|
+
"\nclass ",
|
|
136
|
+
"\nexport interface ",
|
|
137
|
+
"\ninterface ",
|
|
138
|
+
"\n// ─", // section separator comments
|
|
139
|
+
"\n/** ", // next docblock
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
let earliestEnd = -1;
|
|
143
|
+
for (const t of terminators) {
|
|
144
|
+
const idx = src.indexOf(t, startIdx + startAnchor.length);
|
|
145
|
+
if (idx > 0 && (earliestEnd < 0 || idx < earliestEnd)) earliestEnd = idx;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return earliestEnd > 0 ? src.slice(startIdx, earliestEnd) : src.slice(startIdx);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Poll `condition()` until it returns truthy or `timeoutMs` elapses.
|
|
153
|
+
* Returns the truthy value from `condition()`, or throws on timeout.
|
|
154
|
+
*
|
|
155
|
+
* Use this instead of `await new Promise(r => setTimeout(r, <magic-ms>))`
|
|
156
|
+
* when waiting for a state change that tests produce. The fixed-sleep
|
|
157
|
+
* pattern is flaky: too short → race; too long → slow tests.
|
|
158
|
+
*
|
|
159
|
+
* @param condition Predicate. Returns truthy when done. May be async.
|
|
160
|
+
* @param opts.timeoutMs Max total wait. Defaults to 2000ms.
|
|
161
|
+
* @param opts.intervalMs Poll interval. Defaults to 10ms.
|
|
162
|
+
* @param opts.description Included in the timeout error for debuggability.
|
|
163
|
+
*/
|
|
164
|
+
export async function waitForCondition<T>(
|
|
165
|
+
condition: () => T | Promise<T>,
|
|
166
|
+
opts: { timeoutMs?: number; intervalMs?: number; description?: string } = {},
|
|
167
|
+
): Promise<T> {
|
|
168
|
+
const timeoutMs = opts.timeoutMs ?? 2000;
|
|
169
|
+
const intervalMs = opts.intervalMs ?? 10;
|
|
170
|
+
const deadline = Date.now() + timeoutMs;
|
|
171
|
+
let lastErr: unknown;
|
|
172
|
+
while (Date.now() < deadline) {
|
|
173
|
+
try {
|
|
174
|
+
const result = await condition();
|
|
175
|
+
if (result) return result;
|
|
176
|
+
} catch (e) {
|
|
177
|
+
lastErr = e;
|
|
178
|
+
}
|
|
179
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
180
|
+
}
|
|
181
|
+
const desc = opts.description ?? "condition";
|
|
182
|
+
const errSuffix = lastErr instanceof Error ? ` (last error: ${lastErr.message})` : "";
|
|
183
|
+
throw new Error(`waitForCondition timed out after ${timeoutMs}ms waiting for ${desc}${errSuffix}`);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Find the first line in rendered output that matches a predicate. Returns
|
|
188
|
+
* the line's index and text, or throws if no line matches.
|
|
189
|
+
*
|
|
190
|
+
* Use this instead of `lines[N]` indexing when the N is positional and
|
|
191
|
+
* could shift under formatting changes.
|
|
192
|
+
*/
|
|
193
|
+
export function findLine(
|
|
194
|
+
output: string,
|
|
195
|
+
predicate: RegExp | ((line: string) => boolean),
|
|
196
|
+
): { index: number; text: string } {
|
|
197
|
+
const lines = output.split("\n");
|
|
198
|
+
const fn = predicate instanceof RegExp
|
|
199
|
+
? (l: string) => {
|
|
200
|
+
// RegExp.test is stateful when the pattern has /g or /y flags
|
|
201
|
+
// (maintains lastIndex across calls). Reset before each test so
|
|
202
|
+
// matches on different lines don't silently skip.
|
|
203
|
+
if (predicate.global || predicate.sticky) predicate.lastIndex = 0;
|
|
204
|
+
return predicate.test(l);
|
|
205
|
+
}
|
|
206
|
+
: predicate;
|
|
207
|
+
for (let i = 0; i < lines.length; i++) {
|
|
208
|
+
if (fn(lines[i]!)) return { index: i, text: lines[i]! };
|
|
209
|
+
}
|
|
210
|
+
const preview = lines.slice(0, 10).join("\n");
|
|
211
|
+
throw new Error(
|
|
212
|
+
`findLine: no line matched. First 10 lines were:\n${preview}`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
@@ -14,6 +14,7 @@ import assert from "node:assert/strict";
|
|
|
14
14
|
import { readFileSync } from "node:fs";
|
|
15
15
|
import { join, dirname } from "node:path";
|
|
16
16
|
import { fileURLToPath } from "node:url";
|
|
17
|
+
import { extractSourceRegion } from "./test-helpers.ts";
|
|
17
18
|
|
|
18
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
20
|
|
|
@@ -127,7 +128,13 @@ test("profile: balanced profile skips research, reassess, and slice research (AD
|
|
|
127
128
|
|
|
128
129
|
test("profile: quality profile skips research, slice research, and reassess (ADR-003)", () => {
|
|
129
130
|
const qualityIdx = preferencesSrc.indexOf('case "quality":');
|
|
130
|
-
|
|
131
|
+
// preferencesSrc is concatenated from multiple modules — bound the region
|
|
132
|
+
// with the next case marker so the assertion stays tightly scoped.
|
|
133
|
+
const qualityBlock = extractSourceRegion(
|
|
134
|
+
preferencesSrc,
|
|
135
|
+
'case "quality":',
|
|
136
|
+
'case "burn-max":',
|
|
137
|
+
);
|
|
131
138
|
assert.ok(qualityBlock.includes("skip_research: true"), "quality should skip research");
|
|
132
139
|
assert.ok(qualityBlock.includes("skip_slice_research: true"), "quality should skip slice research");
|
|
133
140
|
assert.ok(qualityBlock.includes("skip_reassess: true"), "quality should skip reassess");
|
|
@@ -44,7 +44,19 @@ describe("#2883: tool invocation error tracking on AutoSession", () => {
|
|
|
44
44
|
|
|
45
45
|
// ─── isToolInvocationError classifier ────────────────────────────────────
|
|
46
46
|
|
|
47
|
-
import {
|
|
47
|
+
import {
|
|
48
|
+
isDeterministicPolicyError,
|
|
49
|
+
isToolInvocationError,
|
|
50
|
+
isQueuedUserMessageSkip,
|
|
51
|
+
} from "../auto-tool-tracking.ts";
|
|
52
|
+
import {
|
|
53
|
+
shouldBlockContextWrite,
|
|
54
|
+
shouldBlockPendingGateInSnapshot,
|
|
55
|
+
shouldBlockQueueExecutionInSnapshot,
|
|
56
|
+
resetWriteGateState,
|
|
57
|
+
type WriteGateSnapshot,
|
|
58
|
+
} from "../bootstrap/write-gate.ts";
|
|
59
|
+
import { BLOCKED_WRITE_ERROR } from "../write-intercept.ts";
|
|
48
60
|
|
|
49
61
|
describe("#2883: isToolInvocationError classification", () => {
|
|
50
62
|
test("detects JSON validation failure pattern", () => {
|
|
@@ -89,11 +101,59 @@ describe("#2883: isToolInvocationError classification", () => {
|
|
|
89
101
|
);
|
|
90
102
|
});
|
|
91
103
|
|
|
104
|
+
test("detects raw write-gate CONTEXT failures for non-GSD write tools", () => {
|
|
105
|
+
resetWriteGateState();
|
|
106
|
+
const result = shouldBlockContextWrite(
|
|
107
|
+
"write",
|
|
108
|
+
"/tmp/project/.gsd/milestones/M001/M001-CONTEXT.md",
|
|
109
|
+
"M001",
|
|
110
|
+
false,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
assert.equal(result.block, true);
|
|
114
|
+
assert.equal(isDeterministicPolicyError(result.reason ?? ""), true);
|
|
115
|
+
assert.equal(isToolInvocationError(result.reason ?? ""), true);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("detects raw pending-gate failures for non-GSD write tools", () => {
|
|
119
|
+
const snapshot: WriteGateSnapshot = {
|
|
120
|
+
verifiedDepthMilestones: [],
|
|
121
|
+
activeQueuePhase: false,
|
|
122
|
+
pendingGateId: "depth_verification_M001",
|
|
123
|
+
};
|
|
124
|
+
const result = shouldBlockPendingGateInSnapshot(snapshot, "write", "M001", false);
|
|
125
|
+
|
|
126
|
+
assert.equal(result.block, true);
|
|
127
|
+
assert.equal(isDeterministicPolicyError(result.reason ?? ""), true);
|
|
128
|
+
assert.equal(isToolInvocationError(result.reason ?? ""), true);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("detects queue-mode policy blocks for raw write/edit/bash tools", () => {
|
|
132
|
+
const snapshot: WriteGateSnapshot = {
|
|
133
|
+
verifiedDepthMilestones: [],
|
|
134
|
+
activeQueuePhase: true,
|
|
135
|
+
pendingGateId: null,
|
|
136
|
+
};
|
|
137
|
+
const writeResult = shouldBlockQueueExecutionInSnapshot(snapshot, "write", "src/app.ts", true);
|
|
138
|
+
const bashResult = shouldBlockQueueExecutionInSnapshot(snapshot, "bash", "npm run build", true);
|
|
139
|
+
|
|
140
|
+
assert.equal(writeResult.block, true);
|
|
141
|
+
assert.equal(bashResult.block, true);
|
|
142
|
+
assert.equal(isDeterministicPolicyError(writeResult.reason ?? ""), true);
|
|
143
|
+
assert.equal(isToolInvocationError(bashResult.reason ?? ""), true);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("detects direct STATE.md/gsd.db write-intercept policy blocks", () => {
|
|
147
|
+
assert.equal(isDeterministicPolicyError(BLOCKED_WRITE_ERROR), true);
|
|
148
|
+
assert.equal(isToolInvocationError(BLOCKED_WRITE_ERROR), true);
|
|
149
|
+
});
|
|
150
|
+
|
|
92
151
|
test("returns false for normal tool errors (business logic)", () => {
|
|
93
152
|
assert.equal(
|
|
94
153
|
isToolInvocationError("Slice S01 is already complete"),
|
|
95
154
|
false,
|
|
96
155
|
);
|
|
156
|
+
assert.equal(isDeterministicPolicyError("Slice S01 is already complete"), false);
|
|
97
157
|
});
|
|
98
158
|
|
|
99
159
|
test("returns false for empty string", () => {
|
|
@@ -36,6 +36,9 @@ const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
|
|
|
36
36
|
{ canonical: "gsd_reassess_roadmap", alias: "gsd_roadmap_reassess" },
|
|
37
37
|
{ canonical: "gsd_complete_milestone", alias: "gsd_milestone_complete" },
|
|
38
38
|
{ canonical: "gsd_validate_milestone", alias: "gsd_milestone_validate" },
|
|
39
|
+
{ canonical: "gsd_task_reopen", alias: "gsd_reopen_task" },
|
|
40
|
+
{ canonical: "gsd_slice_reopen", alias: "gsd_reopen_slice" },
|
|
41
|
+
{ canonical: "gsd_milestone_reopen", alias: "gsd_reopen_milestone" },
|
|
39
42
|
];
|
|
40
43
|
|
|
41
44
|
// ─── Registration count ──────────────────────────────────────────────────────
|
|
@@ -45,7 +48,11 @@ console.log('\n── Tool naming: registration count ──');
|
|
|
45
48
|
const pi = makeMockPi();
|
|
46
49
|
registerDbTools(pi);
|
|
47
50
|
|
|
48
|
-
assert.deepStrictEqual(
|
|
51
|
+
assert.deepStrictEqual(
|
|
52
|
+
pi.tools.length,
|
|
53
|
+
RENAME_MAP.length * 2 + 2,
|
|
54
|
+
'Should register canonical/alias tool pairs plus 1 gate tool and 1 gsd_skip_slice',
|
|
55
|
+
);
|
|
49
56
|
|
|
50
57
|
// ─── Both names exist for each pair ──────────────────────────────────────────
|
|
51
58
|
|
|
@@ -258,6 +258,55 @@ test("resolution: markCaptureExecuted is idempotent", () => {
|
|
|
258
258
|
}
|
|
259
259
|
});
|
|
260
260
|
|
|
261
|
+
// ─── executeTriageResolutions + note execution (#3578) ──────────────────────
|
|
262
|
+
|
|
263
|
+
test("resolution: executeTriageResolutions stamps note captures as executed", () => {
|
|
264
|
+
const tmp = makeTempDir("res-exec-note");
|
|
265
|
+
try {
|
|
266
|
+
const id = appendCapture(tmp, "FYI the API changed");
|
|
267
|
+
markCaptureResolved(tmp, id, "note", "acknowledged", "informational");
|
|
268
|
+
|
|
269
|
+
const result = executeTriageResolutions(tmp, "M001", "S01");
|
|
270
|
+
|
|
271
|
+
// The note should now be marked as executed
|
|
272
|
+
const all = loadAllCaptures(tmp);
|
|
273
|
+
assert.strictEqual(all.length, 1);
|
|
274
|
+
assert.strictEqual(all[0].executed, true, "note capture should be marked as executed");
|
|
275
|
+
|
|
276
|
+
// It should appear in the actions log
|
|
277
|
+
assert.ok(
|
|
278
|
+
result.actions.some(a => a.includes(id) && a.includes("Note acknowledged")),
|
|
279
|
+
"actions should include a note-acknowledged entry",
|
|
280
|
+
);
|
|
281
|
+
} finally {
|
|
282
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("resolution: executeTriageResolutions does not double-stamp already-executed notes", () => {
|
|
287
|
+
const tmp = makeTempDir("res-exec-note-idem");
|
|
288
|
+
try {
|
|
289
|
+
const id = appendCapture(tmp, "informational note");
|
|
290
|
+
markCaptureResolved(tmp, id, "note", "acknowledged", "info");
|
|
291
|
+
|
|
292
|
+
// First execution — stamps the note
|
|
293
|
+
executeTriageResolutions(tmp, "M001", "S01");
|
|
294
|
+
|
|
295
|
+
// Second execution — should be a no-op for the note
|
|
296
|
+
const result2 = executeTriageResolutions(tmp, "M001", "S01");
|
|
297
|
+
|
|
298
|
+
assert.strictEqual(result2.actions.length, 0, "second call should produce no actions");
|
|
299
|
+
|
|
300
|
+
// Verify the Executed field was not duplicated in the file
|
|
301
|
+
const filePath = join(tmp, ".gsd", "CAPTURES.md");
|
|
302
|
+
const content = readFileSync(filePath, "utf-8");
|
|
303
|
+
const executedMatches = content.match(/\*\*Executed:\*\*/g);
|
|
304
|
+
assert.strictEqual(executedMatches?.length, 1, "should have exactly one Executed field");
|
|
305
|
+
} finally {
|
|
306
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
|
|
261
310
|
// ─── loadActionableCaptures ──────────────────────────────────────────────────
|
|
262
311
|
|
|
263
312
|
test("resolution: loadActionableCaptures returns only unexecuted actionable captures", () => {
|
|
@@ -387,8 +436,7 @@ test("resolution: executeTriageResolutions handles mixed classifications", () =>
|
|
|
387
436
|
assert.strictEqual(result.injected, 1, "should inject 1 task");
|
|
388
437
|
assert.strictEqual(result.replanned, 0);
|
|
389
438
|
assert.strictEqual(result.quickTasks.length, 1, "should queue 1 quick-task");
|
|
390
|
-
|
|
391
|
-
assert.strictEqual(result.actions.length, 3, "should have 3 action entries (defer excluded, note now included)");
|
|
439
|
+
assert.strictEqual(result.actions.length, 3, "should have 3 action entries (inject + quick-task + note acknowledged; defer excluded)");
|
|
392
440
|
} finally {
|
|
393
441
|
rmSync(tmp, { recursive: true, force: true });
|
|
394
442
|
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Project: gsd-pi — Tests for the auto/turn-epoch stale-write guard.
|
|
2
|
+
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
_resetTurnEpoch,
|
|
8
|
+
bumpTurnGeneration,
|
|
9
|
+
describeTurnEpoch,
|
|
10
|
+
getCurrentTurnGeneration,
|
|
11
|
+
isStaleWrite,
|
|
12
|
+
runWithTurnGeneration,
|
|
13
|
+
} from "../auto/turn-epoch.ts";
|
|
14
|
+
|
|
15
|
+
test("turn-epoch: generation starts at 0 and bumps monotonically", () => {
|
|
16
|
+
_resetTurnEpoch();
|
|
17
|
+
assert.equal(getCurrentTurnGeneration(), 0);
|
|
18
|
+
assert.equal(bumpTurnGeneration("test-a"), 1);
|
|
19
|
+
assert.equal(bumpTurnGeneration("test-b"), 2);
|
|
20
|
+
assert.equal(getCurrentTurnGeneration(), 2);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("turn-epoch: isStaleWrite returns false when no turn context captured", () => {
|
|
24
|
+
_resetTurnEpoch();
|
|
25
|
+
bumpTurnGeneration("no-context");
|
|
26
|
+
// Called outside runWithTurnGeneration — safe default is false.
|
|
27
|
+
assert.equal(isStaleWrite("out-of-band"), false);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("turn-epoch: isStaleWrite returns false inside a fresh turn", () => {
|
|
31
|
+
_resetTurnEpoch();
|
|
32
|
+
const captured = getCurrentTurnGeneration();
|
|
33
|
+
runWithTurnGeneration(captured, () => {
|
|
34
|
+
assert.equal(isStaleWrite("fresh"), false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("turn-epoch: isStaleWrite returns true after the epoch bumps mid-turn", () => {
|
|
39
|
+
_resetTurnEpoch();
|
|
40
|
+
const captured = getCurrentTurnGeneration();
|
|
41
|
+
runWithTurnGeneration(captured, () => {
|
|
42
|
+
bumpTurnGeneration("recovery-fires");
|
|
43
|
+
assert.equal(isStaleWrite("stale"), true);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("turn-epoch: nested turns each see their own captured generation", () => {
|
|
48
|
+
_resetTurnEpoch();
|
|
49
|
+
const outerGen = getCurrentTurnGeneration();
|
|
50
|
+
runWithTurnGeneration(outerGen, () => {
|
|
51
|
+
assert.equal(isStaleWrite("outer-fresh"), false);
|
|
52
|
+
bumpTurnGeneration("bump-between");
|
|
53
|
+
const innerGen = getCurrentTurnGeneration();
|
|
54
|
+
runWithTurnGeneration(innerGen, () => {
|
|
55
|
+
// Inner context saw the bumped generation at capture time — fresh.
|
|
56
|
+
assert.equal(isStaleWrite("inner-fresh"), false);
|
|
57
|
+
});
|
|
58
|
+
// Back to outer context — still stale because outerGen < current.
|
|
59
|
+
assert.equal(isStaleWrite("outer-after-bump"), true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("turn-epoch: describeTurnEpoch surfaces captured vs current", () => {
|
|
64
|
+
_resetTurnEpoch();
|
|
65
|
+
bumpTurnGeneration("seed");
|
|
66
|
+
const captured = getCurrentTurnGeneration();
|
|
67
|
+
runWithTurnGeneration(captured, () => {
|
|
68
|
+
let snapshot = describeTurnEpoch();
|
|
69
|
+
assert.equal(snapshot.captured, captured);
|
|
70
|
+
assert.equal(snapshot.current, captured);
|
|
71
|
+
assert.equal(snapshot.stale, false);
|
|
72
|
+
|
|
73
|
+
bumpTurnGeneration("supersede");
|
|
74
|
+
snapshot = describeTurnEpoch();
|
|
75
|
+
assert.equal(snapshot.captured, captured);
|
|
76
|
+
assert.equal(snapshot.current, captured + 1);
|
|
77
|
+
assert.equal(snapshot.stale, true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Outside the turn — captured is null, stale is false.
|
|
81
|
+
const outside = describeTurnEpoch();
|
|
82
|
+
assert.equal(outside.captured, null);
|
|
83
|
+
assert.equal(outside.stale, false);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("turn-epoch: AsyncLocalStorage propagates across awaits", async () => {
|
|
87
|
+
_resetTurnEpoch();
|
|
88
|
+
const captured = getCurrentTurnGeneration();
|
|
89
|
+
await runWithTurnGeneration(captured, async () => {
|
|
90
|
+
await Promise.resolve();
|
|
91
|
+
await new Promise((r) => setTimeout(r, 1));
|
|
92
|
+
bumpTurnGeneration("async-bump");
|
|
93
|
+
await Promise.resolve();
|
|
94
|
+
assert.equal(isStaleWrite("post-await"), true);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// ─── Source-level invariant checks for recoverTimedOutUnit ──────────────────
|
|
99
|
+
//
|
|
100
|
+
// The recoverTimedOutUnit function has two branch families:
|
|
101
|
+
// - ADVANCE branches: the unit is done, loop moves on — these MUST bump.
|
|
102
|
+
// - STEERING branches: the same LLM turn is kept alive with a steering
|
|
103
|
+
// message — these MUST NOT bump (otherwise the retry's legitimate writes
|
|
104
|
+
// get marked stale).
|
|
105
|
+
//
|
|
106
|
+
// The whole function must contain zero raw `resolveAgentEnd` calls with the
|
|
107
|
+
// "timeout-recovery" _synthetic marker — all advance paths go through
|
|
108
|
+
// bumpAndResolveSynthetic. And there must be no top-level bump call.
|
|
109
|
+
|
|
110
|
+
test("recoverTimedOutUnit: no raw `resolveAgentEnd({ _synthetic: \"timeout-recovery\" })` calls remain", async () => {
|
|
111
|
+
const fs = await import("node:fs");
|
|
112
|
+
const path = await import("node:path");
|
|
113
|
+
const url = await import("node:url");
|
|
114
|
+
const here = path.dirname(url.fileURLToPath(import.meta.url));
|
|
115
|
+
const src = fs.readFileSync(
|
|
116
|
+
path.join(here, "..", "auto-timeout-recovery.ts"),
|
|
117
|
+
"utf-8",
|
|
118
|
+
);
|
|
119
|
+
const rawSyntheticResolve =
|
|
120
|
+
/resolveAgentEnd\s*\(\s*\{\s*messages:\s*\[\s*\]\s*,\s*_synthetic:\s*["']timeout-recovery/;
|
|
121
|
+
assert.equal(
|
|
122
|
+
rawSyntheticResolve.test(src),
|
|
123
|
+
false,
|
|
124
|
+
"auto-timeout-recovery.ts must funnel advance paths through bumpAndResolveSynthetic — a raw resolveAgentEnd with _synthetic:\"timeout-recovery\" would leak orphan writes",
|
|
125
|
+
);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("recoverTimedOutUnit: no top-level bumpTurnGeneration — steering branches must not supersede", async () => {
|
|
129
|
+
const fs = await import("node:fs");
|
|
130
|
+
const path = await import("node:path");
|
|
131
|
+
const url = await import("node:url");
|
|
132
|
+
const here = path.dirname(url.fileURLToPath(import.meta.url));
|
|
133
|
+
const src = fs.readFileSync(
|
|
134
|
+
path.join(here, "..", "auto-timeout-recovery.ts"),
|
|
135
|
+
"utf-8",
|
|
136
|
+
);
|
|
137
|
+
// The only bump surface allowed is via bumpAndResolveSynthetic (advance
|
|
138
|
+
// paths) — a direct bumpTurnGeneration call in this file would bump even
|
|
139
|
+
// when the function later decides to take a steering retry branch.
|
|
140
|
+
assert.equal(
|
|
141
|
+
/\bbumpTurnGeneration\s*\(/.test(src),
|
|
142
|
+
false,
|
|
143
|
+
"auto-timeout-recovery.ts must not call bumpTurnGeneration directly — use bumpAndResolveSynthetic so bump and supersede are atomic and tied to advance-only branches",
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("recoverTimedOutUnit: bumpAndResolveSynthetic appears exactly four times (one per advance branch)", async () => {
|
|
148
|
+
const fs = await import("node:fs");
|
|
149
|
+
const path = await import("node:path");
|
|
150
|
+
const url = await import("node:url");
|
|
151
|
+
const here = path.dirname(url.fileURLToPath(import.meta.url));
|
|
152
|
+
const src = fs.readFileSync(
|
|
153
|
+
path.join(here, "..", "auto-timeout-recovery.ts"),
|
|
154
|
+
"utf-8",
|
|
155
|
+
);
|
|
156
|
+
const matches = src.match(/bumpAndResolveSynthetic\s*\(/g) ?? [];
|
|
157
|
+
assert.equal(
|
|
158
|
+
matches.length,
|
|
159
|
+
4,
|
|
160
|
+
`expected 4 advance-branch supersede sites (durableComplete, execute-task-exhausted, artifact-already-exists, non-execute-exhausted); found ${matches.length}`,
|
|
161
|
+
);
|
|
162
|
+
});
|