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,16 +13,18 @@ import { appendEvent } from "./workflow-events.js";
|
|
|
13
13
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
14
14
|
import { clearParseCache } from "./files.js";
|
|
15
15
|
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
16
|
-
import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGates, updateTaskStatus, updateSliceStatus } from "./gsd-db.js";
|
|
16
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGates, updateTaskStatus, updateSliceStatus, insertSlice, getMilestone } from "./gsd-db.js";
|
|
17
17
|
import { isValidationTerminal } from "./state.js";
|
|
18
18
|
import { getErrorMessage } from "./error-utils.js";
|
|
19
19
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
20
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
20
21
|
import {
|
|
21
22
|
nativeConflictFiles,
|
|
22
23
|
nativeCommit,
|
|
23
24
|
nativeCheckoutTheirs,
|
|
24
25
|
nativeAddPaths,
|
|
25
26
|
nativeMergeAbort,
|
|
27
|
+
nativeRebaseAbort,
|
|
26
28
|
nativeResetHard,
|
|
27
29
|
} from "./native-git-bridge.js";
|
|
28
30
|
import {
|
|
@@ -50,9 +52,14 @@ import {
|
|
|
50
52
|
resolveExpectedArtifactPath,
|
|
51
53
|
diagnoseExpectedArtifact,
|
|
52
54
|
} from "./auto-artifact-paths.js";
|
|
55
|
+
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
53
56
|
|
|
54
57
|
// Re-export so existing consumers of auto-recovery.ts keep working.
|
|
55
58
|
export { resolveExpectedArtifactPath, diagnoseExpectedArtifact };
|
|
59
|
+
export {
|
|
60
|
+
classifyMilestoneSummaryContent,
|
|
61
|
+
type MilestoneSummaryOutcome,
|
|
62
|
+
} from "./milestone-summary-classifier.js";
|
|
56
63
|
|
|
57
64
|
// ─── Artifact Resolution & Verification ───────────────────────────────────────
|
|
58
65
|
|
|
@@ -268,11 +275,26 @@ export function verifyExpectedArtifact(
|
|
|
268
275
|
// RESEARCH file. Without this, resolveExpectedArtifactPath returns null and
|
|
269
276
|
// the retry/escalation machinery silently re-dispatches forever.
|
|
270
277
|
//
|
|
278
|
+
// #4068: Also treat a PARALLEL-BLOCKER placeholder as a terminal completion
|
|
279
|
+
// so that timeout-recovery can write the blocker, have verifyExpectedArtifact
|
|
280
|
+
// return true, and let the dispatch loop advance past this unit. Without
|
|
281
|
+
// this, the blocker is written but verification still returns false, the unit
|
|
282
|
+
// is never cleared from unitDispatchCount, and on the next iteration the
|
|
283
|
+
// dispatch rule (which correctly skips parallel-research when PARALLEL-BLOCKER
|
|
284
|
+
// exists) returns null — leaving the loop stuck re-deriving indefinitely.
|
|
285
|
+
//
|
|
271
286
|
// NOTE: this predicate mirrors the dispatch rule at
|
|
272
287
|
// auto-dispatch.ts parallel-research-slices — keep the two in sync.
|
|
273
288
|
if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
|
|
274
289
|
const { milestone: mid } = parseUnitId(unitId);
|
|
275
290
|
if (!mid) return false;
|
|
291
|
+
|
|
292
|
+
// #4068: PARALLEL-BLOCKER written by timeout-recovery is a terminal state.
|
|
293
|
+
const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
294
|
+
if (blockerPath && existsSync(blockerPath)) {
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
|
|
276
298
|
const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
277
299
|
if (!roadmapFile || !existsSync(roadmapFile)) {
|
|
278
300
|
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
|
|
@@ -462,6 +484,14 @@ export function verifyExpectedArtifact(
|
|
|
462
484
|
// A milestone with only .gsd/ plan files and zero implementation code is
|
|
463
485
|
// not genuinely complete — the LLM wrote plan files but skipped actual work.
|
|
464
486
|
if (unitType === "complete-milestone") {
|
|
487
|
+
const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
|
|
488
|
+
if (summaryOutcome === "failure") return false;
|
|
489
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
490
|
+
if (mid && isDbAvailable()) {
|
|
491
|
+
const dbMilestone = getMilestone(mid);
|
|
492
|
+
if (!dbMilestone) return false;
|
|
493
|
+
if (!isClosedStatus(dbMilestone.status) && summaryOutcome !== "success") return false;
|
|
494
|
+
}
|
|
465
495
|
if (hasImplementationArtifacts(base) === "absent") return false;
|
|
466
496
|
}
|
|
467
497
|
|
|
@@ -532,6 +562,16 @@ export function writeBlockerPlaceholder(
|
|
|
532
562
|
try { updateSliceStatus(mid, sid, "complete", ts); } catch (e) { logWarning("recovery", `updateSliceStatus failed during context exhaustion: ${e instanceof Error ? e.message : String(e)}`); }
|
|
533
563
|
try { appendEvent(base, { cmd: "complete-slice", params: { milestoneId: mid, sliceId: sid }, ts, actor: "system", trigger_reason: "blocker-placeholder-recovery" }); } catch (e) { logWarning("recovery", `appendEvent failed for slice recovery: ${e instanceof Error ? e.message : String(e)}`); }
|
|
534
564
|
}
|
|
565
|
+
// Insert a placeholder complete slice so deriveState sees activeMilestoneSlices.length > 0
|
|
566
|
+
// and exits the pre-planning phase. Without this, activeMilestoneSlices stays empty
|
|
567
|
+
// after the blocker ROADMAP.md is written, causing deriveState to return phase:'pre-planning'
|
|
568
|
+
// indefinitely and re-dispatching plan-milestone in an infinite loop (#4378).
|
|
569
|
+
if (unitType === "plan-milestone" && mid) {
|
|
570
|
+
try {
|
|
571
|
+
insertSlice({ id: "S00-blocker", milestoneId: mid, title: "Blocker placeholder — planning failed", status: "complete", sequence: 0 });
|
|
572
|
+
} catch (e) { logWarning("recovery", `insertSlice placeholder failed for plan-milestone recovery: ${e instanceof Error ? e.message : String(e)}`); }
|
|
573
|
+
try { appendEvent(base, { cmd: "plan-milestone", params: { milestoneId: mid }, ts, actor: "system", trigger_reason: "blocker-placeholder-recovery" }); } catch (e) { logWarning("recovery", `appendEvent failed for plan-milestone recovery: ${e instanceof Error ? e.message : String(e)}`); }
|
|
574
|
+
}
|
|
535
575
|
}
|
|
536
576
|
|
|
537
577
|
return diagnoseExpectedArtifact(unitType, unitId, base);
|
|
@@ -573,6 +613,79 @@ function abortAndResetMerge(
|
|
|
573
613
|
|
|
574
614
|
export type MergeReconcileResult = "clean" | "reconciled" | "blocked";
|
|
575
615
|
|
|
616
|
+
/**
|
|
617
|
+
* Detect and abort other in-progress git operations left behind by a SIGKILL'd
|
|
618
|
+
* worker (rebase, cherry-pick, revert). Without this, a killed worker mid-rebase
|
|
619
|
+
* leaves `.git/rebase-merge/` or `.git/CHERRY_PICK_HEAD` and the worktree is
|
|
620
|
+
* wedged until the user manually runs the matching `--abort`.
|
|
621
|
+
*
|
|
622
|
+
* Called before merge-state reconciliation because these states block any
|
|
623
|
+
* subsequent merge/commit operation. (Issue #4980 HIGH-7)
|
|
624
|
+
*/
|
|
625
|
+
function reconcileOtherInProgressGitOps(
|
|
626
|
+
basePath: string,
|
|
627
|
+
ctx: ExtensionContext,
|
|
628
|
+
): "clean" | "reconciled" | "blocked" {
|
|
629
|
+
const gitDir = join(basePath, ".git");
|
|
630
|
+
const states: Array<{
|
|
631
|
+
label: string;
|
|
632
|
+
indicators: string[];
|
|
633
|
+
abort: () => void;
|
|
634
|
+
}> = [
|
|
635
|
+
{
|
|
636
|
+
label: "rebase",
|
|
637
|
+
indicators: [join(gitDir, "rebase-merge"), join(gitDir, "rebase-apply")],
|
|
638
|
+
abort: () => nativeRebaseAbort(basePath),
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
label: "cherry-pick",
|
|
642
|
+
indicators: [join(gitDir, "CHERRY_PICK_HEAD")],
|
|
643
|
+
abort: () => {
|
|
644
|
+
// No native helper; fall back to git CLI.
|
|
645
|
+
try {
|
|
646
|
+
execFileSync("git", ["cherry-pick", "--abort"], {
|
|
647
|
+
cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
|
|
648
|
+
});
|
|
649
|
+
} catch (err) { logWarning("recovery", `cherry-pick --abort failed: ${getErrorMessage(err)}`); }
|
|
650
|
+
},
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
label: "revert",
|
|
654
|
+
indicators: [join(gitDir, "REVERT_HEAD")],
|
|
655
|
+
abort: () => {
|
|
656
|
+
try {
|
|
657
|
+
execFileSync("git", ["revert", "--abort"], {
|
|
658
|
+
cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
|
|
659
|
+
});
|
|
660
|
+
} catch (err) { logWarning("recovery", `revert --abort failed: ${getErrorMessage(err)}`); }
|
|
661
|
+
},
|
|
662
|
+
},
|
|
663
|
+
];
|
|
664
|
+
|
|
665
|
+
let reconciled = false;
|
|
666
|
+
for (const s of states) {
|
|
667
|
+
const present = s.indicators.some((p) => existsSync(p));
|
|
668
|
+
if (!present) continue;
|
|
669
|
+
try {
|
|
670
|
+
s.abort();
|
|
671
|
+
ctx.ui.notify(
|
|
672
|
+
`Detected leftover ${s.label} state from prior session — aborted.`,
|
|
673
|
+
"warning",
|
|
674
|
+
);
|
|
675
|
+
reconciled = true;
|
|
676
|
+
} catch (err) {
|
|
677
|
+
logError("recovery", `${s.label} abort failed: ${getErrorMessage(err)}`);
|
|
678
|
+
ctx.ui.notify(
|
|
679
|
+
`Detected leftover ${s.label} state but auto-abort failed. ` +
|
|
680
|
+
`Run \`git ${s.label} --abort\` manually before retrying.`,
|
|
681
|
+
"error",
|
|
682
|
+
);
|
|
683
|
+
return "blocked";
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
return reconciled ? "reconciled" : "clean";
|
|
687
|
+
}
|
|
688
|
+
|
|
576
689
|
/**
|
|
577
690
|
* Detect leftover merge state from a prior session and reconcile it.
|
|
578
691
|
* If MERGE_HEAD or SQUASH_MSG exists, check whether conflicts are resolved.
|
|
@@ -583,11 +696,21 @@ export function reconcileMergeState(
|
|
|
583
696
|
basePath: string,
|
|
584
697
|
ctx: ExtensionContext,
|
|
585
698
|
): MergeReconcileResult {
|
|
699
|
+
// First, abort any rebase/cherry-pick/revert left over from a SIGKILL'd
|
|
700
|
+
// worker. Doing this before the merge-state check unblocks any merge that
|
|
701
|
+
// would otherwise refuse with "you have unfinished operation". (HIGH-7)
|
|
702
|
+
const otherOpsResult = reconcileOtherInProgressGitOps(basePath, ctx);
|
|
703
|
+
if (otherOpsResult === "blocked") return "blocked";
|
|
704
|
+
|
|
586
705
|
const mergeHeadPath = join(basePath, ".git", "MERGE_HEAD");
|
|
587
706
|
const squashMsgPath = join(basePath, ".git", "SQUASH_MSG");
|
|
588
707
|
const hasMergeHead = existsSync(mergeHeadPath);
|
|
589
708
|
const hasSquashMsg = existsSync(squashMsgPath);
|
|
590
|
-
if (!hasMergeHead && !hasSquashMsg)
|
|
709
|
+
if (!hasMergeHead && !hasSquashMsg) {
|
|
710
|
+
// If we cleaned up another op type, return "reconciled" so the caller
|
|
711
|
+
// re-derives state from a known-good baseline.
|
|
712
|
+
return otherOpsResult === "reconciled" ? "reconciled" : "clean";
|
|
713
|
+
}
|
|
591
714
|
|
|
592
715
|
const conflictedFiles = nativeConflictFiles(basePath);
|
|
593
716
|
if (conflictedFiles.length === 0) {
|
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
nativeBranchListMerged,
|
|
46
46
|
nativeBranchDelete,
|
|
47
47
|
nativeWorktreeRemove,
|
|
48
|
+
nativeCommitCountBetween,
|
|
48
49
|
} from "./native-git-bridge.js";
|
|
49
50
|
import { GitServiceImpl } from "./git-service.js";
|
|
50
51
|
import {
|
|
@@ -55,13 +56,16 @@ import {
|
|
|
55
56
|
import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
56
57
|
import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
|
|
57
58
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
59
|
+
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
58
60
|
import { initMetrics } from "./metrics.js";
|
|
59
61
|
import { initRoutingHistory } from "./routing-history.js";
|
|
60
62
|
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
61
63
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
62
64
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
63
65
|
import { isDbAvailable, getMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
|
|
64
|
-
import {
|
|
66
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
67
|
+
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
68
|
+
|
|
65
69
|
import {
|
|
66
70
|
debugLog,
|
|
67
71
|
enableDebug,
|
|
@@ -74,6 +78,7 @@ import type { AutoSession } from "./auto/session.js";
|
|
|
74
78
|
import {
|
|
75
79
|
existsSync,
|
|
76
80
|
mkdirSync,
|
|
81
|
+
readFileSync,
|
|
77
82
|
readdirSync,
|
|
78
83
|
rmSync,
|
|
79
84
|
statSync,
|
|
@@ -141,6 +146,35 @@ export async function openProjectDbIfPresent(basePath: string): Promise<void> {
|
|
|
141
146
|
*
|
|
142
147
|
* Returns a summary of actions taken for the caller to surface via notify.
|
|
143
148
|
*/
|
|
149
|
+
/**
|
|
150
|
+
* Decide which survivor-branch recovery action bootstrapAutoSession must
|
|
151
|
+
* run for the current (hasSurvivorBranch, phase) combination. Extracted
|
|
152
|
+
* from the inline chain at `bootstrapAutoSession` (around line 604) so
|
|
153
|
+
* the decision table is testable without constructing a full session.
|
|
154
|
+
*
|
|
155
|
+
* - `none` — no survivor, or phase doesn't call for recovery. Fall
|
|
156
|
+
* through to normal bootstrap flow.
|
|
157
|
+
* - `discuss` — survivor + phase=needs-discussion (#1726). Route to
|
|
158
|
+
* showSmartEntry.
|
|
159
|
+
* - `finalize` — survivor + phase=complete (#2358). Run mergeAndExit to
|
|
160
|
+
* merge the milestone branch and clear the worktree.
|
|
161
|
+
*
|
|
162
|
+
* Any other phase with a survivor (pre-planning, planning, executing…)
|
|
163
|
+
* returns `none` — the caller continues its normal flow and the
|
|
164
|
+
* survivor branch participates in whatever auto-mode happens next.
|
|
165
|
+
*/
|
|
166
|
+
export type SurvivorAction = "none" | "discuss" | "finalize";
|
|
167
|
+
|
|
168
|
+
export function decideSurvivorAction(
|
|
169
|
+
hasSurvivorBranch: boolean,
|
|
170
|
+
phase: string | null | undefined,
|
|
171
|
+
): SurvivorAction {
|
|
172
|
+
if (!hasSurvivorBranch) return "none";
|
|
173
|
+
if (phase === "needs-discussion") return "discuss";
|
|
174
|
+
if (phase === "complete") return "finalize";
|
|
175
|
+
return "none";
|
|
176
|
+
}
|
|
177
|
+
|
|
144
178
|
export function auditOrphanedMilestoneBranches(
|
|
145
179
|
basePath: string,
|
|
146
180
|
isolationMode: "worktree" | "branch" | "none",
|
|
@@ -184,11 +218,61 @@ export function auditOrphanedMilestoneBranches(
|
|
|
184
218
|
const milestoneId = branch.replace(/^milestone\//, "");
|
|
185
219
|
const milestone = getMilestone(milestoneId);
|
|
186
220
|
|
|
187
|
-
|
|
188
|
-
if (!milestone || milestone.status !== "complete") continue;
|
|
221
|
+
if (!milestone) continue;
|
|
189
222
|
|
|
190
223
|
const isMerged = mergedBranches.has(branch);
|
|
191
224
|
|
|
225
|
+
// #4762 — in-progress milestone branch with unmerged commits ahead of
|
|
226
|
+
// main. This is the pre-completion orphan case: auto-mode exited without
|
|
227
|
+
// completing the milestone (pause, stop, crash, merge error, blocker) and
|
|
228
|
+
// work is stranded on the branch or in the worktree. Data safety first:
|
|
229
|
+
// we never delete or touch; we just surface a warning so the user knows
|
|
230
|
+
// where to look.
|
|
231
|
+
//
|
|
232
|
+
// Gate on isClosedStatus so we only warn about genuinely open milestones.
|
|
233
|
+
// Parked/other closed statuses go through the legacy complete/unmerged
|
|
234
|
+
// path below where appropriate.
|
|
235
|
+
if (!isClosedStatus(milestone.status)) {
|
|
236
|
+
if (isMerged) continue; // nothing to recover
|
|
237
|
+
let commitsAhead = 0;
|
|
238
|
+
try {
|
|
239
|
+
commitsAhead = nativeCommitCountBetween(basePath, mainBranch, branch);
|
|
240
|
+
} catch {
|
|
241
|
+
// Rev-walk failure — skip rather than noise
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (commitsAhead === 0) continue;
|
|
245
|
+
|
|
246
|
+
const wtDir = getWorktreeDir(basePath, milestoneId);
|
|
247
|
+
const wtDirExists = existsSync(wtDir);
|
|
248
|
+
const wtSuffix = wtDirExists
|
|
249
|
+
? ` Worktree directory at .gsd/worktrees/${milestoneId}/ holds the live work.`
|
|
250
|
+
: "";
|
|
251
|
+
warnings.push(
|
|
252
|
+
`Branch ${branch} has ${commitsAhead} commit(s) ahead of ${mainBranch} for in-progress milestone ${milestoneId}.` +
|
|
253
|
+
wtSuffix +
|
|
254
|
+
` Run \`/gsd auto\` to resume, or merge manually if abandoning.`,
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
// #4764 telemetry
|
|
258
|
+
try {
|
|
259
|
+
emitWorktreeOrphaned(basePath, milestoneId, {
|
|
260
|
+
reason: "in-progress-unmerged",
|
|
261
|
+
commitsAhead,
|
|
262
|
+
worktreeDirExists: wtDirExists,
|
|
263
|
+
});
|
|
264
|
+
} catch (err) {
|
|
265
|
+
logWarning("engine", `worktree-orphaned telemetry failed for ${milestoneId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Only the "complete" status participates in the merged/unmerged cleanup
|
|
272
|
+
// paths below — other closed statuses (parked, etc.) are intentionally
|
|
273
|
+
// left alone.
|
|
274
|
+
if (milestone.status !== "complete") continue;
|
|
275
|
+
|
|
192
276
|
if (isMerged) {
|
|
193
277
|
// Branch is merged — safe to delete branch and clean up worktree dir
|
|
194
278
|
try {
|
|
@@ -233,6 +317,16 @@ export function auditOrphanedMilestoneBranches(
|
|
|
233
317
|
`Branch ${branch} exists for completed milestone ${milestoneId} but is NOT merged into ${mainBranch}. ` +
|
|
234
318
|
`This may contain unmerged work. Merge manually or run \`/gsd health --fix\` to resolve.`,
|
|
235
319
|
);
|
|
320
|
+
|
|
321
|
+
// #4764 telemetry
|
|
322
|
+
try {
|
|
323
|
+
emitWorktreeOrphaned(basePath, milestoneId, {
|
|
324
|
+
reason: "complete-unmerged",
|
|
325
|
+
worktreeDirExists: existsSync(getWorktreeDir(basePath, milestoneId)),
|
|
326
|
+
});
|
|
327
|
+
} catch (err) {
|
|
328
|
+
logWarning("engine", `worktree-orphaned telemetry failed for ${milestoneId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
329
|
+
}
|
|
236
330
|
}
|
|
237
331
|
}
|
|
238
332
|
|
|
@@ -419,16 +513,35 @@ export async function bootstrapAutoSession(
|
|
|
419
513
|
// Invalidate caches before initial state derivation
|
|
420
514
|
invalidateAllCaches();
|
|
421
515
|
|
|
422
|
-
// Clean stale runtime unit files for completed milestones (#887)
|
|
423
|
-
cleanStaleRuntimeUnits(
|
|
424
|
-
gsdRoot(base),
|
|
425
|
-
(mid) => !!resolveMilestoneFile(base, mid, "SUMMARY"),
|
|
426
|
-
);
|
|
427
|
-
|
|
428
516
|
// Open the project-root DB before deriveState so DB-backed state
|
|
429
517
|
// derivation (queue-order, task status) works on a cold start (#2841).
|
|
518
|
+
// Must happen before cleanStaleRuntimeUnits so the cleanup predicate can
|
|
519
|
+
// consult DB status and avoid clearing runtime units for milestones that
|
|
520
|
+
// only have a failure-path SUMMARY on disk (#4663).
|
|
430
521
|
await openProjectDbIfPresent(base);
|
|
431
522
|
|
|
523
|
+
// Clean stale runtime unit files for completed milestones (#887).
|
|
524
|
+
// DB-authoritative: when DB is available, require DB status to be closed
|
|
525
|
+
// before clearing runtime units. A SUMMARY file alone is no longer
|
|
526
|
+
// trusted as proof of completion (#4663). Fall back to SUMMARY-file
|
|
527
|
+
// presence only when DB is unavailable (legacy/pre-migration).
|
|
528
|
+
cleanStaleRuntimeUnits(
|
|
529
|
+
gsdRoot(base),
|
|
530
|
+
(mid) => {
|
|
531
|
+
if (isDbAvailable()) {
|
|
532
|
+
const row = getMilestone(mid);
|
|
533
|
+
return !!row && isClosedStatus(row.status);
|
|
534
|
+
}
|
|
535
|
+
const summaryFile = resolveMilestoneFile(base, mid, "SUMMARY");
|
|
536
|
+
if (!summaryFile) return false;
|
|
537
|
+
try {
|
|
538
|
+
return classifyMilestoneSummaryContent(readFileSync(summaryFile, "utf-8")) !== "failure";
|
|
539
|
+
} catch {
|
|
540
|
+
return false;
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
);
|
|
544
|
+
|
|
432
545
|
// ── Orphaned milestone branch audit ──
|
|
433
546
|
// Catches completed milestones whose teardown (merge + branch delete)
|
|
434
547
|
// was lost due to session ending between completion and teardown.
|
|
@@ -491,7 +604,7 @@ export async function bootstrapAutoSession(
|
|
|
491
604
|
// The worktree/branch was created but the milestone only has CONTEXT-DRAFT.md.
|
|
492
605
|
// Route to the interactive discussion handler instead of falling through to
|
|
493
606
|
// auto-mode, which would immediately stop with "needs discussion".
|
|
494
|
-
if (hasSurvivorBranch
|
|
607
|
+
if (decideSurvivorAction(hasSurvivorBranch, state.phase) === "discuss") {
|
|
495
608
|
const { showSmartEntry } = await import("./guided-flow.js");
|
|
496
609
|
await showSmartEntry(ctx, pi, base, { step: requestedStepMode });
|
|
497
610
|
|
|
@@ -517,7 +630,9 @@ export async function bootstrapAutoSession(
|
|
|
517
630
|
// The milestone artifacts were written but finalization (merge, worktree
|
|
518
631
|
// cleanup) never ran. Run mergeAndExit to finalize, then re-derive state
|
|
519
632
|
// so the normal "all milestones complete" or "next milestone" path runs.
|
|
520
|
-
|
|
633
|
+
// Re-evaluate via the helper — the discuss branch above may have cleared
|
|
634
|
+
// hasSurvivorBranch after a successful promotion.
|
|
635
|
+
if (decideSurvivorAction(hasSurvivorBranch, state.phase) === "finalize") {
|
|
521
636
|
const mid = state.activeMilestone!.id;
|
|
522
637
|
ctx.ui.notify(
|
|
523
638
|
`Milestone ${mid} is complete but branch/worktree was not finalized. Running merge now.`,
|
|
@@ -553,37 +668,15 @@ export async function bootstrapAutoSession(
|
|
|
553
668
|
const { showSmartEntry } = await import("./guided-flow.js");
|
|
554
669
|
await showSmartEntry(ctx, pi, base, { step: requestedStepMode });
|
|
555
670
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
} else if (
|
|
566
|
-
postState.activeMilestone &&
|
|
567
|
-
postState.phase === "pre-planning"
|
|
568
|
-
) {
|
|
569
|
-
const contextFile = resolveMilestoneFile(
|
|
570
|
-
base,
|
|
571
|
-
postState.activeMilestone.id,
|
|
572
|
-
"CONTEXT",
|
|
573
|
-
);
|
|
574
|
-
const hasContext = !!(contextFile && (await loadFile(contextFile)));
|
|
575
|
-
if (hasContext) {
|
|
576
|
-
state = postState;
|
|
577
|
-
} else {
|
|
578
|
-
ctx.ui.notify(
|
|
579
|
-
"Discussion completed but no milestone context was written. Run /gsd to try the discussion again, or /gsd auto after creating the milestone manually.",
|
|
580
|
-
"warning",
|
|
581
|
-
);
|
|
582
|
-
return releaseLockAndReturn();
|
|
583
|
-
}
|
|
584
|
-
} else {
|
|
585
|
-
return releaseLockAndReturn();
|
|
586
|
-
}
|
|
671
|
+
// showSmartEntry dispatches via pi.sendMessage() which is fire-and-forget:
|
|
672
|
+
// it queues the message and returns immediately, before the LLM turn runs.
|
|
673
|
+
// Checking postState here would always see the pre-dispatch state, causing
|
|
674
|
+
// the premature "Discussion completed but..." warning (#3420).
|
|
675
|
+
//
|
|
676
|
+
// checkAutoStartAfterDiscuss (in guided-flow.ts) already handles re-entering
|
|
677
|
+
// auto-mode by calling startAutoDetached after the discussion completes.
|
|
678
|
+
// Release the lock and let the async dispatch proceed.
|
|
679
|
+
return releaseLockAndReturn();
|
|
587
680
|
}
|
|
588
681
|
|
|
589
682
|
// Active milestone exists but has no roadmap
|
|
@@ -595,17 +688,16 @@ export async function bootstrapAutoSession(
|
|
|
595
688
|
const { showSmartEntry } = await import("./guided-flow.js");
|
|
596
689
|
await showSmartEntry(ctx, pi, base, { step: requestedStepMode });
|
|
597
690
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
}
|
|
691
|
+
// showSmartEntry dispatches via pi.sendMessage() which is fire-and-forget:
|
|
692
|
+
// it queues the message and returns immediately, before the LLM turn runs.
|
|
693
|
+
// Checking postState here fires before the LLM has had a turn, so the
|
|
694
|
+
// pre-planning phase would still appear unchanged and a premature warning
|
|
695
|
+
// would be emitted (#3420).
|
|
696
|
+
//
|
|
697
|
+
// checkAutoStartAfterDiscuss (in guided-flow.ts) already handles re-entering
|
|
698
|
+
// auto-mode by calling startAutoDetached after the discussion completes.
|
|
699
|
+
// Release the lock and let the async dispatch proceed.
|
|
700
|
+
return releaseLockAndReturn();
|
|
609
701
|
}
|
|
610
702
|
}
|
|
611
703
|
|
|
@@ -824,9 +916,6 @@ export async function bootstrapAutoSession(
|
|
|
824
916
|
}
|
|
825
917
|
|
|
826
918
|
ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
|
|
827
|
-
ctx.ui.setFooter(hideFooter);
|
|
828
|
-
// Hide gsd-health during AUTO — gsd-progress is the single source of truth
|
|
829
|
-
// for last-commit / cost / health signal while auto is running.
|
|
830
919
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
831
920
|
const modeLabel = s.stepMode ? "Step-mode" : "Auto-mode";
|
|
832
921
|
const pendingCount = (state.registry ?? []).filter(
|
|
@@ -913,17 +1002,34 @@ export async function bootstrapAutoSession(
|
|
|
913
1002
|
);
|
|
914
1003
|
}
|
|
915
1004
|
|
|
916
|
-
// Self-heal: remove stale .git/index.lock
|
|
1005
|
+
// Self-heal: remove stale .git/index.lock.
|
|
1006
|
+
//
|
|
1007
|
+
// Threshold raised from 60s → 5min because a 60s-old lock is not
|
|
1008
|
+
// definitively stale: `git gc --auto` triggered by a heavy commit, NFS
|
|
1009
|
+
// delays, or concurrent worktree writes can hold .git/index.lock for
|
|
1010
|
+
// minutes on large repos. Force-removing a live lock causes the holder
|
|
1011
|
+
// to encounter `fatal: Unable to create '.git/index.lock'` on its next
|
|
1012
|
+
// write, or worse, operate on a partially-written index → corruption
|
|
1013
|
+
// requiring `git fsck`/`git reset` to recover.
|
|
1014
|
+
// (Issue #4980 CRIT-3)
|
|
917
1015
|
try {
|
|
918
1016
|
const gitLockFile = join(base, ".git", "index.lock");
|
|
919
1017
|
if (existsSync(gitLockFile)) {
|
|
920
1018
|
const lockAge = Date.now() - statSync(gitLockFile).mtimeMs;
|
|
921
|
-
|
|
1019
|
+
const STALE_GIT_LOCK_THRESHOLD_MS = 5 * 60_000;
|
|
1020
|
+
if (lockAge > STALE_GIT_LOCK_THRESHOLD_MS) {
|
|
922
1021
|
unlinkSync(gitLockFile);
|
|
923
1022
|
ctx.ui.notify(
|
|
924
|
-
|
|
925
|
-
"
|
|
1023
|
+
`Removed stale .git/index.lock (age ${Math.round(lockAge / 1000)}s, > 5min threshold).`,
|
|
1024
|
+
"warning",
|
|
926
1025
|
);
|
|
1026
|
+
} else {
|
|
1027
|
+
// Lock present but not yet stale — surface so the user knows why
|
|
1028
|
+
// git ops may be queueing instead of silently waiting.
|
|
1029
|
+
debugLog("git-lock-present-not-stale", {
|
|
1030
|
+
ageMs: lockAge,
|
|
1031
|
+
thresholdMs: STALE_GIT_LOCK_THRESHOLD_MS,
|
|
1032
|
+
});
|
|
927
1033
|
}
|
|
928
1034
|
}
|
|
929
1035
|
} catch (e) {
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
} from "./auto-recovery.js";
|
|
19
19
|
import { existsSync } from "node:fs";
|
|
20
20
|
|
|
21
|
-
import {
|
|
21
|
+
import { bumpAndResolveSynthetic } from "./auto/resolve.js";
|
|
22
22
|
|
|
23
23
|
export interface RecoveryContext {
|
|
24
24
|
basePath: string;
|
|
@@ -35,6 +35,13 @@ export async function recoverTimedOutUnit(
|
|
|
35
35
|
reason: "idle" | "hard",
|
|
36
36
|
rctx: RecoveryContext,
|
|
37
37
|
): Promise<"recovered" | "paused"> {
|
|
38
|
+
// Note on turn epoch: the bump is intentionally NOT unconditional at
|
|
39
|
+
// function entry. Two branches below (the "steering retry" paths) keep
|
|
40
|
+
// the same LLM turn alive and let it try again — they must NOT bump,
|
|
41
|
+
// otherwise the retry's legitimate writes get marked stale and drop.
|
|
42
|
+
// Each advance branch calls `bumpAndResolveSynthetic` to bump+resolve
|
|
43
|
+
// atomically. Search for that helper to find all supersede sites.
|
|
44
|
+
|
|
38
45
|
const { basePath, verbose, currentUnitStartedAt, unitRecoveryCount } = rctx;
|
|
39
46
|
|
|
40
47
|
const runtime = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
@@ -74,7 +81,7 @@ export async function recoverTimedOutUnit(
|
|
|
74
81
|
"info",
|
|
75
82
|
);
|
|
76
83
|
unitRecoveryCount.delete(recoveryKey);
|
|
77
|
-
|
|
84
|
+
bumpAndResolveSynthetic(`timeout-recovery:${reason}:${unitType}/${unitId}`);
|
|
78
85
|
return "recovered";
|
|
79
86
|
}
|
|
80
87
|
|
|
@@ -145,7 +152,7 @@ export async function recoverTimedOutUnit(
|
|
|
145
152
|
"warning",
|
|
146
153
|
);
|
|
147
154
|
unitRecoveryCount.delete(recoveryKey);
|
|
148
|
-
|
|
155
|
+
bumpAndResolveSynthetic(`timeout-recovery:${reason}:${unitType}/${unitId}`);
|
|
149
156
|
return "recovered";
|
|
150
157
|
}
|
|
151
158
|
|
|
@@ -179,7 +186,7 @@ export async function recoverTimedOutUnit(
|
|
|
179
186
|
"info",
|
|
180
187
|
);
|
|
181
188
|
unitRecoveryCount.delete(recoveryKey);
|
|
182
|
-
|
|
189
|
+
bumpAndResolveSynthetic(`timeout-recovery:${reason}:${unitType}/${unitId}`);
|
|
183
190
|
return "recovered";
|
|
184
191
|
}
|
|
185
192
|
|
|
@@ -265,7 +272,7 @@ export async function recoverTimedOutUnit(
|
|
|
265
272
|
"warning",
|
|
266
273
|
);
|
|
267
274
|
unitRecoveryCount.delete(recoveryKey);
|
|
268
|
-
|
|
275
|
+
bumpAndResolveSynthetic(`timeout-recovery:${reason}:${unitType}/${unitId}`);
|
|
269
276
|
return "recovered";
|
|
270
277
|
}
|
|
271
278
|
|
|
@@ -87,20 +87,21 @@ export function clearInFlightTools(): void {
|
|
|
87
87
|
// ─── Tool invocation error classification (#2883) ────────────────────────
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
* Patterns that indicate a tool invocation failed
|
|
91
|
-
*
|
|
92
|
-
* handler. When these errors occur, retrying the same unit will
|
|
93
|
-
* failure, so the retry loop must be broken.
|
|
90
|
+
* Patterns that indicate a tool invocation failed deterministically before
|
|
91
|
+
* useful work could be completed — as opposed to a normal business-logic error
|
|
92
|
+
* from the tool handler. When these errors occur, retrying the same unit will
|
|
93
|
+
* produce the same failure, so the retry loop must be broken.
|
|
94
94
|
*/
|
|
95
95
|
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON/i;
|
|
96
|
+
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
96
97
|
|
|
97
98
|
/**
|
|
98
|
-
* Returns true if the error message indicates a
|
|
99
|
-
*
|
|
99
|
+
* Returns true if the error message indicates a deterministic invocation or
|
|
100
|
+
* policy failure (as opposed to a normal tool execution error).
|
|
100
101
|
*/
|
|
101
102
|
export function isToolInvocationError(errorMsg: string): boolean {
|
|
102
103
|
if (!errorMsg) return false;
|
|
103
|
-
return TOOL_INVOCATION_ERROR_RE.test(errorMsg);
|
|
104
|
+
return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
/**
|
|
@@ -112,3 +113,46 @@ export function isQueuedUserMessageSkip(errorMsg: string): boolean {
|
|
|
112
113
|
if (!errorMsg) return false;
|
|
113
114
|
return /^Skipped due to queued user message\.?$/i.test(errorMsg.trim());
|
|
114
115
|
}
|
|
116
|
+
|
|
117
|
+
// ─── Deterministic policy error classification (#4973, #4974) ──────────────
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Known deterministic policy error substrings. Each entry is a stable string
|
|
121
|
+
* that will appear in the tool error text content when the corresponding
|
|
122
|
+
* policy gate fires. Retrying these errors will always produce the same outcome.
|
|
123
|
+
*
|
|
124
|
+
* Add new entries here as new deterministic gates are introduced. Do NOT use
|
|
125
|
+
* regex — explicit substrings keep the list auditable.
|
|
126
|
+
*/
|
|
127
|
+
export const DETERMINISTIC_POLICY_ERROR_STRINGS = [
|
|
128
|
+
// gsd_summary_save write-gate: CONTEXT artifact blocked pending depth verification (#4973).
|
|
129
|
+
// Matches the fallback text in workflow-tool-executors.ts and the verbose reason
|
|
130
|
+
// from shouldBlockContextArtifactSaveInSnapshot at write-gate.ts:432-442.
|
|
131
|
+
"context write blocked",
|
|
132
|
+
"CONTEXT without depth verification",
|
|
133
|
+
// Raw write tool gate (#4973): shouldBlockContextWrite at write-gate.ts:390-399 emits
|
|
134
|
+
// "Cannot write to milestone CONTEXT.md without depth verification." for direct
|
|
135
|
+
// write tool calls to *-CONTEXT.md paths (different code path than gsd_summary_save).
|
|
136
|
+
"CONTEXT.md without depth verification",
|
|
137
|
+
] as const;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Returns true if the error message indicates a deterministic policy gate
|
|
141
|
+
* blocked the tool call before execution. Retrying the same unit without
|
|
142
|
+
* changing behavior will hit the same gate, so auto-mode should pause instead
|
|
143
|
+
* of re-dispatching.
|
|
144
|
+
*
|
|
145
|
+
* Combines the regex-based gate set from #4974 (HARD BLOCK / queue planning /
|
|
146
|
+
* STATE.md / mechanical gate) and the substring-based set from #4973 (context
|
|
147
|
+
* write block / CONTEXT depth verification). Both branches landed on main
|
|
148
|
+
* independently and their parallel `isDeterministicPolicyError` declarations
|
|
149
|
+
* were not deduplicated at merge — this consolidated form preserves both
|
|
150
|
+
* matchers under a single export.
|
|
151
|
+
*/
|
|
152
|
+
export function isDeterministicPolicyError(errorMsg: string): boolean {
|
|
153
|
+
if (!errorMsg) return false;
|
|
154
|
+
return (
|
|
155
|
+
DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg) ||
|
|
156
|
+
DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s))
|
|
157
|
+
);
|
|
158
|
+
}
|