gsd-pi 2.80.0-dev.4ea7d80e7 → 2.80.0-dev.7582bf37a
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 +4 -2
- 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/GSD-WORKFLOW.md +2 -2
- 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/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/phases.js +240 -139
- 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 +8 -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-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +104 -86
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- 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 +209 -81
- package/dist/resources/extensions/gsd/auto.js +159 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
- 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 +319 -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 +65 -9
- package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
- 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/detection.js +106 -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 +141 -46
- 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 +27 -23
- 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-milestone.md +3 -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/safety/evidence-collector.js +10 -2
- 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/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-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
- 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 +3 -3
- 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 +1 -1
- 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_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 +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/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/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/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/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- 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/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/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/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 +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- 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 +9 -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/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 +8 -0
- 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 +14 -0
- 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/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 +32 -0
- 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 +17 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +52 -7
- 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 +41 -3
- 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 +22 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-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/src/core/agent-session-abort-order.test.ts +36 -0
- 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 +59 -7
- 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 +44 -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 +24 -0
- 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/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- 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/loop-deps.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/phases.ts +328 -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 +8 -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-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- 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 +241 -72
- package/src/resources/extensions/gsd/auto.ts +208 -39
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
- 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 +369 -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 +72 -9
- package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
- 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/detection.ts +128 -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 +167 -53
- 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 +27 -23
- 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-milestone.md +3 -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/safety/evidence-collector.ts +11 -2
- 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/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 +433 -11
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- 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 +160 -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 +138 -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 +97 -2
- 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 +5 -1
- 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 +4 -9
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
- 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 +132 -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 +239 -1
- 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 +1 -0
- 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 +242 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -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 +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -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 +91 -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/right-sized-workflow-prompts.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -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 +166 -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 -59
- 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 +1 -0
- 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/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 +38 -6
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
- 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 +203 -4
- 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/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-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
- 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/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-loop pipeline phases, merge closeout, and finalize handling.
|
|
1
3
|
/**
|
|
2
4
|
* auto/phases.ts — Pipeline phases for the auto-loop.
|
|
3
5
|
*
|
|
@@ -32,13 +34,13 @@ import { detectStuck } from "./detect-stuck.js";
|
|
|
32
34
|
import { runUnit } from "./run-unit.js";
|
|
33
35
|
import { debugLog } from "../debug-logger.js";
|
|
34
36
|
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
|
|
35
|
-
import {
|
|
37
|
+
import { classifyProject } from "../detection.js";
|
|
36
38
|
import { MergeConflictError } from "../git-service.js";
|
|
37
39
|
import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
|
|
38
40
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
39
41
|
import { resumeAutoAfterProviderDelay } from "../bootstrap/provider-error-resume.js";
|
|
40
42
|
import { join, basename } from "node:path";
|
|
41
|
-
import { existsSync, cpSync
|
|
43
|
+
import { existsSync, cpSync } from "node:fs";
|
|
42
44
|
import {
|
|
43
45
|
logWarning,
|
|
44
46
|
logError,
|
|
@@ -50,13 +52,14 @@ import {
|
|
|
50
52
|
} from "../workflow-logger.js";
|
|
51
53
|
import { gsdRoot } from "../paths.js";
|
|
52
54
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
53
|
-
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
|
|
55
|
+
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
54
56
|
import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
55
57
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
56
58
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
57
59
|
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
58
|
-
import { isDbAvailable, getMilestoneSlices
|
|
60
|
+
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
59
61
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
62
|
+
import type { PostflightResult, PreflightResult } from "../clean-root-preflight.js";
|
|
60
63
|
import { ensurePlanV2Graph, isEmptyPlanV2GraphResult, isMissingFinalizedContextResult } from "../uok/plan-v2.js";
|
|
61
64
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
62
65
|
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
@@ -76,10 +79,15 @@ function isSamePathLocal(a: string, b: string): boolean {
|
|
|
76
79
|
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
function
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
82
|
+
export function shouldDegradeEmptyWorktreeToProjectRoot(
|
|
83
|
+
worktreeClassification: ReturnType<typeof classifyProject>,
|
|
84
|
+
projectRootClassification: ReturnType<typeof classifyProject>,
|
|
85
|
+
): boolean {
|
|
86
|
+
return (
|
|
87
|
+
worktreeClassification.kind === "greenfield" &&
|
|
88
|
+
projectRootClassification.kind !== "greenfield" &&
|
|
89
|
+
projectRootClassification.kind !== "invalid-repo"
|
|
90
|
+
);
|
|
83
91
|
}
|
|
84
92
|
|
|
85
93
|
// ─── Session timeout auto-resume state ────────────────────────────────────────
|
|
@@ -120,10 +128,23 @@ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
|
|
|
120
128
|
"completing-milestone",
|
|
121
129
|
]);
|
|
122
130
|
|
|
123
|
-
function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
131
|
+
export function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
124
132
|
return PLAN_V2_GATE_PHASES.has(phase);
|
|
125
133
|
}
|
|
126
134
|
|
|
135
|
+
export function _shouldProceedWithInvalidRepoClassificationForTest(
|
|
136
|
+
reason: string | undefined,
|
|
137
|
+
hasGit: boolean,
|
|
138
|
+
): boolean {
|
|
139
|
+
return reason === "missing .git" && hasGit;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function _resolveCurrentUnitStartedAtForTest(
|
|
143
|
+
currentUnit: { startedAt: number } | null | undefined,
|
|
144
|
+
): number | undefined {
|
|
145
|
+
return currentUnit?.startedAt;
|
|
146
|
+
}
|
|
147
|
+
|
|
127
148
|
/**
|
|
128
149
|
* Generate and write an HTML milestone report snapshot.
|
|
129
150
|
* Extracted from the milestone-transition block in autoLoop.
|
|
@@ -215,6 +236,132 @@ async function closeoutAndStop(
|
|
|
215
236
|
await deps.stopAuto(ctx, pi, reason);
|
|
216
237
|
}
|
|
217
238
|
|
|
239
|
+
async function stopOnPostflightRecoveryNeeded(
|
|
240
|
+
ic: IterationContext,
|
|
241
|
+
result: PostflightResult,
|
|
242
|
+
milestoneId: string,
|
|
243
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
244
|
+
if (!result.needsManualRecovery) return null;
|
|
245
|
+
const { ctx, pi, deps } = ic;
|
|
246
|
+
const reason = `Post-merge stash restore failed for milestone ${milestoneId}`;
|
|
247
|
+
ctx.ui.notify(
|
|
248
|
+
`${reason}. Resolve the working tree before resuming auto-mode. ${result.message}`,
|
|
249
|
+
"error",
|
|
250
|
+
);
|
|
251
|
+
await deps.stopAuto(ctx, pi, reason);
|
|
252
|
+
return { action: "break", reason: "postflight-stash-restore-failed" };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
async function restorePreflightStashOrStop(
|
|
256
|
+
ic: IterationContext,
|
|
257
|
+
preflight: PreflightResult,
|
|
258
|
+
milestoneId: string,
|
|
259
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
260
|
+
if (!preflight.stashPushed) return null;
|
|
261
|
+
const { ctx, s, deps } = ic;
|
|
262
|
+
const result = deps.postflightPopStash(
|
|
263
|
+
s.originalBasePath || s.basePath,
|
|
264
|
+
milestoneId,
|
|
265
|
+
preflight.stashMarker,
|
|
266
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
267
|
+
);
|
|
268
|
+
return stopOnPostflightRecoveryNeeded(ic, result, milestoneId);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Run a milestone merge surrounded by preflight stash + always-on postflight
|
|
273
|
+
* pop. The previous code popped the stash only after a successful merge, which
|
|
274
|
+
* leaked `gsd-preflight-stash:M00x:*` entries whenever `mergeAndExit` threw —
|
|
275
|
+
* leaving the user's pre-merge working tree silently stashed away after a
|
|
276
|
+
* merge-conflict or other merge error. This helper restores the stash on
|
|
277
|
+
* every exit path, then surfaces the merge or stash failure (in priority
|
|
278
|
+
* order) as the loop's stop reason.
|
|
279
|
+
*
|
|
280
|
+
* Returns a `break` action when auto-mode must stop, or `null` when the merge
|
|
281
|
+
* succeeded and the stash (if any) was restored cleanly.
|
|
282
|
+
*/
|
|
283
|
+
export async function _runMilestoneMergeWithStashRestore(
|
|
284
|
+
ic: IterationContext,
|
|
285
|
+
milestoneId: string,
|
|
286
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
287
|
+
const { ctx, pi, s, deps } = ic;
|
|
288
|
+
|
|
289
|
+
const preflight = deps.preflightCleanRoot(
|
|
290
|
+
s.originalBasePath || s.basePath,
|
|
291
|
+
milestoneId,
|
|
292
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
let mergeError: unknown = null;
|
|
296
|
+
try {
|
|
297
|
+
deps.resolver.mergeAndExit(milestoneId, ctx.ui);
|
|
298
|
+
s.milestoneMergedInPhases = true;
|
|
299
|
+
} catch (mergeErr) {
|
|
300
|
+
mergeError = mergeErr;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Always attempt to restore the stashed working tree, even on merge error.
|
|
304
|
+
// postflightPopStash itself does not throw; failures surface via the
|
|
305
|
+
// PostflightResult.needsManualRecovery flag.
|
|
306
|
+
let stashResult: PostflightResult | null = null;
|
|
307
|
+
if (preflight.stashPushed) {
|
|
308
|
+
stashResult = deps.postflightPopStash(
|
|
309
|
+
s.originalBasePath || s.basePath,
|
|
310
|
+
milestoneId,
|
|
311
|
+
preflight.stashMarker,
|
|
312
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Merge failure takes priority over stash recovery — the merge is the
|
|
317
|
+
// authoritative gate. If the stash also needed manual recovery, the user
|
|
318
|
+
// already saw the postflightPopStash notify above.
|
|
319
|
+
if (mergeError) {
|
|
320
|
+
if (mergeError instanceof MergeConflictError) {
|
|
321
|
+
ctx.ui.notify(
|
|
322
|
+
`Merge conflict: ${mergeError.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
323
|
+
"error",
|
|
324
|
+
);
|
|
325
|
+
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${milestoneId}`);
|
|
326
|
+
return { action: "break", reason: "merge-conflict" };
|
|
327
|
+
}
|
|
328
|
+
logError("engine", "Milestone merge failed with non-conflict error", {
|
|
329
|
+
milestone: milestoneId,
|
|
330
|
+
error: String(mergeError),
|
|
331
|
+
});
|
|
332
|
+
ctx.ui.notify(
|
|
333
|
+
`Merge failed: ${mergeError instanceof Error ? mergeError.message : String(mergeError)}. Resolve and run /gsd auto to resume.`,
|
|
334
|
+
"error",
|
|
335
|
+
);
|
|
336
|
+
await deps.stopAuto(
|
|
337
|
+
ctx,
|
|
338
|
+
pi,
|
|
339
|
+
`Merge error on milestone ${milestoneId}: ${String(mergeError)}`,
|
|
340
|
+
);
|
|
341
|
+
return { action: "break", reason: "merge-failed" };
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (stashResult) {
|
|
345
|
+
return stopOnPostflightRecoveryNeeded(ic, stashResult, milestoneId);
|
|
346
|
+
}
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export async function _runMilestoneMergeOnceWithStashRestore(
|
|
351
|
+
ic: IterationContext,
|
|
352
|
+
milestoneId: string,
|
|
353
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
354
|
+
if (ic.s.milestoneMergedInPhases) {
|
|
355
|
+
debugLog("autoLoop", {
|
|
356
|
+
phase: "milestone-merge-skip",
|
|
357
|
+
reason: "already-merged-in-phases",
|
|
358
|
+
milestoneId,
|
|
359
|
+
});
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
return _runMilestoneMergeWithStashRestore(ic, milestoneId);
|
|
363
|
+
}
|
|
364
|
+
|
|
218
365
|
async function emitCancelledUnitEnd(
|
|
219
366
|
ic: IterationContext,
|
|
220
367
|
unitType: string,
|
|
@@ -651,41 +798,11 @@ export async function runPreDispatch(
|
|
|
651
798
|
loopState.recentUnits.length = 0;
|
|
652
799
|
loopState.stuckRecoveryAttempts = 0;
|
|
653
800
|
|
|
654
|
-
// Worktree lifecycle on milestone transition — merge current, enter next
|
|
655
|
-
// #2909: preflight
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
660
|
-
);
|
|
661
|
-
try {
|
|
662
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId!, ctx.ui);
|
|
663
|
-
} catch (mergeErr) {
|
|
664
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
665
|
-
// Real code conflicts — stop the loop instead of retrying forever (#2330)
|
|
666
|
-
ctx.ui.notify(
|
|
667
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
668
|
-
"error",
|
|
669
|
-
);
|
|
670
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
671
|
-
return { action: "break", reason: "merge-conflict" };
|
|
672
|
-
}
|
|
673
|
-
// Non-conflict merge errors — stop auto to avoid advancing with unmerged work
|
|
674
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
675
|
-
ctx.ui.notify(
|
|
676
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
677
|
-
"error",
|
|
678
|
-
);
|
|
679
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
680
|
-
return { action: "break", reason: "merge-failed" };
|
|
681
|
-
}
|
|
682
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
683
|
-
if (preflightTransition.stashPushed) {
|
|
684
|
-
deps.postflightPopStash(
|
|
685
|
-
s.originalBasePath || s.basePath,
|
|
686
|
-
s.currentMilestoneId!,
|
|
687
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
688
|
-
);
|
|
801
|
+
// Worktree lifecycle on milestone transition — merge current, enter next.
|
|
802
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
803
|
+
{
|
|
804
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId!);
|
|
805
|
+
if (stop) return stop;
|
|
689
806
|
}
|
|
690
807
|
|
|
691
808
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
@@ -763,44 +880,11 @@ export async function runPreDispatch(
|
|
|
763
880
|
m.status !== "complete" && m.status !== "parked",
|
|
764
881
|
);
|
|
765
882
|
if (incomplete.length === 0 && state.registry.length > 0) {
|
|
766
|
-
// All milestones complete — merge milestone branch before stopping
|
|
883
|
+
// All milestones complete — merge milestone branch before stopping.
|
|
767
884
|
if (s.currentMilestoneId) {
|
|
768
|
-
// #2909: preflight
|
|
769
|
-
const
|
|
770
|
-
|
|
771
|
-
s.currentMilestoneId,
|
|
772
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
773
|
-
);
|
|
774
|
-
try {
|
|
775
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
776
|
-
// Prevent stopAuto from attempting the same merge (#2645)
|
|
777
|
-
s.milestoneMergedInPhases = true;
|
|
778
|
-
} catch (mergeErr) {
|
|
779
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
780
|
-
ctx.ui.notify(
|
|
781
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
782
|
-
"error",
|
|
783
|
-
);
|
|
784
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
785
|
-
return { action: "break", reason: "merge-conflict" };
|
|
786
|
-
}
|
|
787
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
788
|
-
ctx.ui.notify(
|
|
789
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
790
|
-
"error",
|
|
791
|
-
);
|
|
792
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
793
|
-
return { action: "break", reason: "merge-failed" };
|
|
794
|
-
}
|
|
795
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
796
|
-
if (preflightAllComplete.stashPushed) {
|
|
797
|
-
deps.postflightPopStash(
|
|
798
|
-
s.originalBasePath || s.basePath,
|
|
799
|
-
s.currentMilestoneId,
|
|
800
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
801
|
-
);
|
|
802
|
-
}
|
|
803
|
-
|
|
885
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
886
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
887
|
+
if (stop) return stop;
|
|
804
888
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
805
889
|
}
|
|
806
890
|
deps.sendDesktopNotification(
|
|
@@ -891,44 +975,11 @@ export async function runPreDispatch(
|
|
|
891
975
|
|
|
892
976
|
// Terminal: complete
|
|
893
977
|
if (state.phase === "complete") {
|
|
894
|
-
// Milestone merge on complete (before closeout so branch state is clean)
|
|
978
|
+
// Milestone merge on complete (before closeout so branch state is clean).
|
|
895
979
|
if (s.currentMilestoneId) {
|
|
896
|
-
// #2909: preflight
|
|
897
|
-
const
|
|
898
|
-
|
|
899
|
-
s.currentMilestoneId,
|
|
900
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
901
|
-
);
|
|
902
|
-
try {
|
|
903
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
904
|
-
// Prevent stopAuto from attempting the same merge (#2645)
|
|
905
|
-
s.milestoneMergedInPhases = true;
|
|
906
|
-
} catch (mergeErr) {
|
|
907
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
908
|
-
ctx.ui.notify(
|
|
909
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
910
|
-
"error",
|
|
911
|
-
);
|
|
912
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
913
|
-
return { action: "break", reason: "merge-conflict" };
|
|
914
|
-
}
|
|
915
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
916
|
-
ctx.ui.notify(
|
|
917
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
918
|
-
"error",
|
|
919
|
-
);
|
|
920
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
921
|
-
return { action: "break", reason: "merge-failed" };
|
|
922
|
-
}
|
|
923
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
924
|
-
if (preflightComplete.stashPushed) {
|
|
925
|
-
deps.postflightPopStash(
|
|
926
|
-
s.originalBasePath || s.basePath,
|
|
927
|
-
s.currentMilestoneId,
|
|
928
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
929
|
-
);
|
|
930
|
-
}
|
|
931
|
-
|
|
980
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
981
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
982
|
+
if (stop) return stop;
|
|
932
983
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
933
984
|
}
|
|
934
985
|
deps.sendDesktopNotification(
|
|
@@ -1051,6 +1102,65 @@ export async function runDispatch(
|
|
|
1051
1102
|
let prompt = dispatchResult.prompt;
|
|
1052
1103
|
const pauseAfterUatDispatch = dispatchResult.pauseAfterDispatch ?? false;
|
|
1053
1104
|
|
|
1105
|
+
// Resolve hooks and prior-slice gating before health/stuck accounting so
|
|
1106
|
+
// those checks run against the final dispatch unit.
|
|
1107
|
+
const preDispatchResult = deps.runPreDispatchHooks(
|
|
1108
|
+
unitType,
|
|
1109
|
+
unitId,
|
|
1110
|
+
prompt,
|
|
1111
|
+
s.basePath,
|
|
1112
|
+
);
|
|
1113
|
+
if (preDispatchResult.firedHooks.length > 0) {
|
|
1114
|
+
ctx.ui.notify(
|
|
1115
|
+
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
1116
|
+
"info",
|
|
1117
|
+
);
|
|
1118
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
1119
|
+
}
|
|
1120
|
+
if (preDispatchResult.action === "skip") {
|
|
1121
|
+
ctx.ui.notify(
|
|
1122
|
+
`Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
|
|
1123
|
+
"info",
|
|
1124
|
+
);
|
|
1125
|
+
await new Promise((r) => setImmediate(r));
|
|
1126
|
+
return { action: "continue" };
|
|
1127
|
+
}
|
|
1128
|
+
if (preDispatchResult.action === "replace") {
|
|
1129
|
+
prompt = preDispatchResult.prompt ?? prompt;
|
|
1130
|
+
if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
|
|
1131
|
+
} else if (preDispatchResult.prompt) {
|
|
1132
|
+
prompt = preDispatchResult.prompt;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1136
|
+
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1137
|
+
guardBasePath,
|
|
1138
|
+
deps.getMainBranch(guardBasePath),
|
|
1139
|
+
unitType,
|
|
1140
|
+
unitId,
|
|
1141
|
+
);
|
|
1142
|
+
if (priorSliceBlocker) {
|
|
1143
|
+
await deps.stopAuto(ctx, pi, priorSliceBlocker);
|
|
1144
|
+
debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
|
|
1145
|
+
return { action: "break", reason: "prior-slice-blocker" };
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
// Execute-task needs a real writable checkout. The same health check also
|
|
1149
|
+
// exists in runUnitPhase, but the stuck-window detector runs before that
|
|
1150
|
+
// phase. Check here too so repeated derivations of a broken worktree stop
|
|
1151
|
+
// with the actionable worktree error instead of the generic stuck-loop error.
|
|
1152
|
+
if (s.basePath && unitType === "execute-task") {
|
|
1153
|
+
const gitMarker = join(s.basePath, ".git");
|
|
1154
|
+
const hasGit = deps.existsSync(gitMarker);
|
|
1155
|
+
if (!hasGit) {
|
|
1156
|
+
const msg = `Worktree health check failed: ${s.basePath} has no .git — refusing to dispatch ${unitType} ${unitId}`;
|
|
1157
|
+
debugLog("autoLoop", { phase: "dispatch-worktree-health-fail", basePath: s.basePath, hasGit });
|
|
1158
|
+
ctx.ui.notify(msg, "error");
|
|
1159
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
1160
|
+
return { action: "break", reason: "worktree-invalid" };
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1054
1164
|
// ── Sliding-window stuck detection with graduated recovery ──
|
|
1055
1165
|
const derivedKey = `${unitType}/${unitId}`;
|
|
1056
1166
|
|
|
@@ -1097,17 +1207,24 @@ export async function runDispatch(
|
|
|
1097
1207
|
level: 1,
|
|
1098
1208
|
action: "artifact-found",
|
|
1099
1209
|
});
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
"info",
|
|
1103
|
-
);
|
|
1104
|
-
if (!refreshPlanSliceRecoveryDbIfNeeded(unitType)) {
|
|
1210
|
+
const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId);
|
|
1211
|
+
if (!recoveryDb.ok) {
|
|
1105
1212
|
ctx.ui.notify(
|
|
1106
|
-
|
|
1213
|
+
recoveryDb.fatal
|
|
1214
|
+
? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
|
|
1215
|
+
: `${recoveryDb.message} Keeping stuck state for retry.`,
|
|
1107
1216
|
"warning",
|
|
1108
1217
|
);
|
|
1218
|
+
if (recoveryDb.fatal) {
|
|
1219
|
+
await deps.pauseAuto(ctx, pi);
|
|
1220
|
+
return { action: "break", reason: recoveryDb.reason };
|
|
1221
|
+
}
|
|
1109
1222
|
return { action: "continue" };
|
|
1110
1223
|
}
|
|
1224
|
+
ctx.ui.notify(
|
|
1225
|
+
`Stuck recovery: artifact for ${unitType} ${unitId} found on disk. Invalidating caches.`,
|
|
1226
|
+
"info",
|
|
1227
|
+
);
|
|
1111
1228
|
deps.invalidateAllCaches();
|
|
1112
1229
|
loopState.recentUnits.length = 0;
|
|
1113
1230
|
loopState.stuckRecoveryAttempts = 0;
|
|
@@ -1132,19 +1249,26 @@ export async function runDispatch(
|
|
|
1132
1249
|
level: 2,
|
|
1133
1250
|
action: "artifact-found",
|
|
1134
1251
|
});
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1252
|
+
const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId);
|
|
1253
|
+
if (recoveryDb.ok) {
|
|
1254
|
+
ctx.ui.notify(
|
|
1255
|
+
`Stuck recovery: artifact for ${unitType} ${unitId} found on disk after cache invalidation. Continuing.`,
|
|
1256
|
+
"info",
|
|
1257
|
+
);
|
|
1140
1258
|
loopState.recentUnits.length = 0;
|
|
1141
1259
|
loopState.stuckRecoveryAttempts = 0;
|
|
1142
1260
|
return { action: "continue" };
|
|
1143
1261
|
}
|
|
1144
1262
|
ctx.ui.notify(
|
|
1145
|
-
|
|
1263
|
+
recoveryDb.fatal
|
|
1264
|
+
? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
|
|
1265
|
+
: `${recoveryDb.message} Stopping for manual recovery.`,
|
|
1146
1266
|
"warning",
|
|
1147
1267
|
);
|
|
1268
|
+
if (recoveryDb.fatal) {
|
|
1269
|
+
await deps.pauseAuto(ctx, pi);
|
|
1270
|
+
return { action: "break", reason: recoveryDb.reason };
|
|
1271
|
+
}
|
|
1148
1272
|
}
|
|
1149
1273
|
debugLog("autoLoop", {
|
|
1150
1274
|
phase: "stuck-detected",
|
|
@@ -1178,48 +1302,6 @@ export async function runDispatch(
|
|
|
1178
1302
|
}
|
|
1179
1303
|
}
|
|
1180
1304
|
|
|
1181
|
-
// Pre-dispatch hooks
|
|
1182
|
-
const preDispatchResult = deps.runPreDispatchHooks(
|
|
1183
|
-
unitType,
|
|
1184
|
-
unitId,
|
|
1185
|
-
prompt,
|
|
1186
|
-
s.basePath,
|
|
1187
|
-
);
|
|
1188
|
-
if (preDispatchResult.firedHooks.length > 0) {
|
|
1189
|
-
ctx.ui.notify(
|
|
1190
|
-
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
1191
|
-
"info",
|
|
1192
|
-
);
|
|
1193
|
-
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
1194
|
-
}
|
|
1195
|
-
if (preDispatchResult.action === "skip") {
|
|
1196
|
-
ctx.ui.notify(
|
|
1197
|
-
`Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
|
|
1198
|
-
"info",
|
|
1199
|
-
);
|
|
1200
|
-
await new Promise((r) => setImmediate(r));
|
|
1201
|
-
return { action: "continue" };
|
|
1202
|
-
}
|
|
1203
|
-
if (preDispatchResult.action === "replace") {
|
|
1204
|
-
prompt = preDispatchResult.prompt ?? prompt;
|
|
1205
|
-
if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
|
|
1206
|
-
} else if (preDispatchResult.prompt) {
|
|
1207
|
-
prompt = preDispatchResult.prompt;
|
|
1208
|
-
}
|
|
1209
|
-
|
|
1210
|
-
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1211
|
-
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1212
|
-
guardBasePath,
|
|
1213
|
-
deps.getMainBranch(guardBasePath),
|
|
1214
|
-
unitType,
|
|
1215
|
-
unitId,
|
|
1216
|
-
);
|
|
1217
|
-
if (priorSliceBlocker) {
|
|
1218
|
-
await deps.stopAuto(ctx, pi, priorSliceBlocker);
|
|
1219
|
-
debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
|
|
1220
|
-
return { action: "break", reason: "prior-slice-blocker" };
|
|
1221
|
-
}
|
|
1222
|
-
|
|
1223
1305
|
return {
|
|
1224
1306
|
action: "next",
|
|
1225
1307
|
data: {
|
|
@@ -1484,8 +1566,9 @@ export async function runUnitPhase(
|
|
|
1484
1566
|
// Verify the working directory is a valid git checkout with project
|
|
1485
1567
|
// files before dispatching work. A broken worktree causes agents to
|
|
1486
1568
|
// hallucinate summaries since they cannot read or write any files.
|
|
1487
|
-
// Uses
|
|
1488
|
-
//
|
|
1569
|
+
// Uses project classification so project presence is not conflated with
|
|
1570
|
+
// ecosystem marker detection. Static/minimal repos become untyped-existing.
|
|
1571
|
+
let projectClassification: ReturnType<typeof classifyProject> | null = null;
|
|
1489
1572
|
if (s.basePath && unitType === "execute-task") {
|
|
1490
1573
|
const gitMarker = join(s.basePath, ".git");
|
|
1491
1574
|
const hasGit = deps.existsSync(gitMarker);
|
|
@@ -1496,30 +1579,52 @@ export async function runUnitPhase(
|
|
|
1496
1579
|
await deps.stopAuto(ctx, pi, msg);
|
|
1497
1580
|
return { action: "break", reason: "worktree-invalid" };
|
|
1498
1581
|
}
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1582
|
+
projectClassification = classifyProject(s.basePath);
|
|
1583
|
+
if (projectClassification.kind === "invalid-repo") {
|
|
1584
|
+
const msg = `Worktree health check failed: ${s.basePath} classified as invalid-repo (${projectClassification.reason}) — refusing to dispatch ${unitType} ${unitId}`;
|
|
1585
|
+
debugLog("runUnitPhase", { phase: "worktree-health-invalid-repo", basePath: s.basePath, classification: projectClassification });
|
|
1586
|
+
if (_shouldProceedWithInvalidRepoClassificationForTest(projectClassification.reason, hasGit)) {
|
|
1587
|
+
ctx.ui.notify(
|
|
1588
|
+
`Warning: ${s.basePath} project classification could not confirm .git; assuming it has no project content yet — proceeding as greenfield project because worktree health reported .git present`,
|
|
1589
|
+
"warning",
|
|
1590
|
+
);
|
|
1591
|
+
} else {
|
|
1592
|
+
ctx.ui.notify(msg, "error");
|
|
1593
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
1594
|
+
return { action: "break", reason: "worktree-invalid" };
|
|
1595
|
+
}
|
|
1596
|
+
} else if (projectClassification.kind === "greenfield") {
|
|
1597
|
+
const projectRoot = s.canonicalProjectRoot;
|
|
1598
|
+
if (!isSamePathLocal(s.basePath, projectRoot)) {
|
|
1599
|
+
const projectRootClassification = classifyProject(projectRoot);
|
|
1600
|
+
if (shouldDegradeEmptyWorktreeToProjectRoot(projectClassification, projectRootClassification)) {
|
|
1601
|
+
debugLog("runUnitPhase", {
|
|
1602
|
+
phase: "worktree-health-degrade-to-project-root",
|
|
1603
|
+
worktreePath: s.basePath,
|
|
1604
|
+
projectRoot,
|
|
1605
|
+
worktreeClassification: projectClassification,
|
|
1606
|
+
projectRootClassification,
|
|
1607
|
+
});
|
|
1608
|
+
ctx.ui.notify(
|
|
1609
|
+
`Warning: ${s.basePath} has no project content, but ${projectRoot} does. Continuing in project root because the milestone worktree cannot represent untracked project files.`,
|
|
1610
|
+
"warning",
|
|
1611
|
+
);
|
|
1612
|
+
s.basePath = projectRoot;
|
|
1613
|
+
s.isolationDegraded = true;
|
|
1614
|
+
projectClassification = projectRootClassification;
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1509
1617
|
}
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
// to ensure we're in a valid working directory.
|
|
1521
|
-
debugLog("runUnitPhase", { phase: "worktree-health-warn-greenfield", basePath: s.basePath, hasProjectFile, hasSrcDir, hasXcodeBundle });
|
|
1522
|
-
ctx.ui.notify(`Warning: ${s.basePath} has no recognized project files — proceeding as greenfield project`, "warning");
|
|
1618
|
+
|
|
1619
|
+
if (projectClassification.kind === "greenfield") {
|
|
1620
|
+
debugLog("runUnitPhase", { phase: "worktree-health-greenfield", basePath: s.basePath, classification: projectClassification });
|
|
1621
|
+
ctx.ui.notify(`Warning: ${s.basePath} has no project content yet — proceeding as greenfield project`, "warning");
|
|
1622
|
+
} else if (projectClassification.kind === "untyped-existing") {
|
|
1623
|
+
debugLog("runUnitPhase", { phase: "worktree-health-untyped-existing", basePath: s.basePath, classification: projectClassification });
|
|
1624
|
+
ctx.ui.notify(
|
|
1625
|
+
`Notice: ${s.basePath} has existing project content but no recognized tooling markers — using generic file-level workflow guidance`,
|
|
1626
|
+
"info",
|
|
1627
|
+
);
|
|
1523
1628
|
}
|
|
1524
1629
|
}
|
|
1525
1630
|
|
|
@@ -1598,6 +1703,17 @@ export async function runUnitPhase(
|
|
|
1598
1703
|
// Prompt injection
|
|
1599
1704
|
let finalPrompt = prompt;
|
|
1600
1705
|
|
|
1706
|
+
if (unitType === "execute-task") {
|
|
1707
|
+
projectClassification ??= classifyProject(s.basePath);
|
|
1708
|
+
if (projectClassification.kind === "untyped-existing") {
|
|
1709
|
+
const samples = projectClassification.contentFiles.slice(0, 8).join(", ") || "project files";
|
|
1710
|
+
finalPrompt +=
|
|
1711
|
+
"\n\n**Project classification:** Existing untyped project. No recognized build/tooling markers were detected, " +
|
|
1712
|
+
"so use generic file-level workflow guidance. Task plans and completion summaries must list every concrete " +
|
|
1713
|
+
`project file changed in \`files\` or \`expected_output\`. Detected content sample: ${samples}.`;
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1601
1717
|
if (s.pendingVerificationRetry) {
|
|
1602
1718
|
const retryCtx = s.pendingVerificationRetry;
|
|
1603
1719
|
s.pendingVerificationRetry = null;
|
|
@@ -1982,7 +2098,7 @@ export async function runUnitPhase(
|
|
|
1982
2098
|
const currentLedger = deps.getLedger() as { units: Array<{ type: string; id: string; startedAt: number; toolCalls: number }> } | null;
|
|
1983
2099
|
if (currentLedger?.units) {
|
|
1984
2100
|
const lastUnit = [...currentLedger.units].reverse().find(
|
|
1985
|
-
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit
|
|
2101
|
+
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === _resolveCurrentUnitStartedAtForTest(s.currentUnit),
|
|
1986
2102
|
);
|
|
1987
2103
|
if (lastUnit && lastUnit.toolCalls === 0) {
|
|
1988
2104
|
if (USER_DRIVEN_DEEP_UNITS.has(unitType) && isAwaitingUserInput(s.lastUnitAgentEndMessages ?? undefined)) {
|
|
@@ -2004,7 +2120,7 @@ export async function runUnitPhase(
|
|
|
2004
2120
|
);
|
|
2005
2121
|
// Fall through to next iteration where dispatch will re-derive
|
|
2006
2122
|
// and re-dispatch this unit.
|
|
2007
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
2123
|
+
return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
2008
2124
|
}
|
|
2009
2125
|
}
|
|
2010
2126
|
}
|
|
@@ -2069,7 +2185,7 @@ export async function runUnitPhase(
|
|
|
2069
2185
|
s.checkpointSha = null;
|
|
2070
2186
|
}
|
|
2071
2187
|
|
|
2072
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
2188
|
+
return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
2073
2189
|
}
|
|
2074
2190
|
|
|
2075
2191
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
@@ -2249,8 +2365,20 @@ export async function runFinalize(
|
|
|
2249
2365
|
return { action: "break", reason: "step-wizard" };
|
|
2250
2366
|
}
|
|
2251
2367
|
|
|
2368
|
+
if (preUnitSnapshot?.type === "complete-milestone" && s.currentMilestoneId) {
|
|
2369
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
2370
|
+
if (stop) return stop;
|
|
2371
|
+
}
|
|
2372
|
+
|
|
2252
2373
|
// Both pre and post verification completed without timeout — reset counter
|
|
2253
2374
|
loopState.consecutiveFinalizeTimeouts = 0;
|
|
2375
|
+
if (preUnitSnapshot) {
|
|
2376
|
+
writeUnitRuntimeRecord(s.basePath, preUnitSnapshot.type, preUnitSnapshot.id, preUnitSnapshot.startedAt, {
|
|
2377
|
+
phase: "finalized",
|
|
2378
|
+
lastProgressAt: Date.now(),
|
|
2379
|
+
lastProgressKind: "finalize-success",
|
|
2380
|
+
});
|
|
2381
|
+
}
|
|
2254
2382
|
s.currentUnit = null;
|
|
2255
2383
|
clearCurrentPhase();
|
|
2256
2384
|
|