gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82

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.
Files changed (653) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  9. package/dist/resources/extensions/cmux/index.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +146 -49
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  17. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  19. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  26. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  27. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  31. package/dist/resources/extensions/gsd/auto.js +135 -74
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  37. package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  41. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  43. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
  45. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  47. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  48. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  49. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  50. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  51. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  52. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
  56. package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
  57. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  58. package/dist/resources/extensions/gsd/doctor.js +2 -28
  59. package/dist/resources/extensions/gsd/export-html.js +27 -425
  60. package/dist/resources/extensions/gsd/forensics.js +10 -3
  61. package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
  62. package/dist/resources/extensions/gsd/git-service.js +152 -15
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  69. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  70. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  75. package/dist/resources/extensions/gsd/paths.js +4 -0
  76. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  77. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  80. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  81. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  82. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  83. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  84. package/dist/resources/extensions/gsd/preferences.js +35 -0
  85. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  89. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  90. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  94. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  95. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  97. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  98. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  99. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  100. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  101. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  102. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  103. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  104. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  105. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  106. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  108. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  109. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  110. package/dist/resources/extensions/gsd/state.js +28 -7
  111. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  112. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  113. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  114. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  115. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  116. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  117. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  118. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  119. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  120. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  121. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  122. package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
  123. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  124. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  125. package/dist/resources/extensions/gsd/validation.js +23 -1
  126. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  127. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  128. package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
  129. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  130. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  131. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  132. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  133. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  134. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  135. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  136. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  140. package/dist/resources/extensions/subagent/index.js +448 -78
  141. package/dist/resources/extensions/subagent/launch.js +77 -0
  142. package/dist/resources/extensions/subagent/run-store.js +148 -0
  143. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  144. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  145. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  146. package/dist/resources/extensions/visual-brief/index.js +5 -0
  147. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  148. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  149. package/dist/resources/skills/forensics/SKILL.md +1 -1
  150. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  151. package/dist/web/standalone/.next/BUILD_ID +1 -1
  152. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  153. package/dist/web/standalone/.next/build-manifest.json +3 -3
  154. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  155. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  156. package/dist/web/standalone/.next/required-server-files.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/index.html +1 -1
  180. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  181. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  183. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  186. package/dist/web/standalone/.next/server/app/page.js +2 -2
  187. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  190. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  191. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  199. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  200. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  203. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  204. package/dist/web/standalone/server.js +1 -1
  205. package/dist/welcome-screen.js +7 -8
  206. package/package.json +4 -4
  207. package/packages/contracts/dist/rpc.test.js +7 -0
  208. package/packages/contracts/dist/rpc.test.js.map +1 -1
  209. package/packages/contracts/dist/workflow.d.ts +21 -0
  210. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  211. package/packages/contracts/dist/workflow.js +24 -0
  212. package/packages/contracts/dist/workflow.js.map +1 -1
  213. package/packages/contracts/src/rpc.test.ts +8 -0
  214. package/packages/contracts/src/workflow.ts +24 -0
  215. package/packages/daemon/package.json +2 -2
  216. package/packages/mcp-server/README.md +13 -4
  217. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  218. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  219. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  220. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  221. package/packages/mcp-server/package.json +2 -2
  222. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  223. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  224. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  225. package/packages/native/package.json +1 -1
  226. package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
  227. package/packages/native/tsconfig.json +2 -1
  228. package/packages/native/tsconfig.tsbuildinfo +1 -1
  229. package/packages/pi-agent-core/package.json +1 -1
  230. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  232. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  236. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  239. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  240. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  241. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  243. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  244. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  245. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  247. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  248. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  249. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  250. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  251. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  252. package/packages/pi-ai/package.json +1 -1
  253. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  254. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  255. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  256. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  257. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  258. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  263. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  265. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  267. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  269. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  271. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  273. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  275. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  300. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  301. package/packages/pi-coding-agent/package.json +1 -1
  302. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  303. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  304. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  305. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  306. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  307. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  308. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  309. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
  310. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  312. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  313. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  315. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  316. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  317. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  320. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  321. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  322. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  323. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  324. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  325. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  326. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  327. package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
  328. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  329. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  330. package/packages/pi-tui/dist/components/loader.js +3 -0
  331. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  332. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  333. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  334. package/packages/pi-tui/dist/terminal.js +12 -0
  335. package/packages/pi-tui/dist/terminal.js.map +1 -1
  336. package/packages/pi-tui/dist/tui.d.ts +1 -0
  337. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  338. package/packages/pi-tui/dist/tui.js +117 -33
  339. package/packages/pi-tui/dist/tui.js.map +1 -1
  340. package/packages/pi-tui/package.json +1 -1
  341. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  342. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  343. package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
  344. package/packages/pi-tui/src/components/loader.ts +3 -0
  345. package/packages/pi-tui/src/terminal.ts +11 -0
  346. package/packages/pi-tui/src/tui.ts +116 -33
  347. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  348. package/packages/rpc-client/package.json +1 -1
  349. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  350. package/pkg/package.json +1 -1
  351. package/src/resources/GSD-WORKFLOW.md +10 -1
  352. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  353. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  354. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  355. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  356. package/src/resources/extensions/cmux/index.ts +6 -0
  357. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  358. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  360. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  361. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  362. package/src/resources/extensions/gsd/auto/phases.ts +172 -60
  363. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  364. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  365. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  369. package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
  370. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  371. package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
  372. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  373. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  374. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  375. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  376. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  377. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  378. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  379. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  380. package/src/resources/extensions/gsd/auto.ts +172 -81
  381. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  382. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  383. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  384. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  385. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  386. package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
  387. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  388. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  389. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  390. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  391. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  392. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  393. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
  394. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  395. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  396. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  397. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  398. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  399. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  400. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  401. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  402. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  403. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  404. package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
  405. package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
  406. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  407. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  408. package/src/resources/extensions/gsd/doctor.ts +2 -27
  409. package/src/resources/extensions/gsd/export-html.ts +27 -427
  410. package/src/resources/extensions/gsd/forensics.ts +9 -3
  411. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  412. package/src/resources/extensions/gsd/git-service.ts +182 -16
  413. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  414. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  415. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  416. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  417. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  418. package/src/resources/extensions/gsd/journal.ts +8 -1
  419. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  420. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  421. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  422. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  423. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  424. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  425. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  426. package/src/resources/extensions/gsd/paths.ts +5 -0
  427. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  428. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  431. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  432. package/src/resources/extensions/gsd/preferences-models.ts +6 -4
  433. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  434. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  435. package/src/resources/extensions/gsd/preferences.ts +39 -0
  436. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  437. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  440. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  441. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  442. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  443. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  445. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  446. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  448. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  449. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  450. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  451. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  454. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  455. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  456. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  457. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  458. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  459. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  460. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  461. package/src/resources/extensions/gsd/state.ts +33 -7
  462. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  463. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  464. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  465. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  466. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  467. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  468. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  469. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  470. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  471. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  472. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  473. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  474. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  476. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  477. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  478. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  479. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  480. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  481. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  482. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  483. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  484. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  485. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
  486. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  487. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  488. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  489. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  490. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  491. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  492. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  493. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  494. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  495. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  497. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
  498. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  499. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  500. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  501. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  502. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  503. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  504. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  505. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  506. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  507. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  508. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  510. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  511. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  512. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  513. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  514. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  515. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  516. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  517. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  518. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
  519. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
  520. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  521. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  522. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  523. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  524. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  525. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  527. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  528. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  529. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  530. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  531. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  532. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  533. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  534. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
  535. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  536. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  537. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  538. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  539. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  540. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  541. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  542. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  543. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  544. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  545. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  546. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  547. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  548. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  549. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  551. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  553. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  554. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  555. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  556. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  557. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  558. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  559. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  560. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  561. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  562. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  563. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  564. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  566. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  567. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  568. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  570. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  572. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  573. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  574. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  575. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  576. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  579. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  581. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  582. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  584. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  585. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  587. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  589. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  591. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  592. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  593. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  594. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  597. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  598. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  599. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  600. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  601. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  602. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  603. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  604. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  605. package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
  606. package/src/resources/extensions/gsd/types.ts +1 -1
  607. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  608. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  609. package/src/resources/extensions/gsd/validation.ts +23 -1
  610. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  611. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  612. package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
  613. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  614. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  615. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  616. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  617. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  618. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  619. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  620. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  621. package/src/resources/extensions/shared/html-shell.ts +412 -0
  622. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  623. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  624. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  625. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  626. package/src/resources/extensions/subagent/index.ts +567 -103
  627. package/src/resources/extensions/subagent/launch.ts +131 -0
  628. package/src/resources/extensions/subagent/run-store.ts +218 -0
  629. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  630. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  631. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  632. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  633. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  634. package/src/resources/extensions/visual-brief/index.ts +8 -0
  635. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  636. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  637. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  638. package/src/resources/skills/forensics/SKILL.md +1 -1
  639. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  640. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  641. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  642. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  644. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  645. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  646. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  647. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  648. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  649. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  650. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  651. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  652. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
  653. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
@@ -7,8 +7,8 @@
7
7
  *
8
8
  * Split into two functions called sequentially by auto-loop with
9
9
  * the verification gate between them:
10
- * 1. postUnitPreVerification() — commit, doctor, state rebuild, worktree sync, artifact verification
11
- * 2. postUnitPostVerification() — DB dual-write, hooks, triage, quick-tasks
10
+ * 1. postUnitPreVerification() — closeout git for non-task units, doctor, state rebuild, worktree sync, artifact verification
11
+ * 2. postUnitPostVerification() — post-verified task git, DB dual-write, hooks, triage, quick-tasks
12
12
  *
13
13
  * Extracted from the pre-loop agent_end handler in auto.ts.
14
14
  */
@@ -23,12 +23,12 @@ import { rebuildState } from "./doctor.js";
23
23
  import { parseUnitId } from "./unit-id.js";
24
24
  import { closeoutUnit } from "./auto-unit-closeout.js";
25
25
  import { runTurnGitAction, } from "./git-service.js";
26
- import { verifyExpectedArtifact, resolveExpectedArtifactPath, writeBlockerPlaceholder, diagnoseExpectedArtifact, } from "./auto-recovery.js";
26
+ import { verifyExpectedArtifact, resolveExpectedArtifactPath, writeBlockerPlaceholder, diagnoseExpectedArtifact, diagnoseWorktreeIntegrityFailure, } from "./auto-recovery.js";
27
27
  import { regenerateIfMissing } from "./workflow-projections.js";
28
28
  import { WorktreeStateProjection } from "./worktree-state-projection.js";
29
29
  import { createWorkspace, scopeMilestone } from "./workspace.js";
30
30
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
31
- import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
31
+ import { isDbAvailable, getDbPath, refreshOpenDatabaseFromDisk, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
32
32
  import { renderPlanCheckboxes } from "./markdown-renderer.js";
33
33
  import { consumeSignal } from "./session-status-io.js";
34
34
  import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
@@ -37,8 +37,7 @@ import { debugLog } from "./debug-logger.js";
37
37
  import { runSafely } from "./auto-utils.js";
38
38
  import { getEvidence, clearEvidenceFromDisk } from "./safety/evidence-collector.js";
39
39
  import { validateFileChanges } from "./safety/file-change-validator.js";
40
- // crossReferenceEvidence available for future use when verification_evidence is stored in DB
41
- // import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
40
+ import { crossReferenceEvidence } from "./safety/evidence-cross-ref.js";
42
41
  import { validateContent } from "./safety/content-validator.js";
43
42
  import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
44
43
  import { resolveExpectedArtifactPath as resolveArtifactForContent } from "./auto-artifact-paths.js";
@@ -56,6 +55,8 @@ import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
56
55
  import { clearProjectResearchInflightMarker, finalizeProjectResearchTimeout, } from "./project-research-policy.js";
57
56
  import { validateArtifact } from "./schemas/validate.js";
58
57
  import { verificationRetryKey } from "./auto/verification-retry-policy.js";
58
+ import { getLedger } from "./metrics.js";
59
+ import { getUnitCostSpikeAction } from "./auto-budget.js";
59
60
  // ─── Path Comparison Helper ───────────────────────────────────────────────
60
61
  /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
61
62
  function isSamePathLocal(a, b) {
@@ -76,6 +77,40 @@ function formatPreExecutionCheckDetail(check) {
76
77
  }
77
78
  const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
78
79
  const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
80
+ const GIT_ACTION_FAILURE_LOG_REL_PATH = ".gsd/git-action-failures.log";
81
+ const DEFAULT_PER_UNIT_COST_CAP_USD = 5.0;
82
+ function getCurrentUnitCostStats(unitId) {
83
+ const ledger = getLedger();
84
+ if (!ledger || !Array.isArray(ledger.units) || ledger.units.length === 0) {
85
+ return { unitCostUsd: 0, rollingAvgUsd: 0 };
86
+ }
87
+ let unitCostUsd = 0;
88
+ let totalCost = 0;
89
+ let totalUnits = 0;
90
+ for (const unit of ledger.units) {
91
+ const cost = typeof unit?.cost === "number" ? unit.cost : 0;
92
+ if (!Number.isFinite(cost) || cost < 0)
93
+ continue;
94
+ totalCost += cost;
95
+ totalUnits++;
96
+ if (unit?.id === unitId)
97
+ unitCostUsd += cost;
98
+ }
99
+ return {
100
+ unitCostUsd,
101
+ rollingAvgUsd: totalUnits > 0 ? totalCost / totalUnits : 0,
102
+ };
103
+ }
104
+ function persistGitActionFailure(basePath, action, message) {
105
+ const logPath = join(basePath, GIT_ACTION_FAILURE_LOG_REL_PATH);
106
+ const logDir = join(basePath, ".gsd");
107
+ const timestamp = new Date().toISOString();
108
+ const body = message.trim() || "unknown git failure";
109
+ const entry = `[${timestamp}] action=${action}\n${body}\n\n`;
110
+ mkdirSync(logDir, { recursive: true });
111
+ appendFileSync(logPath, entry, "utf-8");
112
+ return logPath;
113
+ }
79
114
  function stripKnownIdPrefix(value, id) {
80
115
  const raw = String(value ?? "").trim();
81
116
  if (!raw)
@@ -126,7 +161,12 @@ async function buildTaskCommitContextForUnit(basePath, unitId) {
126
161
  sliceId: sid,
127
162
  sliceTitle: stripKnownIdPrefix(slice?.title, sid),
128
163
  oneLiner: summary?.oneLiner || task?.one_liner || undefined,
129
- keyFiles: summary?.frontmatter.key_files?.filter(f => !f.includes("{{")) ??
164
+ keyFiles: summary?.frontmatter.key_files?.filter((f) => {
165
+ const normalized = f.trim();
166
+ return normalized.length > 0 &&
167
+ !normalized.includes("{{") &&
168
+ !/^(?:\(none\)|none\.?|n\/a)$/i.test(normalized);
169
+ }) ??
130
170
  task?.key_files ??
131
171
  undefined,
132
172
  issueNumber: ghIssueNumber,
@@ -171,6 +211,9 @@ export function _shouldDispatchQuickTaskForTest(state) {
171
211
  !!state.currentUnit &&
172
212
  state.currentUnit.type !== "quick-task";
173
213
  }
214
+ export function shouldDeferCloseoutGitAction(unitType) {
215
+ return unitType === "execute-task";
216
+ }
174
217
  /** Unit types that only touch `.gsd/` internal state files (no code changes).
175
218
  * Auto-commit is skipped for these — their state files are picked up by the
176
219
  * next actual task commit via `smartStage()`. */
@@ -181,7 +224,7 @@ const LIFECYCLE_ONLY_UNITS = new Set([
181
224
  "reassess-roadmap", "rewrite-docs",
182
225
  ]);
183
226
  import { describeNextUnit, } from "./auto-dashboard.js";
184
- import { existsSync, unlinkSync } from "node:fs";
227
+ import { appendFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs";
185
228
  import { join, relative } from "node:path";
186
229
  import { _resetHasChangesCache } from "./native-git-bridge.js";
187
230
  import { autoCommitCurrentBranch } from "./worktree.js";
@@ -292,14 +335,27 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
292
335
  * looping indefinitely (#2007).
293
336
  */
294
337
  export const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
295
- export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
338
+ export const STEP_COMPLETE_FALLBACK_MESSAGE = "Step complete. Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).";
296
339
  export function buildStepCompleteMessage(nextState) {
297
340
  if (nextState.phase === "complete") {
298
341
  return "Step complete — milestone finished. Run /gsd status to review, or start the next milestone.";
299
342
  }
300
343
  const next = describeNextUnit(nextState);
301
344
  return `Step complete. Next: ${next.label}\n`
302
- + `Run /clear, then /gsd to continue (or /gsd auto to run continuously).`;
345
+ + `Run /clear if you want a clean view, then /gsd next to continue one step (or /gsd auto to run continuously).`;
346
+ }
347
+ /**
348
+ * Decide whether step mode should stop at the step wizard after a unit finishes.
349
+ *
350
+ * @param currentUnitType The just-finished unit type, such as "execute-task" or
351
+ * "complete-milestone"; may be null/undefined when no current unit is known.
352
+ * @param phaseAfterUnit The freshly derived next phase, such as "executing" or
353
+ * "complete"; may be null/undefined if state derivation failed.
354
+ * @returns true to show the step wizard; false to keep the loop running so
355
+ * terminal milestone completion can reach the merge/finalization path.
356
+ */
357
+ export function shouldReturnStepWizardAfterUnit(currentUnitType, phaseAfterUnit) {
358
+ return currentUnitType !== "complete-milestone" && phaseAfterUnit !== "complete";
303
359
  }
304
360
  export const USER_DRIVEN_DEEP_UNITS = new Set([
305
361
  "discuss-project",
@@ -316,6 +372,10 @@ function artifactValidationKind(unitType) {
316
372
  return null;
317
373
  }
318
374
  function describeArtifactVerificationFailure(unitType, unitId, basePath) {
375
+ const worktreeFailure = diagnoseWorktreeIntegrityFailure(basePath);
376
+ if (worktreeFailure) {
377
+ return `${worktreeFailure} Unit: ${unitType} ${unitId}.`;
378
+ }
319
379
  const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
320
380
  if (!artifactPath) {
321
381
  return `Artifact verification failed: ${unitType} "${unitId}" has no resolvable artifact path.`;
@@ -360,6 +420,162 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
360
420
  return null;
361
421
  }
362
422
  }
423
+ /**
424
+ * Execute the turn-level git action (commit, snapshot, or status-only).
425
+ *
426
+ * @param opts.softFailure - Defaults to false. When true, retry git failures,
427
+ * warn, and continue without pausing auto-mode; use for best-effort deferred
428
+ * closeout work where a git failure should not block the run.
429
+ */
430
+ async function runCloseoutGitAction(pctx, unit, opts) {
431
+ const { s, ctx, pi, pauseAuto } = pctx;
432
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
433
+ const uokFlags = resolveUokFlags(prefs);
434
+ const turnAction = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
435
+ const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
436
+ const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
437
+ s.lastGitActionFailure = null;
438
+ s.lastGitActionStatus = null;
439
+ try {
440
+ let taskContext;
441
+ let targetRepositories;
442
+ if (turnAction === "commit" && unit.type === "execute-task") {
443
+ taskContext = await buildTaskCommitContextForUnit(s.basePath, unit.id);
444
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unit.id);
445
+ if (mid && sid && tid && isDbAvailable()) {
446
+ targetRepositories = getTask(mid, sid, tid)?.target_repositories;
447
+ }
448
+ }
449
+ // Invalidate the nativeHasChanges cache before auto-commit (#1853).
450
+ // The cache has a 10-second TTL and is keyed by basePath. A stale
451
+ // `false` result causes autoCommit to skip staging entirely.
452
+ _resetHasChangesCache();
453
+ const skipLifecycleCommit = turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(unit.type);
454
+ if (skipLifecycleCommit) {
455
+ debugLog("postUnit", {
456
+ phase: "git-action-skipped",
457
+ reason: "lifecycle-only-unit",
458
+ unitType: unit.type,
459
+ unitId: unit.id,
460
+ });
461
+ }
462
+ else {
463
+ const maxAttempts = opts?.softFailure ? 3 : 1;
464
+ let gitResult = runTurnGitAction({
465
+ basePath: s.basePath,
466
+ action: turnAction,
467
+ unitType: unit.type,
468
+ unitId: unit.id,
469
+ taskContext,
470
+ targetRepositories,
471
+ });
472
+ for (let attempt = 1; gitResult.status === "failed" && attempt < maxAttempts; attempt++) {
473
+ await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
474
+ gitResult = runTurnGitAction({
475
+ basePath: s.basePath,
476
+ action: turnAction,
477
+ unitType: unit.type,
478
+ unitId: unit.id,
479
+ taskContext,
480
+ targetRepositories,
481
+ });
482
+ }
483
+ if (uokFlags.gitops) {
484
+ writeTurnGitTransaction({
485
+ basePath: s.basePath,
486
+ traceId,
487
+ turnId,
488
+ unitType: unit.type,
489
+ unitId: unit.id,
490
+ stage: "publish",
491
+ action: turnAction,
492
+ push: uokFlags.gitopsTurnPush,
493
+ status: gitResult.status,
494
+ error: gitResult.error,
495
+ metadata: {
496
+ dirty: gitResult.dirty,
497
+ dirtyRepositories: gitResult.dirtyRepositories,
498
+ commitMessage: gitResult.commitMessage,
499
+ commitMessages: gitResult.commitMessages,
500
+ commitErrors: gitResult.commitErrors,
501
+ skippedRepositories: gitResult.skippedRepositories,
502
+ snapshotLabel: gitResult.snapshotLabel,
503
+ },
504
+ });
505
+ }
506
+ if (gitResult.status === "failed") {
507
+ s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
508
+ s.lastGitActionStatus = "failed";
509
+ const fullError = gitResult.error ?? "unknown error";
510
+ const failureLogPath = persistGitActionFailure(s.basePath, turnAction, fullError);
511
+ if (uokFlags.gitops && uokFlags.gates) {
512
+ const parsed = parseUnitId(unit.id);
513
+ const gateRunner = new UokGateRunner();
514
+ gateRunner.register({
515
+ id: "closeout-git-action",
516
+ type: "closeout",
517
+ execute: async () => ({
518
+ outcome: "fail",
519
+ failureClass: "git",
520
+ rationale: `turn git action "${turnAction}" failed`,
521
+ findings: fullError,
522
+ }),
523
+ });
524
+ await gateRunner.run("closeout-git-action", {
525
+ basePath: s.basePath,
526
+ traceId,
527
+ turnId,
528
+ milestoneId: parsed.milestone ?? undefined,
529
+ sliceId: parsed.slice ?? undefined,
530
+ taskId: parsed.task ?? undefined,
531
+ unitType: unit.type,
532
+ unitId: unit.id,
533
+ });
534
+ }
535
+ const failureMsg = `Git ${turnAction} failed: ${fullError.split("\n")[0]} (full details: ${failureLogPath})`;
536
+ ctx.ui.notify(failureMsg, opts?.softFailure ? "warning" : "error");
537
+ debugLog("postUnit", {
538
+ phase: opts?.softFailure ? "git-action-failed-soft" : "git-action-failed-blocking",
539
+ action: turnAction,
540
+ error: fullError,
541
+ failureLogPath,
542
+ });
543
+ if (opts?.softFailure) {
544
+ return "continue";
545
+ }
546
+ await pauseAuto(ctx, pi);
547
+ return "dispatched";
548
+ }
549
+ s.lastGitActionStatus = "ok";
550
+ if (turnAction === "commit" && gitResult.commitMessage) {
551
+ ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
552
+ }
553
+ else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
554
+ ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
555
+ }
556
+ }
557
+ }
558
+ catch (e) {
559
+ const message = e instanceof Error ? e.message : String(e);
560
+ s.lastGitActionFailure = message;
561
+ s.lastGitActionStatus = "failed";
562
+ debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
563
+ ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, opts?.softFailure ? "warning" : "error");
564
+ if (opts?.softFailure) {
565
+ return "continue";
566
+ }
567
+ if (uokFlags.gitops) {
568
+ await pauseAuto(ctx, pi);
569
+ return "dispatched";
570
+ }
571
+ }
572
+ // GitHub sync (non-blocking, opt-in)
573
+ await runSafely("postUnit", "github-sync", async () => {
574
+ const { runGitHubSync } = await import("../github-sync/sync.js");
575
+ await runGitHubSync(s.basePath, unit.type, unit.id);
576
+ });
577
+ return "continue";
578
+ }
363
579
  /**
364
580
  * Pre-verification processing: parallel worker signal check, cache invalidation,
365
581
  * auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
@@ -370,7 +586,7 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
370
586
  * - "retry" — artifact verification failed, s.pendingVerificationRetry set for loop re-iteration
371
587
  */
372
588
  export async function postUnitPreVerification(pctx, opts) {
373
- const { s, ctx, pi, buildSnapshotOpts, stopAuto, pauseAuto } = pctx;
589
+ const { s, ctx, pi, stopAuto, pauseAuto } = pctx;
374
590
  // ── Parallel worker signal check ──
375
591
  const milestoneLock = process.env.GSD_MILESTONE_LOCK;
376
592
  if (milestoneLock) {
@@ -392,125 +608,29 @@ export async function postUnitPreVerification(pctx, opts) {
392
608
  if (!opts?.skipSettleDelay) {
393
609
  await new Promise(r => setTimeout(r, 100));
394
610
  }
395
- const prefs = loadEffectiveGSDPreferences()?.preferences;
396
- const uokFlags = resolveUokFlags(prefs);
611
+ const dbPath = getDbPath();
612
+ if (isDbAvailable() && dbPath && dbPath !== ":memory:") {
613
+ const refreshed = refreshOpenDatabaseFromDisk();
614
+ if (!refreshed) {
615
+ logWarning("db", "post-unit database refresh failed; derived state may be stale");
616
+ }
617
+ }
397
618
  // Turn-level git action (commit | snapshot | status-only)
398
619
  if (s.currentUnit) {
399
620
  const unit = s.currentUnit;
400
- const turnAction = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
401
- const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
402
- const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
403
- s.lastGitActionFailure = null;
404
- s.lastGitActionStatus = null;
405
- try {
406
- let taskContext;
407
- if (turnAction === "commit" && s.currentUnit.type === "execute-task") {
408
- taskContext = await buildTaskCommitContextForUnit(s.basePath, s.currentUnit.id);
409
- }
410
- // Invalidate the nativeHasChanges cache before auto-commit (#1853).
411
- // The cache has a 10-second TTL and is keyed by basePath. A stale
412
- // `false` result causes autoCommit to skip staging entirely, leaving
413
- // code files only in the working tree where they are destroyed by
414
- // `git worktree remove --force` during teardown.
415
- _resetHasChangesCache();
416
- const skipLifecycleCommit = turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type);
417
- if (skipLifecycleCommit) {
418
- debugLog("postUnit", {
419
- phase: "git-action-skipped",
420
- reason: "lifecycle-only-unit",
421
- unitType: s.currentUnit.type,
422
- unitId: s.currentUnit.id,
423
- });
424
- }
425
- else {
426
- const gitResult = runTurnGitAction({
427
- basePath: s.basePath,
428
- action: turnAction,
429
- unitType: s.currentUnit.type,
430
- unitId: s.currentUnit.id,
431
- taskContext,
432
- });
433
- if (uokFlags.gitops) {
434
- writeTurnGitTransaction({
435
- basePath: s.basePath,
436
- traceId,
437
- turnId,
438
- unitType: unit.type,
439
- unitId: unit.id,
440
- stage: "publish",
441
- action: turnAction,
442
- push: uokFlags.gitopsTurnPush,
443
- status: gitResult.status,
444
- error: gitResult.error,
445
- metadata: {
446
- dirty: gitResult.dirty,
447
- commitMessage: gitResult.commitMessage,
448
- snapshotLabel: gitResult.snapshotLabel,
449
- },
450
- });
451
- }
452
- if (gitResult.status === "failed") {
453
- s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
454
- s.lastGitActionStatus = "failed";
455
- if (uokFlags.gitops && uokFlags.gates) {
456
- const parsed = parseUnitId(unit.id);
457
- const gateRunner = new UokGateRunner();
458
- gateRunner.register({
459
- id: "closeout-git-action",
460
- type: "closeout",
461
- execute: async () => ({
462
- outcome: "fail",
463
- failureClass: "git",
464
- rationale: `turn git action "${turnAction}" failed`,
465
- findings: gitResult.error ?? "unknown git failure",
466
- }),
467
- });
468
- await gateRunner.run("closeout-git-action", {
469
- basePath: s.basePath,
470
- traceId,
471
- turnId,
472
- milestoneId: parsed.milestone ?? undefined,
473
- sliceId: parsed.slice ?? undefined,
474
- taskId: parsed.task ?? undefined,
475
- unitType: unit.type,
476
- unitId: unit.id,
477
- });
478
- }
479
- const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
480
- ctx.ui.notify(failureMsg, "error");
481
- debugLog("postUnit", {
482
- phase: "git-action-failed-blocking",
483
- action: turnAction,
484
- error: gitResult.error ?? "unknown error",
485
- });
486
- await pauseAuto(ctx, pi);
487
- return "dispatched";
488
- }
489
- s.lastGitActionStatus = "ok";
490
- if (turnAction === "commit" && gitResult.commitMessage) {
491
- ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
492
- }
493
- else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
494
- ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
495
- }
496
- }
621
+ if (shouldDeferCloseoutGitAction(unit.type)) {
622
+ debugLog("postUnit", {
623
+ phase: "git-action-deferred-until-verification",
624
+ unitType: unit.type,
625
+ unitId: unit.id,
626
+ });
497
627
  }
498
- catch (e) {
499
- const message = e instanceof Error ? e.message : String(e);
500
- s.lastGitActionFailure = message;
501
- s.lastGitActionStatus = "failed";
502
- debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
503
- ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, uokFlags.gitops ? "error" : "warning");
504
- if (uokFlags.gitops) {
505
- await pauseAuto(ctx, pi);
628
+ else {
629
+ const gitActionResult = await runCloseoutGitAction(pctx, unit);
630
+ if (gitActionResult === "dispatched") {
506
631
  return "dispatched";
507
632
  }
508
633
  }
509
- // GitHub sync (non-blocking, opt-in)
510
- await runSafely("postUnit", "github-sync", async () => {
511
- const { runGitHubSync } = await import("../github-sync/sync.js");
512
- await runGitHubSync(s.basePath, unit.type, unit.id);
513
- });
514
634
  // Prune dead bg-shell processes
515
635
  await runSafely("postUnit", "prune-bg-shell", async () => {
516
636
  const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
@@ -723,7 +843,7 @@ export async function postUnitPreVerification(pctx, opts) {
723
843
  const safetyConfig = resolveSafetyHarnessConfig(prefs?.safety_harness);
724
844
  if (safetyConfig.enabled) {
725
845
  const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
726
- // File change validation (execute-task only, after auto-commit)
846
+ // File change validation (execute-task only, after unit execution)
727
847
  if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid && isDbAvailable()) {
728
848
  try {
729
849
  const taskRow = getTask(sMid, sSid, sTid);
@@ -756,12 +876,35 @@ export async function postUnitPreVerification(pctx, opts) {
756
876
  const bashCalls = actual.filter(e => e.kind === "bash");
757
877
  if (sMid && sSid && sTid && isDbAvailable()) {
758
878
  const taskRow = getTask(sMid, sSid, sTid);
759
- const claimedCommands = getVerificationEvidence(sMid, sSid, sTid)
760
- .map((row) => row.command)
761
- .filter((command) => typeof command === "string" && command.trim().length > 0);
762
- if (taskRow?.status === "complete" && claimedCommands.length > 0 && bashCalls.length === 0) {
763
- logWarning("safety", "task claimed verification command evidence but no execution tool calls were recorded");
764
- ctx.ui.notify(`Safety: task ${sTid} claimed command evidence but no execution tool calls were recorded`, "warning");
879
+ if (taskRow?.status === "complete") {
880
+ const claimedEvidence = getVerificationEvidence(sMid, sSid, sTid)
881
+ .map((row) => ({
882
+ command: row.command,
883
+ exitCode: row.exit_code,
884
+ verdict: row.verdict,
885
+ createdAt: row.created_at,
886
+ }))
887
+ .filter((row) => typeof row.command === "string" && row.command.trim().length > 0);
888
+ const mismatches = crossReferenceEvidence(claimedEvidence, actual);
889
+ for (const mismatch of mismatches) {
890
+ const logMessage = `evidence-xref: ${mismatch.reason}`;
891
+ if (mismatch.severity === "error") {
892
+ logError("safety", logMessage);
893
+ }
894
+ else {
895
+ logWarning("safety", logMessage);
896
+ }
897
+ }
898
+ if (claimedEvidence.length > 0 && bashCalls.length === 0) {
899
+ logWarning("safety", "task claimed verification command evidence but no execution tool calls were recorded");
900
+ ctx.ui.notify(`Safety: task ${sTid} claimed command evidence but no execution tool calls were recorded`, "warning");
901
+ }
902
+ const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
903
+ if (blockingMismatch) {
904
+ ctx.ui.notify(`Safety: task ${sTid} claimed passing verification that failed in recorded execution`, "error");
905
+ await pauseAuto(ctx, pi);
906
+ return "dispatched";
907
+ }
765
908
  }
766
909
  }
767
910
  }
@@ -919,9 +1062,25 @@ export async function postUnitPreVerification(pctx, opts) {
919
1062
  s.verificationRetryCount.delete(retryKey);
920
1063
  s.verificationRetryFailureHashes.delete(retryKey);
921
1064
  writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
922
- ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries) (#4973)`, "warning");
1065
+ ctx.ui.notify(`${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries)`, "warning");
923
1066
  // Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
924
1067
  }
1068
+ else if (!triggerArtifactVerified && diagnoseWorktreeIntegrityFailure(s.basePath)) {
1069
+ const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
1070
+ const worktreeFailure = diagnoseWorktreeIntegrityFailure(s.basePath);
1071
+ s.pendingVerificationRetry = null;
1072
+ s.verificationRetryCount.delete(retryKey);
1073
+ s.verificationRetryFailureHashes.delete(retryKey);
1074
+ debugLog("postUnit", {
1075
+ phase: "worktree-integrity-failure",
1076
+ unitType: s.currentUnit.type,
1077
+ unitId: s.currentUnit.id,
1078
+ basePath: s.basePath,
1079
+ });
1080
+ ctx.ui.notify(`${worktreeFailure} Retry ${s.currentUnit.id} after repair.`, "error");
1081
+ await pauseAuto(ctx, pi);
1082
+ return "dispatched";
1083
+ }
925
1084
  else if (!triggerArtifactVerified && !isDbAvailable()) {
926
1085
  debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
927
1086
  const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
@@ -942,6 +1101,27 @@ export async function postUnitPreVerification(pctx, opts) {
942
1101
  const hasExpectedArtifact = resolveExpectedArtifactPath(s.currentUnit.type, s.currentUnit.id, s.basePath) !== null;
943
1102
  if (hasExpectedArtifact) {
944
1103
  const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
1104
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
1105
+ const perUnitCapUsd = typeof prefs?.per_unit_cost_cap_usd === "number" && Number.isFinite(prefs.per_unit_cost_cap_usd) && prefs.per_unit_cost_cap_usd > 0
1106
+ ? prefs.per_unit_cost_cap_usd
1107
+ : DEFAULT_PER_UNIT_COST_CAP_USD;
1108
+ const { unitCostUsd, rollingAvgUsd } = getCurrentUnitCostStats(s.currentUnit.id);
1109
+ if (unitCostUsd >= perUnitCapUsd) {
1110
+ s.pendingVerificationRetry = null;
1111
+ s.verificationRetryCount.delete(retryKey);
1112
+ s.verificationRetryFailureHashes.delete(retryKey);
1113
+ ctx.ui.notify(`Unit ${s.currentUnit.id} hit per-unit cap $${perUnitCapUsd.toFixed(2)} — pausing auto-mode.`, "error");
1114
+ await pauseAuto(ctx, pi);
1115
+ return "dispatched";
1116
+ }
1117
+ if (getUnitCostSpikeAction(unitCostUsd, rollingAvgUsd, 3.0) === "pause") {
1118
+ s.pendingVerificationRetry = null;
1119
+ s.verificationRetryCount.delete(retryKey);
1120
+ s.verificationRetryFailureHashes.delete(retryKey);
1121
+ ctx.ui.notify(`Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) — pausing auto-mode.`, "error");
1122
+ await pauseAuto(ctx, pi);
1123
+ return "dispatched";
1124
+ }
945
1125
  const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
946
1126
  const failureDetails = describeArtifactVerificationFailure(s.currentUnit.type, s.currentUnit.id, s.basePath);
947
1127
  if (attempt > MAX_ARTIFACT_VERIFICATION_RETRIES) {
@@ -992,6 +1172,12 @@ export async function postUnitPreVerification(pctx, opts) {
992
1172
  export async function postUnitPostVerification(pctx) {
993
1173
  const { s, ctx, pi, buildSnapshotOpts, lockBase, stopAuto, pauseAuto, updateProgressWidget } = pctx;
994
1174
  if (s.currentUnit) {
1175
+ if (shouldDeferCloseoutGitAction(s.currentUnit.type)) {
1176
+ const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit, { softFailure: true });
1177
+ if (gitActionResult === "dispatched") {
1178
+ return "stopped";
1179
+ }
1180
+ }
995
1181
  try {
996
1182
  const codebasePrefs = loadEffectiveGSDPreferences()?.preferences?.codebase;
997
1183
  const refresh = ensureCodebaseMapFresh(s.basePath, codebasePrefs
@@ -1161,7 +1347,9 @@ export async function postUnitPostVerification(pctx) {
1161
1347
  // s.canonicalProjectRoot is the project root and lacks files that a
1162
1348
  // prior slice wrote to the worktree but hasn't merged to main yet.
1163
1349
  const preExecutionBasePath = s.basePath;
1164
- const result = await runPreExecutionChecks(tasks, preExecutionBasePath);
1350
+ const result = await runPreExecutionChecks(tasks, preExecutionBasePath, {
1351
+ additionalRoots: [s.canonicalProjectRoot],
1352
+ });
1165
1353
  // Log summary to stderr in existing verification output format
1166
1354
  const emoji = result.status === "pass" ? "✅" : result.status === "warn" ? "⚠️" : "❌";
1167
1355
  process.stderr.write(`gsd-pre-exec: ${emoji} Pre-execution checks ${result.status} for ${mid}/${sid} (${result.durationMs}ms)\n`);
@@ -1171,12 +1359,12 @@ export async function postUnitPostVerification(pctx) {
1171
1359
  process.stderr.write(`gsd-pre-exec: ${checkEmoji} [${check.category}] ${check.target}: ${check.message}\n`);
1172
1360
  }
1173
1361
  // Write evidence JSON to slice artifacts directory
1174
- const slicePath = resolveSlicePath(preExecutionBasePath, mid, sid);
1362
+ const slicePath = resolveSlicePath(s.canonicalProjectRoot, mid, sid);
1175
1363
  const evidenceFileName = `${sid}-PRE-EXEC-VERIFY.json`;
1176
1364
  let evidencePath = join(".gsd", "milestones", mid, "slices", sid, evidenceFileName);
1177
1365
  if (slicePath) {
1178
1366
  writePreExecutionEvidence(result, slicePath, mid, sid);
1179
- evidencePath = relative(preExecutionBasePath, join(slicePath, evidenceFileName)) || evidenceFileName;
1367
+ evidencePath = relative(s.canonicalProjectRoot, join(slicePath, evidenceFileName)) || evidenceFileName;
1180
1368
  }
1181
1369
  if (uokFlags.gates) {
1182
1370
  const failedChecks = result.checks
@@ -1356,18 +1544,22 @@ export async function postUnitPostVerification(pctx) {
1356
1544
  }
1357
1545
  }
1358
1546
  // Step mode → show wizard instead of dispatch.
1359
- // Without this notify(), /gsd in step mode finishes a unit and silently
1360
- // exits the loop, leaving the user with no hint to /clear and /gsd again.
1547
+ // Without this notify(), /gsd next finishes a unit and silently exits the
1548
+ // loop, leaving the user with no next-step command.
1361
1549
  if (s.stepMode) {
1550
+ let phaseAfterUnit = null;
1362
1551
  try {
1363
1552
  const nextState = await deriveState(s.canonicalProjectRoot);
1553
+ phaseAfterUnit = nextState.phase;
1364
1554
  ctx.ui.notify(buildStepCompleteMessage(nextState), "info");
1365
1555
  }
1366
1556
  catch (e) {
1367
1557
  debugLog("postUnit", { phase: "step-wizard-notify", error: String(e) });
1368
1558
  ctx.ui.notify(STEP_COMPLETE_FALLBACK_MESSAGE, "info");
1369
1559
  }
1370
- return "step-wizard";
1560
+ return shouldReturnStepWizardAfterUnit(s.currentUnit?.type, phaseAfterUnit)
1561
+ ? "step-wizard"
1562
+ : "continue";
1371
1563
  }
1372
1564
  return "continue";
1373
1565
  }