gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0
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 +35 -59
- package/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
- package/dist/resources/extensions/gsd/auto/phases.js +282 -132
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
- package/dist/resources/extensions/gsd/auto/session.js +9 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +112 -78
- package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
- package/dist/resources/extensions/gsd/auto-start.js +252 -14
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
- package/dist/resources/extensions/gsd/auto.js +264 -86
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +73 -5
- package/dist/resources/extensions/gsd/gsd-db.js +46 -13
- package/dist/resources/extensions/gsd/guided-flow.js +119 -42
- package/dist/resources/extensions/gsd/health-widget.js +3 -0
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
- package/dist/resources/extensions/gsd/tool-contract.js +50 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- 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 +14 -14
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +9 -2
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +43 -11
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +31 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +52 -11
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +26 -10
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/types.ts +3 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
- 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-tool-refresh.test.js +30 -1
- 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 +21 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -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 +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -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 +6 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
- 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/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- 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/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
- 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 +155 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -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 +25 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +18 -8
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +7 -0
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -11
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
- package/src/resources/extensions/gsd/auto/phases.ts +393 -200
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
- package/src/resources/extensions/gsd/auto/session.ts +9 -1
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +124 -80
- package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
- package/src/resources/extensions/gsd/auto-start.ts +319 -19
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
- package/src/resources/extensions/gsd/auto.ts +324 -88
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +87 -10
- package/src/resources/extensions/gsd/gsd-db.ts +50 -13
- package/src/resources/extensions/gsd/guided-flow.ts +148 -49
- package/src/resources/extensions/gsd/health-widget.ts +3 -0
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +543 -40
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-loop pipeline phases, merge closeout, and finalize handling.
|
|
1
3
|
/**
|
|
2
4
|
* auto/phases.ts — Pipeline phases for the auto-loop.
|
|
3
5
|
*
|
|
@@ -50,13 +52,14 @@ import {
|
|
|
50
52
|
} from "../workflow-logger.js";
|
|
51
53
|
import { gsdRoot } from "../paths.js";
|
|
52
54
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
53
|
-
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
|
|
55
|
+
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
54
56
|
import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
55
57
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
56
58
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
57
59
|
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
58
|
-
import { isDbAvailable, getMilestoneSlices
|
|
60
|
+
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
59
61
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
62
|
+
import type { PostflightResult, PreflightResult } from "../clean-root-preflight.js";
|
|
60
63
|
import { ensurePlanV2Graph, isEmptyPlanV2GraphResult, isMissingFinalizedContextResult } from "../uok/plan-v2.js";
|
|
61
64
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
62
65
|
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
@@ -69,6 +72,8 @@ import {
|
|
|
69
72
|
getRequiredWorkflowToolsForAutoUnit,
|
|
70
73
|
supportsStructuredQuestions,
|
|
71
74
|
} from "../workflow-mcp.js";
|
|
75
|
+
import { resolveManifest } from "../unit-context-manifest.js";
|
|
76
|
+
import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
|
|
72
77
|
|
|
73
78
|
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
74
79
|
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
@@ -76,10 +81,111 @@ function isSamePathLocal(a: string, b: string): boolean {
|
|
|
76
81
|
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
77
82
|
}
|
|
78
83
|
|
|
79
|
-
function
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
export function shouldDegradeEmptyWorktreeToProjectRoot(
|
|
85
|
+
worktreeClassification: ReturnType<typeof classifyProject>,
|
|
86
|
+
projectRootClassification: ReturnType<typeof classifyProject>,
|
|
87
|
+
): boolean {
|
|
88
|
+
return (
|
|
89
|
+
worktreeClassification.kind === "greenfield" &&
|
|
90
|
+
projectRootClassification.kind !== "greenfield" &&
|
|
91
|
+
projectRootClassification.kind !== "invalid-repo"
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function unitWritesSource(unitType: string): boolean | null {
|
|
96
|
+
const manifest = resolveManifest(unitType);
|
|
97
|
+
if (!manifest) return null;
|
|
98
|
+
return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
102
|
+
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function resolveEmptyWorktreeWithProjectContent(
|
|
106
|
+
unitRoot: string,
|
|
107
|
+
projectRoot: string,
|
|
108
|
+
): boolean {
|
|
109
|
+
if (isSamePathLocal(unitRoot, projectRoot)) return false;
|
|
110
|
+
const worktreeClassification = classifyProject(unitRoot);
|
|
111
|
+
if (worktreeClassification.kind !== "greenfield") return false;
|
|
112
|
+
const projectRootClassification = classifyProject(projectRoot);
|
|
113
|
+
return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function validateSourceWriteWorktreeSafety(
|
|
117
|
+
ic: IterationContext,
|
|
118
|
+
unitType: string,
|
|
119
|
+
unitId: string,
|
|
120
|
+
milestoneId: string | undefined,
|
|
121
|
+
phase: string,
|
|
122
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
123
|
+
const { ctx, pi, s, deps } = ic;
|
|
124
|
+
if (!s.basePath) return null;
|
|
125
|
+
|
|
126
|
+
// Custom engine workflows (graph-driven, registered via run dirs) define
|
|
127
|
+
// their own step ids that are not in the GSD UnitContextManifest. Don't
|
|
128
|
+
// fail closed for those — the custom engine owns its own dispatch
|
|
129
|
+
// contract. The fail-closed safety check applies only to built-in GSD
|
|
130
|
+
// units whose Tool Contract is registered in the manifest. Use a truthy
|
|
131
|
+
// check so undefined (test sessions that never set the field) routes
|
|
132
|
+
// through the safety check, matching the regression test contract.
|
|
133
|
+
if (s.activeEngineId) return null;
|
|
134
|
+
|
|
135
|
+
const writesSource = unitWritesSource(unitType);
|
|
136
|
+
if (writesSource === null) {
|
|
137
|
+
const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
|
|
138
|
+
debugLog("worktreeSafety", {
|
|
139
|
+
phase,
|
|
140
|
+
unitType,
|
|
141
|
+
unitId,
|
|
142
|
+
milestoneId,
|
|
143
|
+
result: { ok: false, kind: "missing-tool-contract", reason: msg },
|
|
144
|
+
basePath: s.basePath,
|
|
145
|
+
});
|
|
146
|
+
ctx.ui.notify(msg, "error");
|
|
147
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
148
|
+
return { action: "break", reason: "missing-tool-contract" };
|
|
149
|
+
}
|
|
150
|
+
if (!writesSource) return null;
|
|
151
|
+
|
|
152
|
+
const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
153
|
+
if (deps.getIsolationMode(projectRoot) !== "worktree") return null;
|
|
154
|
+
|
|
155
|
+
const safety = createWorktreeSafetyModule();
|
|
156
|
+
const result = safety.validateUnitRoot({
|
|
157
|
+
unitType,
|
|
158
|
+
unitId,
|
|
159
|
+
writeScope: "source-writing",
|
|
160
|
+
projectRoot,
|
|
161
|
+
unitRoot: s.basePath,
|
|
162
|
+
milestoneId,
|
|
163
|
+
expectedBranch: milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
|
|
164
|
+
emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
|
|
165
|
+
lease: s.workerId
|
|
166
|
+
? {
|
|
167
|
+
required: true,
|
|
168
|
+
held: s.currentMilestoneId === milestoneId && s.milestoneLeaseToken !== null,
|
|
169
|
+
owner: s.workerId,
|
|
170
|
+
}
|
|
171
|
+
: undefined,
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
if (result.ok) return null;
|
|
175
|
+
|
|
176
|
+
const msg = formatWorktreeSafetyFailure(result);
|
|
177
|
+
debugLog("worktreeSafety", {
|
|
178
|
+
phase,
|
|
179
|
+
unitType,
|
|
180
|
+
unitId,
|
|
181
|
+
milestoneId,
|
|
182
|
+
result,
|
|
183
|
+
basePath: s.basePath,
|
|
184
|
+
projectRoot,
|
|
185
|
+
});
|
|
186
|
+
ctx.ui.notify(msg, "error");
|
|
187
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
188
|
+
return { action: "break", reason: result.kind };
|
|
83
189
|
}
|
|
84
190
|
|
|
85
191
|
// ─── Session timeout auto-resume state ────────────────────────────────────────
|
|
@@ -120,10 +226,23 @@ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
|
|
|
120
226
|
"completing-milestone",
|
|
121
227
|
]);
|
|
122
228
|
|
|
123
|
-
function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
229
|
+
export function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
124
230
|
return PLAN_V2_GATE_PHASES.has(phase);
|
|
125
231
|
}
|
|
126
232
|
|
|
233
|
+
export function _shouldProceedWithInvalidRepoClassificationForTest(
|
|
234
|
+
reason: string | undefined,
|
|
235
|
+
hasGit: boolean,
|
|
236
|
+
): boolean {
|
|
237
|
+
return reason === "missing .git" && hasGit;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function _resolveCurrentUnitStartedAtForTest(
|
|
241
|
+
currentUnit: { startedAt: number } | null | undefined,
|
|
242
|
+
): number | undefined {
|
|
243
|
+
return currentUnit?.startedAt;
|
|
244
|
+
}
|
|
245
|
+
|
|
127
246
|
/**
|
|
128
247
|
* Generate and write an HTML milestone report snapshot.
|
|
129
248
|
* Extracted from the milestone-transition block in autoLoop.
|
|
@@ -215,6 +334,136 @@ async function closeoutAndStop(
|
|
|
215
334
|
await deps.stopAuto(ctx, pi, reason);
|
|
216
335
|
}
|
|
217
336
|
|
|
337
|
+
async function stopOnPostflightRecoveryNeeded(
|
|
338
|
+
ic: IterationContext,
|
|
339
|
+
result: PostflightResult,
|
|
340
|
+
milestoneId: string,
|
|
341
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
342
|
+
if (!result.needsManualRecovery) return null;
|
|
343
|
+
const { ctx, pi, deps } = ic;
|
|
344
|
+
const reason = `Post-merge stash restore failed for milestone ${milestoneId}`;
|
|
345
|
+
ctx.ui.notify(
|
|
346
|
+
`${reason}. Resolve the working tree before resuming auto-mode. ${result.message}`,
|
|
347
|
+
"error",
|
|
348
|
+
);
|
|
349
|
+
await deps.stopAuto(ctx, pi, reason);
|
|
350
|
+
return { action: "break", reason: "postflight-stash-restore-failed" };
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function restorePreflightStashOrStop(
|
|
354
|
+
ic: IterationContext,
|
|
355
|
+
preflight: PreflightResult,
|
|
356
|
+
milestoneId: string,
|
|
357
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
358
|
+
if (!preflight.stashPushed) return null;
|
|
359
|
+
const { ctx, s, deps } = ic;
|
|
360
|
+
const result = deps.postflightPopStash(
|
|
361
|
+
s.originalBasePath || s.basePath,
|
|
362
|
+
milestoneId,
|
|
363
|
+
preflight.stashMarker,
|
|
364
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
365
|
+
);
|
|
366
|
+
return stopOnPostflightRecoveryNeeded(ic, result, milestoneId);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Run a milestone merge surrounded by preflight stash + always-on postflight
|
|
371
|
+
* pop. The previous code popped the stash only after a successful merge, which
|
|
372
|
+
* leaked `gsd-preflight-stash:M00x:*` entries whenever `mergeAndExit` threw —
|
|
373
|
+
* leaving the user's pre-merge working tree silently stashed away after a
|
|
374
|
+
* merge-conflict or other merge error. This helper restores the stash on
|
|
375
|
+
* every exit path, then surfaces the merge or stash failure (in priority
|
|
376
|
+
* order) as the loop's stop reason.
|
|
377
|
+
*
|
|
378
|
+
* Returns a `break` action when auto-mode must stop, or `null` when the merge
|
|
379
|
+
* succeeded and the stash (if any) was restored cleanly.
|
|
380
|
+
*/
|
|
381
|
+
export async function _runMilestoneMergeWithStashRestore(
|
|
382
|
+
ic: IterationContext,
|
|
383
|
+
milestoneId: string,
|
|
384
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
385
|
+
const { ctx, pi, s, deps } = ic;
|
|
386
|
+
|
|
387
|
+
const preflight = deps.preflightCleanRoot(
|
|
388
|
+
s.originalBasePath || s.basePath,
|
|
389
|
+
milestoneId,
|
|
390
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
391
|
+
);
|
|
392
|
+
|
|
393
|
+
let mergeError: unknown = null;
|
|
394
|
+
const exitResult = deps.lifecycle.exitMilestone(
|
|
395
|
+
milestoneId,
|
|
396
|
+
{ merge: true },
|
|
397
|
+
ctx.ui,
|
|
398
|
+
);
|
|
399
|
+
if (exitResult.ok) {
|
|
400
|
+
s.milestoneMergedInPhases = true;
|
|
401
|
+
} else {
|
|
402
|
+
mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// Always attempt to restore the stashed working tree, even on merge error.
|
|
406
|
+
// postflightPopStash itself does not throw; failures surface via the
|
|
407
|
+
// PostflightResult.needsManualRecovery flag.
|
|
408
|
+
let stashResult: PostflightResult | null = null;
|
|
409
|
+
if (preflight.stashPushed) {
|
|
410
|
+
stashResult = deps.postflightPopStash(
|
|
411
|
+
s.originalBasePath || s.basePath,
|
|
412
|
+
milestoneId,
|
|
413
|
+
preflight.stashMarker,
|
|
414
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Merge failure takes priority over stash recovery — the merge is the
|
|
419
|
+
// authoritative gate. If the stash also needed manual recovery, the user
|
|
420
|
+
// already saw the postflightPopStash notify above.
|
|
421
|
+
if (mergeError) {
|
|
422
|
+
if (mergeError instanceof MergeConflictError) {
|
|
423
|
+
ctx.ui.notify(
|
|
424
|
+
`Merge conflict: ${mergeError.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
425
|
+
"error",
|
|
426
|
+
);
|
|
427
|
+
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${milestoneId}`);
|
|
428
|
+
return { action: "break", reason: "merge-conflict" };
|
|
429
|
+
}
|
|
430
|
+
logError("engine", "Milestone merge failed with non-conflict error", {
|
|
431
|
+
milestone: milestoneId,
|
|
432
|
+
error: String(mergeError),
|
|
433
|
+
});
|
|
434
|
+
ctx.ui.notify(
|
|
435
|
+
`Merge failed: ${mergeError instanceof Error ? mergeError.message : String(mergeError)}. Resolve and run /gsd auto to resume.`,
|
|
436
|
+
"error",
|
|
437
|
+
);
|
|
438
|
+
await deps.stopAuto(
|
|
439
|
+
ctx,
|
|
440
|
+
pi,
|
|
441
|
+
`Merge error on milestone ${milestoneId}: ${String(mergeError)}`,
|
|
442
|
+
);
|
|
443
|
+
return { action: "break", reason: "merge-failed" };
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
if (stashResult) {
|
|
447
|
+
return stopOnPostflightRecoveryNeeded(ic, stashResult, milestoneId);
|
|
448
|
+
}
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export async function _runMilestoneMergeOnceWithStashRestore(
|
|
453
|
+
ic: IterationContext,
|
|
454
|
+
milestoneId: string,
|
|
455
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
456
|
+
if (ic.s.milestoneMergedInPhases) {
|
|
457
|
+
debugLog("autoLoop", {
|
|
458
|
+
phase: "milestone-merge-skip",
|
|
459
|
+
reason: "already-merged-in-phases",
|
|
460
|
+
milestoneId,
|
|
461
|
+
});
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
return _runMilestoneMergeWithStashRestore(ic, milestoneId);
|
|
465
|
+
}
|
|
466
|
+
|
|
218
467
|
async function emitCancelledUnitEnd(
|
|
219
468
|
ic: IterationContext,
|
|
220
469
|
unitType: string,
|
|
@@ -442,13 +691,10 @@ export async function runPreDispatch(
|
|
|
442
691
|
if (
|
|
443
692
|
s.originalBasePath &&
|
|
444
693
|
!isSamePathLocal(s.basePath, s.originalBasePath) &&
|
|
445
|
-
s.currentMilestoneId
|
|
694
|
+
s.currentMilestoneId &&
|
|
695
|
+
s.scope
|
|
446
696
|
) {
|
|
447
|
-
deps.
|
|
448
|
-
s.originalBasePath,
|
|
449
|
-
s.basePath,
|
|
450
|
-
s.currentMilestoneId,
|
|
451
|
-
);
|
|
697
|
+
deps.worktreeProjection.projectRootToWorktree(s.scope);
|
|
452
698
|
}
|
|
453
699
|
|
|
454
700
|
// Derive state — use canonical project root so the cache key is stable
|
|
@@ -651,42 +897,11 @@ export async function runPreDispatch(
|
|
|
651
897
|
loopState.recentUnits.length = 0;
|
|
652
898
|
loopState.stuckRecoveryAttempts = 0;
|
|
653
899
|
|
|
654
|
-
// Worktree lifecycle on milestone transition — merge current, enter next
|
|
655
|
-
// #2909: preflight
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
660
|
-
);
|
|
661
|
-
try {
|
|
662
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId!, ctx.ui);
|
|
663
|
-
} catch (mergeErr) {
|
|
664
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
665
|
-
// Real code conflicts — stop the loop instead of retrying forever (#2330)
|
|
666
|
-
ctx.ui.notify(
|
|
667
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
668
|
-
"error",
|
|
669
|
-
);
|
|
670
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
671
|
-
return { action: "break", reason: "merge-conflict" };
|
|
672
|
-
}
|
|
673
|
-
// Non-conflict merge errors — stop auto to avoid advancing with unmerged work
|
|
674
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
675
|
-
ctx.ui.notify(
|
|
676
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
677
|
-
"error",
|
|
678
|
-
);
|
|
679
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
680
|
-
return { action: "break", reason: "merge-failed" };
|
|
681
|
-
}
|
|
682
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
683
|
-
if (preflightTransition.stashPushed) {
|
|
684
|
-
deps.postflightPopStash(
|
|
685
|
-
s.originalBasePath || s.basePath,
|
|
686
|
-
s.currentMilestoneId!,
|
|
687
|
-
preflightTransition.stashMarker,
|
|
688
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
689
|
-
);
|
|
900
|
+
// Worktree lifecycle on milestone transition — merge current, enter next.
|
|
901
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
902
|
+
{
|
|
903
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId!);
|
|
904
|
+
if (stop) return stop;
|
|
690
905
|
}
|
|
691
906
|
|
|
692
907
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
@@ -701,7 +916,17 @@ export async function runPreDispatch(
|
|
|
701
916
|
if (deps.getIsolationMode(s.basePath) !== "none") {
|
|
702
917
|
deps.captureIntegrationBranch(s.basePath, mid);
|
|
703
918
|
}
|
|
704
|
-
deps.
|
|
919
|
+
const enterResult = deps.lifecycle.enterMilestone(mid, ctx.ui);
|
|
920
|
+
if (!enterResult.ok) {
|
|
921
|
+
ctx.ui.notify(
|
|
922
|
+
`Milestone transition stopped: failed to enter ${mid} (${enterResult.reason}).`,
|
|
923
|
+
"error",
|
|
924
|
+
);
|
|
925
|
+
if (enterResult.reason === "lease-conflict") {
|
|
926
|
+
await deps.pauseAuto(ctx, pi);
|
|
927
|
+
}
|
|
928
|
+
return { action: "break", reason: "milestone-enter-failed" };
|
|
929
|
+
}
|
|
705
930
|
} else {
|
|
706
931
|
// mid is undefined — no milestone to capture integration branch for
|
|
707
932
|
}
|
|
@@ -764,45 +989,11 @@ export async function runPreDispatch(
|
|
|
764
989
|
m.status !== "complete" && m.status !== "parked",
|
|
765
990
|
);
|
|
766
991
|
if (incomplete.length === 0 && state.registry.length > 0) {
|
|
767
|
-
// All milestones complete — merge milestone branch before stopping
|
|
992
|
+
// All milestones complete — merge milestone branch before stopping.
|
|
768
993
|
if (s.currentMilestoneId) {
|
|
769
|
-
// #2909: preflight
|
|
770
|
-
const
|
|
771
|
-
|
|
772
|
-
s.currentMilestoneId,
|
|
773
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
774
|
-
);
|
|
775
|
-
try {
|
|
776
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
777
|
-
// Prevent stopAuto from attempting the same merge (#2645)
|
|
778
|
-
s.milestoneMergedInPhases = true;
|
|
779
|
-
} catch (mergeErr) {
|
|
780
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
781
|
-
ctx.ui.notify(
|
|
782
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
783
|
-
"error",
|
|
784
|
-
);
|
|
785
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
786
|
-
return { action: "break", reason: "merge-conflict" };
|
|
787
|
-
}
|
|
788
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
789
|
-
ctx.ui.notify(
|
|
790
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
791
|
-
"error",
|
|
792
|
-
);
|
|
793
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
794
|
-
return { action: "break", reason: "merge-failed" };
|
|
795
|
-
}
|
|
796
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
797
|
-
if (preflightAllComplete.stashPushed) {
|
|
798
|
-
deps.postflightPopStash(
|
|
799
|
-
s.originalBasePath || s.basePath,
|
|
800
|
-
s.currentMilestoneId,
|
|
801
|
-
preflightAllComplete.stashMarker,
|
|
802
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
803
|
-
);
|
|
804
|
-
}
|
|
805
|
-
|
|
994
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
995
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
996
|
+
if (stop) return stop;
|
|
806
997
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
807
998
|
}
|
|
808
999
|
deps.sendDesktopNotification(
|
|
@@ -893,45 +1084,11 @@ export async function runPreDispatch(
|
|
|
893
1084
|
|
|
894
1085
|
// Terminal: complete
|
|
895
1086
|
if (state.phase === "complete") {
|
|
896
|
-
// Milestone merge on complete (before closeout so branch state is clean)
|
|
1087
|
+
// Milestone merge on complete (before closeout so branch state is clean).
|
|
897
1088
|
if (s.currentMilestoneId) {
|
|
898
|
-
// #2909: preflight
|
|
899
|
-
const
|
|
900
|
-
|
|
901
|
-
s.currentMilestoneId,
|
|
902
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
903
|
-
);
|
|
904
|
-
try {
|
|
905
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
906
|
-
// Prevent stopAuto from attempting the same merge (#2645)
|
|
907
|
-
s.milestoneMergedInPhases = true;
|
|
908
|
-
} catch (mergeErr) {
|
|
909
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
910
|
-
ctx.ui.notify(
|
|
911
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
912
|
-
"error",
|
|
913
|
-
);
|
|
914
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
915
|
-
return { action: "break", reason: "merge-conflict" };
|
|
916
|
-
}
|
|
917
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
918
|
-
ctx.ui.notify(
|
|
919
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
920
|
-
"error",
|
|
921
|
-
);
|
|
922
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
923
|
-
return { action: "break", reason: "merge-failed" };
|
|
924
|
-
}
|
|
925
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
926
|
-
if (preflightComplete.stashPushed) {
|
|
927
|
-
deps.postflightPopStash(
|
|
928
|
-
s.originalBasePath || s.basePath,
|
|
929
|
-
s.currentMilestoneId,
|
|
930
|
-
preflightComplete.stashMarker,
|
|
931
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
932
|
-
);
|
|
933
|
-
}
|
|
934
|
-
|
|
1089
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
1090
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
1091
|
+
if (stop) return stop;
|
|
935
1092
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
936
1093
|
}
|
|
937
1094
|
deps.sendDesktopNotification(
|
|
@@ -1054,6 +1211,58 @@ export async function runDispatch(
|
|
|
1054
1211
|
let prompt = dispatchResult.prompt;
|
|
1055
1212
|
const pauseAfterUatDispatch = dispatchResult.pauseAfterDispatch ?? false;
|
|
1056
1213
|
|
|
1214
|
+
// Resolve hooks and prior-slice gating before health/stuck accounting so
|
|
1215
|
+
// those checks run against the final dispatch unit.
|
|
1216
|
+
const preDispatchResult = deps.runPreDispatchHooks(
|
|
1217
|
+
unitType,
|
|
1218
|
+
unitId,
|
|
1219
|
+
prompt,
|
|
1220
|
+
s.basePath,
|
|
1221
|
+
);
|
|
1222
|
+
if (preDispatchResult.firedHooks.length > 0) {
|
|
1223
|
+
ctx.ui.notify(
|
|
1224
|
+
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
1225
|
+
"info",
|
|
1226
|
+
);
|
|
1227
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
1228
|
+
}
|
|
1229
|
+
if (preDispatchResult.action === "skip") {
|
|
1230
|
+
ctx.ui.notify(
|
|
1231
|
+
`Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
|
|
1232
|
+
"info",
|
|
1233
|
+
);
|
|
1234
|
+
await new Promise((r) => setImmediate(r));
|
|
1235
|
+
return { action: "continue" };
|
|
1236
|
+
}
|
|
1237
|
+
if (preDispatchResult.action === "replace") {
|
|
1238
|
+
prompt = preDispatchResult.prompt ?? prompt;
|
|
1239
|
+
if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
|
|
1240
|
+
} else if (preDispatchResult.prompt) {
|
|
1241
|
+
prompt = preDispatchResult.prompt;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1245
|
+
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1246
|
+
guardBasePath,
|
|
1247
|
+
deps.getMainBranch(guardBasePath),
|
|
1248
|
+
unitType,
|
|
1249
|
+
unitId,
|
|
1250
|
+
);
|
|
1251
|
+
if (priorSliceBlocker) {
|
|
1252
|
+
await deps.stopAuto(ctx, pi, priorSliceBlocker);
|
|
1253
|
+
debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
|
|
1254
|
+
return { action: "break", reason: "prior-slice-blocker" };
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
|
|
1258
|
+
ic,
|
|
1259
|
+
unitType,
|
|
1260
|
+
unitId,
|
|
1261
|
+
mid,
|
|
1262
|
+
"pre-dispatch",
|
|
1263
|
+
);
|
|
1264
|
+
if (worktreeSafetyBlock) return worktreeSafetyBlock;
|
|
1265
|
+
|
|
1057
1266
|
// ── Sliding-window stuck detection with graduated recovery ──
|
|
1058
1267
|
const derivedKey = `${unitType}/${unitId}`;
|
|
1059
1268
|
|
|
@@ -1100,17 +1309,24 @@ export async function runDispatch(
|
|
|
1100
1309
|
level: 1,
|
|
1101
1310
|
action: "artifact-found",
|
|
1102
1311
|
});
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
"info",
|
|
1106
|
-
);
|
|
1107
|
-
if (!refreshPlanSliceRecoveryDbIfNeeded(unitType)) {
|
|
1312
|
+
const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId);
|
|
1313
|
+
if (!recoveryDb.ok) {
|
|
1108
1314
|
ctx.ui.notify(
|
|
1109
|
-
|
|
1315
|
+
recoveryDb.fatal
|
|
1316
|
+
? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
|
|
1317
|
+
: `${recoveryDb.message} Keeping stuck state for retry.`,
|
|
1110
1318
|
"warning",
|
|
1111
1319
|
);
|
|
1320
|
+
if (recoveryDb.fatal) {
|
|
1321
|
+
await deps.pauseAuto(ctx, pi);
|
|
1322
|
+
return { action: "break", reason: recoveryDb.reason };
|
|
1323
|
+
}
|
|
1112
1324
|
return { action: "continue" };
|
|
1113
1325
|
}
|
|
1326
|
+
ctx.ui.notify(
|
|
1327
|
+
`Stuck recovery: artifact for ${unitType} ${unitId} found on disk. Invalidating caches.`,
|
|
1328
|
+
"info",
|
|
1329
|
+
);
|
|
1114
1330
|
deps.invalidateAllCaches();
|
|
1115
1331
|
loopState.recentUnits.length = 0;
|
|
1116
1332
|
loopState.stuckRecoveryAttempts = 0;
|
|
@@ -1135,19 +1351,26 @@ export async function runDispatch(
|
|
|
1135
1351
|
level: 2,
|
|
1136
1352
|
action: "artifact-found",
|
|
1137
1353
|
});
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1354
|
+
const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId);
|
|
1355
|
+
if (recoveryDb.ok) {
|
|
1356
|
+
ctx.ui.notify(
|
|
1357
|
+
`Stuck recovery: artifact for ${unitType} ${unitId} found on disk after cache invalidation. Continuing.`,
|
|
1358
|
+
"info",
|
|
1359
|
+
);
|
|
1143
1360
|
loopState.recentUnits.length = 0;
|
|
1144
1361
|
loopState.stuckRecoveryAttempts = 0;
|
|
1145
1362
|
return { action: "continue" };
|
|
1146
1363
|
}
|
|
1147
1364
|
ctx.ui.notify(
|
|
1148
|
-
|
|
1365
|
+
recoveryDb.fatal
|
|
1366
|
+
? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
|
|
1367
|
+
: `${recoveryDb.message} Stopping for manual recovery.`,
|
|
1149
1368
|
"warning",
|
|
1150
1369
|
);
|
|
1370
|
+
if (recoveryDb.fatal) {
|
|
1371
|
+
await deps.pauseAuto(ctx, pi);
|
|
1372
|
+
return { action: "break", reason: recoveryDb.reason };
|
|
1373
|
+
}
|
|
1151
1374
|
}
|
|
1152
1375
|
debugLog("autoLoop", {
|
|
1153
1376
|
phase: "stuck-detected",
|
|
@@ -1181,48 +1404,6 @@ export async function runDispatch(
|
|
|
1181
1404
|
}
|
|
1182
1405
|
}
|
|
1183
1406
|
|
|
1184
|
-
// Pre-dispatch hooks
|
|
1185
|
-
const preDispatchResult = deps.runPreDispatchHooks(
|
|
1186
|
-
unitType,
|
|
1187
|
-
unitId,
|
|
1188
|
-
prompt,
|
|
1189
|
-
s.basePath,
|
|
1190
|
-
);
|
|
1191
|
-
if (preDispatchResult.firedHooks.length > 0) {
|
|
1192
|
-
ctx.ui.notify(
|
|
1193
|
-
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
1194
|
-
"info",
|
|
1195
|
-
);
|
|
1196
|
-
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
1197
|
-
}
|
|
1198
|
-
if (preDispatchResult.action === "skip") {
|
|
1199
|
-
ctx.ui.notify(
|
|
1200
|
-
`Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
|
|
1201
|
-
"info",
|
|
1202
|
-
);
|
|
1203
|
-
await new Promise((r) => setImmediate(r));
|
|
1204
|
-
return { action: "continue" };
|
|
1205
|
-
}
|
|
1206
|
-
if (preDispatchResult.action === "replace") {
|
|
1207
|
-
prompt = preDispatchResult.prompt ?? prompt;
|
|
1208
|
-
if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
|
|
1209
|
-
} else if (preDispatchResult.prompt) {
|
|
1210
|
-
prompt = preDispatchResult.prompt;
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1214
|
-
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1215
|
-
guardBasePath,
|
|
1216
|
-
deps.getMainBranch(guardBasePath),
|
|
1217
|
-
unitType,
|
|
1218
|
-
unitId,
|
|
1219
|
-
);
|
|
1220
|
-
if (priorSliceBlocker) {
|
|
1221
|
-
await deps.stopAuto(ctx, pi, priorSliceBlocker);
|
|
1222
|
-
debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
|
|
1223
|
-
return { action: "break", reason: "prior-slice-blocker" };
|
|
1224
|
-
}
|
|
1225
|
-
|
|
1226
1407
|
return {
|
|
1227
1408
|
action: "next",
|
|
1228
1409
|
data: {
|
|
@@ -1483,28 +1664,26 @@ export async function runUnitPhase(
|
|
|
1483
1664
|
unitId,
|
|
1484
1665
|
});
|
|
1485
1666
|
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1667
|
+
const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
|
|
1668
|
+
ic,
|
|
1669
|
+
unitType,
|
|
1670
|
+
unitId,
|
|
1671
|
+
mid,
|
|
1672
|
+
"unit-execution",
|
|
1673
|
+
);
|
|
1674
|
+
if (worktreeSafetyBlock) return worktreeSafetyBlock;
|
|
1675
|
+
|
|
1676
|
+
// ── Project classification notice (#1833, #1843) ─────────────────────
|
|
1677
|
+
// Worktree Safety owns source-write root validity. Classification now only
|
|
1678
|
+
// shapes user/model guidance for valid roots.
|
|
1492
1679
|
let projectClassification: ReturnType<typeof classifyProject> | null = null;
|
|
1493
1680
|
if (s.basePath && unitType === "execute-task") {
|
|
1494
|
-
const gitMarker = join(s.basePath, ".git");
|
|
1495
|
-
const hasGit = deps.existsSync(gitMarker);
|
|
1496
|
-
if (!hasGit) {
|
|
1497
|
-
const msg = `Worktree health check failed: ${s.basePath} has no .git — refusing to dispatch ${unitType} ${unitId}`;
|
|
1498
|
-
debugLog("runUnitPhase", { phase: "worktree-health-fail", basePath: s.basePath, hasGit });
|
|
1499
|
-
ctx.ui.notify(msg, "error");
|
|
1500
|
-
await deps.stopAuto(ctx, pi, msg);
|
|
1501
|
-
return { action: "break", reason: "worktree-invalid" };
|
|
1502
|
-
}
|
|
1503
1681
|
projectClassification = classifyProject(s.basePath);
|
|
1504
1682
|
if (projectClassification.kind === "invalid-repo") {
|
|
1505
1683
|
const msg = `Worktree health check failed: ${s.basePath} classified as invalid-repo (${projectClassification.reason}) — refusing to dispatch ${unitType} ${unitId}`;
|
|
1506
1684
|
debugLog("runUnitPhase", { phase: "worktree-health-invalid-repo", basePath: s.basePath, classification: projectClassification });
|
|
1507
|
-
|
|
1685
|
+
const hasGit = deps.existsSync(join(s.basePath, ".git"));
|
|
1686
|
+
if (_shouldProceedWithInvalidRepoClassificationForTest(projectClassification.reason, hasGit)) {
|
|
1508
1687
|
ctx.ui.notify(
|
|
1509
1688
|
`Warning: ${s.basePath} project classification could not confirm .git; assuming it has no project content yet — proceeding as greenfield project because worktree health reported .git present`,
|
|
1510
1689
|
"warning",
|
|
@@ -1514,7 +1693,9 @@ export async function runUnitPhase(
|
|
|
1514
1693
|
await deps.stopAuto(ctx, pi, msg);
|
|
1515
1694
|
return { action: "break", reason: "worktree-invalid" };
|
|
1516
1695
|
}
|
|
1517
|
-
}
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1698
|
+
if (projectClassification.kind === "greenfield") {
|
|
1518
1699
|
debugLog("runUnitPhase", { phase: "worktree-health-greenfield", basePath: s.basePath, classification: projectClassification });
|
|
1519
1700
|
ctx.ui.notify(`Warning: ${s.basePath} has no project content yet — proceeding as greenfield project`, "warning");
|
|
1520
1701
|
} else if (projectClassification.kind === "untyped-existing") {
|
|
@@ -1996,7 +2177,7 @@ export async function runUnitPhase(
|
|
|
1996
2177
|
const currentLedger = deps.getLedger() as { units: Array<{ type: string; id: string; startedAt: number; toolCalls: number }> } | null;
|
|
1997
2178
|
if (currentLedger?.units) {
|
|
1998
2179
|
const lastUnit = [...currentLedger.units].reverse().find(
|
|
1999
|
-
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit
|
|
2180
|
+
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === _resolveCurrentUnitStartedAtForTest(s.currentUnit),
|
|
2000
2181
|
);
|
|
2001
2182
|
if (lastUnit && lastUnit.toolCalls === 0) {
|
|
2002
2183
|
if (USER_DRIVEN_DEEP_UNITS.has(unitType) && isAwaitingUserInput(s.lastUnitAgentEndMessages ?? undefined)) {
|
|
@@ -2018,7 +2199,7 @@ export async function runUnitPhase(
|
|
|
2018
2199
|
);
|
|
2019
2200
|
// Fall through to next iteration where dispatch will re-derive
|
|
2020
2201
|
// and re-dispatch this unit.
|
|
2021
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
2202
|
+
return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
2022
2203
|
}
|
|
2023
2204
|
}
|
|
2024
2205
|
}
|
|
@@ -2083,7 +2264,7 @@ export async function runUnitPhase(
|
|
|
2083
2264
|
s.checkpointSha = null;
|
|
2084
2265
|
}
|
|
2085
2266
|
|
|
2086
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
2267
|
+
return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
2087
2268
|
}
|
|
2088
2269
|
|
|
2089
2270
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
@@ -2263,8 +2444,20 @@ export async function runFinalize(
|
|
|
2263
2444
|
return { action: "break", reason: "step-wizard" };
|
|
2264
2445
|
}
|
|
2265
2446
|
|
|
2447
|
+
if (preUnitSnapshot?.type === "complete-milestone" && s.currentMilestoneId) {
|
|
2448
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
2449
|
+
if (stop) return stop;
|
|
2450
|
+
}
|
|
2451
|
+
|
|
2266
2452
|
// Both pre and post verification completed without timeout — reset counter
|
|
2267
2453
|
loopState.consecutiveFinalizeTimeouts = 0;
|
|
2454
|
+
if (preUnitSnapshot) {
|
|
2455
|
+
writeUnitRuntimeRecord(s.basePath, preUnitSnapshot.type, preUnitSnapshot.id, preUnitSnapshot.startedAt, {
|
|
2456
|
+
phase: "finalized",
|
|
2457
|
+
lastProgressAt: Date.now(),
|
|
2458
|
+
lastProgressKind: "finalize-success",
|
|
2459
|
+
});
|
|
2460
|
+
}
|
|
2268
2461
|
s.currentUnit = null;
|
|
2269
2462
|
clearCurrentPhase();
|
|
2270
2463
|
|