gsd-pi 2.44.0-dev.d25d507 → 2.45.0-dev.1afbdaa

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 (407) hide show
  1. package/dist/help-text.js +1 -1
  2. package/dist/loader.js +34 -0
  3. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  4. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  5. package/dist/resources/extensions/gsd/auto/phases.js +63 -77
  6. package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
  7. package/dist/resources/extensions/gsd/auto/session.js +0 -11
  8. package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
  9. package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
  10. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  11. package/dist/resources/extensions/gsd/auto-start.js +23 -5
  12. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  13. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  14. package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
  15. package/dist/resources/extensions/gsd/auto.js +42 -60
  16. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
  18. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  19. package/dist/resources/extensions/gsd/commands/context.js +0 -4
  20. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  21. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  22. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
  23. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  24. package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
  26. package/dist/resources/extensions/gsd/db-writer.js +40 -22
  27. package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
  28. package/dist/resources/extensions/gsd/doctor.js +13 -3
  29. package/dist/resources/extensions/gsd/git-service.js +8 -3
  30. package/dist/resources/extensions/gsd/gsd-db.js +28 -4
  31. package/dist/resources/extensions/gsd/guided-flow.js +1 -2
  32. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  33. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  34. package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
  35. package/dist/resources/extensions/gsd/preferences-types.js +2 -2
  36. package/dist/resources/extensions/gsd/preferences.js +8 -4
  37. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
  38. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  39. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  40. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
  41. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  42. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  43. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  44. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  45. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  46. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  47. package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
  48. package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
  49. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  50. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  51. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  52. package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
  53. package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
  54. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  56. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  57. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  58. package/dist/resources/extensions/gsd/rethink.js +115 -0
  59. package/dist/resources/extensions/gsd/session-lock.js +1 -3
  60. package/dist/resources/extensions/gsd/state.js +48 -3
  61. package/dist/resources/extensions/gsd/sync-lock.js +89 -0
  62. package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
  63. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
  64. package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
  65. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
  66. package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
  67. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
  68. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
  69. package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
  70. package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
  71. package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
  72. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  73. package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
  74. package/dist/resources/extensions/gsd/workflow-events.js +102 -0
  75. package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
  76. package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
  77. package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
  78. package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
  79. package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
  80. package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
  81. package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
  82. package/dist/resources/extensions/gsd/write-intercept.js +84 -0
  83. package/dist/resources/extensions/mcp-client/index.js +14 -0
  84. package/dist/resources/extensions/voice/index.js +11 -16
  85. package/dist/resources/extensions/voice/linux-ready.js +67 -0
  86. package/dist/web/standalone/.next/BUILD_ID +1 -1
  87. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  88. package/dist/web/standalone/.next/build-manifest.json +3 -3
  89. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  90. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  91. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  93. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found/page.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/index.html +1 -1
  151. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  152. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  153. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  154. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  156. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  157. package/dist/web/standalone/.next/server/app/page.js +1 -1
  158. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  160. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  163. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  164. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  165. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  166. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  167. package/dist/web/standalone/.next/static/chunks/app/{page-b9367c5ae13b99c6.js → page-6654a8cca61a3d1c.js} +1 -1
  168. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  169. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  170. package/package.json +2 -1
  171. package/packages/native/dist/stream-process/index.js +2 -2
  172. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  173. package/packages/native/src/stream-process/index.ts +2 -2
  174. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  175. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  177. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  178. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
  180. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  182. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
  185. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
  187. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
  188. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
  189. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
  190. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
  191. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
  192. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  193. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  194. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  195. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  196. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
  197. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
  199. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  200. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  201. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
  203. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  205. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  207. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/main.js +17 -0
  210. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  215. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  216. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  220. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  221. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  222. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  224. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  226. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  229. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  231. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  233. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  236. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  238. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  239. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  240. package/packages/pi-coding-agent/package.json +1 -1
  241. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  242. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
  243. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  244. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  245. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
  246. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  247. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
  248. package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
  249. package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
  250. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  251. package/packages/pi-coding-agent/src/main.ts +19 -0
  252. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  253. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  254. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  255. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  256. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  257. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  258. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  259. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  260. package/pkg/package.json +1 -1
  261. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  262. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  263. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
  264. package/src/resources/extensions/gsd/auto/phases.ts +69 -91
  265. package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
  266. package/src/resources/extensions/gsd/auto/session.ts +0 -18
  267. package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
  268. package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
  269. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
  270. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  271. package/src/resources/extensions/gsd/auto-start.ts +26 -5
  272. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  273. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  274. package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
  275. package/src/resources/extensions/gsd/auto.ts +44 -86
  276. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
  277. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  278. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  279. package/src/resources/extensions/gsd/commands/context.ts +0 -5
  280. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  281. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  282. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
  283. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  284. package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
  285. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
  286. package/src/resources/extensions/gsd/db-writer.ts +41 -27
  287. package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
  288. package/src/resources/extensions/gsd/doctor-types.ts +7 -1
  289. package/src/resources/extensions/gsd/doctor.ts +13 -4
  290. package/src/resources/extensions/gsd/git-service.ts +6 -2
  291. package/src/resources/extensions/gsd/gsd-db.ts +32 -4
  292. package/src/resources/extensions/gsd/guided-flow.ts +1 -2
  293. package/src/resources/extensions/gsd/journal.ts +6 -1
  294. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  295. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  296. package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
  297. package/src/resources/extensions/gsd/preferences-types.ts +2 -2
  298. package/src/resources/extensions/gsd/preferences.ts +7 -3
  299. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
  300. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  301. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  302. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
  303. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  304. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  305. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  306. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  307. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  308. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  309. package/src/resources/extensions/gsd/prompts/queue.md +2 -2
  310. package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
  311. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  312. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  313. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  314. package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
  315. package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
  316. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  317. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  318. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  319. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  320. package/src/resources/extensions/gsd/rethink.ts +154 -0
  321. package/src/resources/extensions/gsd/session-lock.ts +0 -4
  322. package/src/resources/extensions/gsd/state.ts +49 -1
  323. package/src/resources/extensions/gsd/sync-lock.ts +94 -0
  324. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +5 -13
  325. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
  326. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  327. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +96 -0
  328. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +264 -228
  329. package/src/resources/extensions/gsd/tests/complete-task.test.ts +317 -250
  330. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  331. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +2 -8
  332. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
  333. package/src/resources/extensions/gsd/tests/db-writer.test.ts +79 -0
  334. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  335. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +60 -0
  336. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  337. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  338. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +1 -1
  339. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  340. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  341. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +15 -24
  342. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  343. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  344. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  345. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  346. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  347. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
  348. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +42 -3
  349. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
  350. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -7
  351. package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
  352. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
  353. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -2
  354. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  355. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
  356. package/src/resources/extensions/gsd/tests/preferences.test.ts +7 -9
  357. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
  358. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
  359. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  360. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
  361. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
  362. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +1 -4
  363. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  364. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
  365. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  366. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
  367. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  368. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  369. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
  370. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
  371. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
  372. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
  373. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
  374. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
  375. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  376. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
  377. package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
  378. package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
  379. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
  380. package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
  381. package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
  382. package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
  383. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
  384. package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
  385. package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
  386. package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
  387. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  388. package/src/resources/extensions/gsd/types.ts +8 -0
  389. package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
  390. package/src/resources/extensions/gsd/workflow-events.ts +154 -0
  391. package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
  392. package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
  393. package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
  394. package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
  395. package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
  396. package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
  397. package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
  398. package/src/resources/extensions/gsd/write-intercept.ts +90 -0
  399. package/src/resources/extensions/mcp-client/index.ts +20 -0
  400. package/src/resources/extensions/voice/index.ts +11 -21
  401. package/src/resources/extensions/voice/linux-ready.ts +87 -0
  402. package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
  403. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  404. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  405. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  406. /package/dist/web/standalone/.next/static/{tokoGmfkYfWf1_Yl_Gz7i → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
  407. /package/dist/web/standalone/.next/static/{tokoGmfkYfWf1_Yl_Gz7i → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
@@ -13,14 +13,12 @@
13
13
  import { deriveState } from "./state.js";
14
14
  import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
15
15
  import { loadPrompt } from "./prompt-loader.js";
16
- import { resolveSliceFile, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName, gsdRoot, } from "./paths.js";
16
+ import { resolveSliceFile, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName, } from "./paths.js";
17
17
  import { invalidateAllCaches } from "./cache.js";
18
18
  import { closeoutUnit } from "./auto-unit-closeout.js";
19
19
  import { autoCommitCurrentBranch, } from "./worktree.js";
20
20
  import { verifyExpectedArtifact, resolveExpectedArtifactPath, } from "./auto-recovery.js";
21
- import { writeUnitRuntimeRecord, clearUnitRuntimeRecord } from "./unit-runtime.js";
22
- import { runGSDDoctor, rebuildState, summarizeDoctorIssues } from "./doctor.js";
23
- import { recordHealthSnapshot, checkHealEscalation } from "./doctor-proactive.js";
21
+ import { regenerateIfMissing } from "./workflow-projections.js";
24
22
  import { syncStateToProjectRoot } from "./auto-worktree-sync.js";
25
23
  import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
26
24
  import { renderPlanCheckboxes } from "./markdown-renderer.js";
@@ -30,7 +28,6 @@ import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
30
28
  import { debugLog } from "./debug-logger.js";
31
29
  import { existsSync, unlinkSync } from "node:fs";
32
30
  import { join } from "node:path";
33
- import { atomicWriteSync } from "./atomic-write.js";
34
31
  import { _resetHasChangesCache } from "./native-git-bridge.js";
35
32
  /**
36
33
  * Detect summary files written directly to disk without the LLM calling
@@ -137,8 +134,6 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
137
134
  }
138
135
  return rogues;
139
136
  }
140
- /** Throttle STATE.md rebuilds — at most once per 30 seconds */
141
- const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
142
137
  /**
143
138
  * Pre-verification processing: parallel worker signal check, cache invalidation,
144
139
  * auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
@@ -232,74 +227,6 @@ export async function postUnitPreVerification(pctx, opts) {
232
227
  catch (e) {
233
228
  debugLog("postUnit", { phase: "github-sync", error: String(e) });
234
229
  }
235
- // Doctor: fix mechanical bookkeeping (skipped for lightweight sidecars)
236
- if (!opts?.skipDoctor)
237
- try {
238
- const scopeParts = s.currentUnit.id.split("/").slice(0, 2);
239
- const doctorScope = scopeParts.join("/");
240
- const sliceTerminalUnits = new Set(["complete-slice", "run-uat"]);
241
- const effectiveFixLevel = sliceTerminalUnits.has(s.currentUnit.type) ? "all" : "task";
242
- const report = await runGSDDoctor(s.basePath, { fix: true, scope: doctorScope, fixLevel: effectiveFixLevel });
243
- // Human-readable fix notification with details
244
- if (report.fixesApplied.length > 0) {
245
- const fixSummary = report.fixesApplied.length <= 2
246
- ? report.fixesApplied.join("; ")
247
- : `${report.fixesApplied[0]}; +${report.fixesApplied.length - 1} more`;
248
- ctx.ui.notify(`Doctor: ${fixSummary}`, "info");
249
- }
250
- // Proactive health tracking — filter to current milestone to avoid
251
- // cross-milestone stale errors inflating the escalation counter
252
- const currentMilestoneId = s.currentUnit.id.split("/")[0];
253
- const milestoneIssues = currentMilestoneId
254
- ? report.issues.filter(i => i.unitId === currentMilestoneId ||
255
- i.unitId.startsWith(`${currentMilestoneId}/`))
256
- : report.issues;
257
- const summary = summarizeDoctorIssues(milestoneIssues);
258
- // Pass issue details + scope for real-time visibility in the progress widget
259
- const issueDetails = milestoneIssues
260
- .filter(i => i.severity === "error" || i.severity === "warning")
261
- .map(i => ({ code: i.code, message: i.message, severity: i.severity, unitId: i.unitId }));
262
- recordHealthSnapshot(summary.errors, summary.warnings, report.fixesApplied.length, issueDetails, report.fixesApplied, doctorScope);
263
- // Check if we should escalate to LLM-assisted heal
264
- if (summary.errors > 0) {
265
- const unresolvedErrors = milestoneIssues
266
- .filter(i => i.severity === "error" && !i.fixable)
267
- .map(i => ({ code: i.code, message: i.message, unitId: i.unitId }));
268
- const escalation = checkHealEscalation(summary.errors, unresolvedErrors);
269
- if (escalation.shouldEscalate) {
270
- ctx.ui.notify(`Doctor heal escalation: ${escalation.reason}. Dispatching LLM-assisted heal.`, "warning");
271
- try {
272
- const { formatDoctorIssuesForPrompt, formatDoctorReport } = await import("./doctor.js");
273
- const { dispatchDoctorHeal } = await import("./commands-handlers.js");
274
- const actionable = report.issues.filter(i => i.severity === "error");
275
- const reportText = formatDoctorReport(report, { scope: doctorScope, includeWarnings: true });
276
- const structuredIssues = formatDoctorIssuesForPrompt(actionable);
277
- dispatchDoctorHeal(pi, doctorScope, reportText, structuredIssues);
278
- return "dispatched";
279
- }
280
- catch (e) {
281
- debugLog("postUnit", { phase: "doctor-heal-dispatch", error: String(e) });
282
- }
283
- }
284
- }
285
- }
286
- catch (e) {
287
- debugLog("postUnit", { phase: "doctor", error: String(e) });
288
- }
289
- // Throttled STATE.md rebuild (skipped for lightweight sidecars)
290
- if (!opts?.skipStateRebuild) {
291
- const now = Date.now();
292
- if (now - s.lastStateRebuildAt >= STATE_REBUILD_MIN_INTERVAL_MS) {
293
- try {
294
- await rebuildState(s.basePath);
295
- s.lastStateRebuildAt = now;
296
- autoCommitCurrentBranch(s.basePath, "state-rebuild", s.currentUnit.id);
297
- }
298
- catch (e) {
299
- debugLog("postUnit", { phase: "state-rebuild", error: String(e) });
300
- }
301
- }
302
- }
303
230
  // Prune dead bg-shell processes
304
231
  try {
305
232
  const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
@@ -411,6 +338,27 @@ export async function postUnitPreVerification(pctx, opts) {
411
338
  catch (e) {
412
339
  debugLog("postUnit", { phase: "artifact-verify", error: String(e) });
413
340
  }
341
+ // If verification failed, attempt to regenerate missing projection files
342
+ // from DB data before giving up (e.g. research-slice produces PLAN from engine).
343
+ if (!triggerArtifactVerified) {
344
+ try {
345
+ const parts = s.currentUnit.id.split("/");
346
+ const [mid, sid] = parts;
347
+ if (mid && sid) {
348
+ const regenerated = regenerateIfMissing(s.basePath, mid, sid, "PLAN");
349
+ if (regenerated) {
350
+ // Re-check after regeneration
351
+ triggerArtifactVerified = verifyExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
352
+ if (triggerArtifactVerified) {
353
+ invalidateAllCaches();
354
+ }
355
+ }
356
+ }
357
+ }
358
+ catch (e) {
359
+ debugLog("postUnit", { phase: "regenerate-projection", error: String(e) });
360
+ }
361
+ }
414
362
  // When artifact verification fails for a unit type that has a known expected
415
363
  // artifact, return "retry" so the caller re-dispatches with failure context
416
364
  // instead of blindly re-dispatching the same unit (#1571).
@@ -432,18 +380,7 @@ export async function postUnitPreVerification(pctx, opts) {
432
380
  }
433
381
  }
434
382
  else {
435
- // Hook unit completed — finalize its runtime record
436
- try {
437
- writeUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, {
438
- phase: "finalized",
439
- progressCount: 1,
440
- lastProgressKind: "hook-completed",
441
- });
442
- clearUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id);
443
- }
444
- catch (e) {
445
- debugLog("postUnit", { phase: "hook-finalize", error: String(e) });
446
- }
383
+ // Hook unit completed — no additional processing needed
447
384
  }
448
385
  }
449
386
  return "continue";
@@ -517,15 +454,7 @@ export async function postUnitPostVerification(pctx) {
517
454
  }
518
455
  }
519
456
  }
520
- // 3. Remove from s.completedUnits and flush to completed-units.json
521
- s.completedUnits = s.completedUnits.filter(u => !(u.type === trigger.unitType && u.id === trigger.unitId));
522
- try {
523
- const completedKeysPath = join(gsdRoot(s.basePath), "completed-units.json");
524
- const keys = s.completedUnits.map(u => `${u.type}/${u.id}`);
525
- atomicWriteSync(completedKeysPath, JSON.stringify(keys, null, 2));
526
- }
527
- catch { /* non-fatal: disk flush failure */ }
528
- // 4. Delete the retry_on artifact (e.g. NEEDS-REWORK.md)
457
+ // 3. Delete the retry_on artifact (e.g. NEEDS-REWORK.md)
529
458
  if (trigger.retryArtifact) {
530
459
  const retryArtifactPath = resolveHookArtifactPath(s.basePath, trigger.unitId, trigger.retryArtifact);
531
460
  if (existsSync(retryArtifactPath)) {
@@ -1156,6 +1156,12 @@ export async function buildCompleteMilestonePrompt(mid, midTitle, base, level) {
1156
1156
  roadmapPath: roadmapRel,
1157
1157
  inlinedContext,
1158
1158
  milestoneSummaryPath,
1159
+ skillActivation: buildSkillActivationBlock({
1160
+ base,
1161
+ milestoneId: mid,
1162
+ milestoneTitle: midTitle,
1163
+ extraContext: [inlinedContext],
1164
+ }),
1159
1165
  });
1160
1166
  }
1161
1167
  export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
@@ -1236,6 +1242,12 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
1236
1242
  inlinedContext,
1237
1243
  validationPath: validationOutputPath,
1238
1244
  remediationRound: String(remediationRound),
1245
+ skillActivation: buildSkillActivationBlock({
1246
+ base,
1247
+ milestoneId: mid,
1248
+ milestoneTitle: midTitle,
1249
+ extraContext: [inlinedContext],
1250
+ }),
1239
1251
  });
1240
1252
  }
1241
1253
  export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
@@ -1332,6 +1344,12 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
1332
1344
  uatResultPath,
1333
1345
  uatType,
1334
1346
  inlinedContext,
1347
+ skillActivation: buildSkillActivationBlock({
1348
+ base,
1349
+ milestoneId: mid,
1350
+ sliceId,
1351
+ extraContext: [inlinedContext],
1352
+ }),
1335
1353
  });
1336
1354
  }
1337
1355
  export async function buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base, level) {
@@ -1378,11 +1396,16 @@ export async function buildReassessRoadmapPrompt(mid, midTitle, completedSliceId
1378
1396
  milestoneTitle: midTitle,
1379
1397
  completedSliceId,
1380
1398
  roadmapPath: roadmapRel,
1381
- completedSliceSummaryPath: summaryRel,
1382
1399
  assessmentPath,
1383
1400
  inlinedContext,
1384
1401
  deferredCaptures,
1385
1402
  commitInstruction: reassessCommitInstruction,
1403
+ skillActivation: buildSkillActivationBlock({
1404
+ base,
1405
+ milestoneId: mid,
1406
+ milestoneTitle: midTitle,
1407
+ extraContext: [inlinedContext, deferredCaptures],
1408
+ }),
1386
1409
  });
1387
1410
  }
1388
1411
  // ─── Reactive Execute Prompt ──────────────────────────────────────────────
@@ -197,10 +197,13 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
197
197
  state = await deriveState(wtPath);
198
198
  }
199
199
  }
200
- // Milestone branch recovery (#601)
200
+ // Milestone branch recovery (#601, #2358)
201
+ // Detect survivor milestone branches in both pre-planning and complete phases.
202
+ // In phase=complete, the milestone artifacts exist but finalization (merge,
203
+ // worktree cleanup) was never run — the survivor branch must be merged.
201
204
  let hasSurvivorBranch = false;
202
205
  if (state.activeMilestone &&
203
- state.phase === "pre-planning" &&
206
+ (state.phase === "pre-planning" || state.phase === "complete") &&
204
207
  shouldUseWorktreeIsolation() &&
205
208
  !detectWorktreeName(base) &&
206
209
  !base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)) {
@@ -231,6 +234,22 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
231
234
  return releaseLockAndReturn();
232
235
  }
233
236
  }
237
+ // Survivor branch exists and milestone is complete (#2358):
238
+ // The milestone artifacts were written but finalization (merge, worktree
239
+ // cleanup) never ran. Run mergeAndExit to finalize, then re-derive state
240
+ // so the normal "all milestones complete" or "next milestone" path runs.
241
+ if (hasSurvivorBranch && state.phase === "complete") {
242
+ const mid = state.activeMilestone.id;
243
+ ctx.ui.notify(`Milestone ${mid} is complete but branch/worktree was not finalized. Running merge now.`, "info");
244
+ const resolver = buildResolver();
245
+ resolver.mergeAndExit(mid, {
246
+ notify: ctx.ui.notify.bind(ctx.ui),
247
+ });
248
+ invalidateAllCaches();
249
+ state = await deriveState(base);
250
+ // Clear survivor flag — finalization is done
251
+ hasSurvivorBranch = false;
252
+ }
234
253
  if (!hasSurvivorBranch) {
235
254
  // No active work — start a new milestone via discuss flow
236
255
  if (!state.activeMilestone || state.phase === "complete") {
@@ -333,7 +352,6 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
333
352
  });
334
353
  s.autoStartTime = Date.now();
335
354
  s.resourceVersionOnStart = readResourceVersion();
336
- s.completedUnits = [];
337
355
  s.pendingQuickTasks = [];
338
356
  s.currentUnit = null;
339
357
  s.currentMilestoneId = state.activeMilestone?.id ?? null;
@@ -436,8 +454,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
436
454
  ? `Will loop through ${pendingCount} milestones.`
437
455
  : "Will loop until milestone complete.";
438
456
  ctx.ui.notify(`${modeLabel} started. ${scopeMsg}`, "info");
439
- updateSessionLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown", 0);
440
- writeLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown", 0);
457
+ updateSessionLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown");
458
+ writeLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown");
441
459
  // Secrets collection gate
442
460
  const mid = state.activeMilestone.id;
443
461
  try {
@@ -6,6 +6,7 @@
6
6
  * via startUnitSupervision() and torn down by the caller via clearUnitTimeout().
7
7
  */
8
8
  import { readUnitRuntimeRecord, writeUnitRuntimeRecord } from "./unit-runtime.js";
9
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
9
10
  import { resolveAutoSupervisorConfig } from "./preferences.js";
10
11
  import { computeBudgets, resolveExecutorContextWindow } from "./context-budget.js";
11
12
  import { getInFlightToolCount, getOldestInFlightToolStart, } from "./auto-tool-tracking.js";
@@ -21,12 +22,65 @@ import { resolveAgentEndCancelled } from "./auto/resolve.js";
21
22
  * 3. Hard timeout (pause + recovery)
22
23
  * 4. Context-pressure monitor (continue-here)
23
24
  */
25
+ /**
26
+ * Parse a task estimate string (e.g. "30m", "2h", "1h30m") into minutes.
27
+ * Returns null if the string cannot be parsed.
28
+ */
29
+ export function parseEstimateMinutes(estimate) {
30
+ if (!estimate || typeof estimate !== "string")
31
+ return null;
32
+ const trimmed = estimate.trim();
33
+ if (!trimmed)
34
+ return null;
35
+ let totalMinutes = 0;
36
+ let matched = false;
37
+ // Match hours component
38
+ const hoursMatch = trimmed.match(/(\d+)\s*h/i);
39
+ if (hoursMatch) {
40
+ totalMinutes += Number(hoursMatch[1]) * 60;
41
+ matched = true;
42
+ }
43
+ // Match minutes component
44
+ const minutesMatch = trimmed.match(/(\d+)\s*m/i);
45
+ if (minutesMatch) {
46
+ totalMinutes += Number(minutesMatch[1]);
47
+ matched = true;
48
+ }
49
+ return matched ? totalMinutes : null;
50
+ }
24
51
  export function startUnitSupervision(sctx) {
25
52
  const { s, ctx, pi, unitType, unitId, prefs, buildSnapshotOpts, buildRecoveryContext, pauseAuto } = sctx;
26
53
  const supervisor = resolveAutoSupervisorConfig();
27
- const softTimeoutMs = (supervisor.soft_timeout_minutes ?? 0) * 60 * 1000;
28
- const idleTimeoutMs = (supervisor.idle_timeout_minutes ?? 0) * 60 * 1000;
29
- const hardTimeoutMs = (supervisor.hard_timeout_minutes ?? 0) * 60 * 1000;
54
+ // Scale timeouts based on task estimate annotations (#2243).
55
+ // If the task has an est: annotation, use it to extend the hard and soft timeouts
56
+ // so longer tasks don't get prematurely timed out.
57
+ let taskEstimate = sctx.taskEstimate;
58
+ if (!taskEstimate && unitType === "task" && isDbAvailable()) {
59
+ // Look up the task estimate from the DB (#2243).
60
+ try {
61
+ if (s.currentMilestoneId) {
62
+ const slices = getMilestoneSlices(s.currentMilestoneId);
63
+ for (const slice of slices) {
64
+ const tasks = getSliceTasks(s.currentMilestoneId, slice.id);
65
+ const task = tasks.find(t => t.id === unitId);
66
+ if (task?.estimate) {
67
+ taskEstimate = task.estimate;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ catch {
74
+ // Non-fatal — fall through with no estimate
75
+ }
76
+ }
77
+ const estimateMinutes = taskEstimate ? parseEstimateMinutes(taskEstimate) : null;
78
+ const timeoutScale = estimateMinutes && estimateMinutes > 0
79
+ ? Math.max(1, estimateMinutes / 10) // 10min task = 1x, 30min = 3x, 2h = 12x
80
+ : 1;
81
+ const softTimeoutMs = (supervisor.soft_timeout_minutes ?? 0) * 60 * 1000 * timeoutScale;
82
+ const idleTimeoutMs = (supervisor.idle_timeout_minutes ?? 0) * 60 * 1000; // idle not scaled — idle is idle
83
+ const hardTimeoutMs = (supervisor.hard_timeout_minutes ?? 0) * 60 * 1000 * timeoutScale;
30
84
  // ── 1. Soft timeout warning ──
31
85
  s.wrapupWarningHandle = setTimeout(() => {
32
86
  s.wrapupWarningHandle = null;
@@ -63,6 +63,10 @@ export function syncStateToProjectRoot(worktreePath, projectRoot, milestoneId) {
63
63
  // 2. Milestone directory — ROADMAP, slice PLANs, task summaries
64
64
  // Copy the entire milestone .gsd subtree so deriveState reads current checkboxes
65
65
  safeCopyRecursive(join(wtGsd, "milestones", milestoneId), join(prGsd, "milestones", milestoneId), { force: true });
66
+ // 3. metrics.json — session cost/token tracking (#2313).
67
+ // Without this, metrics accumulated in the worktree are invisible from the
68
+ // project root and never appear in the dashboard or skill-health reports.
69
+ safeCopy(join(wtGsd, "metrics.json"), join(prGsd, "metrics.json"), { force: true });
66
70
  // 4. Runtime records — unit dispatch state used by selfHealRuntimeRecords().
67
71
  // Without this, a crash during a unit leaves the runtime record only in the
68
72
  // worktree. If the next session resolves basePath before worktree re-entry,
@@ -17,6 +17,7 @@ import { createWorktree, removeWorktree, resolveGitDir, worktreePath, } from "./
17
17
  import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
18
18
  import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
19
19
  import { debugLog } from "./debug-logger.js";
20
+ import { logWarning } from "./workflow-logger.js";
20
21
  import { loadEffectiveGSDPreferences } from "./preferences.js";
21
22
  import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, } from "./native-git-bridge.js";
22
23
  // ─── Module State ──────────────────────────────────────────────────────────
@@ -109,6 +110,7 @@ export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
109
110
  "OVERRIDES.md",
110
111
  "QUEUE.md",
111
112
  "completed-units.json",
113
+ "metrics.json",
112
114
  ];
113
115
  for (const f of rootFiles) {
114
116
  const src = join(mainGsd, f);
@@ -269,8 +271,9 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
269
271
  // ── 1. Sync root-level .gsd/ files back ──────────────────────────────
270
272
  // The worktree is authoritative — complete-milestone updates REQUIREMENTS,
271
273
  // PROJECT, etc. These must overwrite main's copies so they survive teardown.
272
- // Also includes QUEUE.md and completed-units.json which are written during
273
- // milestone closeout and lost on teardown without explicit sync (#1787).
274
+ // Also includes QUEUE.md, completed-units.json, and metrics.json which are
275
+ // written during milestone closeout and lost on teardown without explicit sync
276
+ // (#1787, #2313).
274
277
  const rootFiles = [
275
278
  "DECISIONS.md",
276
279
  "REQUIREMENTS.md",
@@ -279,6 +282,7 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
279
282
  "OVERRIDES.md",
280
283
  "QUEUE.md",
281
284
  "completed-units.json",
285
+ "metrics.json",
282
286
  ];
283
287
  for (const f of rootFiles) {
284
288
  const src = join(wtGsd, f);
@@ -612,7 +616,7 @@ export function createAutoWorktree(basePath, milestoneId) {
612
616
  const hookError = runWorktreePostCreateHook(basePath, info.path);
613
617
  if (hookError) {
614
618
  // Non-fatal — log but don't prevent worktree usage
615
- console.error(`[GSD] ${hookError}`);
619
+ logWarning("reconcile", hookError, { worktree: info.name });
616
620
  }
617
621
  const previousCwd = process.cwd();
618
622
  try {
@@ -687,9 +691,9 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
687
691
  // backslashes (#1436), leaving ~1 GB+ orphaned directories.
688
692
  const wtDir = worktreePath(originalBasePath, milestoneId);
689
693
  if (existsSync(wtDir)) {
690
- console.error(`[GSD] WARNING: Worktree directory still exists after teardown: ${wtDir}\n` +
691
- ` This is likely an orphaned directory consuming disk space.\n` +
692
- ` Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`);
694
+ logWarning("reconcile", `Worktree directory still exists after teardown: ${wtDir}. ` +
695
+ `This is likely an orphaned directory consuming disk space. ` +
696
+ `Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`, { worktree: milestoneId });
693
697
  // Attempt a direct filesystem removal as a fallback
694
698
  try {
695
699
  rmSync(wtDir, { recursive: true, force: true });
@@ -1133,9 +1137,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1133
1137
  // Push failure is non-fatal
1134
1138
  }
1135
1139
  }
1136
- // 9b. Auto-create PR if enabled (requires push_branches + push succeeded)
1140
+ // 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
1137
1141
  let prCreated = false;
1138
- if (prefs.auto_pr === true && pushed) {
1142
+ if (prefs.auto_pr === true && !nothingToCommit) {
1139
1143
  const remote = prefs.remote ?? "origin";
1140
1144
  const prTarget = prefs.pr_target_branch ?? mainBranch;
1141
1145
  try {
@@ -1145,9 +1149,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1145
1149
  stdio: ["ignore", "pipe", "pipe"],
1146
1150
  encoding: "utf-8",
1147
1151
  });
1148
- // Create PR via gh CLI
1152
+ // Create PR via gh CLI with explicit --head and --base (#2302)
1149
1153
  execFileSync("gh", [
1150
- "pr", "create",
1154
+ "pr", "create", "--draft",
1151
1155
  "--base", prTarget,
1152
1156
  "--head", milestoneBranch,
1153
1157
  "--title", `Milestone ${milestoneId} complete`,