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,909 +0,0 @@
|
|
|
1
|
-
// GSD-2 — WorktreeResolver: encapsulates worktree path state and merge/exit lifecycle.
|
|
2
|
-
/**
|
|
3
|
-
* WorktreeResolver — encapsulates worktree path state and merge/exit lifecycle.
|
|
4
|
-
*
|
|
5
|
-
* Replaces scattered `s.basePath`/`s.originalBasePath` mutation and 3 duplicated
|
|
6
|
-
* merge-or-teardown blocks in auto-loop.ts with single method calls. All
|
|
7
|
-
* `s.basePath` mutations (except session.reset() and initial setup) happen
|
|
8
|
-
* through this class.
|
|
9
|
-
*
|
|
10
|
-
* Design: Option A — mutates AutoSession fields directly so existing `s.basePath`
|
|
11
|
-
* reads continue to work everywhere without wiring changes.
|
|
12
|
-
*
|
|
13
|
-
* Key invariant: `createAutoWorktree()` and `enterAutoWorktree()` call
|
|
14
|
-
* `process.chdir()` internally — this class MUST NOT double-chdir.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
18
|
-
import { randomUUID } from "node:crypto";
|
|
19
|
-
import { join } from "node:path";
|
|
20
|
-
import type { AutoSession } from "./auto/session.js";
|
|
21
|
-
import { debugLog } from "./debug-logger.js";
|
|
22
|
-
import { MergeConflictError } from "./git-service.js";
|
|
23
|
-
import { emitJournalEvent } from "./journal.js";
|
|
24
|
-
import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
|
|
25
|
-
import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
|
|
26
|
-
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
27
|
-
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
28
|
-
import { claimMilestoneLease, releaseMilestoneLease } from "./db/milestone-leases.js";
|
|
29
|
-
|
|
30
|
-
// ─── Path Comparison Helper ────────────────────────────────────────────────
|
|
31
|
-
/**
|
|
32
|
-
* Compare two paths for physical identity, tolerating trailing slashes,
|
|
33
|
-
* symlink differences, and case variations on case-insensitive volumes.
|
|
34
|
-
*
|
|
35
|
-
* Used in place of string `===` / `!==` wherever one operand may be
|
|
36
|
-
* realpath-normalised (e.g. from the workspace registry) and the other
|
|
37
|
-
* may not be (e.g. a raw caller-supplied basePath).
|
|
38
|
-
*/
|
|
39
|
-
function isSamePath(a: string, b: string): boolean {
|
|
40
|
-
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// ─── Dependency Interface ──────────────────────────────────────────────────
|
|
44
|
-
|
|
45
|
-
export interface WorktreeResolverDeps {
|
|
46
|
-
isInAutoWorktree: (basePath: string) => boolean;
|
|
47
|
-
shouldUseWorktreeIsolation: () => boolean;
|
|
48
|
-
getIsolationMode: (basePath?: string) => "worktree" | "branch" | "none";
|
|
49
|
-
mergeMilestoneToMain: (
|
|
50
|
-
basePath: string,
|
|
51
|
-
milestoneId: string,
|
|
52
|
-
roadmapContent: string,
|
|
53
|
-
) => { pushed: boolean; codeFilesChanged: boolean };
|
|
54
|
-
syncWorktreeStateBack: (
|
|
55
|
-
mainBasePath: string,
|
|
56
|
-
worktreePath: string,
|
|
57
|
-
milestoneId: string,
|
|
58
|
-
) => { synced: string[] };
|
|
59
|
-
teardownAutoWorktree: (
|
|
60
|
-
basePath: string,
|
|
61
|
-
milestoneId: string,
|
|
62
|
-
opts?: { preserveBranch?: boolean },
|
|
63
|
-
) => void;
|
|
64
|
-
createAutoWorktree: (basePath: string, milestoneId: string) => string;
|
|
65
|
-
enterAutoWorktree: (basePath: string, milestoneId: string) => string;
|
|
66
|
-
enterBranchModeForMilestone: (basePath: string, milestoneId: string) => void;
|
|
67
|
-
getAutoWorktreePath: (basePath: string, milestoneId: string) => string | null;
|
|
68
|
-
autoCommitCurrentBranch: (
|
|
69
|
-
basePath: string,
|
|
70
|
-
reason: string,
|
|
71
|
-
milestoneId: string,
|
|
72
|
-
) => void;
|
|
73
|
-
getCurrentBranch: (basePath: string) => string;
|
|
74
|
-
autoWorktreeBranch: (milestoneId: string) => string;
|
|
75
|
-
resolveMilestoneFile: (
|
|
76
|
-
basePath: string,
|
|
77
|
-
milestoneId: string,
|
|
78
|
-
fileType: string,
|
|
79
|
-
) => string | null;
|
|
80
|
-
readFileSync: (path: string, encoding: string) => string;
|
|
81
|
-
GitServiceImpl: new (basePath: string, gitConfig: unknown) => unknown;
|
|
82
|
-
loadEffectiveGSDPreferences: () =>
|
|
83
|
-
| { preferences?: { git?: Record<string, unknown> } }
|
|
84
|
-
| undefined;
|
|
85
|
-
invalidateAllCaches: () => void;
|
|
86
|
-
captureIntegrationBranch: (
|
|
87
|
-
basePath: string,
|
|
88
|
-
mid: string,
|
|
89
|
-
) => void;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// ─── Notify Context ────────────────────────────────────────────────────────
|
|
93
|
-
|
|
94
|
-
export interface NotifyCtx {
|
|
95
|
-
notify: (
|
|
96
|
-
msg: string,
|
|
97
|
-
level?: "info" | "warning" | "error" | "success",
|
|
98
|
-
) => void;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// ─── Path Helpers ──────────────────────────────────────────────────────────
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Resolve the project root from session path state.
|
|
105
|
-
*
|
|
106
|
-
* Prefers `originalBasePath` (always the project root when set), but falls
|
|
107
|
-
* back to `basePath` when `originalBasePath` is falsy (e.g. fresh AutoSession
|
|
108
|
-
* with default empty string). If `basePath` itself is inside a worktree
|
|
109
|
-
* directory (including symlink-resolved ~/.gsd/projects/<hash>/worktrees
|
|
110
|
-
* paths), recover the actual project root to prevent double nesting (#3729).
|
|
111
|
-
*/
|
|
112
|
-
export function resolveProjectRoot(
|
|
113
|
-
originalBasePath: string,
|
|
114
|
-
basePath: string,
|
|
115
|
-
): string {
|
|
116
|
-
return resolveWorktreeProjectRoot(basePath, originalBasePath);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// ─── WorktreeResolver ──────────────────────────────────────────────────────
|
|
120
|
-
|
|
121
|
-
export class WorktreeResolver {
|
|
122
|
-
private readonly s: AutoSession;
|
|
123
|
-
private readonly deps: WorktreeResolverDeps;
|
|
124
|
-
|
|
125
|
-
constructor(session: AutoSession, deps: WorktreeResolverDeps) {
|
|
126
|
-
this.s = session;
|
|
127
|
-
this.deps = deps;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// ── Getters ────────────────────────────────────────────────────────────
|
|
131
|
-
|
|
132
|
-
/** Current working path — may be worktree or project root. */
|
|
133
|
-
get workPath(): string {
|
|
134
|
-
return this.s.basePath;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/** Original project root — always the non-worktree path. */
|
|
138
|
-
get projectRoot(): string {
|
|
139
|
-
return resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/** Path for auto.lock file — same as the old lockBase(). */
|
|
143
|
-
get lockPath(): string {
|
|
144
|
-
return resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// ── Private Helpers ────────────────────────────────────────────────────
|
|
148
|
-
|
|
149
|
-
private rebuildGitService(): void {
|
|
150
|
-
const gitConfig =
|
|
151
|
-
this.deps.loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
152
|
-
this.s.gitService = new this.deps.GitServiceImpl(
|
|
153
|
-
this.s.basePath,
|
|
154
|
-
gitConfig,
|
|
155
|
-
) as AutoSession["gitService"];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/** Restore basePath to originalBasePath and rebuild GitService. */
|
|
159
|
-
private restoreToProjectRoot(): void {
|
|
160
|
-
if (!this.s.originalBasePath) return;
|
|
161
|
-
this.s.basePath = this.s.originalBasePath;
|
|
162
|
-
this.rebuildGitService();
|
|
163
|
-
this.deps.invalidateAllCaches();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// ── Validation ──────────────────────────────────────────────────────────
|
|
167
|
-
|
|
168
|
-
/** Validate milestoneId to prevent path traversal. */
|
|
169
|
-
private validateMilestoneId(milestoneId: string): void {
|
|
170
|
-
if (/[\/\\]|\.\./.test(milestoneId)) {
|
|
171
|
-
throw new Error(
|
|
172
|
-
`Invalid milestoneId: ${milestoneId} — contains path separators or traversal`,
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// ── Enter Milestone ────────────────────────────────────────────────────
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Enter or create a worktree for the given milestone.
|
|
181
|
-
*
|
|
182
|
-
* Only acts if `shouldUseWorktreeIsolation()` returns true.
|
|
183
|
-
* Delegates to `enterAutoWorktree` (existing) or `createAutoWorktree` (new).
|
|
184
|
-
* Those functions call `process.chdir()` internally — we do NOT double-chdir.
|
|
185
|
-
*
|
|
186
|
-
* Updates `s.basePath` and rebuilds GitService on success.
|
|
187
|
-
* On failure: notifies a warning and does NOT update `s.basePath`.
|
|
188
|
-
*/
|
|
189
|
-
enterMilestone(milestoneId: string, ctx: NotifyCtx): void {
|
|
190
|
-
this.validateMilestoneId(milestoneId);
|
|
191
|
-
|
|
192
|
-
// If worktree creation failed earlier this session, skip all future attempts
|
|
193
|
-
if (this.s.isolationDegraded) {
|
|
194
|
-
debugLog("WorktreeResolver", {
|
|
195
|
-
action: "enterMilestone",
|
|
196
|
-
milestoneId,
|
|
197
|
-
skipped: true,
|
|
198
|
-
reason: "isolation-degraded",
|
|
199
|
-
});
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Phase B: claim a milestone lease before any worktree mutation. Two
|
|
204
|
-
// workers cannot enter the same milestone concurrently. Best-effort:
|
|
205
|
-
// skip if no worker registered (single-worker fallback) or DB
|
|
206
|
-
// unavailable; reuse existing lease if we already hold it on this
|
|
207
|
-
// milestone (re-entry within the same session).
|
|
208
|
-
if (this.s.workerId) {
|
|
209
|
-
if (this.s.currentMilestoneId === milestoneId && this.s.milestoneLeaseToken !== null) {
|
|
210
|
-
// Already held — no-op, the heartbeat in loop.ts refreshes TTL.
|
|
211
|
-
} else {
|
|
212
|
-
// If we held a different milestone, release it first so other
|
|
213
|
-
// workers don't have to wait for TTL.
|
|
214
|
-
if (this.s.currentMilestoneId && this.s.currentMilestoneId !== milestoneId && this.s.milestoneLeaseToken !== null) {
|
|
215
|
-
try {
|
|
216
|
-
releaseMilestoneLease(this.s.workerId, this.s.currentMilestoneId, this.s.milestoneLeaseToken);
|
|
217
|
-
} catch (err) {
|
|
218
|
-
debugLog("WorktreeResolver", {
|
|
219
|
-
action: "enterMilestone",
|
|
220
|
-
milestoneId,
|
|
221
|
-
releasePriorLeaseError: err instanceof Error ? err.message : String(err),
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
this.s.milestoneLeaseToken = null;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
try {
|
|
228
|
-
const claim = claimMilestoneLease(this.s.workerId, milestoneId);
|
|
229
|
-
if (claim.ok) {
|
|
230
|
-
this.s.milestoneLeaseToken = claim.token;
|
|
231
|
-
debugLog("WorktreeResolver", {
|
|
232
|
-
action: "enterMilestone",
|
|
233
|
-
milestoneId,
|
|
234
|
-
leaseAcquired: true,
|
|
235
|
-
fencingToken: claim.token,
|
|
236
|
-
expiresAt: claim.expiresAt,
|
|
237
|
-
});
|
|
238
|
-
} else {
|
|
239
|
-
// Lease held by another worker — fail loud so the user can
|
|
240
|
-
// see the conflict instead of silently double-running.
|
|
241
|
-
const msg = `Milestone ${milestoneId} is held by worker ${claim.byWorker} until ${claim.expiresAt}.`;
|
|
242
|
-
debugLog("WorktreeResolver", {
|
|
243
|
-
action: "enterMilestone",
|
|
244
|
-
milestoneId,
|
|
245
|
-
leaseHeldByOther: claim.byWorker,
|
|
246
|
-
expiresAt: claim.expiresAt,
|
|
247
|
-
});
|
|
248
|
-
ctx.notify(`${msg} Another auto-mode worker is active. Stop it before entering ${milestoneId}.`, "error");
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
} catch (err) {
|
|
252
|
-
// DB unavailable or other error — log and fall through to the
|
|
253
|
-
// pre-Phase-B single-worker behavior so a fresh project before
|
|
254
|
-
// DB init still works.
|
|
255
|
-
debugLog("WorktreeResolver", {
|
|
256
|
-
action: "enterMilestone",
|
|
257
|
-
milestoneId,
|
|
258
|
-
leaseError: err instanceof Error ? err.message : String(err),
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// Resolve the project root for worktree operations via shared helper.
|
|
265
|
-
// Handles the case where originalBasePath is falsy and basePath is itself
|
|
266
|
-
// a worktree path — prevents double-nested worktree paths (#3729).
|
|
267
|
-
const basePath = resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
|
|
268
|
-
const mode = this.deps.getIsolationMode(basePath);
|
|
269
|
-
|
|
270
|
-
if (mode === "none") {
|
|
271
|
-
debugLog("WorktreeResolver", {
|
|
272
|
-
action: "enterMilestone",
|
|
273
|
-
milestoneId,
|
|
274
|
-
skipped: true,
|
|
275
|
-
reason: "isolation-disabled",
|
|
276
|
-
});
|
|
277
|
-
emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
|
|
278
|
-
ts: new Date().toISOString(),
|
|
279
|
-
flowId: randomUUID(),
|
|
280
|
-
seq: 0,
|
|
281
|
-
eventType: "worktree-skip",
|
|
282
|
-
data: { milestoneId, reason: "isolation-disabled" },
|
|
283
|
-
});
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
debugLog("WorktreeResolver", {
|
|
288
|
-
action: "enterMilestone",
|
|
289
|
-
milestoneId,
|
|
290
|
-
mode,
|
|
291
|
-
basePath,
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
// ── Branch mode: create/checkout milestone branch, stay in project root ──
|
|
295
|
-
if (mode === "branch") {
|
|
296
|
-
try {
|
|
297
|
-
this.deps.enterBranchModeForMilestone(basePath, milestoneId);
|
|
298
|
-
// basePath does not change — no worktree, no chdir.
|
|
299
|
-
// Rebuild GitService so the new HEAD is reflected, then flush any
|
|
300
|
-
// path-keyed caches that may have been populated before the checkout.
|
|
301
|
-
this.rebuildGitService();
|
|
302
|
-
this.deps.invalidateAllCaches();
|
|
303
|
-
debugLog("WorktreeResolver", {
|
|
304
|
-
action: "enterMilestone",
|
|
305
|
-
milestoneId,
|
|
306
|
-
mode: "branch",
|
|
307
|
-
result: "success",
|
|
308
|
-
});
|
|
309
|
-
emitJournalEvent(basePath, {
|
|
310
|
-
ts: new Date().toISOString(),
|
|
311
|
-
flowId: randomUUID(),
|
|
312
|
-
seq: 0,
|
|
313
|
-
eventType: "worktree-skip",
|
|
314
|
-
data: { milestoneId, reason: "branch-mode-no-worktree" },
|
|
315
|
-
});
|
|
316
|
-
ctx.notify(`Switched to branch milestone/${milestoneId}.`, "info");
|
|
317
|
-
} catch (err) {
|
|
318
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
319
|
-
debugLog("WorktreeResolver", {
|
|
320
|
-
action: "enterMilestone",
|
|
321
|
-
milestoneId,
|
|
322
|
-
mode: "branch",
|
|
323
|
-
result: "error",
|
|
324
|
-
error: msg,
|
|
325
|
-
});
|
|
326
|
-
ctx.notify(
|
|
327
|
-
`Branch isolation setup for ${milestoneId} failed: ${msg}. Continuing on current branch.`,
|
|
328
|
-
"warning",
|
|
329
|
-
);
|
|
330
|
-
this.s.isolationDegraded = true;
|
|
331
|
-
}
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// ── Worktree mode ─────────────────────────────────────────────────────────
|
|
336
|
-
try {
|
|
337
|
-
const existingPath = this.deps.getAutoWorktreePath(basePath, milestoneId);
|
|
338
|
-
let wtPath: string;
|
|
339
|
-
|
|
340
|
-
if (existingPath) {
|
|
341
|
-
wtPath = this.deps.enterAutoWorktree(basePath, milestoneId);
|
|
342
|
-
} else {
|
|
343
|
-
wtPath = this.deps.createAutoWorktree(basePath, milestoneId);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
this.s.basePath = wtPath;
|
|
347
|
-
this.rebuildGitService();
|
|
348
|
-
|
|
349
|
-
debugLog("WorktreeResolver", {
|
|
350
|
-
action: "enterMilestone",
|
|
351
|
-
milestoneId,
|
|
352
|
-
result: "success",
|
|
353
|
-
wtPath,
|
|
354
|
-
});
|
|
355
|
-
emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
|
|
356
|
-
ts: new Date().toISOString(),
|
|
357
|
-
flowId: randomUUID(),
|
|
358
|
-
seq: 0,
|
|
359
|
-
eventType: "worktree-enter",
|
|
360
|
-
data: { milestoneId, wtPath, created: !existingPath },
|
|
361
|
-
});
|
|
362
|
-
// #4764 — record creation/enter as a lifecycle event so the telemetry
|
|
363
|
-
// aggregator can pair it with the eventual worktree-merged event.
|
|
364
|
-
try {
|
|
365
|
-
emitWorktreeCreated(this.s.originalBasePath || this.s.basePath, milestoneId, {
|
|
366
|
-
reason: existingPath ? "enter-milestone" : "create-milestone",
|
|
367
|
-
});
|
|
368
|
-
} catch (telemetryErr) {
|
|
369
|
-
debugLog("WorktreeResolver", {
|
|
370
|
-
action: "enterMilestone",
|
|
371
|
-
phase: "telemetry-emit",
|
|
372
|
-
error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
ctx.notify(`Entered worktree for ${milestoneId} at ${wtPath}`, "info");
|
|
376
|
-
} catch (err) {
|
|
377
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
378
|
-
debugLog("WorktreeResolver", {
|
|
379
|
-
action: "enterMilestone",
|
|
380
|
-
milestoneId,
|
|
381
|
-
result: "error",
|
|
382
|
-
error: msg,
|
|
383
|
-
});
|
|
384
|
-
emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
|
|
385
|
-
ts: new Date().toISOString(),
|
|
386
|
-
flowId: randomUUID(),
|
|
387
|
-
seq: 0,
|
|
388
|
-
eventType: "worktree-create-failed",
|
|
389
|
-
data: { milestoneId, error: msg, fallback: "project-root" },
|
|
390
|
-
});
|
|
391
|
-
ctx.notify(
|
|
392
|
-
`Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`,
|
|
393
|
-
"warning",
|
|
394
|
-
);
|
|
395
|
-
// Degrade isolation for the rest of this session so mergeAndExit
|
|
396
|
-
// doesn't try to merge a nonexistent worktree branch (#2483)
|
|
397
|
-
this.s.isolationDegraded = true;
|
|
398
|
-
// Do NOT update s.basePath — stay in project root
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// ── Exit Milestone ─────────────────────────────────────────────────────
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Exit the current worktree: auto-commit, teardown, reset basePath.
|
|
406
|
-
*
|
|
407
|
-
* Only acts if currently in an auto-worktree (checked via `isInAutoWorktree`).
|
|
408
|
-
* Resets `s.basePath` to `s.originalBasePath` and rebuilds GitService.
|
|
409
|
-
*/
|
|
410
|
-
exitMilestone(
|
|
411
|
-
milestoneId: string,
|
|
412
|
-
ctx: NotifyCtx,
|
|
413
|
-
opts?: { preserveBranch?: boolean },
|
|
414
|
-
): void {
|
|
415
|
-
this.validateMilestoneId(milestoneId);
|
|
416
|
-
if (!this.deps.isInAutoWorktree(this.s.basePath)) {
|
|
417
|
-
debugLog("WorktreeResolver", {
|
|
418
|
-
action: "exitMilestone",
|
|
419
|
-
milestoneId,
|
|
420
|
-
skipped: true,
|
|
421
|
-
reason: "not-in-worktree",
|
|
422
|
-
});
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
debugLog("WorktreeResolver", {
|
|
427
|
-
action: "exitMilestone",
|
|
428
|
-
milestoneId,
|
|
429
|
-
basePath: this.s.basePath,
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
try {
|
|
433
|
-
this.deps.autoCommitCurrentBranch(this.s.basePath, "stop", milestoneId);
|
|
434
|
-
} catch (err) {
|
|
435
|
-
debugLog("WorktreeResolver", {
|
|
436
|
-
action: "exitMilestone",
|
|
437
|
-
milestoneId,
|
|
438
|
-
phase: "auto-commit-failed",
|
|
439
|
-
error: err instanceof Error ? err.message : String(err),
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
try {
|
|
444
|
-
this.deps.teardownAutoWorktree(this.s.originalBasePath, milestoneId, {
|
|
445
|
-
preserveBranch: opts?.preserveBranch ?? false,
|
|
446
|
-
});
|
|
447
|
-
} catch (err) {
|
|
448
|
-
debugLog("WorktreeResolver", {
|
|
449
|
-
action: "exitMilestone",
|
|
450
|
-
milestoneId,
|
|
451
|
-
phase: "teardown-failed",
|
|
452
|
-
error: err instanceof Error ? err.message : String(err),
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
this.restoreToProjectRoot();
|
|
457
|
-
debugLog("WorktreeResolver", {
|
|
458
|
-
action: "exitMilestone",
|
|
459
|
-
milestoneId,
|
|
460
|
-
result: "done",
|
|
461
|
-
basePath: this.s.basePath,
|
|
462
|
-
});
|
|
463
|
-
ctx.notify(`Exited worktree for ${milestoneId}`, "info");
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
// ── Merge and Exit ─────────────────────────────────────────────────────
|
|
467
|
-
|
|
468
|
-
/**
|
|
469
|
-
* Merge the completed milestone branch back to main and exit the worktree.
|
|
470
|
-
*
|
|
471
|
-
* Handles all three isolation modes:
|
|
472
|
-
* - **worktree**: Read roadmap, merge, teardown worktree, reset paths.
|
|
473
|
-
* Falls back to bare teardown if no roadmap exists.
|
|
474
|
-
* - **branch**: Check if on milestone branch, merge if so (no chdir/teardown).
|
|
475
|
-
* - **none**: No-op.
|
|
476
|
-
*
|
|
477
|
-
* Error recovery: on merge failure, always restore `s.basePath` to
|
|
478
|
-
* `s.originalBasePath` and `process.chdir(s.originalBasePath)`.
|
|
479
|
-
*/
|
|
480
|
-
mergeAndExit(milestoneId: string, ctx: NotifyCtx): void {
|
|
481
|
-
this.validateMilestoneId(milestoneId);
|
|
482
|
-
|
|
483
|
-
// Anchor cwd at the project root before any merge work. Some merge code
|
|
484
|
-
// paths (mergeMilestoneToMain, slice-cadence) chdir explicitly; others
|
|
485
|
-
// (branch-mode, isolation-degraded skip, missing-original-base skip)
|
|
486
|
-
// do not. If the worktree dir is later torn down while cwd still points
|
|
487
|
-
// into it, every subsequent process.cwd() throws ENOENT — and after
|
|
488
|
-
// de73fb43d that surfaces as a session-failed cancel and (in headless
|
|
489
|
-
// mode) terminates the whole gsd process. Best-effort: silent on
|
|
490
|
-
// failure so existing test fixtures that use synthetic paths still pass.
|
|
491
|
-
if (this.s.originalBasePath) {
|
|
492
|
-
try {
|
|
493
|
-
// process.cwd() can throw ENOENT when cwd was removed, so attempt
|
|
494
|
-
// recovery directly.
|
|
495
|
-
process.chdir(this.s.originalBasePath);
|
|
496
|
-
} catch (err) {
|
|
497
|
-
debugLog("WorktreeResolver", {
|
|
498
|
-
action: "mergeAndExit",
|
|
499
|
-
phase: "pre-merge-chdir-failed",
|
|
500
|
-
milestoneId,
|
|
501
|
-
originalBasePath: this.s.originalBasePath,
|
|
502
|
-
error: err instanceof Error ? err.message : String(err),
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
// #4764 — telemetry: record start timestamp so we can emit merge duration.
|
|
508
|
-
const mergeStartedAt = new Date().toISOString();
|
|
509
|
-
const mergeStartMs = Date.now();
|
|
510
|
-
|
|
511
|
-
// If worktree creation failed earlier, skip merge — work is on current branch (#2483)
|
|
512
|
-
if (this.s.isolationDegraded) {
|
|
513
|
-
debugLog("WorktreeResolver", {
|
|
514
|
-
action: "mergeAndExit",
|
|
515
|
-
milestoneId,
|
|
516
|
-
skipped: true,
|
|
517
|
-
reason: "isolation-degraded",
|
|
518
|
-
});
|
|
519
|
-
ctx.notify(
|
|
520
|
-
`Skipping worktree merge for ${milestoneId} — isolation was degraded (worktree creation failed earlier). Work is on the current branch.`,
|
|
521
|
-
"info",
|
|
522
|
-
);
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
const mode = this.deps.getIsolationMode(this.s.originalBasePath || this.s.basePath);
|
|
527
|
-
debugLog("WorktreeResolver", {
|
|
528
|
-
action: "mergeAndExit",
|
|
529
|
-
milestoneId,
|
|
530
|
-
mode,
|
|
531
|
-
basePath: this.s.basePath,
|
|
532
|
-
});
|
|
533
|
-
emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
|
|
534
|
-
ts: new Date().toISOString(),
|
|
535
|
-
flowId: randomUUID(),
|
|
536
|
-
seq: 0,
|
|
537
|
-
eventType: "worktree-merge-start",
|
|
538
|
-
data: { milestoneId, mode },
|
|
539
|
-
});
|
|
540
|
-
|
|
541
|
-
// #2625: If we are physically inside an auto-worktree, we MUST merge
|
|
542
|
-
// regardless of the current isolation config. This prevents data loss when
|
|
543
|
-
// the default isolation mode changes between versions (e.g., "worktree" ->
|
|
544
|
-
// "none"): the worktree branch still holds real commits that need merging.
|
|
545
|
-
const inWorktree = this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath;
|
|
546
|
-
|
|
547
|
-
if (mode === "none" && !inWorktree) {
|
|
548
|
-
debugLog("WorktreeResolver", {
|
|
549
|
-
action: "mergeAndExit",
|
|
550
|
-
milestoneId,
|
|
551
|
-
skipped: true,
|
|
552
|
-
reason: "mode-none",
|
|
553
|
-
});
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
let actuallyMerged = false;
|
|
558
|
-
if (
|
|
559
|
-
mode === "worktree" || inWorktree
|
|
560
|
-
) {
|
|
561
|
-
actuallyMerged = this._mergeWorktreeMode(milestoneId, ctx);
|
|
562
|
-
} else if (mode === "branch") {
|
|
563
|
-
actuallyMerged = this._mergeBranchMode(milestoneId, ctx);
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
// The remainder of this function emits telemetry and runs re-squash.
|
|
567
|
-
// Both are gated on actuallyMerged — if the _merge* helper took a
|
|
568
|
-
// no-merge path (missing originalBase, no roadmap, wrong branch) the
|
|
569
|
-
// milestone branch was intentionally left unmerged and we must not
|
|
570
|
-
// emit a worktree-merged event or collapse commits on main.
|
|
571
|
-
if (!actuallyMerged) {
|
|
572
|
-
// Always clear the start-SHA tracker to avoid leaking across sessions.
|
|
573
|
-
this.s.milestoneStartShas.delete(milestoneId);
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
// #4765 — when collapse_cadence=slice AND milestone_resquash=true, the
|
|
578
|
-
// N per-slice commits on main should be collapsed into one milestone
|
|
579
|
-
// commit. Done AFTER the primary merge-and-teardown so the branch and
|
|
580
|
-
// worktree are already cleaned up; we operate on main directly.
|
|
581
|
-
try {
|
|
582
|
-
const startSha = this.s.milestoneStartShas.get(milestoneId);
|
|
583
|
-
if (startSha) {
|
|
584
|
-
const prefs = loadEffectiveGSDPreferences(this.s.originalBasePath || this.s.basePath)?.preferences;
|
|
585
|
-
if (getCollapseCadence(prefs) === "slice" && getMilestoneResquash(prefs)) {
|
|
586
|
-
const result = resquashMilestoneOnMain(
|
|
587
|
-
this.s.originalBasePath || this.s.basePath,
|
|
588
|
-
milestoneId,
|
|
589
|
-
startSha,
|
|
590
|
-
);
|
|
591
|
-
if (result.resquashed) {
|
|
592
|
-
ctx.notify(
|
|
593
|
-
`slice-cadence: re-squashed slice commits for ${milestoneId} into a single milestone commit.`,
|
|
594
|
-
"info",
|
|
595
|
-
);
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
this.s.milestoneStartShas.delete(milestoneId);
|
|
599
|
-
}
|
|
600
|
-
} catch (err) {
|
|
601
|
-
debugLog("WorktreeResolver", {
|
|
602
|
-
action: "mergeAndExit",
|
|
603
|
-
milestoneId,
|
|
604
|
-
phase: "resquash",
|
|
605
|
-
error: err instanceof Error ? err.message : String(err),
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
// #4764 — record merge completion. Only reaches here when an actual
|
|
610
|
-
// merge ran; failure paths throw out of _merge* before this point and
|
|
611
|
-
// no-merge paths returned above.
|
|
612
|
-
try {
|
|
613
|
-
emitWorktreeMerged(this.s.originalBasePath || this.s.basePath, milestoneId, {
|
|
614
|
-
reason: "milestone-complete",
|
|
615
|
-
startedAt: mergeStartedAt,
|
|
616
|
-
durationMs: Date.now() - mergeStartMs,
|
|
617
|
-
});
|
|
618
|
-
} catch (telemetryErr) {
|
|
619
|
-
debugLog("WorktreeResolver", {
|
|
620
|
-
action: "mergeAndExit",
|
|
621
|
-
phase: "telemetry-emit",
|
|
622
|
-
error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
|
|
623
|
-
});
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
/** Worktree-mode merge: read roadmap, merge, teardown, reset paths.
|
|
628
|
-
* Returns true when a squash-merge actually ran (false on skip paths). */
|
|
629
|
-
private _mergeWorktreeMode(milestoneId: string, ctx: NotifyCtx): boolean {
|
|
630
|
-
const originalBase = this.s.originalBasePath;
|
|
631
|
-
if (!originalBase) {
|
|
632
|
-
debugLog("WorktreeResolver", {
|
|
633
|
-
action: "mergeAndExit",
|
|
634
|
-
milestoneId,
|
|
635
|
-
mode: "worktree",
|
|
636
|
-
skipped: true,
|
|
637
|
-
reason: "missing-original-base",
|
|
638
|
-
});
|
|
639
|
-
return false;
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
let merged = false;
|
|
643
|
-
try {
|
|
644
|
-
const { synced } = this.deps.syncWorktreeStateBack(
|
|
645
|
-
originalBase,
|
|
646
|
-
this.s.basePath,
|
|
647
|
-
milestoneId,
|
|
648
|
-
);
|
|
649
|
-
if (synced.length > 0) {
|
|
650
|
-
debugLog("WorktreeResolver", {
|
|
651
|
-
action: "mergeAndExit",
|
|
652
|
-
milestoneId,
|
|
653
|
-
phase: "reverse-sync",
|
|
654
|
-
synced: synced.length,
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
// Resolve roadmap — try project root first, then worktree path as fallback.
|
|
659
|
-
// The worktree may hold the only copy when syncWorktreeStateBack fails
|
|
660
|
-
// silently or .gsd/ is not symlinked. Without the fallback, a missing
|
|
661
|
-
// roadmap triggers bare teardown which deletes the branch and orphans all
|
|
662
|
-
// milestone commits (#1573).
|
|
663
|
-
let roadmapPath = this.deps.resolveMilestoneFile(
|
|
664
|
-
originalBase,
|
|
665
|
-
milestoneId,
|
|
666
|
-
"ROADMAP",
|
|
667
|
-
);
|
|
668
|
-
if (!roadmapPath && !isSamePath(this.s.basePath, originalBase)) {
|
|
669
|
-
roadmapPath = this.deps.resolveMilestoneFile(
|
|
670
|
-
this.s.basePath,
|
|
671
|
-
milestoneId,
|
|
672
|
-
"ROADMAP",
|
|
673
|
-
);
|
|
674
|
-
if (roadmapPath) {
|
|
675
|
-
debugLog("WorktreeResolver", {
|
|
676
|
-
action: "mergeAndExit",
|
|
677
|
-
milestoneId,
|
|
678
|
-
phase: "roadmap-fallback",
|
|
679
|
-
note: "resolved from worktree path",
|
|
680
|
-
});
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
if (roadmapPath) {
|
|
685
|
-
const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
|
|
686
|
-
const mergeResult = this.deps.mergeMilestoneToMain(
|
|
687
|
-
originalBase,
|
|
688
|
-
milestoneId,
|
|
689
|
-
roadmapContent,
|
|
690
|
-
);
|
|
691
|
-
merged = true;
|
|
692
|
-
|
|
693
|
-
// #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
|
|
694
|
-
// cleanup internally (step 12), but it can silently fail on Windows
|
|
695
|
-
// or when the worktree directory is locked. Perform a secondary
|
|
696
|
-
// teardown here to ensure the worktree is properly cleaned up.
|
|
697
|
-
// This is idempotent — if the worktree was already removed,
|
|
698
|
-
// teardownAutoWorktree handles the no-op case gracefully.
|
|
699
|
-
try {
|
|
700
|
-
this.deps.teardownAutoWorktree(originalBase, milestoneId);
|
|
701
|
-
} catch {
|
|
702
|
-
// Best-effort — the primary cleanup in mergeMilestoneToMain may
|
|
703
|
-
// have already removed the worktree.
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
if (mergeResult.codeFilesChanged) {
|
|
707
|
-
ctx.notify(
|
|
708
|
-
`Milestone ${milestoneId} merged to main.${mergeResult.pushed ? " Pushed to remote." : ""}`,
|
|
709
|
-
"info",
|
|
710
|
-
);
|
|
711
|
-
} else {
|
|
712
|
-
// (#1906) Milestone produced only .gsd/ metadata — no actual code was
|
|
713
|
-
// merged. This typically means the LLM wrote planning artifacts
|
|
714
|
-
// (summaries, roadmaps) but never implemented the code. Surface this
|
|
715
|
-
// clearly so the user knows the milestone is not truly complete.
|
|
716
|
-
ctx.notify(
|
|
717
|
-
`WARNING: Milestone ${milestoneId} merged to main but contained NO code changes — only .gsd/ metadata files. ` +
|
|
718
|
-
`The milestone summary may describe planned work that was never implemented. ` +
|
|
719
|
-
`Review the milestone output and re-run if code is missing.`,
|
|
720
|
-
"warning",
|
|
721
|
-
);
|
|
722
|
-
}
|
|
723
|
-
} else {
|
|
724
|
-
// No roadmap at either location — teardown but PRESERVE the branch so
|
|
725
|
-
// commits are not orphaned. The user can merge manually later (#1573).
|
|
726
|
-
this.deps.teardownAutoWorktree(originalBase, milestoneId, {
|
|
727
|
-
preserveBranch: true,
|
|
728
|
-
});
|
|
729
|
-
ctx.notify(
|
|
730
|
-
`Exited worktree for ${milestoneId} (no roadmap found — branch preserved for manual merge).`,
|
|
731
|
-
"warning",
|
|
732
|
-
);
|
|
733
|
-
}
|
|
734
|
-
} catch (err) {
|
|
735
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
736
|
-
debugLog("WorktreeResolver", {
|
|
737
|
-
action: "mergeAndExit",
|
|
738
|
-
milestoneId,
|
|
739
|
-
result: "error",
|
|
740
|
-
error: msg,
|
|
741
|
-
fallback: "chdir-to-project-root",
|
|
742
|
-
});
|
|
743
|
-
emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
|
|
744
|
-
ts: new Date().toISOString(),
|
|
745
|
-
flowId: randomUUID(),
|
|
746
|
-
seq: 0,
|
|
747
|
-
eventType: "worktree-merge-failed",
|
|
748
|
-
data: { milestoneId, error: msg },
|
|
749
|
-
});
|
|
750
|
-
// Surface a clear, actionable error. The worktree and milestone branch are
|
|
751
|
-
// intentionally preserved — nothing has been deleted. The user can retry
|
|
752
|
-
// /gsd dispatch complete-milestone or merge manually once the underlying
|
|
753
|
-
// issue is fixed (e.g. checkout to wrong branch, unresolved conflicts).
|
|
754
|
-
// (#1668, #1891)
|
|
755
|
-
ctx.notify(
|
|
756
|
-
`Milestone merge failed: ${msg}. Your worktree and milestone branch are preserved — retry with \`/gsd dispatch complete-milestone\` or merge manually.`,
|
|
757
|
-
"warning",
|
|
758
|
-
);
|
|
759
|
-
|
|
760
|
-
// Clean up stale merge state left by failed squash-merge (#1389)
|
|
761
|
-
try {
|
|
762
|
-
const gitDir = join(originalBase || this.s.basePath, ".git");
|
|
763
|
-
for (const f of ["SQUASH_MSG", "MERGE_HEAD", "MERGE_MSG"]) {
|
|
764
|
-
const p = join(gitDir, f);
|
|
765
|
-
if (existsSync(p)) unlinkSync(p);
|
|
766
|
-
}
|
|
767
|
-
} catch { /* best-effort */ }
|
|
768
|
-
|
|
769
|
-
// Error recovery: always restore to project root
|
|
770
|
-
if (originalBase) {
|
|
771
|
-
try {
|
|
772
|
-
process.chdir(originalBase);
|
|
773
|
-
} catch {
|
|
774
|
-
/* best-effort */
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
// Restore state before re-throwing so callers always get a consistent
|
|
779
|
-
// session (#4380).
|
|
780
|
-
this.restoreToProjectRoot();
|
|
781
|
-
// Re-throw: MergeConflictError stops the auto loop (#2330); non-conflict
|
|
782
|
-
// errors (permission denied, filesystem failures) must also propagate so
|
|
783
|
-
// broken states are diagnosable (#4380).
|
|
784
|
-
throw err;
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
// Always restore basePath and rebuild — whether merge succeeded or failed
|
|
788
|
-
this.restoreToProjectRoot();
|
|
789
|
-
debugLog("WorktreeResolver", {
|
|
790
|
-
action: "mergeAndExit",
|
|
791
|
-
milestoneId,
|
|
792
|
-
result: "done",
|
|
793
|
-
basePath: this.s.basePath,
|
|
794
|
-
});
|
|
795
|
-
return merged;
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
/** Branch-mode merge: check current branch, merge if on milestone branch.
|
|
799
|
-
* Returns true when a merge actually ran (false on skip paths). */
|
|
800
|
-
private _mergeBranchMode(milestoneId: string, ctx: NotifyCtx): boolean {
|
|
801
|
-
try {
|
|
802
|
-
const currentBranch = this.deps.getCurrentBranch(this.s.basePath);
|
|
803
|
-
const milestoneBranch = this.deps.autoWorktreeBranch(milestoneId);
|
|
804
|
-
|
|
805
|
-
if (currentBranch !== milestoneBranch) {
|
|
806
|
-
debugLog("WorktreeResolver", {
|
|
807
|
-
action: "mergeAndExit",
|
|
808
|
-
milestoneId,
|
|
809
|
-
mode: "branch",
|
|
810
|
-
skipped: true,
|
|
811
|
-
reason: "not-on-milestone-branch",
|
|
812
|
-
currentBranch,
|
|
813
|
-
milestoneBranch,
|
|
814
|
-
});
|
|
815
|
-
return false;
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
const roadmapPath = this.deps.resolveMilestoneFile(
|
|
819
|
-
this.s.basePath,
|
|
820
|
-
milestoneId,
|
|
821
|
-
"ROADMAP",
|
|
822
|
-
);
|
|
823
|
-
if (!roadmapPath) {
|
|
824
|
-
debugLog("WorktreeResolver", {
|
|
825
|
-
action: "mergeAndExit",
|
|
826
|
-
milestoneId,
|
|
827
|
-
mode: "branch",
|
|
828
|
-
skipped: true,
|
|
829
|
-
reason: "no-roadmap",
|
|
830
|
-
});
|
|
831
|
-
return false;
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
|
|
835
|
-
const mergeResult = this.deps.mergeMilestoneToMain(
|
|
836
|
-
this.s.basePath,
|
|
837
|
-
milestoneId,
|
|
838
|
-
roadmapContent,
|
|
839
|
-
);
|
|
840
|
-
|
|
841
|
-
// Rebuild GitService after merge (branch HEAD changed)
|
|
842
|
-
this.rebuildGitService();
|
|
843
|
-
|
|
844
|
-
if (mergeResult.codeFilesChanged) {
|
|
845
|
-
ctx.notify(
|
|
846
|
-
`Milestone ${milestoneId} merged (branch mode).${mergeResult.pushed ? " Pushed to remote." : ""}`,
|
|
847
|
-
"info",
|
|
848
|
-
);
|
|
849
|
-
} else {
|
|
850
|
-
ctx.notify(
|
|
851
|
-
`WARNING: Milestone ${milestoneId} merged (branch mode) but contained NO code changes — only .gsd/ metadata. ` +
|
|
852
|
-
`Review the milestone output and re-run if code is missing.`,
|
|
853
|
-
"warning",
|
|
854
|
-
);
|
|
855
|
-
}
|
|
856
|
-
debugLog("WorktreeResolver", {
|
|
857
|
-
action: "mergeAndExit",
|
|
858
|
-
milestoneId,
|
|
859
|
-
mode: "branch",
|
|
860
|
-
result: "success",
|
|
861
|
-
});
|
|
862
|
-
return true;
|
|
863
|
-
} catch (err) {
|
|
864
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
865
|
-
debugLog("WorktreeResolver", {
|
|
866
|
-
action: "mergeAndExit",
|
|
867
|
-
milestoneId,
|
|
868
|
-
mode: "branch",
|
|
869
|
-
result: "error",
|
|
870
|
-
error: msg,
|
|
871
|
-
});
|
|
872
|
-
ctx.notify(`Milestone merge failed (branch mode): ${msg}`, "warning");
|
|
873
|
-
// Re-throw all errors so callers can apply their own recovery logic (#4380).
|
|
874
|
-
throw err;
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
// ── Merge and Enter Next ───────────────────────────────────────────────
|
|
879
|
-
|
|
880
|
-
/**
|
|
881
|
-
* Milestone transition: merge the current milestone, then enter the next one.
|
|
882
|
-
*
|
|
883
|
-
* This is the pattern used when the loop detects that the active milestone
|
|
884
|
-
* has changed (e.g., current completed, next one is now active). The caller
|
|
885
|
-
* is responsible for re-deriving state between the merge and the enter.
|
|
886
|
-
*/
|
|
887
|
-
mergeAndEnterNext(
|
|
888
|
-
currentMilestoneId: string,
|
|
889
|
-
nextMilestoneId: string,
|
|
890
|
-
ctx: NotifyCtx,
|
|
891
|
-
): void {
|
|
892
|
-
debugLog("WorktreeResolver", {
|
|
893
|
-
action: "mergeAndEnterNext",
|
|
894
|
-
currentMilestoneId,
|
|
895
|
-
nextMilestoneId,
|
|
896
|
-
});
|
|
897
|
-
try {
|
|
898
|
-
this.mergeAndExit(currentMilestoneId, ctx);
|
|
899
|
-
} catch (err) {
|
|
900
|
-
// mergeAndExit emits a warning and restores state when it fails during
|
|
901
|
-
// merge/cleanup. But if it throws before recovery runs (e.g., in
|
|
902
|
-
// validateMilestoneId or emitJournalEvent), basePath won't be restored
|
|
903
|
-
// to projectRoot — re-throw so we don't enter the next milestone with
|
|
904
|
-
// the current one unmerged.
|
|
905
|
-
if (this.s.basePath !== this.projectRoot) throw err;
|
|
906
|
-
}
|
|
907
|
-
this.enterMilestone(nextMilestoneId, ctx);
|
|
908
|
-
}
|
|
909
|
-
}
|