gsd-pi 2.76.0-dev.fe143342a → 2.77.0-dev.1594b263e
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 +18 -36
- package/dist/claude-cli-check.js +36 -3
- package/dist/cli-web-branch.d.ts +1 -0
- package/dist/cli-web-branch.js +3 -0
- package/dist/cli.js +38 -2
- package/dist/extension-discovery.d.ts +6 -0
- package/dist/extension-discovery.js +37 -0
- package/dist/extension-registry.d.ts +3 -0
- package/dist/extension-sort.d.ts +18 -0
- package/dist/extension-sort.js +114 -0
- package/dist/extension-validator.d.ts +47 -0
- package/dist/extension-validator.js +127 -0
- package/dist/headless.js +49 -4
- package/dist/loader.js +35 -7
- package/dist/onboarding.js +45 -0
- 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 +9 -4
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +559 -76
- package/dist/resources/extensions/cmux/index.js +20 -0
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
- package/dist/resources/extensions/google-search/index.js +3 -375
- package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
- package/dist/resources/extensions/gsd/auto/loop.js +133 -2
- package/dist/resources/extensions/gsd/auto/phases.js +110 -42
- package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
- package/dist/resources/extensions/gsd/auto/session.js +24 -3
- package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +216 -40
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +125 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +240 -66
- package/dist/resources/extensions/gsd/auto-prompts.js +386 -104
- package/dist/resources/extensions/gsd/auto-recovery.js +124 -4
- package/dist/resources/extensions/gsd/auto-start.js +141 -66
- 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 +230 -86
- package/dist/resources/extensions/gsd/auto.js +159 -48
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +36 -2
- 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-extension.js +11 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +161 -11
- package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
- package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
- package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
- 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 +29 -3
- 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 +2 -0
- package/dist/resources/extensions/gsd/gsd-db.js +95 -32
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow.js +214 -13
- package/dist/resources/extensions/gsd/health-widget.js +4 -1
- package/dist/resources/extensions/gsd/journal.js +17 -2
- package/dist/resources/extensions/gsd/key-manager.js +22 -0
- 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 +42 -3
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/notifications.js +30 -16
- package/dist/resources/extensions/gsd/pre-execution-checks.js +31 -6
- 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/discuss-headless.md +29 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/reports.js +5 -4
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +12 -4
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
- 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/token-counter.js +22 -5
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
- 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 +30 -7
- 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 +136 -17
- 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/extensions/shared/cmux-events.js +12 -0
- package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
- 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/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/dist/resources/skills/write-docs/SKILL.md +2 -1
- 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 +10 -10
- 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 +10 -10
- 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-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
- package/dist/welcome-screen.js +6 -1
- package/dist/wizard.js +2 -0
- package/package.json +17 -16
- package/packages/daemon/package.json +2 -2
- 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/remote-questions.d.ts +45 -0
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
- package/packages/mcp-server/dist/remote-questions.js +732 -0
- package/packages/mcp-server/dist/remote-questions.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +31 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +179 -93
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts +14 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +49 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +9 -3
- 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 +89 -0
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/readers/readers.test.ts +5 -1
- package/packages/mcp-server/src/remote-questions.test.ts +294 -0
- package/packages/mcp-server/src/remote-questions.ts +916 -0
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +236 -108
- package/packages/mcp-server/src/session-manager.ts +43 -1
- 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.test.json +19 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +7 -2
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
- 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/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +6 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
- 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/custom.d.ts +38 -0
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/custom.js +41 -0
- package/packages/pi-ai/dist/models/custom.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/dist/providers/anthropic-auth.test.js +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +16 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/package.json +6 -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/custom.ts +42 -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 +48 -11
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
- package/packages/pi-ai/src/providers/anthropic.ts +9 -3
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
- package/packages/pi-ai/src/providers/simple-options.ts +17 -1
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -31
- 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/agent-session.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +7 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
- package/packages/pi-coding-agent/dist/core/compaction/utils.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 +29 -18
- 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/compaction-utils.test.js +56 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -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 +19 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
- package/packages/pi-coding-agent/dist/core/model-registry.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/resource-loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.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/session-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +21 -1
- package/packages/pi-coding-agent/dist/core/session-manager.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 +19 -5
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.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 +139 -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 +118 -14
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +6 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -36
- 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/agent-session.ts +11 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
- package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +15 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
- package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
- 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/session-manager.test.ts +30 -1
- package/packages/pi-coding-agent/src/core/session-manager.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
- package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -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 +160 -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 +132 -14
- 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 +31 -14
- 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/package.json +6 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
- 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/package.json +6 -1
- package/packages/rpc-client/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +526 -0
- package/scripts/lib/workspace-manifest.cjs +86 -0
- package/scripts/link-workspace-packages.cjs +5 -17
- package/scripts/postinstall.js +9 -178
- 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 +9 -4
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +609 -82
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1033 -87
- package/src/resources/extensions/cmux/index.ts +35 -10
- 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/extension-manifest.json +5 -4
- package/src/resources/extensions/google-search/index.ts +9 -470
- package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +14 -1
- package/src/resources/extensions/gsd/auto/loop.ts +151 -2
- package/src/resources/extensions/gsd/auto/phases.ts +139 -41
- package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
- package/src/resources/extensions/gsd/auto/session.ts +35 -3
- package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
- package/src/resources/extensions/gsd/auto/types.ts +1 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +229 -39
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +132 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +255 -76
- package/src/resources/extensions/gsd/auto-prompts.ts +413 -94
- package/src/resources/extensions/gsd/auto-recovery.ts +125 -2
- package/src/resources/extensions/gsd/auto-start.ts +166 -60
- 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 +251 -93
- package/src/resources/extensions/gsd/auto.ts +182 -54
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +43 -2
- 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-extension.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -9
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +193 -11
- package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
- package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
- package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
- 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 +26 -2
- 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 +2 -1
- package/src/resources/extensions/gsd/gsd-db.ts +97 -34
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +261 -14
- package/src/resources/extensions/gsd/health-widget.ts +3 -1
- package/src/resources/extensions/gsd/journal.ts +39 -3
- package/src/resources/extensions/gsd/key-manager.ts +22 -0
- 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 +48 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/notifications.ts +27 -15
- package/src/resources/extensions/gsd/pre-execution-checks.ts +33 -7
- package/src/resources/extensions/gsd/preferences-types.ts +8 -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/discuss-headless.md +29 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/reports.ts +5 -4
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +16 -3
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -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 +322 -286
- 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-paused-session-validation.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -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-bootstrap-await-3420.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
- 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/auto-wrapup-inflight-guard.test.ts +23 -0
- 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/clean-root-preflight.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
- 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-slice.test.ts +2 -2
- 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 +161 -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 +14 -9
- package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -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/doctor-providers.test.ts +31 -0
- 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/ensure-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +113 -0
- 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-change-validator.test.ts +38 -0
- 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 +131 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +296 -1
- 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-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 +4 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
- 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/integration/worktree-e2e.test.ts +11 -0
- 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/issue-4540-regressions.test.ts +288 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +2 -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/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- 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-status-authoritative.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
- 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-commit-scope.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +274 -112
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +337 -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/prefs-wizard-coverage.test.ts +44 -0
- 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 +388 -0
- 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 +15 -6
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
- 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/safety-harness-false-positives.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -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/session-start-footer.test.ts +32 -40
- 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/stash-queued-context-files.test.ts +56 -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-counter.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
- 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 +42 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
- 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/workflow-mcp.test.ts +25 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +242 -247
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
- 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 +71 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/token-counter.ts +22 -5
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- 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 +39 -8
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +23 -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 +150 -18
- 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/cmux-events.ts +59 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
- 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/src/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/src/resources/skills/write-docs/SKILL.md +2 -1
- package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.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 -142
- 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/{n21VtX2hZlkpdEUO_nU4z → MdwvuQQLlBY6wwiSO1Tgv}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → MdwvuQQLlBY6wwiSO1Tgv}/_ssgManifest.js +0 -0
|
@@ -13,6 +13,75 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
13
13
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
14
14
|
import { applyModelPolicyFilter } from "./uok/model-policy.js";
|
|
15
15
|
import { isModelBlocked } from "./blocked-models.js";
|
|
16
|
+
import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
|
|
17
|
+
/**
|
|
18
|
+
* Thrown when the model-policy gate rejects every candidate model for a unit
|
|
19
|
+
* dispatch (#4959 / #4681 / #4850). The auto-loop catches this specifically
|
|
20
|
+
* to classify the unit as `blocked` rather than counting it as a retryable
|
|
21
|
+
* iteration error — pre-send policy denial is a configuration problem, not a
|
|
22
|
+
* transient runtime failure, so retrying just burns the consecutive-error
|
|
23
|
+
* budget toward a hard stop.
|
|
24
|
+
*/
|
|
25
|
+
export class ModelPolicyDispatchBlockedError extends Error {
|
|
26
|
+
unitType;
|
|
27
|
+
unitId;
|
|
28
|
+
reasons;
|
|
29
|
+
constructor(unitType, unitId, reasons) {
|
|
30
|
+
const summary = reasons.length === 0
|
|
31
|
+
? "no candidate models"
|
|
32
|
+
: reasons
|
|
33
|
+
.slice(0, 4)
|
|
34
|
+
.map((r) => `${r.provider}/${r.modelId} (${r.reason})`)
|
|
35
|
+
.join("; ");
|
|
36
|
+
super(`Model policy denied dispatch for ${unitType}/${unitId} before prompt send. Rejected: ${summary}`);
|
|
37
|
+
this.name = "ModelPolicyDispatchBlockedError";
|
|
38
|
+
this.unitType = unitType;
|
|
39
|
+
this.unitId = unitId;
|
|
40
|
+
this.reasons = reasons;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Baseline active-tool set per-`pi` instance, captured the first time
|
|
44
|
+
// `selectAndApplyModel` runs against that instance during an auto session
|
|
45
|
+
// and re-applied before each subsequent dispatch. WeakMap so that test
|
|
46
|
+
// fakes / disposed sessions are garbage-collected normally. See
|
|
47
|
+
// #4959 / #4681 cross-unit poisoning notes at the call site below.
|
|
48
|
+
//
|
|
49
|
+
// LIFECYCLE: the baseline is tied to a single auto session, NOT to the
|
|
50
|
+
// lifetime of the `pi` instance (which can outlive many auto runs and have
|
|
51
|
+
// the user mutate tools between them). `clearToolBaseline` MUST be called
|
|
52
|
+
// at auto start AND auto stop so that a second `/gsd auto` run on the same
|
|
53
|
+
// `pi` does not silently restore a stale snapshot from the prior run and
|
|
54
|
+
// undo any tool changes the user made between sessions.
|
|
55
|
+
const TOOL_BASELINE = new WeakMap();
|
|
56
|
+
/**
|
|
57
|
+
* Drop the captured tool baseline for `pi` so the next `selectAndApplyModel`
|
|
58
|
+
* call re-captures from the live active set. Wired into `startAuto` and
|
|
59
|
+
* `stopAuto` in `auto.ts` to bound the baseline to a single auto session.
|
|
60
|
+
*
|
|
61
|
+
* Safe to call when no baseline is recorded (no-op).
|
|
62
|
+
*/
|
|
63
|
+
export function clearToolBaseline(pi) {
|
|
64
|
+
TOOL_BASELINE.delete(pi);
|
|
65
|
+
}
|
|
66
|
+
function restoreToolBaseline(pi) {
|
|
67
|
+
const key = pi;
|
|
68
|
+
const baseline = TOOL_BASELINE.get(key);
|
|
69
|
+
if (baseline === undefined) {
|
|
70
|
+
// First call: capture the canonical pre-dispatch tool set. At auto-mode
|
|
71
|
+
// start the active set has not yet been narrowed for any provider.
|
|
72
|
+
// Guarded against test fakes that omit getActiveTools — record an empty
|
|
73
|
+
// baseline so subsequent calls don't keep re-probing.
|
|
74
|
+
const initial = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
|
|
75
|
+
TOOL_BASELINE.set(key, [...initial]);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Restore baseline before the next unit reads getActiveTools / applies
|
|
79
|
+
// post-selection adjustToolSet. Older fakes that omit setActiveTools are
|
|
80
|
+
// tolerated — the test asserts call order on real fakes.
|
|
81
|
+
if (typeof pi.setActiveTools === "function") {
|
|
82
|
+
pi.setActiveTools([...baseline]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
16
85
|
function reapplyThinkingLevel(pi, level) {
|
|
17
86
|
if (!level)
|
|
18
87
|
return;
|
|
@@ -86,6 +155,29 @@ autoModeStartThinkingLevel) {
|
|
|
86
155
|
: resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode);
|
|
87
156
|
let routing = null;
|
|
88
157
|
let appliedModel = null;
|
|
158
|
+
// ── Restore active-tool baseline before policy evaluation (#4959, #4681, #4850) ──
|
|
159
|
+
// Per-unit narrowing at the bottom of this function (line ~417) calls
|
|
160
|
+
// `pi.setActiveTools(finalToolNames)` and monotonically narrows the active
|
|
161
|
+
// set across units. Without restoration, a previously-dispatched unit on a
|
|
162
|
+
// narrow-API provider (e.g. openai-completions) leaves the active set
|
|
163
|
+
// missing tools that the next unit's selected model fully supports, but
|
|
164
|
+
// `pi.getActiveTools()` snapshot-as-hard-gate (the old behaviour) blocked
|
|
165
|
+
// dispatch with "tool policy denied" anyway.
|
|
166
|
+
//
|
|
167
|
+
// The baseline is captured once per `pi` instance via a WeakMap and
|
|
168
|
+
// re-applied here so each unit starts from a clean slate. Soft adaptation
|
|
169
|
+
// (adjustToolSet at the bottom of this function) still trims for the
|
|
170
|
+
// selected model.
|
|
171
|
+
//
|
|
172
|
+
// Auto-mode only (#4965): `guided-flow.ts:dispatchWorkflow` also calls
|
|
173
|
+
// `selectAndApplyModel` with `isAutoMode=false`. Guided-flow has its own
|
|
174
|
+
// narrow/restore via discuss-tool-scoping (guided-flow.ts:587-622) and no
|
|
175
|
+
// baseline-clear hook of its own, so an unconditional restore here would
|
|
176
|
+
// resurrect an auto-era baseline on guided-flow dispatches — silently
|
|
177
|
+
// overwriting any tool changes made interactively between auto sessions.
|
|
178
|
+
// The baseline is structurally an auto-mode concept; gate it accordingly.
|
|
179
|
+
if (isAutoMode)
|
|
180
|
+
restoreToolBaseline(pi);
|
|
89
181
|
if (modelConfig) {
|
|
90
182
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
91
183
|
const modelPolicyTraceId = `model:${ctx.sessionManager.getSessionId()}:${Date.now()}`;
|
|
@@ -114,7 +206,16 @@ autoModeStartThinkingLevel) {
|
|
|
114
206
|
const taskMetadataForPolicy = unitType === "execute-task"
|
|
115
207
|
? extractTaskMetadata(unitId, basePath)
|
|
116
208
|
: undefined;
|
|
209
|
+
let policyDenyReasons = [];
|
|
117
210
|
if (uokFlags.modelPolicy) {
|
|
211
|
+
// Use the workflow-spec required-tool subset for the unit type rather
|
|
212
|
+
// than the live `pi.getActiveTools()` snapshot (#4959). The active set
|
|
213
|
+
// is poisoned by per-unit narrowing for narrow-API providers — using it
|
|
214
|
+
// as a hard gate promotes soft adaptation (adjustToolSet at line ~417)
|
|
215
|
+
// into a layering violation that throws before dispatch. The smaller
|
|
216
|
+
// workflow-required subset reflects what the unit actually needs; soft
|
|
217
|
+
// adaptation post-selection still trims provider-incompatible tools.
|
|
218
|
+
const requiredTools = getRequiredWorkflowToolsForAutoUnit(unitType);
|
|
118
219
|
const policy = applyModelPolicyFilter(availableModels, {
|
|
119
220
|
basePath,
|
|
120
221
|
traceId: modelPolicyTraceId,
|
|
@@ -123,12 +224,15 @@ autoModeStartThinkingLevel) {
|
|
|
123
224
|
taskMetadata: taskMetadataForPolicy,
|
|
124
225
|
currentProvider: ctx.model?.provider,
|
|
125
226
|
allowCrossProvider: routingConfig.cross_provider !== false,
|
|
126
|
-
requiredTools
|
|
227
|
+
requiredTools,
|
|
127
228
|
});
|
|
128
229
|
routingEligibleModels = policy.eligible;
|
|
129
230
|
policyAllowedModelKeys = new Set(policy.eligible.map((m) => `${m.provider.toLowerCase()}/${m.id.toLowerCase()}`));
|
|
231
|
+
policyDenyReasons = policy.decisions
|
|
232
|
+
.filter((d) => !d.allowed)
|
|
233
|
+
.map((d) => ({ provider: d.provider, modelId: d.modelId, reason: d.reason }));
|
|
130
234
|
if (routingEligibleModels.length === 0) {
|
|
131
|
-
throw new
|
|
235
|
+
throw new ModelPolicyDispatchBlockedError(unitType, unitId, policyDenyReasons);
|
|
132
236
|
}
|
|
133
237
|
}
|
|
134
238
|
// Disable routing for flat-rate providers like GitHub Copilot (#3453).
|
|
@@ -169,7 +273,11 @@ autoModeStartThinkingLevel) {
|
|
|
169
273
|
if (shouldClassify) {
|
|
170
274
|
let classification = classifyUnitComplexity(unitType, unitId, basePath, budgetPct, taskMetadataForPolicy);
|
|
171
275
|
const availableModelIds = routingEligibleModels.map(m => `${m.provider}/${m.id}`);
|
|
172
|
-
// Escalate tier on retry when escalate_on_failure is enabled (default: true)
|
|
276
|
+
// Escalate tier on retry when escalate_on_failure is enabled (default: true).
|
|
277
|
+
// #4973: Deterministic policy errors are short-circuited at the postUnit
|
|
278
|
+
// level (auto-post-unit.ts writes a placeholder and returns "continue"),
|
|
279
|
+
// so this code path only runs for legitimate model-quality retries where
|
|
280
|
+
// tier escalation is the right response.
|
|
173
281
|
if (retryContext?.isRetry &&
|
|
174
282
|
retryContext.previousTier &&
|
|
175
283
|
routingConfig.escalate_on_failure !== false) {
|
|
@@ -179,6 +287,18 @@ autoModeStartThinkingLevel) {
|
|
|
179
287
|
// Always notify on tier escalation — model changes should be visible (#3962)
|
|
180
288
|
ctx.ui.notify(`Tier escalation: ${retryContext.previousTier} → ${escalated} (retry after failure)`, "info");
|
|
181
289
|
}
|
|
290
|
+
else {
|
|
291
|
+
// #4973: Already at max tier — keep previousTier rather than letting
|
|
292
|
+
// fresh classification silently downgrade the model back to a lower tier.
|
|
293
|
+
// Without this, a light-start unit on retry 3 would revert to the light
|
|
294
|
+
// model after escalating to heavy on retries 1 and 2.
|
|
295
|
+
const tierOrder = { light: 0, standard: 1, heavy: 2 };
|
|
296
|
+
const prevOrder = tierOrder[retryContext.previousTier] ?? 0;
|
|
297
|
+
const freshOrder = tierOrder[classification.tier] ?? 0;
|
|
298
|
+
if (prevOrder > freshOrder) {
|
|
299
|
+
classification = { ...classification, tier: retryContext.previousTier, reason: "retained escalated tier from retry" };
|
|
300
|
+
}
|
|
301
|
+
}
|
|
182
302
|
}
|
|
183
303
|
// Load user capability overrides from preferences (D-17: deep-merged with built-in profiles)
|
|
184
304
|
const capabilityOverrides = loadCapabilityOverrides(prefs ?? {});
|
|
@@ -291,7 +411,7 @@ autoModeStartThinkingLevel) {
|
|
|
291
411
|
// ADR-005: Adjust active tool set for the selected model's provider capabilities.
|
|
292
412
|
// Hard-filter incompatible tools, then let extensions override via adjust_tool_set hook.
|
|
293
413
|
const activeToolNames = pi.getActiveTools();
|
|
294
|
-
const { toolNames: compatibleTools, removedTools } = adjustToolSet(activeToolNames, model.api);
|
|
414
|
+
const { toolNames: compatibleTools, removedTools } = adjustToolSet(activeToolNames, model.api, model.provider);
|
|
295
415
|
let finalToolNames = compatibleTools;
|
|
296
416
|
// Fire adjust_tool_set hook — extensions can override the filtered tool set
|
|
297
417
|
if (routingConfig.hooks !== false) {
|
|
@@ -335,7 +455,7 @@ autoModeStartThinkingLevel) {
|
|
|
335
455
|
}
|
|
336
456
|
}
|
|
337
457
|
if (uokFlags.modelPolicy && policyAllowedModelKeys && !attemptedPolicyEligible) {
|
|
338
|
-
throw new
|
|
458
|
+
throw new ModelPolicyDispatchBlockedError(unitType, unitId, policyDenyReasons);
|
|
339
459
|
}
|
|
340
460
|
}
|
|
341
461
|
else if (autoModeStartModel) {
|
|
@@ -30,7 +30,7 @@ import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookSta
|
|
|
30
30
|
import { hasPendingCaptures, loadPendingCaptures, revertExecutorResolvedCaptures } from "./captures.js";
|
|
31
31
|
import { debugLog } from "./debug-logger.js";
|
|
32
32
|
import { runSafely } from "./auto-utils.js";
|
|
33
|
-
import { getEvidence } from "./safety/evidence-collector.js";
|
|
33
|
+
import { getEvidence, clearEvidenceFromDisk } from "./safety/evidence-collector.js";
|
|
34
34
|
import { validateFileChanges } from "./safety/file-change-validator.js";
|
|
35
35
|
// crossReferenceEvidence available for future use when verification_evidence is stored in DB
|
|
36
36
|
// import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
|
|
@@ -45,8 +45,34 @@ import { ensureCodebaseMapFresh } from "./codebase-generator.js";
|
|
|
45
45
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
46
46
|
import { UokGateRunner } from "./uok/gate-runner.js";
|
|
47
47
|
import { writeTurnGitTransaction } from "./uok/gitops.js";
|
|
48
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
49
|
+
import { detectAbandonMilestone } from "./abandon-detect.js";
|
|
50
|
+
import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
|
|
48
51
|
/** Maximum verification retry attempts before escalating to blocker placeholder (#2653). */
|
|
49
52
|
const MAX_VERIFICATION_RETRIES = 3;
|
|
53
|
+
/** Keep failure toasts short while still showing concrete examples. */
|
|
54
|
+
const MAX_NOTIFICATION_DETAILS = 3;
|
|
55
|
+
const NOTIFICATION_BULLET = "•";
|
|
56
|
+
function formatPreExecutionCheckDetail(check) {
|
|
57
|
+
const category = check.category?.trim() || "unknown category";
|
|
58
|
+
const target = check.target?.trim() || "unknown target";
|
|
59
|
+
const message = check.message.split(/\r?\n/, 1)[0]?.trim() || "No details provided";
|
|
60
|
+
return ` ${NOTIFICATION_BULLET} [${category}] ${target}: ${message}`;
|
|
61
|
+
}
|
|
62
|
+
const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
|
|
63
|
+
const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
|
|
64
|
+
async function waitForMilestoneDbClose(mid) {
|
|
65
|
+
const deadline = Date.now() + COMPLETE_MILESTONE_DB_SETTLE_MS;
|
|
66
|
+
while (Date.now() < deadline) {
|
|
67
|
+
if (!isDbAvailable())
|
|
68
|
+
return false;
|
|
69
|
+
const milestone = getMilestone(mid);
|
|
70
|
+
if (milestone && isClosedStatus(milestone.status))
|
|
71
|
+
return true;
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, COMPLETE_MILESTONE_DB_SETTLE_POLL_MS));
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
50
76
|
/** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
|
|
51
77
|
* drain via runUnit. Logs the enqueue event and notifies the UI. */
|
|
52
78
|
function enqueueSidecar(s, ctx, entry, debugExtra, notification) {
|
|
@@ -72,7 +98,7 @@ const LIFECYCLE_ONLY_UNITS = new Set([
|
|
|
72
98
|
]);
|
|
73
99
|
import { describeNextUnit, } from "./auto-dashboard.js";
|
|
74
100
|
import { existsSync, unlinkSync } from "node:fs";
|
|
75
|
-
import { join } from "node:path";
|
|
101
|
+
import { join, relative } from "node:path";
|
|
76
102
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
77
103
|
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
78
104
|
/**
|
|
@@ -184,6 +210,13 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
|
|
|
184
210
|
}
|
|
185
211
|
return rogues;
|
|
186
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Maximum number of times to retry a unit whose expected artifact is missing
|
|
215
|
+
* after execution. Matches the bounded pattern used by runPostUnitVerification
|
|
216
|
+
* in auto-verification.ts. Exceeding this limit pauses auto-mode instead of
|
|
217
|
+
* looping indefinitely (#2007).
|
|
218
|
+
*/
|
|
219
|
+
const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
|
|
187
220
|
export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
|
|
188
221
|
export function buildStepCompleteMessage(nextState) {
|
|
189
222
|
if (nextState.phase === "complete") {
|
|
@@ -457,6 +490,36 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
457
490
|
// Rewrite-docs completion
|
|
458
491
|
if (s.currentUnit.type === "rewrite-docs") {
|
|
459
492
|
await runSafely("postUnit", "rewrite-docs-resolve", async () => {
|
|
493
|
+
// Detect abandon/descope overrides BEFORE resolving them (#3490).
|
|
494
|
+
// If an override is about abandoning the milestone, park it so the
|
|
495
|
+
// state engine skips it. Without this, rewrite-docs only edits
|
|
496
|
+
// markdown but the DB still has the milestone as active.
|
|
497
|
+
try {
|
|
498
|
+
const { loadActiveOverrides } = await import("./files.js");
|
|
499
|
+
const overrides = await loadActiveOverrides(s.basePath);
|
|
500
|
+
const decision = detectAbandonMilestone(overrides, s.currentMilestoneId);
|
|
501
|
+
if (decision.shouldPark && s.currentMilestoneId) {
|
|
502
|
+
const { parkMilestone } = await import("./milestone-actions.js");
|
|
503
|
+
const parked = parkMilestone(s.basePath, s.currentMilestoneId, decision.reason);
|
|
504
|
+
if (parked) {
|
|
505
|
+
ctx.ui.notify(`Milestone ${s.currentMilestoneId} parked: "${decision.reason}"`, "info");
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
// Park refused: milestone directory missing, milestone already
|
|
509
|
+
// completed (SUMMARY present), or PARKED.md already exists.
|
|
510
|
+
// resolveAllOverrides below will still consume the override —
|
|
511
|
+
// surface this loudly so the user notices state drift rather
|
|
512
|
+
// than silently losing the abandon directive.
|
|
513
|
+
const msg = `Abandon detected for ${s.currentMilestoneId} but park refused (milestone is completed, already parked, or missing). Override will be resolved anyway — verify state is correct.`;
|
|
514
|
+
logError("engine", msg);
|
|
515
|
+
ctx.ui.notify(msg, "warning");
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
logError("engine", `abandon-detect failed: ${err.message}`);
|
|
521
|
+
ctx.ui.notify(`Abandon detection failed — check logs. Overrides will still be resolved.`, "warning");
|
|
522
|
+
}
|
|
460
523
|
await resolveAllOverrides(s.basePath);
|
|
461
524
|
// Reset both disk and in-memory counters. Disk counter is authoritative
|
|
462
525
|
// (survives restarts); in-memory is kept in sync for the current session.
|
|
@@ -475,6 +538,85 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
475
538
|
clearReactiveState(s.basePath, mid, sid);
|
|
476
539
|
}
|
|
477
540
|
});
|
|
541
|
+
// #4765 — slice-cadence collapse. When `git.collapse_cadence: "slice"`
|
|
542
|
+
// is set, squash-merge the slice's commits from the milestone branch
|
|
543
|
+
// onto main right here, so orphan risk shrinks from milestone-size to
|
|
544
|
+
// slice-size. Only runs in worktree isolation mode — the feature needs
|
|
545
|
+
// a milestone branch to squash from.
|
|
546
|
+
let sliceMergeStopped = false;
|
|
547
|
+
await runSafely("postUnit", "slice-cadence-merge", async () => {
|
|
548
|
+
const prefsResult = loadEffectiveGSDPreferences(s.basePath);
|
|
549
|
+
const prefs = prefsResult?.preferences;
|
|
550
|
+
const { getCollapseCadence, mergeSliceToMain } = await import("./slice-cadence.js");
|
|
551
|
+
if (getCollapseCadence(prefs) !== "slice")
|
|
552
|
+
return;
|
|
553
|
+
if (prefs?.git?.isolation !== "worktree")
|
|
554
|
+
return;
|
|
555
|
+
if (s.isolationDegraded)
|
|
556
|
+
return;
|
|
557
|
+
const projectRoot = s.originalBasePath || s.basePath;
|
|
558
|
+
const { milestone: mid, slice: sid } = parseUnitId(unit.id);
|
|
559
|
+
if (!mid || !sid)
|
|
560
|
+
return;
|
|
561
|
+
// Record the milestone start SHA before the first slice merge, so
|
|
562
|
+
// resquashMilestoneOnMain has a target at milestone completion.
|
|
563
|
+
// Resolve main branch dynamically — hard-coding "main" breaks repos
|
|
564
|
+
// that use "master" or a custom default branch.
|
|
565
|
+
if (!s.milestoneStartShas.has(mid)) {
|
|
566
|
+
try {
|
|
567
|
+
const { nativeDetectMainBranch } = await import("./native-git-bridge.js");
|
|
568
|
+
const mainBranch = nativeDetectMainBranch(projectRoot);
|
|
569
|
+
const { execFileSync } = await import("node:child_process");
|
|
570
|
+
const sha = execFileSync("git", ["rev-parse", mainBranch], {
|
|
571
|
+
cwd: projectRoot, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
|
|
572
|
+
}).trim();
|
|
573
|
+
if (sha)
|
|
574
|
+
s.milestoneStartShas.set(mid, sha);
|
|
575
|
+
}
|
|
576
|
+
catch (err) {
|
|
577
|
+
logWarning("engine", `slice-cadence: failed to record milestone start SHA: ${err instanceof Error ? err.message : String(err)}`);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
try {
|
|
581
|
+
const result = mergeSliceToMain(projectRoot, mid, sid);
|
|
582
|
+
if (result.skipped) {
|
|
583
|
+
logWarning("engine", `slice-cadence: merge skipped for ${sid} — ${result.skippedReason}`);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
ctx.ui.notify(`slice-cadence: ${sid} merged to main (${result.durationMs}ms).`, "info");
|
|
587
|
+
}
|
|
588
|
+
catch (err) {
|
|
589
|
+
const { MergeConflictError } = await import("./git-service.js");
|
|
590
|
+
if (err instanceof MergeConflictError) {
|
|
591
|
+
ctx.ui.notify(`slice-cadence merge conflict in ${sid}: ${err.conflictedFiles.join(", ")}. ` +
|
|
592
|
+
`Resolve manually on main and run \`/gsd auto\` to resume.`, "error");
|
|
593
|
+
// Stop auto AND signal the outer postUnit flow to exit early.
|
|
594
|
+
// Without the flag, subsequent hooks (triage, rogue detection,
|
|
595
|
+
// DB writes) would keep running against a conflicted main
|
|
596
|
+
// checkout after the loop was already told to stop.
|
|
597
|
+
const { stopAuto } = await import("./auto.js");
|
|
598
|
+
await stopAuto(ctx, undefined, `slice-merge-conflict on ${sid}`);
|
|
599
|
+
sliceMergeStopped = true;
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
logError("engine", `slice-cadence merge failed for ${sid}`, {
|
|
603
|
+
error: err instanceof Error ? err.message : String(err),
|
|
604
|
+
});
|
|
605
|
+
// Non-conflict failures (dirty main, rev-walk error, etc.) can
|
|
606
|
+
// leave the checkout in an unexpected state. Stop auto-mode so
|
|
607
|
+
// the next slice doesn't dispatch on top of it.
|
|
608
|
+
const { stopAuto } = await import("./auto.js");
|
|
609
|
+
await stopAuto(ctx, undefined, `slice-merge-error on ${sid}`);
|
|
610
|
+
sliceMergeStopped = true;
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
// Exit early after stopAuto so the rest of post-unit processing
|
|
614
|
+
// (triage, rogue detection, hook dispatch, DB writes) doesn't run
|
|
615
|
+
// against a conflicted main checkout. Return "dispatched" to match
|
|
616
|
+
// the convention used by other stop/pauseAuto paths in this function
|
|
617
|
+
// (see signal handling earlier: stop/pause also return "dispatched").
|
|
618
|
+
if (sliceMergeStopped)
|
|
619
|
+
return "dispatched";
|
|
478
620
|
}
|
|
479
621
|
// Post-triage: execute actionable resolutions
|
|
480
622
|
if (s.currentUnit.type === "triage-captures") {
|
|
@@ -535,7 +677,7 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
535
677
|
if (taskRow) {
|
|
536
678
|
const expectedOutput = taskRow.expected_output ?? [];
|
|
537
679
|
const plannedFiles = taskRow.files ?? [];
|
|
538
|
-
const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles);
|
|
680
|
+
const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
|
|
539
681
|
if (audit && audit.violations.length > 0) {
|
|
540
682
|
const warnings = audit.violations.filter(v => v.severity === "warning");
|
|
541
683
|
for (const v of warnings) {
|
|
@@ -588,6 +730,16 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
588
730
|
debugLog("postUnit", { phase: "safety-content-validation", error: String(e) });
|
|
589
731
|
}
|
|
590
732
|
}
|
|
733
|
+
// Clear persisted evidence file now that post-unit processing is complete
|
|
734
|
+
// (Bug #4385 — prevents stale evidence from affecting retries of same unit ID).
|
|
735
|
+
if (safetyConfig.evidence_collection && s.currentUnit.type === "execute-task" && sMid && sSid && sTid) {
|
|
736
|
+
try {
|
|
737
|
+
clearEvidenceFromDisk(s.basePath, sMid, sSid, sTid);
|
|
738
|
+
}
|
|
739
|
+
catch (e) {
|
|
740
|
+
debugLog("postUnit", { phase: "safety-evidence-clear", error: String(e) });
|
|
741
|
+
}
|
|
742
|
+
}
|
|
591
743
|
}
|
|
592
744
|
}
|
|
593
745
|
catch (e) {
|
|
@@ -607,6 +759,25 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
607
759
|
}
|
|
608
760
|
// If verification failed, attempt to regenerate missing projection files
|
|
609
761
|
// from DB data before giving up (e.g. research-slice produces PLAN from engine).
|
|
762
|
+
if (!triggerArtifactVerified) {
|
|
763
|
+
if (s.currentUnit.type === "complete-milestone") {
|
|
764
|
+
try {
|
|
765
|
+
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
766
|
+
if (mid) {
|
|
767
|
+
const settled = await waitForMilestoneDbClose(mid);
|
|
768
|
+
if (settled) {
|
|
769
|
+
triggerArtifactVerified = verifyExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
770
|
+
if (triggerArtifactVerified) {
|
|
771
|
+
invalidateAllCaches();
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
catch (e) {
|
|
777
|
+
debugLog("postUnit", { phase: "artifact-verify-settle-db", error: String(e) });
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
610
781
|
if (!triggerArtifactVerified) {
|
|
611
782
|
try {
|
|
612
783
|
const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
|
|
@@ -628,24 +799,38 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
628
799
|
// When artifact verification fails for a unit type that has a known expected
|
|
629
800
|
// artifact, return "retry" so the caller re-dispatches with failure context
|
|
630
801
|
// instead of blindly re-dispatching the same unit (#1571).
|
|
631
|
-
//
|
|
632
|
-
//
|
|
802
|
+
// Retries are capped at MAX_ARTIFACT_VERIFICATION_RETRIES to prevent
|
|
803
|
+
// unbounded loops (#2007).
|
|
633
804
|
//
|
|
634
|
-
//
|
|
635
|
-
//
|
|
636
|
-
//
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
805
|
+
// Pre-checks short-circuit retry for known-unrecoverable failures:
|
|
806
|
+
// - Deterministic policy rejection (#4973): structural write-gate failure
|
|
807
|
+
// that will recur on every retry, so write a blocker placeholder.
|
|
808
|
+
// - DB infra failure (#2517): completion tool returned db_unavailable, so
|
|
809
|
+
// the artifact was never written. Retrying can never succeed.
|
|
810
|
+
// - Tool invocation error (#2883/#3595): malformed JSON args or queued
|
|
811
|
+
// user message — retry will produce the same failure.
|
|
812
|
+
//
|
|
813
|
+
// #4973: Deterministic policy rejections (e.g. context_write_blocked from the
|
|
814
|
+
// write-gate) are checked FIRST — before the DB-availability check — because
|
|
815
|
+
// they are structural gates that will fire on every retry regardless of DB or
|
|
816
|
+
// model tier. Short-circuit immediately by writing a blocker placeholder.
|
|
817
|
+
if (!triggerArtifactVerified && s.lastToolInvocationError && isDeterministicPolicyError(s.lastToolInvocationError)) {
|
|
818
|
+
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
819
|
+
debugLog("postUnit", { phase: "deterministic-policy-error-placeholder", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError });
|
|
820
|
+
const reason = `Deterministic policy rejection for ${s.currentUnit.type} "${s.currentUnit.id}": ${s.lastToolInvocationError}. Retrying cannot resolve this gate — writing blocker placeholder to advance pipeline.`;
|
|
821
|
+
s.lastToolInvocationError = null;
|
|
822
|
+
s.pendingVerificationRetry = null;
|
|
823
|
+
s.verificationRetryCount.delete(retryKey);
|
|
824
|
+
writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
|
|
825
|
+
ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries) (#4973)`, "warning");
|
|
826
|
+
// Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
|
|
827
|
+
}
|
|
828
|
+
else if (!triggerArtifactVerified && !isDbAvailable()) {
|
|
641
829
|
debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
|
|
642
830
|
const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
643
831
|
ctx.ui.notify(`Artifact missing for ${s.currentUnit.type} ${s.currentUnit.id} — DB unavailable, skipping retry.${dbSkipDiag ? ` Expected: ${dbSkipDiag}` : ""}`, "error");
|
|
644
832
|
}
|
|
645
833
|
else if (!triggerArtifactVerified) {
|
|
646
|
-
// #2883/#3595: If the artifact is missing because the tool invocation
|
|
647
|
-
// failed (malformed JSON) or was skipped (queued user message), retrying
|
|
648
|
-
// will produce the same failure. Pause auto-mode instead of looping.
|
|
649
834
|
if (s.lastToolInvocationError) {
|
|
650
835
|
const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
|
|
651
836
|
const errMsg = isUserSkip
|
|
@@ -661,58 +846,29 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
661
846
|
if (hasExpectedArtifact) {
|
|
662
847
|
const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
|
|
663
848
|
const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
|
|
664
|
-
|
|
665
|
-
if (attempt > MAX_VERIFICATION_RETRIES) {
|
|
666
|
-
// #4175: For complete-milestone, a blocker placeholder is harmful —
|
|
667
|
-
// the stub SUMMARY has no recovery value (milestone is terminal),
|
|
668
|
-
// it does not update DB status (so deriveState never advances),
|
|
669
|
-
// and it fools stopAuto's presence check into merging a milestone
|
|
670
|
-
// that was never legitimately completed. Pause auto-mode with a
|
|
671
|
-
// clear single failure signal and preserve the worktree branch.
|
|
672
|
-
if (s.currentUnit.type === "complete-milestone") {
|
|
673
|
-
debugLog("postUnit", {
|
|
674
|
-
phase: "artifact-verify-pause-complete-milestone",
|
|
675
|
-
unitType: s.currentUnit.type,
|
|
676
|
-
unitId: s.currentUnit.id,
|
|
677
|
-
attempt,
|
|
678
|
-
maxRetries: MAX_VERIFICATION_RETRIES,
|
|
679
|
-
});
|
|
680
|
-
s.verificationRetryCount.delete(retryKey);
|
|
681
|
-
s.pendingVerificationRetry = null;
|
|
682
|
-
ctx.ui.notify(`Milestone ${s.currentUnit.id} verification failed after ${MAX_VERIFICATION_RETRIES} retries — worktree branch preserved. Re-run /gsd auto once blockers are resolved.`, "error");
|
|
683
|
-
await pauseAuto(ctx, pi);
|
|
684
|
-
return "dispatched";
|
|
685
|
-
}
|
|
686
|
-
// Retries exhausted — write a blocker placeholder so the pipeline
|
|
687
|
-
// can advance past this stuck unit (#2653).
|
|
688
|
-
debugLog("postUnit", {
|
|
689
|
-
phase: "artifact-verify-escalate",
|
|
690
|
-
unitType: s.currentUnit.type,
|
|
691
|
-
unitId: s.currentUnit.id,
|
|
692
|
-
attempt,
|
|
693
|
-
maxRetries: MAX_VERIFICATION_RETRIES,
|
|
694
|
-
});
|
|
695
|
-
const reason = `Artifact verification failed after ${MAX_VERIFICATION_RETRIES} retries for ${s.currentUnit.type} "${s.currentUnit.id}".`;
|
|
696
|
-
writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
|
|
697
|
-
ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — verification retries exhausted (${MAX_VERIFICATION_RETRIES}), wrote blocker placeholder to advance pipeline`, "warning");
|
|
698
|
-
// Reset retry count and fall through to "continue" so the loop
|
|
699
|
-
// re-derives state with the placeholder in place.
|
|
849
|
+
if (attempt > MAX_ARTIFACT_VERIFICATION_RETRIES) {
|
|
700
850
|
s.verificationRetryCount.delete(retryKey);
|
|
701
|
-
s.
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
s.pendingVerificationRetry = {
|
|
706
|
-
unitId: s.currentUnit.id,
|
|
707
|
-
failureContext: `Artifact verification failed: expected artifact for ${s.currentUnit.type} "${s.currentUnit.id}" was not found on disk after unit execution (attempt ${attempt}).`,
|
|
708
|
-
attempt,
|
|
709
|
-
};
|
|
710
|
-
debugLog("postUnit", { phase: "artifact-verify-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
|
|
711
|
-
ctx.ui.notify(`Artifact missing for ${s.currentUnit.type} ${s.currentUnit.id} — retrying (attempt ${attempt})`, "warning");
|
|
712
|
-
return "retry";
|
|
851
|
+
debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
|
|
852
|
+
ctx.ui.notify(`Artifact still missing for ${s.currentUnit.type} ${s.currentUnit.id} after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries — pausing auto-mode`, "error");
|
|
853
|
+
await pauseAuto(ctx, pi);
|
|
854
|
+
return "dispatched";
|
|
713
855
|
}
|
|
856
|
+
s.verificationRetryCount.set(retryKey, attempt);
|
|
857
|
+
s.pendingVerificationRetry = {
|
|
858
|
+
unitId: s.currentUnit.id,
|
|
859
|
+
failureContext: `Artifact verification failed: expected artifact for ${s.currentUnit.type} "${s.currentUnit.id}" was not found on disk after unit execution (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
|
|
860
|
+
attempt,
|
|
861
|
+
};
|
|
862
|
+
debugLog("postUnit", { phase: "artifact-verify-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
|
|
863
|
+
ctx.ui.notify(`Artifact missing for ${s.currentUnit.type} ${s.currentUnit.id} — retrying (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES})`, "warning");
|
|
864
|
+
return "retry";
|
|
714
865
|
}
|
|
715
866
|
}
|
|
867
|
+
// Verification succeeded — clear the retry counter so a future failure
|
|
868
|
+
// of the same unit gets a full retry budget instead of the stale count.
|
|
869
|
+
if (triggerArtifactVerified) {
|
|
870
|
+
s.verificationRetryCount.delete(`${s.currentUnit.type}:${s.currentUnit.id}`);
|
|
871
|
+
}
|
|
716
872
|
}
|
|
717
873
|
else {
|
|
718
874
|
// Hook unit completed — no additional processing needed
|
|
@@ -910,8 +1066,11 @@ export async function postUnitPostVerification(pctx) {
|
|
|
910
1066
|
}
|
|
911
1067
|
// Write evidence JSON to slice artifacts directory
|
|
912
1068
|
const slicePath = resolveSlicePath(s.basePath, mid, sid);
|
|
1069
|
+
const evidenceFileName = `${sid}-PRE-EXEC-VERIFY.json`;
|
|
1070
|
+
let evidencePath = join(".gsd", "milestones", mid, "slices", sid, evidenceFileName);
|
|
913
1071
|
if (slicePath) {
|
|
914
1072
|
writePreExecutionEvidence(result, slicePath, mid, sid);
|
|
1073
|
+
evidencePath = relative(s.basePath, join(slicePath, evidenceFileName)) || evidenceFileName;
|
|
915
1074
|
}
|
|
916
1075
|
if (uokFlags.gates) {
|
|
917
1076
|
const failedChecks = result.checks
|
|
@@ -946,16 +1105,31 @@ export async function postUnitPostVerification(pctx) {
|
|
|
946
1105
|
if (result.status === "fail") {
|
|
947
1106
|
const blockingChecks = result.checks.filter(c => !c.passed && c.blocking);
|
|
948
1107
|
const blockingCount = blockingChecks.length;
|
|
949
|
-
const details = blockingChecks.slice(0,
|
|
950
|
-
const suffix = blockingChecks.length >
|
|
951
|
-
|
|
1108
|
+
const details = blockingChecks.slice(0, MAX_NOTIFICATION_DETAILS).map(formatPreExecutionCheckDetail).join("\n");
|
|
1109
|
+
const suffix = blockingChecks.length > MAX_NOTIFICATION_DETAILS
|
|
1110
|
+
? `\n ${NOTIFICATION_BULLET} ...and ${blockingChecks.length - MAX_NOTIFICATION_DETAILS} more`
|
|
1111
|
+
: "";
|
|
1112
|
+
const evidenceNote = `\nSee ${evidencePath} for full details.`;
|
|
952
1113
|
ctx.ui.notify(`Pre-execution checks failed: ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} found\n${details}${suffix}${evidenceNote}`, "error");
|
|
1114
|
+
// Persist failure context so the next plan-slice re-dispatch can inject
|
|
1115
|
+
// it into the prompt and break the infinite loop (#4551).
|
|
1116
|
+
s.lastPreExecFailure = {
|
|
1117
|
+
unitId: currentUnit.id,
|
|
1118
|
+
blockingFindings: blockingChecks.map(c => `[${c.category}] ${c.target}: ${c.message}`),
|
|
1119
|
+
verdictExcerpt: `status=${result.status}; ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} detected`,
|
|
1120
|
+
};
|
|
953
1121
|
preExecPauseNeeded = true;
|
|
954
1122
|
}
|
|
955
1123
|
else if (result.status === "warn") {
|
|
956
1124
|
ctx.ui.notify(`Pre-execution checks passed with warnings`, "warning");
|
|
957
1125
|
// Strict mode: treat warnings as blocking
|
|
958
1126
|
if (prefs?.enhanced_verification_strict === true) {
|
|
1127
|
+
const warnChecks = result.checks.filter(c => !c.passed);
|
|
1128
|
+
s.lastPreExecFailure = {
|
|
1129
|
+
unitId: currentUnit.id,
|
|
1130
|
+
blockingFindings: warnChecks.map(c => `[${c.category}] ${c.target}: ${c.message}`),
|
|
1131
|
+
verdictExcerpt: `status=${result.status} (strict mode); ${warnChecks.length} warning${warnChecks.length === 1 ? "" : "s"} treated as blocking`,
|
|
1132
|
+
};
|
|
959
1133
|
preExecPauseNeeded = true;
|
|
960
1134
|
}
|
|
961
1135
|
}
|