gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.b0acf17e9

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 (667) hide show
  1. package/README.md +4 -2
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +103 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  29. package/dist/resources/extensions/gsd/auto-start.js +240 -15
  30. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  31. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +165 -28
  33. package/dist/resources/extensions/gsd/auto.js +165 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +50 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +35 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +36 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +10 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +12 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +11 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
  43. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  45. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  46. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  47. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  48. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  49. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  50. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  51. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  52. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  53. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  54. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  55. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  56. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  57. package/dist/resources/extensions/gsd/detection.js +106 -0
  58. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  59. package/dist/resources/extensions/gsd/git-service.js +73 -5
  60. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  61. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  62. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  63. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  64. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  65. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  66. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  67. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  68. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  69. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  70. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  71. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  72. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  73. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  75. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  77. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  79. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  81. package/dist/resources/extensions/gsd/quick.js +34 -2
  82. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  83. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  84. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  85. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  86. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  87. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  88. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  89. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  90. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  91. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  92. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  93. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  94. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  95. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  96. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  98. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  99. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  100. package/dist/web/standalone/.next/BUILD_ID +1 -1
  101. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  102. package/dist/web/standalone/.next/build-manifest.json +3 -3
  103. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  104. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  105. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.html +1 -1
  124. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  126. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  127. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  132. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/middleware.js +3 -3
  135. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  136. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  137. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  138. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  139. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  140. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  141. package/dist/welcome-screen.d.ts +2 -0
  142. package/dist/welcome-screen.js +9 -7
  143. package/package.json +6 -4
  144. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  145. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  146. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  147. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  148. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  149. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  150. package/packages/native/tsconfig.tsbuildinfo +1 -1
  151. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  152. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  153. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  154. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  155. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  156. package/packages/pi-agent-core/dist/agent.js +2 -0
  157. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  158. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  159. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  160. package/packages/pi-agent-core/dist/index.js +2 -0
  161. package/packages/pi-agent-core/dist/index.js.map +1 -1
  162. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  163. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  164. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  165. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  166. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  167. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  168. package/packages/pi-agent-core/dist/types.js.map +1 -1
  169. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  170. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  171. package/packages/pi-agent-core/src/agent.ts +8 -0
  172. package/packages/pi-agent-core/src/index.ts +2 -0
  173. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  174. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  175. package/packages/pi-agent-core/src/types.ts +14 -0
  176. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  177. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  178. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  179. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  180. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  181. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  182. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  183. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  184. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  185. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  186. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  187. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  188. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  189. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  190. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  191. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  192. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  193. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  194. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  195. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  196. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  197. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  198. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  199. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  200. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  201. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  202. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  204. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  206. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
  208. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  210. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  212. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  214. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  218. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  220. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  222. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  224. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  226. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  229. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  231. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  233. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  235. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  237. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  240. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  242. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  244. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  245. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  246. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  248. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  250. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  252. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  254. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  256. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  258. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  260. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  262. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  264. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  266. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  268. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  270. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  272. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  274. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  276. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  278. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  280. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  282. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  284. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  288. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  292. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  294. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  296. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  297. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  298. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  299. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  300. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  301. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  302. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  303. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  304. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  306. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  328. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  334. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  340. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  341. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  343. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  344. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  345. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  346. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
  347. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  348. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  349. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  350. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  351. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  352. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  353. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  354. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  355. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  356. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  357. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  358. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  359. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  360. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  361. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  362. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  363. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  364. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  365. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  366. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  367. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  368. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  369. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  370. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  371. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  372. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  373. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  374. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  375. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  376. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  377. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  378. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  379. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  380. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  381. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  382. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  383. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  384. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +3 -0
  385. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  386. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  387. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  388. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  389. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  390. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/tui.js +18 -8
  392. package/packages/pi-tui/dist/tui.js.map +1 -1
  393. package/packages/pi-tui/src/tui.ts +20 -8
  394. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  395. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  396. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  397. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  398. package/src/resources/GSD-WORKFLOW.md +2 -2
  399. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  400. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  401. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  402. package/src/resources/extensions/github-sync/sync.ts +8 -1
  403. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  404. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  405. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  406. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  407. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  408. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  409. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  410. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  411. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  412. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  413. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  414. package/src/resources/extensions/gsd/auto-post-unit.ts +116 -88
  415. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  416. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  417. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  418. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  419. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  420. package/src/resources/extensions/gsd/auto-worktree.ts +199 -30
  421. package/src/resources/extensions/gsd/auto.ts +216 -40
  422. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  423. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +51 -37
  424. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +35 -10
  425. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +38 -19
  426. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +11 -1
  427. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +13 -4
  428. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +12 -3
  429. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  430. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
  431. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  432. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  433. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  434. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  436. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  437. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  438. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  439. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  440. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  441. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  442. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  443. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  444. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  445. package/src/resources/extensions/gsd/detection.ts +128 -0
  446. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  447. package/src/resources/extensions/gsd/git-service.ts +87 -10
  448. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  449. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  450. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  451. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  452. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  453. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  455. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  457. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  458. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  459. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  460. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  461. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  464. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  466. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  468. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  469. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  470. package/src/resources/extensions/gsd/quick.ts +37 -2
  471. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  472. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  473. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  474. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  475. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  476. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  477. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  479. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  480. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  481. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  482. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  483. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  484. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  485. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  486. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  487. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  488. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  489. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  490. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  491. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  492. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  493. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  494. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  495. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  496. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  497. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  498. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  499. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  500. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  501. package/src/resources/extensions/gsd/tests/cmux.test.ts +42 -53
  502. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  503. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  504. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  505. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  506. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  507. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  508. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  509. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  510. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  511. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  512. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  513. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  514. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  515. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  516. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  517. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  518. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  519. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  520. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  521. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  522. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  523. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  524. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  525. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  526. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  527. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  528. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  529. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  530. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  531. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  532. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  533. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  534. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  535. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  536. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  537. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  538. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +35 -0
  539. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  540. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  541. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  542. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  543. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  544. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  545. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  546. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  547. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  548. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  549. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  550. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  551. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  552. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  553. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  554. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  555. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  556. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  557. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  558. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  559. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  560. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  561. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  562. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  563. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  564. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  565. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  566. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  567. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  568. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  569. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  570. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  571. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  572. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  573. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  574. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  575. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  576. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  577. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  578. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  579. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  580. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  581. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  582. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  583. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  584. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  585. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  586. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  587. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  588. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  589. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  590. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  591. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  592. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  593. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  594. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  595. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  596. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  597. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  598. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  599. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  600. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  601. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  602. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  603. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  604. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  605. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  606. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  607. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  608. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  609. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  610. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  611. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  612. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  613. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  614. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  615. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  616. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +36 -45
  617. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  618. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  619. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  620. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  621. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  622. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  623. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  624. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  625. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  626. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  627. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  628. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  629. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  630. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  631. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  632. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  633. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  634. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  635. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  636. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  637. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  638. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  639. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  640. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  641. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  642. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  643. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  644. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  645. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  646. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  647. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  648. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  649. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  650. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  651. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  652. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  653. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  654. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  655. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  656. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  657. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  658. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  659. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  660. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  661. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  662. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  663. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  664. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  665. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  666. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_buildManifest.js +0 -0
  667. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_ssgManifest.js +0 -0
@@ -14,7 +14,7 @@ import { appendEvent } from "./workflow-events.js";
14
14
  import { atomicWriteSync } from "./atomic-write.js";
15
15
  import { clearParseCache } from "./files.js";
16
16
  import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
17
- import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGates, updateTaskStatus, updateSliceStatus, insertSlice, getMilestone, refreshOpenDatabaseFromDisk } from "./gsd-db.js";
17
+ import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGates, updateTaskStatus, updateSliceStatus, insertSlice, getMilestone, refreshOpenDatabaseFromDisk, getCompletedMilestoneTaskFileHints, getMilestoneCommitAttributionShas, recordMilestoneCommitAttribution } from "./gsd-db.js";
18
18
  import { isValidationTerminal } from "./state.js";
19
19
  import { getErrorMessage } from "./error-utils.js";
20
20
  import { logWarning, logError } from "./workflow-logger.js";
@@ -67,6 +67,60 @@ export {
67
67
 
68
68
  // ─── Artifact Resolution & Verification ───────────────────────────────────────
69
69
 
70
+ export type ArtifactRecoveryDbRefreshResult =
71
+ | { ok: true }
72
+ | { ok: false; fatal: boolean; message: string; reason: string };
73
+
74
+ export function refreshRecoveryDbForArtifact(
75
+ unitType: string,
76
+ unitId: string,
77
+ ): ArtifactRecoveryDbRefreshResult {
78
+ if (unitType !== "plan-slice" && unitType !== "execute-task") return { ok: true };
79
+ if (!isDbAvailable()) return { ok: true };
80
+
81
+ if (!refreshOpenDatabaseFromDisk()) {
82
+ return {
83
+ ok: false,
84
+ fatal: unitType === "execute-task",
85
+ reason: `${unitType}-db-refresh-failed`,
86
+ message: `Stuck recovery found ${unitType} ${unitId} artifacts, but the DB refresh failed.`,
87
+ };
88
+ }
89
+
90
+ if (unitType !== "execute-task") return { ok: true };
91
+
92
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
93
+ if (!mid || !sid || !tid) {
94
+ return {
95
+ ok: false,
96
+ fatal: true,
97
+ reason: "execute-task-invalid-unit-id",
98
+ message: `Stuck recovery found execute-task ${unitId} artifacts, but the unit id could not be parsed for DB verification.`,
99
+ };
100
+ }
101
+
102
+ const task = getTask(mid, sid, tid);
103
+ if (!task) {
104
+ return {
105
+ ok: false,
106
+ fatal: true,
107
+ reason: "execute-task-artifact-db-missing",
108
+ message: `Stuck recovery found execute-task ${unitId} artifacts, but no matching DB task row exists after refresh.`,
109
+ };
110
+ }
111
+
112
+ if (!isClosedStatus(task.status)) {
113
+ return {
114
+ ok: false,
115
+ fatal: true,
116
+ reason: "execute-task-artifact-db-mismatch",
117
+ message: `Stuck recovery found execute-task ${unitId} artifacts, but the DB task status is still '${task.status}' after refresh.`,
118
+ };
119
+ }
120
+
121
+ return { ok: true };
122
+ }
123
+
70
124
  function hasCapturedWorkflowPrefs(base: string): boolean {
71
125
  const prefsPath = resolveExpectedArtifactPath("workflow-preferences", "WORKFLOW-PREFS", base);
72
126
  if (!prefsPath || !existsSync(prefsPath)) return false;
@@ -147,15 +201,29 @@ export function hasImplementationArtifacts(basePath: string, milestoneId?: strin
147
201
  // milestone commits instead of treating the self-diff as proof of no work.
148
202
  if (changedFiles.length === 0) {
149
203
  if (milestoneId && currentBranch === integrationBranch) {
150
- const tagged = getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId);
151
- if (!tagged.ok) return "unknown";
152
- if (tagged.matched) return classifyImplementationFiles(tagged.files);
204
+ const milestoneEvidence = getChangedFilesFromMilestoneEvidence(basePath, milestoneId);
205
+ if (!milestoneEvidence.ok) return "unknown";
206
+ if (milestoneEvidence.matched) return classifyImplementationFiles(milestoneEvidence.files);
153
207
  }
154
208
  if (currentBranch && currentBranch !== "HEAD") return "absent";
155
209
  return "unknown";
156
210
  }
157
211
 
158
- return classifyImplementationFiles(changedFiles);
212
+ const branchClassification = classifyImplementationFiles(changedFiles);
213
+ if (branchClassification === "present") return "present";
214
+
215
+ // A completing milestone branch can have a non-empty diff containing only
216
+ // .gsd/ closeout files after implementation commits already landed on the
217
+ // recorded integration branch. In that topology, the branch diff alone is
218
+ // insufficient; use the same milestone-tagged evidence fallback as the
219
+ // self-diff retry path before declaring the milestone implementation-free.
220
+ if (milestoneId) {
221
+ const milestoneEvidence = getChangedFilesFromMilestoneEvidence(basePath, milestoneId);
222
+ if (!milestoneEvidence.ok) return "unknown";
223
+ if (milestoneEvidence.matched) return classifyImplementationFiles(milestoneEvidence.files);
224
+ }
225
+
226
+ return "absent";
159
227
  } catch (e) {
160
228
  // Non-fatal — if git operations fail, return unknown so callers can decide
161
229
  logWarning("recovery", `implementation artifact check failed: ${(e as Error).message}`);
@@ -185,6 +253,10 @@ function isImplementationPath(file: string): boolean {
185
253
  return !file.startsWith(".gsd/") && !file.startsWith(".gsd\\");
186
254
  }
187
255
 
256
+ function normalizeRepoPath(file: string): string {
257
+ return file.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
258
+ }
259
+
188
260
  /**
189
261
  * Detect the main/master branch name.
190
262
  */
@@ -263,7 +335,7 @@ function getChangedFilesFromMilestoneTaggedCommits(
263
335
  "log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
264
336
  ]);
265
337
  if (!scoped.ok) return scoped;
266
- if (scoped.matched) return scoped;
338
+ if (scoped.matched && classifyImplementationFiles(scoped.files) === "present") return scoped;
267
339
 
268
340
  // Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
269
341
  // path-scoped scan matches no commits even though GSD-tagged commits
@@ -274,9 +346,137 @@ function getChangedFilesFromMilestoneTaggedCommits(
274
346
  // Intentionally unbounded — symmetric with the primary scan, and avoids
275
347
  // reintroducing the rolling-depth failure class removed in #4699 where
276
348
  // milestone evidence aged out behind unrelated activity.
277
- return scanGsdTaggedCommits(basePath, milestoneId, [
349
+ const unscoped = scanGsdTaggedCommits(basePath, milestoneId, [
278
350
  "log", "--format=%H%x1f%B%x1e", "HEAD",
279
351
  ]);
352
+ if (!unscoped.ok) return scoped.matched ? scoped : unscoped;
353
+ if (!unscoped.matched) return scoped;
354
+
355
+ return {
356
+ ok: true,
357
+ matched: true,
358
+ files: [...new Set([...scoped.files, ...unscoped.files])],
359
+ };
360
+ }
361
+
362
+ function getChangedFilesFromMilestoneEvidence(
363
+ basePath: string,
364
+ milestoneId: string,
365
+ ): { ok: boolean; matched: boolean; files: string[] } {
366
+ const tagged = getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId);
367
+ if (!tagged.ok) return tagged;
368
+ if (tagged.matched && classifyImplementationFiles(tagged.files) === "present") return tagged;
369
+
370
+ const attributed = getChangedFilesFromAttributedMilestoneCommits(basePath, milestoneId);
371
+ if (!attributed.ok) return tagged.matched ? tagged : attributed;
372
+ if (attributed.matched && classifyImplementationFiles(attributed.files) === "present") return attributed;
373
+
374
+ const backfilled = backfillChangedFilesFromUntaggedMilestoneCommits(basePath, milestoneId);
375
+ if (!backfilled.ok) return tagged.matched ? tagged : attributed.matched ? attributed : backfilled;
376
+ if (!backfilled.matched) {
377
+ if (tagged.matched) return tagged;
378
+ return attributed.matched ? attributed : backfilled;
379
+ }
380
+
381
+ return {
382
+ ok: true,
383
+ matched: true,
384
+ files: [...new Set([...tagged.files, ...attributed.files, ...backfilled.files])],
385
+ };
386
+ }
387
+
388
+ function getChangedFilesFromAttributedMilestoneCommits(
389
+ basePath: string,
390
+ milestoneId: string,
391
+ ): { ok: boolean; matched: boolean; files: string[] } {
392
+ try {
393
+ const shas = getMilestoneCommitAttributionShas(milestoneId);
394
+ if (shas.length === 0) return { ok: true, matched: false, files: [] };
395
+
396
+ const files = new Set<string>();
397
+ let matched = false;
398
+ for (const sha of shas) {
399
+ if (!isFullCommitSha(sha)) continue;
400
+ const commitFiles = getChangedFilesForCommit(basePath, sha);
401
+ if (commitFiles.length === 0) continue;
402
+ matched = true;
403
+ for (const file of commitFiles) files.add(file);
404
+ }
405
+ return { ok: true, matched, files: [...files] };
406
+ } catch (e) {
407
+ logWarning("recovery", `milestone attribution scan failed: ${(e as Error).message}`);
408
+ return { ok: false, matched: false, files: [] };
409
+ }
410
+ }
411
+
412
+ function backfillChangedFilesFromUntaggedMilestoneCommits(
413
+ basePath: string,
414
+ milestoneId: string,
415
+ ): { ok: boolean; matched: boolean; files: string[] } {
416
+ try {
417
+ const milestone = getMilestone(milestoneId);
418
+ const milestoneStartedAt = milestone?.created_at ? Math.floor(Date.parse(milestone.created_at) / 1000) * 1000 : NaN;
419
+ if (!Number.isFinite(milestoneStartedAt)) return { ok: true, matched: false, files: [] };
420
+
421
+ const taskFileHints = getCompletedMilestoneTaskFileHints(milestoneId);
422
+ if (taskFileHints.length === 0) return { ok: true, matched: false, files: [] };
423
+
424
+ const hintSet = new Set(taskFileHints.map(normalizeRepoPath).filter(Boolean));
425
+ if (hintSet.size === 0) return { ok: true, matched: false, files: [] };
426
+
427
+ const records = getCommitRecords(basePath);
428
+ const files = new Set<string>();
429
+ let matched = false;
430
+ for (const record of records) {
431
+ if (!isFullCommitSha(record.hash)) continue;
432
+ if (Date.parse(record.committedAt) < milestoneStartedAt) continue;
433
+ if (record.parents.trim().split(/\s+/).filter(Boolean).length > 1) continue;
434
+ if (commitMessageHasGsdTrailer(record.message)) continue;
435
+
436
+ const commitFiles = getChangedFilesForCommit(basePath, record.hash);
437
+ const implementationFiles = commitFiles.map(normalizeRepoPath).filter(isImplementationPath);
438
+ if (implementationFiles.length === 0) continue;
439
+ if (!implementationFiles.some((file) => hintSet.has(file))) continue;
440
+
441
+ matched = true;
442
+ for (const file of implementationFiles) files.add(file);
443
+ recordMilestoneCommitAttribution({
444
+ commitSha: record.hash,
445
+ milestoneId,
446
+ source: "backfill",
447
+ confidence: 0.8,
448
+ files: implementationFiles,
449
+ createdAt: new Date().toISOString(),
450
+ });
451
+ }
452
+
453
+ return { ok: true, matched, files: [...files] };
454
+ } catch (e) {
455
+ logWarning("recovery", `milestone attribution backfill failed: ${(e as Error).message}`);
456
+ return { ok: false, matched: false, files: [] };
457
+ }
458
+ }
459
+
460
+ function getCommitRecords(basePath: string): Array<{ hash: string; parents: string; committedAt: string; message: string }> {
461
+ const logOutput = execFileSync("git", ["log", "--format=%H%x1f%P%x1f%cI%x1f%B%x1e", "HEAD"], {
462
+ cwd: basePath,
463
+ stdio: ["ignore", "pipe", "pipe"],
464
+ encoding: "utf-8",
465
+ });
466
+ return logOutput
467
+ .split("\x1e")
468
+ .map((record) => record.trim())
469
+ .filter(Boolean)
470
+ .flatMap((record) => {
471
+ const parts = record.split("\x1f");
472
+ if (parts.length < 4) return [];
473
+ const [hash, parents, committedAt, ...messageParts] = parts;
474
+ return [{ hash: hash.trim(), parents: parents.trim(), committedAt: committedAt.trim(), message: messageParts.join("\x1f") }];
475
+ });
476
+ }
477
+
478
+ function isFullCommitSha(value: string): boolean {
479
+ return /^[0-9a-f]{40}$/i.test(value);
280
480
  }
281
481
 
282
482
  function scanGsdTaggedCommits(
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-mode bootstrap, worktree recovery, and fresh-start initialization.
1
3
  /**
2
4
  * Auto-mode bootstrap — fresh-start initialization path.
3
5
  *
@@ -65,6 +67,7 @@ import { snapshotSkills } from "./skill-discovery.js";
65
67
  import { isDbAvailable, getMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
66
68
  import { isClosedStatus } from "./status-guards.js";
67
69
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
70
+ import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
68
71
 
69
72
  import {
70
73
  debugLog,
@@ -102,6 +105,16 @@ export interface BootstrapDeps {
102
105
  buildResolver: () => WorktreeResolver;
103
106
  }
104
107
 
108
+ export function resolveIsolationNoneBranchCheckout(
109
+ currentBranch: string,
110
+ integrationBranch: string,
111
+ isolationMode: string,
112
+ isRepo: boolean,
113
+ ): string | null {
114
+ if (!isRepo || isolationMode !== "none") return null;
115
+ return currentBranch.startsWith("milestone/") ? integrationBranch : null;
116
+ }
117
+
105
118
  /**
106
119
  * Bootstrap a fresh auto-mode session. Handles everything from git init
107
120
  * through secrets collection, returning when ready for the first
@@ -115,6 +128,18 @@ export interface BootstrapDeps {
115
128
  // Counter moved to AutoSession.consecutiveCompleteBootstraps so s.reset() clears it.
116
129
  const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
117
130
 
131
+ export function hasGitIndexLockForTest(basePath: string): boolean {
132
+ return existsSync(join(basePath, ".git", "index.lock"));
133
+ }
134
+
135
+ export function _shouldAbortBootstrapForUnavailableDbForTest(
136
+ gsdDbPath: string,
137
+ dbAvailable: boolean,
138
+ pathExists: (path: string) => boolean = existsSync,
139
+ ): boolean {
140
+ return pathExists(gsdDbPath) && !dbAvailable;
141
+ }
142
+
118
143
  export async function openProjectDbIfPresent(basePath: string): Promise<void> {
119
144
  const gsdDbPath = resolveProjectRootDbPath(basePath);
120
145
  if (!existsSync(gsdDbPath) || isDbAvailable()) return;
@@ -332,6 +357,165 @@ export function auditOrphanedMilestoneBranches(
332
357
  return { recovered, warnings };
333
358
  }
334
359
 
360
+ /**
361
+ * Pure decision function for picking which orphan milestone the auto-loop
362
+ * should resume the merge transition for. Extracted so it can be unit-tested
363
+ * without spinning up a git repo or a SQLite DB.
364
+ *
365
+ * Returns the lexicographically-greatest milestone id (e.g. "M002" beats
366
+ * "M001") whose branch is unmerged AND has commits ahead of main AND whose
367
+ * status is `complete`. Lex-ordering matches the project's M00x convention,
368
+ * which is the most-recently-completed milestone in practice.
369
+ * `isComplete` errors propagate; `commitsAhead` errors are treated as 0.
370
+ */
371
+ export function _selectResumableMilestone(
372
+ branchNames: readonly string[],
373
+ mergedBranches: ReadonlySet<string>,
374
+ isComplete: (milestoneId: string) => boolean,
375
+ commitsAhead: (branch: string) => number,
376
+ ): string | null {
377
+ const candidates: string[] = [];
378
+ for (const branch of branchNames) {
379
+ if (!branch.startsWith("milestone/")) continue;
380
+ const milestoneId = branch.slice("milestone/".length);
381
+ if (mergedBranches.has(branch)) continue;
382
+ if (!isComplete(milestoneId)) continue;
383
+ let ahead = 0;
384
+ try {
385
+ ahead = commitsAhead(branch);
386
+ } catch {
387
+ continue;
388
+ }
389
+ if (ahead <= 0) continue;
390
+ candidates.push(milestoneId);
391
+ }
392
+ if (candidates.length === 0) return null;
393
+ candidates.sort();
394
+ return candidates[candidates.length - 1];
395
+ }
396
+
397
+ /**
398
+ * Find the most-recent completed milestone whose branch still has unmerged
399
+ * commits ahead of the integration branch. Used by `bootstrapAutoSession`
400
+ * to seed `s.currentMilestoneId` so the auto-loop's transition guard at
401
+ * `phases.ts:730` fires on the first iteration after a process restart —
402
+ * without this, the in-memory-only `s.currentMilestoneId` is `null` after
403
+ * restart, the guard short-circuits, and the orphaned milestone branch
404
+ * never gets merged into main (#5538-followup).
405
+ *
406
+ * Returns null when isolation is `none`, the DB is unavailable, or no
407
+ * orphan candidate exists. All git failures degrade silently — startup
408
+ * must never block on this defensive lookup.
409
+ */
410
+ export function findUnmergedCompletedMilestone(
411
+ basePath: string,
412
+ isolationMode: "worktree" | "branch" | "none",
413
+ ): string | null {
414
+ if (isolationMode === "none") return null;
415
+ if (!isDbAvailable()) return null;
416
+
417
+ let milestoneBranches: string[];
418
+ try {
419
+ milestoneBranches = nativeBranchList(basePath, "milestone/*");
420
+ } catch {
421
+ return null;
422
+ }
423
+ if (milestoneBranches.length === 0) return null;
424
+
425
+ let mainBranch: string;
426
+ try {
427
+ mainBranch = nativeDetectMainBranch(basePath);
428
+ } catch {
429
+ mainBranch = "main";
430
+ }
431
+
432
+ let mergedBranches: Set<string>;
433
+ try {
434
+ mergedBranches = new Set(
435
+ nativeBranchListMerged(basePath, mainBranch, "milestone/*"),
436
+ );
437
+ } catch {
438
+ mergedBranches = new Set();
439
+ }
440
+
441
+ return _selectResumableMilestone(
442
+ milestoneBranches,
443
+ mergedBranches,
444
+ (milestoneId) => {
445
+ const row = getMilestone(milestoneId);
446
+ return !!row && row.status === "complete";
447
+ },
448
+ (branch) => nativeCommitCountBetween(basePath, mainBranch, branch),
449
+ );
450
+ }
451
+
452
+ /**
453
+ * Run `mergeAndExit` for a milestone whose worktree/branch finalization
454
+ * never completed in a prior session — the active-milestone in phase
455
+ * `complete` with a survivor `milestone/<id>` branch still around.
456
+ *
457
+ * Wraps the call in try/catch so a thrown error from `_mergeBranchMode`
458
+ * (made fail-loud in commit 68ef58a3c) is converted into a user-facing
459
+ * error notify instead of an unhandled exception that propagates through
460
+ * `bootstrapAutoSession` to the slash-command caller's `.catch` block.
461
+ *
462
+ * Returns `{ merged: true }` on success; `{ merged: false, error }` on
463
+ * throw — caller decides whether to abort bootstrap.
464
+ */
465
+ export function _finalizeSurvivorBranch(
466
+ resolver: WorktreeResolver,
467
+ milestoneId: string,
468
+ ui: { notify: (msg: string, level?: "info" | "warning" | "error" | "success") => void },
469
+ ): { merged: boolean; error?: unknown } {
470
+ ui.notify(
471
+ `Milestone ${milestoneId} is complete but branch/worktree was not finalized. Running merge now.`,
472
+ "info",
473
+ );
474
+ try {
475
+ resolver.mergeAndExit(milestoneId, { notify: ui.notify.bind(ui) });
476
+ return { merged: true };
477
+ } catch (err) {
478
+ const msg = err instanceof Error ? err.message : String(err);
479
+ ui.notify(
480
+ `Survivor-branch finalization for ${milestoneId} failed: ${msg}. Resolve manually and re-run /gsd auto.`,
481
+ "error",
482
+ );
483
+ return { merged: false, error: err };
484
+ }
485
+ }
486
+
487
+ /**
488
+ * Merge a milestone whose DB row is `complete` but whose branch is still
489
+ * unmerged into the integration branch. Called from `bootstrapAutoSession`
490
+ * for orphans surfaced by `findUnmergedCompletedMilestone`.
491
+ *
492
+ * Notifies the user before and after, swallowing errors so a transient git
493
+ * failure never blocks bootstrap. Returns `{ merged: true }` when the
494
+ * underlying `mergeAndExit` completes; `{ merged: false, error }` on throw.
495
+ *
496
+ * Extracted to keep `bootstrapAutoSession` testable: the merge call and the
497
+ * notify shape are exercised against a mock resolver in
498
+ * `tests/orphan-merge-bootstrap.test.ts`.
499
+ */
500
+ export function _mergeOrphanCompletedMilestone(
501
+ resolver: WorktreeResolver,
502
+ orphanId: string,
503
+ ui: { notify: (msg: string, level?: "info" | "warning" | "error" | "success") => void },
504
+ ): { merged: boolean; error?: unknown } {
505
+ ui.notify(`Detected unmerged completed milestone ${orphanId}. Merging now.`, "info");
506
+ try {
507
+ resolver.mergeAndExit(orphanId, { notify: ui.notify.bind(ui) });
508
+ return { merged: true };
509
+ } catch (err) {
510
+ const msg = err instanceof Error ? err.message : String(err);
511
+ ui.notify(
512
+ `Could not merge orphan milestone ${orphanId}: ${msg}. Resolve manually and re-run /gsd auto.`,
513
+ "warning",
514
+ );
515
+ return { merged: false, error: err };
516
+ }
517
+ }
518
+
335
519
  export async function bootstrapAutoSession(
336
520
  s: AutoSession,
337
521
  ctx: ExtensionCommandContext,
@@ -577,6 +761,39 @@ export async function bootstrapAutoSession(
577
761
  logWarning("bootstrap", `orphaned milestone branch audit failed: ${err instanceof Error ? err.message : String(err)}`);
578
762
  }
579
763
 
764
+ // ── Orphaned preflight-stash audit (#5538-followup) ──
765
+ // Reapplies pre-merge stashes whose milestone is now complete but whose
766
+ // postflight pop was skipped by an interrupted merge in a prior session.
767
+ // Uses `git stash apply` (not pop) so the entry remains as a backup.
768
+ try {
769
+ if (isDbAvailable()) {
770
+ const stashAudit = auditOrphanedPreflightStashes(base, (milestoneId) => {
771
+ const row = getMilestone(milestoneId);
772
+ return !!row && isClosedStatus(row.status);
773
+ });
774
+ for (const entry of stashAudit.applied) {
775
+ ctx.ui.notify(
776
+ `Orphan audit: applied preflight stash ${entry.stashRef} for completed milestone ${entry.milestoneId}. The stash entry is preserved as a backup.`,
777
+ "info",
778
+ );
779
+ }
780
+ for (const msg of stashAudit.warnings) {
781
+ ctx.ui.notify(`Orphan audit: ${msg}`, "warning");
782
+ }
783
+ if (stashAudit.applied.length > 0) {
784
+ debugLog("orphan-stash-audit", {
785
+ applied: stashAudit.applied,
786
+ warnings: stashAudit.warnings,
787
+ });
788
+ }
789
+ }
790
+ } catch (err) {
791
+ logWarning(
792
+ "bootstrap",
793
+ `orphaned preflight-stash audit failed: ${err instanceof Error ? err.message : String(err)}`,
794
+ );
795
+ }
796
+
580
797
  let state = await deriveState(base);
581
798
 
582
799
  // Stale worktree state recovery (#654)
@@ -649,27 +866,74 @@ export async function bootstrapAutoSession(
649
866
  // hasSurvivorBranch after a successful promotion.
650
867
  if (decideSurvivorAction(hasSurvivorBranch, state.phase) === "finalize") {
651
868
  const mid = state.activeMilestone!.id;
652
- ctx.ui.notify(
653
- `Milestone ${mid} is complete but branch/worktree was not finalized. Running merge now.`,
654
- "info",
655
- );
656
- const resolver = buildResolver();
657
- resolver.mergeAndExit(mid, {
658
- notify: ctx.ui.notify.bind(ctx.ui),
659
- });
869
+ // Commit 68ef58a3c made `_mergeBranchMode` throw on wrong-branch
870
+ // instead of returning false silently. Wrap the call so the throw is
871
+ // converted into an error notify + clean bootstrap abort, not an
872
+ // unhandled exception propagating to the slash-command caller (#5549
873
+ // post-merge audit, R2).
874
+ const finalize = _finalizeSurvivorBranch(buildResolver(), mid, ctx.ui);
875
+ if (!finalize.merged) {
876
+ return releaseLockAndReturn();
877
+ }
660
878
  invalidateAllCaches();
661
879
  state = await deriveState(base);
662
880
  // Clear survivor flag — finalization is done
663
881
  hasSurvivorBranch = false;
664
882
  }
665
883
 
884
+ // ── Orphan-completed-milestone merge (#5538-followup) ──
885
+ // A process killed between `complete-milestone` (DB flip + SUMMARY write)
886
+ // and the loop's transition-guard merge strands the milestone branch
887
+ // forever: `s.currentMilestoneId` is in-memory only, so on the next
888
+ // bootstrap the guard at phases.ts:730 sees `mid === s.currentMilestoneId`
889
+ // and short-circuits.
890
+ //
891
+ // The earlier attempt at this fix seeded `s.currentMilestoneId` to the
892
+ // orphan id pre-state-derivation, but the unconditional assignment at
893
+ // line 948 (`s.currentMilestoneId = state.activeMilestone?.id ?? null`)
894
+ // immediately overwrote the seed. Active-merge is the more durable fix:
895
+ // call `mergeAndExit` directly during bootstrap, then re-derive state so
896
+ // the loop's normal flow continues without an in-memory hint.
897
+ //
898
+ // Mirrors the survivor-finalize block above. Failures degrade to a
899
+ // warning notify so a transient git error doesn't block bootstrap.
900
+ {
901
+ const orphan = findUnmergedCompletedMilestone(base, getIsolationMode(base));
902
+ if (orphan && orphan !== state.activeMilestone?.id) {
903
+ const priorBasePath = s.basePath;
904
+ const priorOriginalBasePath = s.originalBasePath;
905
+ s.originalBasePath = base;
906
+ s.basePath = getAutoWorktreePath(base, orphan) ?? base;
907
+ const result = _mergeOrphanCompletedMilestone(buildResolver(), orphan, ctx.ui);
908
+ if (!result.merged) {
909
+ s.basePath = base;
910
+ s.originalBasePath = base;
911
+ try {
912
+ process.chdir(base);
913
+ } catch (err) {
914
+ logWarning("bootstrap", `could not restore cwd after orphan merge failure: ${err instanceof Error ? err.message : String(err)}`);
915
+ }
916
+ return releaseLockAndReturn();
917
+ }
918
+ if (!s.active) {
919
+ s.basePath = priorBasePath || base;
920
+ s.originalBasePath = priorOriginalBasePath || base;
921
+ }
922
+ if (result.merged) {
923
+ invalidateAllCaches();
924
+ state = await deriveState(base);
925
+ }
926
+ }
927
+ }
928
+
666
929
  const effectivePrefs = loadEffectiveGSDPreferences(base)?.preferences;
667
- const deepProjectStagePending = !hasSurvivorBranch
668
- ? (await import("./auto-dispatch.js")).hasPendingDeepStage(
669
- effectivePrefs,
670
- base,
671
- )
672
- : false;
930
+ const { shouldRunDeepProjectSetup } = await import("./auto-dispatch.js");
931
+ const deepProjectStagePending = shouldRunDeepProjectSetup(
932
+ state,
933
+ effectivePrefs,
934
+ base,
935
+ { hasSurvivorBranch },
936
+ );
673
937
 
674
938
  if (deepProjectStagePending) {
675
939
  // Deep project-level setup runs before the first milestone exists. Let
@@ -789,7 +1053,7 @@ export async function bootstrapAutoSession(
789
1053
  s.resourceVersionOnStart = readResourceVersion();
790
1054
  s.pendingQuickTasks = [];
791
1055
  s.currentUnit = null;
792
- s.currentMilestoneId = deepProjectStagePending ? null : state.activeMilestone?.id ?? null;
1056
+ s.currentMilestoneId ??= deepProjectStagePending ? null : state.activeMilestone?.id ?? null;
793
1057
  s.originalModelId = startModelSnapshot?.id ?? ctx.model?.id ?? null;
794
1058
  s.originalModelProvider = startModelSnapshot?.provider ?? ctx.model?.provider ?? null;
795
1059
  s.originalThinkingLevel = startThinkingSnapshot ?? null;
@@ -808,13 +1072,21 @@ export async function bootstrapAutoSession(
808
1072
  // Guard against stale milestone branch when isolation:none (#3613).
809
1073
  // A prior session with isolation:branch/worktree may have left HEAD on
810
1074
  // milestone/<MID>. Auto-checkout back to the integration branch.
811
- if (getIsolationMode(base) === "none" && nativeIsRepo(base)) {
1075
+ const isolationMode = getIsolationMode(base);
1076
+ const isRepo = nativeIsRepo(base);
1077
+ if (isolationMode === "none" && isRepo) {
812
1078
  try {
813
1079
  const currentBranch = nativeGetCurrentBranch(base);
814
- if (currentBranch.startsWith("milestone/")) {
815
- const integrationBranch = nativeDetectMainBranch(base);
816
- nativeCheckoutBranch(base, integrationBranch);
817
- logWarning("bootstrap", `Returned to "${integrationBranch}" — HEAD was on stale milestone branch "${currentBranch}" (isolation: none does not use milestone branches).`);
1080
+ const integrationBranch = nativeDetectMainBranch(base);
1081
+ const branchToCheckout = resolveIsolationNoneBranchCheckout(
1082
+ currentBranch,
1083
+ integrationBranch,
1084
+ isolationMode,
1085
+ isRepo,
1086
+ );
1087
+ if (branchToCheckout) {
1088
+ nativeCheckoutBranch(base, branchToCheckout);
1089
+ logWarning("bootstrap", `Returned to "${branchToCheckout}" — HEAD was on stale milestone branch "${currentBranch}" (isolation: none does not use milestone branches).`);
818
1090
  }
819
1091
  } catch (err) {
820
1092
  logWarning("bootstrap", `Could not auto-checkout from stale milestone branch: ${err instanceof Error ? err.message : String(err)}`);
@@ -863,7 +1135,7 @@ export async function bootstrapAutoSession(
863
1135
  logError("engine", `failed to initialize project database: ${(err as Error).message}`);
864
1136
  }
865
1137
  }
866
- if (existsSync(gsdDbPath) && !isDbAvailable()) {
1138
+ if (_shouldAbortBootstrapForUnavailableDbForTest(gsdDbPath, isDbAvailable())) {
867
1139
  try {
868
1140
  const { openDatabase: openDb } = await import("./gsd-db.js");
869
1141
  openDb(gsdDbPath);
@@ -32,6 +32,7 @@ let _currentSigtermHandler: (() => void) | null = null;
32
32
  export function registerSigtermHandler(
33
33
  currentBasePath: string,
34
34
  previousHandler: (() => void) | null,
35
+ onSignalCleanup?: () => void,
35
36
  ): () => void {
36
37
  // Remove the explicitly-passed previous handler
37
38
  if (previousHandler) {
@@ -43,6 +44,12 @@ export function registerSigtermHandler(
43
44
  for (const sig of CLEANUP_SIGNALS) process.off(sig, _currentSigtermHandler);
44
45
  }
45
46
  const handler = () => {
47
+ try {
48
+ onSignalCleanup?.();
49
+ } catch {
50
+ void 0;
51
+ // Signal cleanup is best-effort; lock cleanup and process exit still run.
52
+ }
46
53
  clearLock(currentBasePath);
47
54
  releaseSessionLock(currentBasePath);
48
55
  process.exit(0);
@@ -71,14 +71,14 @@ export async function recoverTimedOutUnit(
71
71
  recovery: status,
72
72
  });
73
73
 
74
- const durableComplete = status.summaryExists && status.taskChecked && status.nextActionAdvanced;
74
+ const durableComplete = status.dbComplete || (status.summaryExists && status.taskChecked && status.nextActionAdvanced);
75
75
  if (durableComplete) {
76
76
  writeUnitRuntimeRecord(basePath, unitType, unitId, currentUnitStartedAt, {
77
77
  phase: "finalized",
78
78
  recovery: status,
79
79
  });
80
80
  ctx.ui.notify(
81
- `${reason === "idle" ? "Idle" : "Timeout"} recovery: ${unitType} ${unitId} already completed on disk. Continuing auto-mode. (attempt ${attemptNumber})`,
81
+ `${reason === "idle" ? "Idle" : "Timeout"} recovery: ${unitType} ${unitId} already completed. Continuing auto-mode. (attempt ${attemptNumber})`,
82
82
  "info",
83
83
  );
84
84
  unitRecoveryCount.delete(recoveryKey);