gsd-pi 2.43.0-dev.5717b75 → 2.43.0-next.4

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 (395) hide show
  1. package/README.md +0 -23
  2. package/dist/cli.js +3 -18
  3. package/dist/loader.js +1 -3
  4. package/dist/resource-loader.js +6 -39
  5. package/dist/resources/extensions/async-jobs/async-bash-tool.js +4 -52
  6. package/dist/resources/extensions/async-jobs/await-tool.js +0 -5
  7. package/dist/resources/extensions/async-jobs/index.js +0 -2
  8. package/dist/resources/extensions/github-sync/sync.js +2 -1
  9. package/dist/resources/extensions/gsd/auto/phases.js +3 -1
  10. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  11. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +20 -18
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +113 -6
  14. package/dist/resources/extensions/gsd/auto-prompts.js +151 -107
  15. package/dist/resources/extensions/gsd/auto-recovery.js +82 -135
  16. package/dist/resources/extensions/gsd/auto-start.js +11 -8
  17. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  18. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  19. package/dist/resources/extensions/gsd/auto-worktree.js +32 -17
  20. package/dist/resources/extensions/gsd/auto.js +1 -1
  21. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +546 -0
  22. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -11
  24. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  26. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  27. package/dist/resources/extensions/gsd/commands-maintenance.js +62 -3
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  29. package/dist/resources/extensions/gsd/detection.js +0 -19
  30. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -29
  31. package/dist/resources/extensions/gsd/doctor-checks.js +29 -42
  32. package/dist/resources/extensions/gsd/doctor-providers.js +0 -10
  33. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  34. package/dist/resources/extensions/gsd/doctor.js +46 -282
  35. package/dist/resources/extensions/gsd/files.js +14 -198
  36. package/dist/resources/extensions/gsd/forensics.js +0 -84
  37. package/dist/resources/extensions/gsd/git-service.js +69 -3
  38. package/dist/resources/extensions/gsd/gsd-db.js +783 -201
  39. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  40. package/dist/resources/extensions/gsd/markdown-renderer.js +871 -0
  41. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  42. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  43. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  44. package/dist/resources/extensions/gsd/preferences-types.js +0 -1
  45. package/dist/resources/extensions/gsd/preferences.js +8 -59
  46. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  47. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  48. package/dist/resources/extensions/gsd/prompts/forensics.md +0 -2
  49. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  50. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  54. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  55. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -5
  56. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -4
  57. package/dist/resources/extensions/gsd/reactive-graph.js +22 -3
  58. package/dist/resources/extensions/gsd/repo-identity.js +5 -46
  59. package/dist/resources/extensions/gsd/service-tier.js +4 -13
  60. package/dist/resources/extensions/gsd/session-lock.js +2 -2
  61. package/dist/resources/extensions/gsd/state.js +456 -12
  62. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  63. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  64. package/dist/resources/extensions/gsd/tools/plan-milestone.js +203 -0
  65. package/dist/resources/extensions/gsd/tools/plan-slice.js +153 -0
  66. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  67. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  68. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  69. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  70. package/dist/resources/extensions/gsd/undo.js +197 -3
  71. package/dist/resources/extensions/gsd/visualizer-data.js +15 -10
  72. package/dist/resources/extensions/gsd/workspace-index.js +37 -24
  73. package/dist/resources/extensions/gsd/worktree-resolver.js +2 -2
  74. package/dist/resources/extensions/gsd/worktree.js +2 -2
  75. package/dist/resources/extensions/mcp-client/index.js +1 -2
  76. package/dist/resources/extensions/search-the-web/tool-search.js +3 -3
  77. package/dist/web/standalone/.next/BUILD_ID +1 -1
  78. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  79. package/dist/web/standalone/.next/build-manifest.json +3 -3
  80. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  81. package/dist/web/standalone/.next/required-server-files.json +3 -3
  82. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  83. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  85. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  93. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/dev-mode/route.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.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  153. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/index.html +1 -1
  181. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  182. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  183. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  184. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  186. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/page.js +2 -2
  188. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  190. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  191. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  192. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/middleware.js +2 -2
  194. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  196. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  197. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  198. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  199. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/{main-app-fdab67f7802d7832.js → main-app-2f2ee7b85712c2bd.js} +1 -1
  203. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +1 -0
  204. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  205. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  206. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  207. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  208. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  209. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  210. package/dist/web/standalone/server.js +1 -1
  211. package/dist/web-mode.js +3 -10
  212. package/package.json +1 -1
  213. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -8
  215. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/core/auth-storage.js +2 -6
  218. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +0 -60
  220. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -18
  223. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/lsp/client.js +0 -23
  226. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +0 -6
  228. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/package-manager.js +11 -63
  230. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -9
  232. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/resource-loader.js +6 -20
  234. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/system-prompt.js +5 -6
  237. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +0 -3
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +10 -30
  243. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  244. package/packages/pi-coding-agent/package.json +1 -1
  245. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -7
  246. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +0 -68
  247. package/packages/pi-coding-agent/src/core/auth-storage.ts +2 -5
  248. package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -18
  249. package/packages/pi-coding-agent/src/core/lsp/client.ts +0 -29
  250. package/packages/pi-coding-agent/src/core/package-manager.ts +58 -99
  251. package/packages/pi-coding-agent/src/core/resource-loader.ts +6 -24
  252. package/packages/pi-coding-agent/src/core/system-prompt.ts +5 -6
  253. package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +0 -3
  254. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +11 -31
  255. package/pkg/package.json +1 -1
  256. package/src/resources/extensions/async-jobs/async-bash-tool.ts +4 -40
  257. package/src/resources/extensions/async-jobs/await-tool.test.ts +0 -47
  258. package/src/resources/extensions/async-jobs/await-tool.ts +0 -5
  259. package/src/resources/extensions/async-jobs/index.ts +0 -1
  260. package/src/resources/extensions/async-jobs/job-manager.ts +0 -2
  261. package/src/resources/extensions/github-sync/sync.ts +2 -1
  262. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  263. package/src/resources/extensions/gsd/auto/phases.ts +3 -1
  264. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  265. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +17 -17
  266. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  267. package/src/resources/extensions/gsd/auto-post-unit.ts +129 -5
  268. package/src/resources/extensions/gsd/auto-prompts.ts +138 -106
  269. package/src/resources/extensions/gsd/auto-recovery.ts +76 -142
  270. package/src/resources/extensions/gsd/auto-start.ts +10 -7
  271. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  272. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  273. package/src/resources/extensions/gsd/auto-worktree.ts +33 -16
  274. package/src/resources/extensions/gsd/auto.ts +0 -2
  275. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +606 -4
  276. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  277. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -13
  278. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  279. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  280. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  281. package/src/resources/extensions/gsd/commands-maintenance.ts +71 -3
  282. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  283. package/src/resources/extensions/gsd/detection.ts +0 -19
  284. package/src/resources/extensions/gsd/dispatch-guard.ts +14 -30
  285. package/src/resources/extensions/gsd/doctor-checks.ts +26 -43
  286. package/src/resources/extensions/gsd/doctor-providers.ts +0 -13
  287. package/src/resources/extensions/gsd/doctor-types.ts +0 -24
  288. package/src/resources/extensions/gsd/doctor.ts +45 -295
  289. package/src/resources/extensions/gsd/files.ts +16 -220
  290. package/src/resources/extensions/gsd/forensics.ts +0 -92
  291. package/src/resources/extensions/gsd/git-service.ts +72 -2
  292. package/src/resources/extensions/gsd/gitignore.ts +1 -1
  293. package/src/resources/extensions/gsd/gsd-db.ts +1125 -378
  294. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  295. package/src/resources/extensions/gsd/markdown-renderer.ts +1107 -0
  296. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  297. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  298. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  299. package/src/resources/extensions/gsd/preferences-types.ts +0 -3
  300. package/src/resources/extensions/gsd/preferences.ts +6 -62
  301. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  302. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  303. package/src/resources/extensions/gsd/prompts/forensics.md +0 -2
  304. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  305. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  306. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.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 +2 -2
  309. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  310. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -5
  311. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -4
  312. package/src/resources/extensions/gsd/reactive-graph.ts +23 -3
  313. package/src/resources/extensions/gsd/repo-identity.ts +5 -48
  314. package/src/resources/extensions/gsd/service-tier.ts +4 -17
  315. package/src/resources/extensions/gsd/session-lock.ts +2 -2
  316. package/src/resources/extensions/gsd/state.ts +518 -11
  317. package/src/resources/extensions/gsd/tests/activity-log.test.ts +69 -31
  318. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  319. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
  320. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
  321. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
  322. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
  323. package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
  324. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
  325. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +590 -2
  326. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
  327. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
  328. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
  329. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
  330. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
  331. package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
  332. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
  333. package/src/resources/extensions/gsd/tests/git-service.test.ts +14 -9
  334. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  335. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +460 -0
  336. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
  337. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  338. package/src/resources/extensions/gsd/tests/journal.test.ts +127 -82
  339. package/src/resources/extensions/gsd/tests/manifest-status.test.ts +82 -73
  340. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1204 -0
  341. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  342. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  343. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
  344. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
  345. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
  346. package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
  347. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  348. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  349. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  350. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  351. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  352. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +135 -0
  353. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  354. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  355. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  356. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +265 -0
  357. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  358. package/src/resources/extensions/gsd/tests/service-tier.test.ts +1 -30
  359. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
  360. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +3 -56
  361. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -3
  362. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  363. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  364. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +263 -156
  365. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +78 -35
  366. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +74 -81
  367. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +2 -1
  368. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  369. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  370. package/src/resources/extensions/gsd/tools/plan-milestone.ts +244 -0
  371. package/src/resources/extensions/gsd/tools/plan-slice.ts +189 -0
  372. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  373. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  374. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  375. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  376. package/src/resources/extensions/gsd/types.ts +50 -0
  377. package/src/resources/extensions/gsd/undo.ts +247 -3
  378. package/src/resources/extensions/gsd/visualizer-data.ts +16 -11
  379. package/src/resources/extensions/gsd/workspace-index.ts +39 -27
  380. package/src/resources/extensions/gsd/worktree-resolver.ts +3 -2
  381. package/src/resources/extensions/gsd/worktree.ts +2 -2
  382. package/src/resources/extensions/mcp-client/index.ts +1 -5
  383. package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
  384. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  385. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +0 -1
  386. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  387. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
  388. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  389. package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +0 -122
  390. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  391. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  392. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -48
  393. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +0 -151
  394. /package/dist/web/standalone/.next/static/{5ULZcR9XhHFzlAZFiSKRl → ROB0u-QKZQlfuGPZ47tud}/_buildManifest.js +0 -0
  395. /package/dist/web/standalone/.next/static/{5ULZcR9XhHFzlAZFiSKRl → ROB0u-QKZQlfuGPZ47tud}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -24,29 +24,6 @@ One command. Walk away. Come back to a built project with clean git history.
24
24
 
25
25
  ---
26
26
 
27
- ## What's New in v2.42.0
28
-
29
- ### New Features
30
-
31
- - **Declarative workflow engine** — define YAML workflows that execute through auto-loop, enabling repeatable multi-step automations without code. (#2024)
32
- - **Unified rule registry & event journal** — centralized rule registry, event journal with query tool, and standardized tool naming convention. (#1928)
33
- - **PR risk checker** — CI classifies changed files by system area and surfaces risk level on pull requests. (#1930)
34
- - **`/gsd fast`** — toggle service tier for supported models, enabling prioritized API routing for faster responses. (#1862)
35
- - **Web mode CLI flags** — `--host`, `--port`, and `--allowed-origins` flags give full control over the web server bind address and CORS policy. (#1873)
36
- - **ADR attribution** — architecture decision records now distinguish human, agent, and collaborative authorship. (#1830)
37
-
38
- ### Key Fixes
39
-
40
- - **Node v24 web boot** — resolved `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING` that prevented `gsd --web` from starting on Node v24. (#1864)
41
- - **Worktree health check for all ecosystems** — broadened from JS-only to 17+ ecosystems (Rust, Go, Python, Java, etc.). (#1860)
42
- - **Doctor roadmap atomicity** — roadmap checkbox gating now checks summary on disk, not issue detection, preventing false unchecks. (#1915)
43
- - **Windows path handling** — 8.3 short path resolution, backslash normalization in bash commands, PowerShell browser launch, and parenthesis escaping. (#1960, #1863, #1870, #1872)
44
- - **Auth token persistence** — web UI auth token survives page refreshes via sessionStorage. (#1877)
45
- - **German/non-English locale git errors** — git commands now force `LC_ALL=C` to prevent locale-dependent parse failures.
46
- - **Orphan web server process** — stale web server processes on port 3000 are now cleaned up automatically.
47
-
48
- ---
49
-
50
27
  ## What's New in v2.41.0
51
28
 
52
29
  ### New Features
package/dist/cli.js CHANGED
@@ -14,14 +14,6 @@ import { parseCliArgs as parseWebCliArgs, runWebCliBranch, migrateLegacyFlatSess
14
14
  import { stopWebMode } from './web-mode.js';
15
15
  import { getProjectSessionsDir } from './project-sessions.js';
16
16
  import { markStartup, printStartupTimings } from './startup-timings.js';
17
- // ---------------------------------------------------------------------------
18
- // V8 compile cache — Node 22+ can cache compiled bytecode across runs,
19
- // eliminating repeated parse/compile overhead for unchanged modules.
20
- // Must be set early so dynamic imports (extensions, lazy subcommands) benefit.
21
- // ---------------------------------------------------------------------------
22
- if (parseInt(process.versions.node) >= 22) {
23
- process.env.NODE_COMPILE_CACHE ??= join(agentDir, '.compile-cache');
24
- }
25
17
  function exitIfManagedResourcesAreNewer(currentAgentDir) {
26
18
  const currentVersion = process.env.GSD_VERSION || '0.0.0';
27
19
  const managedVersion = getNewerManagedResourceVersion(currentAgentDir, currentVersion);
@@ -469,14 +461,8 @@ const sessionManager = cliFlags._selectedSessionPath
469
461
  exitIfManagedResourcesAreNewer(agentDir);
470
462
  initResources(agentDir);
471
463
  markStartup('initResources');
472
- // Overlap resource loading with session manager setup — both are independent.
473
- // resourceLoader.reload() is the most expensive step (jiti compilation), so
474
- // starting it early shaves ~50-200ms off interactive startup.
475
464
  const resourceLoader = buildResourceLoader(agentDir);
476
- const resourceLoadPromise = resourceLoader.reload();
477
- // While resources load, let session manager finish any async I/O it needs.
478
- // Then await the resource promise before creating the agent session.
479
- await resourceLoadPromise;
465
+ await resourceLoader.reload();
480
466
  markStartup('resourceLoader.reload');
481
467
  const { session, extensionsResult } = await createAgentSession({
482
468
  authStorage,
@@ -544,9 +530,8 @@ if (!process.stdin.isTTY) {
544
530
  process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
545
531
  process.exit(1);
546
532
  }
547
- // Welcome screen — shown on every fresh interactive session before TUI takes over.
548
- // Skip when the first-run banner was already printed in loader.ts (prevents double banner).
549
- if (!process.env.GSD_FIRST_RUN_BANNER) {
533
+ // Welcome screen — shown on every fresh interactive session before TUI takes over
534
+ {
550
535
  const { printWelcomeScreen } = await import('./welcome-screen.js');
551
536
  printWelcomeScreen({
552
537
  version: process.env.GSD_VERSION || '0.0.0',
package/dist/loader.js CHANGED
@@ -42,8 +42,7 @@ const pkgDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'pkg');
42
42
  process.env.PI_PACKAGE_DIR = pkgDir;
43
43
  process.env.PI_SKIP_VERSION_CHECK = '1'; // GSD runs its own update check in cli.ts — suppress pi's
44
44
  process.title = 'gsd';
45
- // Print branded banner on first launch (before ~/.gsd/ exists).
46
- // Set GSD_FIRST_RUN_BANNER so cli.ts skips the duplicate welcome screen.
45
+ // Print branded banner on first launch (before ~/.gsd/ exists)
47
46
  if (!existsSync(appRoot)) {
48
47
  const cyan = '\x1b[36m';
49
48
  const green = '\x1b[32m';
@@ -54,7 +53,6 @@ if (!existsSync(appRoot)) {
54
53
  '\n' +
55
54
  ` Get Shit Done ${dim}v${gsdVersion}${reset}\n` +
56
55
  ` ${green}Welcome.${reset} Setting up your environment...\n\n`);
57
- process.env.GSD_FIRST_RUN_BANNER = '1';
58
56
  }
59
57
  // GSD_CODING_AGENT_DIR — tells pi's getAgentDir() to return ~/.gsd/agent/ instead of ~/.gsd/agent/
60
58
  process.env.GSD_CODING_AGENT_DIR = agentDir;
@@ -48,25 +48,14 @@ function getBundledGsdVersion() {
48
48
  }
49
49
  }
50
50
  function writeManagedResourceManifest(agentDir) {
51
- // Record root-level files and subdirectory extension names currently in the
52
- // bundled extensions source so that future upgrades can detect and prune any
53
- // that get removed or moved.
51
+ // Record root-level files currently in the bundled extensions source so that
52
+ // future upgrades can detect and prune any that get removed or moved.
54
53
  let installedExtensionRootFiles = [];
55
- let installedExtensionDirs = [];
56
54
  try {
57
55
  if (existsSync(bundledExtensionsDir)) {
58
- const entries = readdirSync(bundledExtensionsDir, { withFileTypes: true });
59
- installedExtensionRootFiles = entries
56
+ installedExtensionRootFiles = readdirSync(bundledExtensionsDir, { withFileTypes: true })
60
57
  .filter(e => e.isFile())
61
58
  .map(e => e.name);
62
- installedExtensionDirs = entries
63
- .filter(e => e.isDirectory())
64
- .filter(e => {
65
- // Only track directories that are actual extensions (contain index.js or index.ts)
66
- const dirPath = join(bundledExtensionsDir, e.name);
67
- return existsSync(join(dirPath, 'index.js')) || existsSync(join(dirPath, 'index.ts'));
68
- })
69
- .map(e => e.name);
70
59
  }
71
60
  }
72
61
  catch { /* non-fatal */ }
@@ -75,7 +64,6 @@ function writeManagedResourceManifest(agentDir) {
75
64
  syncedAt: Date.now(),
76
65
  contentHash: computeResourceFingerprint(),
77
66
  installedExtensionRootFiles,
78
- installedExtensionDirs,
79
67
  };
80
68
  writeFileSync(getManagedResourceManifestPath(agentDir), JSON.stringify(manifest));
81
69
  }
@@ -296,20 +284,16 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
296
284
  return;
297
285
  // Current bundled root-level files (what the new version provides)
298
286
  const currentSourceFiles = new Set();
299
- // Current bundled subdirectory extensions
300
- const currentSourceDirs = new Set();
301
287
  try {
302
288
  if (existsSync(bundledExtensionsDir)) {
303
289
  for (const e of readdirSync(bundledExtensionsDir, { withFileTypes: true })) {
304
290
  if (e.isFile())
305
291
  currentSourceFiles.add(e.name);
306
- if (e.isDirectory())
307
- currentSourceDirs.add(e.name);
308
292
  }
309
293
  }
310
294
  }
311
295
  catch { /* non-fatal */ }
312
- const removeFileIfStale = (fileName) => {
296
+ const removeIfStale = (fileName) => {
313
297
  if (currentSourceFiles.has(fileName))
314
298
  return; // still in bundle, not stale
315
299
  const stale = join(extensionsDir, fileName);
@@ -319,33 +303,17 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
319
303
  }
320
304
  catch { /* non-fatal */ }
321
305
  };
322
- const removeDirIfStale = (dirName) => {
323
- if (currentSourceDirs.has(dirName))
324
- return; // still in bundle, not stale
325
- const stale = join(extensionsDir, dirName);
326
- try {
327
- if (existsSync(stale))
328
- rmSync(stale, { recursive: true, force: true });
329
- }
330
- catch { /* non-fatal */ }
331
- };
332
306
  if (manifest?.installedExtensionRootFiles) {
333
307
  // Manifest-based: remove previously-installed root files that are no longer bundled
334
308
  for (const prevFile of manifest.installedExtensionRootFiles) {
335
- removeFileIfStale(prevFile);
336
- }
337
- }
338
- if (manifest?.installedExtensionDirs) {
339
- // Manifest-based: remove previously-installed subdirectory extensions that are no longer bundled
340
- for (const prevDir of manifest.installedExtensionDirs) {
341
- removeDirIfStale(prevDir);
309
+ removeIfStale(prevFile);
342
310
  }
343
311
  }
344
312
  // Always remove known stale files regardless of manifest state.
345
313
  // These were installed by pre-manifest versions so they may not appear in
346
314
  // installedExtensionRootFiles even when a manifest exists.
347
315
  // env-utils.js was moved from extensions/ root → gsd/ in v2.39.x (#1634)
348
- removeFileIfStale('env-utils.js');
316
+ removeIfStale('env-utils.js');
349
317
  }
350
318
  /**
351
319
  * Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
@@ -448,6 +416,5 @@ export function buildResourceLoader(agentDir) {
448
416
  return new DefaultResourceLoader({
449
417
  agentDir,
450
418
  additionalExtensionPaths: piExtensionPaths,
451
- bundledExtensionNames: bundledKeys,
452
419
  });
453
420
  }
@@ -83,15 +83,6 @@ export function createAsyncBashTool(getManager, getCwd) {
83
83
  */
84
84
  function executeBashInBackground(command, cwd, signal, timeout) {
85
85
  return new Promise((resolve, reject) => {
86
- let settled = false;
87
- const safeResolve = (value) => { if (!settled) {
88
- settled = true;
89
- resolve(value);
90
- } };
91
- const safeReject = (err) => { if (!settled) {
92
- settled = true;
93
- reject(err);
94
- } };
95
86
  const { shell, args } = getShellConfig();
96
87
  const resolvedCommand = sanitizeCommand(command);
97
88
  const child = spawn(shell, [...args, resolvedCommand], {
@@ -102,42 +93,11 @@ function executeBashInBackground(command, cwd, signal, timeout) {
102
93
  });
103
94
  let timedOut = false;
104
95
  let timeoutHandle;
105
- let sigkillHandle;
106
- let hardDeadlineHandle;
107
- /** Grace period (ms) between SIGTERM and SIGKILL. */
108
- const SIGKILL_GRACE_MS = 5_000;
109
- /** Hard deadline (ms) after SIGKILL to force-resolve the promise. */
110
- const HARD_DEADLINE_MS = 3_000;
111
96
  if (timeout !== undefined && timeout > 0) {
112
97
  timeoutHandle = setTimeout(() => {
113
98
  timedOut = true;
114
99
  if (child.pid)
115
100
  killTree(child.pid);
116
- // If the process ignores SIGTERM, escalate to SIGKILL
117
- sigkillHandle = setTimeout(() => {
118
- if (child.pid) {
119
- try {
120
- process.kill(-child.pid, "SIGKILL");
121
- }
122
- catch { /* ignore */ }
123
- try {
124
- process.kill(child.pid, "SIGKILL");
125
- }
126
- catch { /* ignore */ }
127
- }
128
- // Hard deadline: if even SIGKILL doesn't trigger 'close',
129
- // force-resolve so the job doesn't hang forever (#2186).
130
- hardDeadlineHandle = setTimeout(() => {
131
- const output = Buffer.concat(chunks).toString("utf-8");
132
- safeResolve(output
133
- ? `${output}\n\nCommand timed out after ${timeout} seconds (force-killed)`
134
- : `Command timed out after ${timeout} seconds (force-killed)`);
135
- }, HARD_DEADLINE_MS);
136
- if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
137
- hardDeadlineHandle.unref();
138
- }, SIGKILL_GRACE_MS);
139
- if (typeof sigkillHandle === "object" && "unref" in sigkillHandle)
140
- sigkillHandle.unref();
141
101
  }, timeout * 1000);
142
102
  }
143
103
  const chunks = [];
@@ -179,31 +139,23 @@ function executeBashInBackground(command, cwd, signal, timeout) {
179
139
  child.on("error", (err) => {
180
140
  if (timeoutHandle)
181
141
  clearTimeout(timeoutHandle);
182
- if (sigkillHandle)
183
- clearTimeout(sigkillHandle);
184
- if (hardDeadlineHandle)
185
- clearTimeout(hardDeadlineHandle);
186
142
  signal.removeEventListener("abort", onAbort);
187
- safeReject(err);
143
+ reject(err);
188
144
  });
189
145
  child.on("close", (code) => {
190
146
  if (timeoutHandle)
191
147
  clearTimeout(timeoutHandle);
192
- if (sigkillHandle)
193
- clearTimeout(sigkillHandle);
194
- if (hardDeadlineHandle)
195
- clearTimeout(hardDeadlineHandle);
196
148
  signal.removeEventListener("abort", onAbort);
197
149
  if (spillStream)
198
150
  spillStream.end();
199
151
  if (signal.aborted) {
200
152
  const output = Buffer.concat(chunks).toString("utf-8");
201
- safeResolve(output ? `${output}\n\nCommand aborted` : "Command aborted");
153
+ resolve(output ? `${output}\n\nCommand aborted` : "Command aborted");
202
154
  return;
203
155
  }
204
156
  if (timedOut) {
205
157
  const output = Buffer.concat(chunks).toString("utf-8");
206
- safeResolve(output ? `${output}\n\nCommand timed out after ${timeout} seconds` : `Command timed out after ${timeout} seconds`);
158
+ resolve(output ? `${output}\n\nCommand timed out after ${timeout} seconds` : `Command timed out after ${timeout} seconds`);
207
159
  return;
208
160
  }
209
161
  const fullOutput = Buffer.concat(chunks).toString("utf-8");
@@ -224,7 +176,7 @@ function executeBashInBackground(command, cwd, signal, timeout) {
224
176
  if (code !== 0 && code !== null) {
225
177
  text += `\n\nCommand exited with code ${code}`;
226
178
  }
227
- safeResolve(text);
179
+ resolve(text);
228
180
  });
229
181
  });
230
182
  }
@@ -54,11 +54,6 @@ export function createAwaitTool(getManager) {
54
54
  };
55
55
  }
56
56
  }
57
- // Mark all watched jobs as awaited upfront so the onJobComplete
58
- // callback (which fires synchronously in the promise .then()) knows
59
- // to suppress the follow-up message.
60
- for (const j of watched)
61
- j.awaited = true;
62
57
  // If all watched jobs are already done, return immediately
63
58
  const running = watched.filter((j) => j.status === "running");
64
59
  if (running.length === 0) {
@@ -34,8 +34,6 @@ export default function AsyncJobs(pi) {
34
34
  latestCwd = ctx.cwd;
35
35
  manager = new AsyncJobManager({
36
36
  onJobComplete: (job) => {
37
- if (job.awaited)
38
- return;
39
37
  const statusEmoji = job.status === "completed" ? "done" : "error";
40
38
  const elapsed = ((Date.now() - job.startTime) / 1000).toFixed(1);
41
39
  const output = job.status === "completed"
@@ -9,7 +9,8 @@
9
9
  */
10
10
  import { existsSync, readdirSync } from "node:fs";
11
11
  import { join } from "node:path";
12
- import { loadFile, parseRoadmap, parsePlan, parseSummary } from "../gsd/files.js";
12
+ import { loadFile, parseSummary } from "../gsd/files.js";
13
+ import { parseRoadmap, parsePlan } from "../gsd/parsers-legacy.js";
13
14
  import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, } from "../gsd/paths.js";
14
15
  import { debugLog } from "../gsd/debug-logger.js";
15
16
  import { loadEffectiveGSDPreferences } from "../gsd/preferences.js";
@@ -165,7 +165,9 @@ export async function runPreDispatch(ic, loopState) {
165
165
  midTitle = state.activeMilestone?.title;
166
166
  if (mid) {
167
167
  if (deps.getIsolationMode() !== "none") {
168
- deps.captureIntegrationBranch(s.basePath, mid);
168
+ deps.captureIntegrationBranch(s.basePath, mid, {
169
+ commitDocs: prefs?.git?.commit_docs,
170
+ });
169
171
  }
170
172
  deps.resolver.enterMilestone(mid, ctx.ui);
171
173
  }
@@ -8,8 +8,7 @@
8
8
  import { getCurrentBranch } from "./worktree.js";
9
9
  import { getActiveHook } from "./post-unit-hooks.js";
10
10
  import { getLedger, getProjectTotals } from "./metrics.js";
11
- import { resolveMilestoneFile, resolveSliceFile, } from "./paths.js";
12
- import { parseRoadmap, parsePlan } from "./files.js";
11
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
13
12
  import { readFileSync, writeFileSync, existsSync } from "node:fs";
14
13
  import { execFileSync } from "node:child_process";
15
14
  import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
@@ -192,24 +191,26 @@ export function estimateTimeRemaining() {
192
191
  let cachedSliceProgress = null;
193
192
  export function updateSliceProgressCache(base, mid, activeSid) {
194
193
  try {
195
- const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
196
- if (!roadmapFile)
197
- return;
198
- const content = readFileSync(roadmapFile, "utf-8");
199
- const roadmap = parseRoadmap(content);
194
+ let normSlices;
195
+ if (isDbAvailable()) {
196
+ normSlices = getMilestoneSlices(mid).map(s => ({ id: s.id, done: s.status === "complete", title: s.title }));
197
+ }
198
+ else {
199
+ normSlices = [];
200
+ }
200
201
  let activeSliceTasks = null;
201
202
  let taskDetails = null;
202
203
  if (activeSid) {
203
204
  try {
204
- const planFile = resolveSliceFile(base, mid, activeSid, "PLAN");
205
- if (planFile && existsSync(planFile)) {
206
- const planContent = readFileSync(planFile, "utf-8");
207
- const plan = parsePlan(planContent);
208
- activeSliceTasks = {
209
- done: plan.tasks.filter(t => t.done).length,
210
- total: plan.tasks.length,
211
- };
212
- taskDetails = plan.tasks.map(t => ({ id: t.id, title: t.title, done: t.done }));
205
+ if (isDbAvailable()) {
206
+ const dbTasks = getSliceTasks(mid, activeSid);
207
+ if (dbTasks.length > 0) {
208
+ activeSliceTasks = {
209
+ done: dbTasks.filter(t => t.status === "complete" || t.status === "done").length,
210
+ total: dbTasks.length,
211
+ };
212
+ taskDetails = dbTasks.map(t => ({ id: t.id, title: t.title, done: t.status === "complete" || t.status === "done" }));
213
+ }
213
214
  }
214
215
  }
215
216
  catch {
@@ -217,8 +218,8 @@ export function updateSliceProgressCache(base, mid, activeSid) {
217
218
  }
218
219
  }
219
220
  cachedSliceProgress = {
220
- done: roadmap.slices.filter(s => s.done).length,
221
- total: roadmap.slices.length,
221
+ done: normSlices.filter(s => s.done).length,
222
+ total: normSlices.length,
222
223
  milestoneId: mid,
223
224
  activeSliceTasks,
224
225
  taskDetails,
@@ -3,8 +3,9 @@
3
3
  * Resolves phase name → unit type + prompt, creates a session, and sends the message.
4
4
  */
5
5
  import { deriveState } from "./state.js";
6
- import { loadFile, parseRoadmap } from "./files.js";
7
- import { resolveMilestoneFile, resolveSliceFile, relSliceFile, } from "./paths.js";
6
+ import { loadFile } from "./files.js";
7
+ import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
8
+ import { resolveSliceFile, relSliceFile, } from "./paths.js";
8
9
  import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
9
10
  import { loadEffectiveGSDPreferences } from "./preferences.js";
10
11
  import { pauseAuto } from "./auto.js";
@@ -117,19 +118,20 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
117
118
  }
118
119
  case "reassess":
119
120
  case "reassess-roadmap": {
120
- const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
121
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
122
- if (!roadmapContent) {
123
- ctx.ui.notify("Cannot dispatch reassess-roadmap: no roadmap found.", "warning");
121
+ // DB primary path get completed slices
122
+ let completedSliceIds = [];
123
+ if (isDbAvailable()) {
124
+ completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
125
+ }
126
+ else {
127
+ ctx.ui.notify("Cannot dispatch reassess-roadmap: DB unavailable.", "warning");
124
128
  return;
125
129
  }
126
- const roadmap = parseRoadmap(roadmapContent);
127
- const completedSlices = roadmap.slices.filter(s => s.done);
128
- if (completedSlices.length === 0) {
130
+ if (completedSliceIds.length === 0) {
129
131
  ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
130
132
  return;
131
133
  }
132
- const completedSliceId = completedSlices[completedSlices.length - 1].id;
134
+ const completedSliceId = completedSliceIds[completedSliceIds.length - 1];
133
135
  unitType = "reassess-roadmap";
134
136
  unitId = `${mid}/${completedSliceId}`;
135
137
  prompt = await buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base);
@@ -141,19 +143,19 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
141
143
  // incomplete) slice. After slice completion, state.activeSlice advances
142
144
  // to the next incomplete slice, so we find the last done slice from the
143
145
  // roadmap instead (#1693).
144
- const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
145
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
146
- if (!roadmapContent) {
147
- ctx.ui.notify("Cannot dispatch run-uat: no roadmap found.", "warning");
146
+ let uatCompletedSliceIds = [];
147
+ if (isDbAvailable()) {
148
+ uatCompletedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
149
+ }
150
+ else {
151
+ ctx.ui.notify("Cannot dispatch run-uat: DB unavailable.", "warning");
148
152
  return;
149
153
  }
150
- const roadmap = parseRoadmap(roadmapContent);
151
- const completedSlices = roadmap.slices.filter(s => s.done);
152
- if (completedSlices.length === 0) {
154
+ if (uatCompletedSliceIds.length === 0) {
153
155
  ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
154
156
  return;
155
157
  }
156
- const sid = completedSlices[completedSlices.length - 1].id;
158
+ const sid = uatCompletedSliceIds[uatCompletedSliceIds.length - 1];
157
159
  const uatFile = resolveSliceFile(base, mid, sid, "UAT");
158
160
  if (!uatFile) {
159
161
  ctx.ui.notify("Cannot dispatch run-uat: no UAT file found.", "warning");
@@ -8,7 +8,8 @@
8
8
  * data structure that is inspectable, testable per-rule, and extensible
9
9
  * without modifying orchestration code.
10
10
  */
11
- import { loadFile, loadActiveOverrides, parseRoadmap } from "./files.js";
11
+ import { loadFile, loadActiveOverrides } from "./files.js";
12
+ import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
12
13
  import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
13
14
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
14
15
  import { join } from "node:path";
@@ -92,12 +93,18 @@ export const DISPATCH_RULES = [
92
93
  if (!prefs?.uat_dispatch)
93
94
  return null;
94
95
  const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
95
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
96
- if (!roadmapContent)
96
+ // DB-first: get completed slices from DB
97
+ let completedSliceIds;
98
+ if (isDbAvailable()) {
99
+ completedSliceIds = getMilestoneSlices(mid)
100
+ .filter(s => s.status === "complete")
101
+ .map(s => s.id);
102
+ }
103
+ else {
97
104
  return null;
98
- const roadmap = parseRoadmap(roadmapContent);
99
- for (const slice of roadmap.slices.filter(s => s.done)) {
100
- const resultFile = resolveSliceFile(basePath, mid, slice.id, "UAT-RESULT");
105
+ }
106
+ for (const sliceId of completedSliceIds) {
107
+ const resultFile = resolveSliceFile(basePath, mid, sliceId, "UAT-RESULT");
101
108
  if (!resultFile)
102
109
  continue;
103
110
  const content = await loadFile(resultFile);
@@ -108,7 +115,7 @@ export const DISPATCH_RULES = [
108
115
  if (verdict && verdict !== "pass" && verdict !== "passed") {
109
116
  return {
110
117
  action: "stop",
111
- reason: `UAT verdict for ${slice.id} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
118
+ reason: `UAT verdict for ${sliceId} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
112
119
  level: "warning",
113
120
  };
114
121
  }
@@ -376,15 +383,19 @@ export const DISPATCH_RULES = [
376
383
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files before
377
384
  // allowing milestone validation. If any slice lacks a summary, the milestone
378
385
  // is not genuinely complete — something skipped earlier slices.
379
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
380
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
381
- if (roadmapContent) {
382
- const roadmap = parseRoadmap(roadmapContent);
386
+ let sliceIds;
387
+ if (isDbAvailable()) {
388
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
389
+ }
390
+ else {
391
+ sliceIds = [];
392
+ }
393
+ if (sliceIds.length > 0) {
383
394
  const missingSlices = [];
384
- for (const slice of roadmap.slices) {
385
- const summaryPath = resolveSliceFile(basePath, mid, slice.id, "SUMMARY");
395
+ for (const sid of sliceIds) {
396
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
386
397
  if (!summaryPath || !existsSync(summaryPath)) {
387
- missingSlices.push(slice.id);
398
+ missingSlices.push(sid);
388
399
  }
389
400
  }
390
401
  if (missingSlices.length > 0) {
@@ -430,15 +441,19 @@ export const DISPATCH_RULES = [
430
441
  if (state.phase !== "completing-milestone")
431
442
  return null;
432
443
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files.
433
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
434
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
435
- if (roadmapContent) {
436
- const roadmap = parseRoadmap(roadmapContent);
444
+ let sliceIds;
445
+ if (isDbAvailable()) {
446
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
447
+ }
448
+ else {
449
+ sliceIds = [];
450
+ }
451
+ if (sliceIds.length > 0) {
437
452
  const missingSlices = [];
438
- for (const slice of roadmap.slices) {
439
- const summaryPath = resolveSliceFile(basePath, mid, slice.id, "SUMMARY");
453
+ for (const sid of sliceIds) {
454
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
440
455
  if (!summaryPath || !existsSync(summaryPath)) {
441
- missingSlices.push(slice.id);
456
+ missingSlices.push(sid);
442
457
  }
443
458
  }
444
459
  if (missingSlices.length > 0) {