gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c

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 (568) hide show
  1. package/dist/cli.js +13 -1
  2. package/dist/help-text.js +24 -0
  3. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  4. package/dist/resources/extensions/github-sync/sync.js +2 -1
  5. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  7. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  8. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  11. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  12. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  13. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  14. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  15. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  16. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  17. package/dist/resources/extensions/gsd/auto.js +1 -4
  18. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  19. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  21. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  22. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  23. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  26. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  28. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  29. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  30. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  31. package/dist/resources/extensions/gsd/doctor.js +46 -282
  32. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  33. package/dist/resources/extensions/gsd/files.js +14 -198
  34. package/dist/resources/extensions/gsd/git-service.js +4 -0
  35. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  37. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  38. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  39. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  40. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  41. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  42. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  43. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  44. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  45. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  46. package/dist/resources/extensions/gsd/preferences.js +1 -0
  47. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  48. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  49. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  50. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  54. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  55. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  57. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  58. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  59. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  60. package/dist/resources/extensions/gsd/state.js +484 -30
  61. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  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 +205 -0
  65. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -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 +53 -16
  72. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  73. package/dist/web/standalone/.next/BUILD_ID +1 -1
  74. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -16
  75. package/dist/web/standalone/.next/build-manifest.json +4 -4
  76. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  77. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  78. package/dist/web/standalone/.next/required-server-files.json +4 -4
  79. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  80. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  81. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  91. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  100. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/export-data/route.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.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  145. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  151. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  172. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/index.html +1 -1
  182. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  183. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/page.js +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -16
  191. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  192. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  193. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  194. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/middleware.js +2 -2
  197. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  199. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  200. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  201. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  202. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  203. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  207. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  210. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  211. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  212. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  254. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  255. package/dist/web/standalone/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +1 -0
  256. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  257. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  258. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  259. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  260. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  261. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  262. package/dist/web/standalone/server.js +1 -1
  263. package/package.json +4 -4
  264. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  265. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  266. package/packages/pi-ai/dist/models.custom.js +170 -0
  267. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  268. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models.js +16 -1
  270. package/packages/pi-ai/dist/models.js.map +1 -1
  271. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  272. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/models.test.js +67 -0
  274. package/packages/pi-ai/dist/models.test.js.map +1 -0
  275. package/packages/pi-ai/src/models.custom.ts +172 -0
  276. package/packages/pi-ai/src/models.test.ts +85 -0
  277. package/packages/pi-ai/src/models.ts +17 -1
  278. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  279. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  281. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  289. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  291. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  294. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  296. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  300. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  304. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  306. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  308. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  310. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  312. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  314. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  318. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  322. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  324. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  326. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  328. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  330. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  333. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/index.js +1 -0
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/main.js +11 -199
  340. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  348. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  351. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  353. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  355. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/package.json +1 -1
  360. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  361. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  362. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  363. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  364. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  365. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  366. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  367. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  368. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  369. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  370. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  371. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  372. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  373. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  374. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  375. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  376. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  377. package/packages/pi-coding-agent/src/index.ts +7 -0
  378. package/packages/pi-coding-agent/src/main.ts +11 -232
  379. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  383. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/package.json +1 -1
  389. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  390. package/src/resources/extensions/github-sync/sync.ts +2 -1
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  392. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  393. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  394. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  395. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  396. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  397. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  398. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  399. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  400. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  401. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  402. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  403. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  404. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  405. package/src/resources/extensions/gsd/auto.ts +0 -9
  406. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  407. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  409. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  410. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  411. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  412. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  413. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  414. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  415. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  416. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  417. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  418. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  419. package/src/resources/extensions/gsd/doctor.ts +45 -295
  420. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  421. package/src/resources/extensions/gsd/files.ts +16 -220
  422. package/src/resources/extensions/gsd/git-service.ts +4 -0
  423. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  424. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  425. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  426. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  427. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  428. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  429. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  430. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  431. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  432. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  433. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  434. package/src/resources/extensions/gsd/preferences.ts +1 -0
  435. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  436. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  437. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  438. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  442. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  443. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  445. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  446. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  447. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  448. package/src/resources/extensions/gsd/state.ts +547 -29
  449. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  450. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  451. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
  453. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
  457. package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
  458. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  459. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
  460. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
  461. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
  462. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
  463. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
  464. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
  465. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
  466. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
  467. package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
  468. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
  469. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
  470. package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
  471. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
  473. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
  474. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  475. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  476. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1205 -0
  477. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  479. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
  480. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
  481. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  487. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  488. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  489. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  490. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  491. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  492. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  493. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  494. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
  495. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  496. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
  497. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  498. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  499. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  500. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  501. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  502. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  503. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  504. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  505. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  506. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  507. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  508. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  509. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  510. package/src/resources/extensions/gsd/types.ts +50 -0
  511. package/src/resources/extensions/gsd/undo.ts +247 -3
  512. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  513. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  514. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  515. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  516. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  517. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  519. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  520. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  521. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  522. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  523. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  526. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  528. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  529. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  530. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  531. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  532. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  533. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  562. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  563. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  564. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  565. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  566. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  567. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  568. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
@@ -0,0 +1,146 @@
1
+ import { clearParseCache } from "../files.js";
2
+ import { transaction, getSlice, getSliceTasks, insertTask, upsertTaskPlanning, insertReplanHistory, deleteTask, } from "../gsd-db.js";
3
+ import { invalidateStateCache } from "../state.js";
4
+ import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
5
+ function isNonEmptyString(value) {
6
+ return typeof value === "string" && value.trim().length > 0;
7
+ }
8
+ function validateParams(params) {
9
+ if (!isNonEmptyString(params?.milestoneId))
10
+ throw new Error("milestoneId is required");
11
+ if (!isNonEmptyString(params?.sliceId))
12
+ throw new Error("sliceId is required");
13
+ if (!isNonEmptyString(params?.blockerTaskId))
14
+ throw new Error("blockerTaskId is required");
15
+ if (!isNonEmptyString(params?.blockerDescription))
16
+ throw new Error("blockerDescription is required");
17
+ if (!isNonEmptyString(params?.whatChanged))
18
+ throw new Error("whatChanged is required");
19
+ if (!Array.isArray(params.updatedTasks)) {
20
+ throw new Error("updatedTasks must be an array");
21
+ }
22
+ if (!Array.isArray(params.removedTaskIds)) {
23
+ throw new Error("removedTaskIds must be an array");
24
+ }
25
+ // Validate each updated task
26
+ for (let i = 0; i < params.updatedTasks.length; i++) {
27
+ const t = params.updatedTasks[i];
28
+ if (!t || typeof t !== "object")
29
+ throw new Error(`updatedTasks[${i}] must be an object`);
30
+ if (!isNonEmptyString(t.taskId))
31
+ throw new Error(`updatedTasks[${i}].taskId is required`);
32
+ if (!isNonEmptyString(t.title))
33
+ throw new Error(`updatedTasks[${i}].title is required`);
34
+ }
35
+ return params;
36
+ }
37
+ export async function handleReplanSlice(rawParams, basePath) {
38
+ // ── Validate ──────────────────────────────────────────────────────
39
+ let params;
40
+ try {
41
+ params = validateParams(rawParams);
42
+ }
43
+ catch (err) {
44
+ return { error: `validation failed: ${err.message}` };
45
+ }
46
+ // ── Verify parent slice exists ────────────────────────────────────
47
+ const parentSlice = getSlice(params.milestoneId, params.sliceId);
48
+ if (!parentSlice) {
49
+ return { error: `missing parent slice: ${params.milestoneId}/${params.sliceId}` };
50
+ }
51
+ // ── Structural enforcement ────────────────────────────────────────
52
+ const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
53
+ const completedTaskIds = new Set();
54
+ for (const task of existingTasks) {
55
+ if (task.status === "complete" || task.status === "done") {
56
+ completedTaskIds.add(task.id);
57
+ }
58
+ }
59
+ // Reject updates to completed tasks
60
+ for (const updatedTask of params.updatedTasks) {
61
+ if (completedTaskIds.has(updatedTask.taskId)) {
62
+ return { error: `cannot modify completed task ${updatedTask.taskId}` };
63
+ }
64
+ }
65
+ // Reject removal of completed tasks
66
+ for (const removedId of params.removedTaskIds) {
67
+ if (completedTaskIds.has(removedId)) {
68
+ return { error: `cannot remove completed task ${removedId}` };
69
+ }
70
+ }
71
+ // ── Transaction: DB mutations ─────────────────────────────────────
72
+ const existingTaskIds = new Set(existingTasks.map((t) => t.id));
73
+ try {
74
+ transaction(() => {
75
+ // Record replan history
76
+ insertReplanHistory({
77
+ milestoneId: params.milestoneId,
78
+ sliceId: params.sliceId,
79
+ taskId: params.blockerTaskId,
80
+ summary: params.whatChanged,
81
+ });
82
+ // Apply task updates (upsert existing, insert new)
83
+ for (const updatedTask of params.updatedTasks) {
84
+ if (existingTaskIds.has(updatedTask.taskId)) {
85
+ // Update existing task's planning fields
86
+ upsertTaskPlanning(params.milestoneId, params.sliceId, updatedTask.taskId, {
87
+ title: updatedTask.title,
88
+ description: updatedTask.description || "",
89
+ estimate: updatedTask.estimate || "",
90
+ files: updatedTask.files || [],
91
+ verify: updatedTask.verify || "",
92
+ inputs: updatedTask.inputs || [],
93
+ expectedOutput: updatedTask.expectedOutput || [],
94
+ });
95
+ }
96
+ else {
97
+ // Insert new task then set planning fields
98
+ insertTask({
99
+ id: updatedTask.taskId,
100
+ sliceId: params.sliceId,
101
+ milestoneId: params.milestoneId,
102
+ title: updatedTask.title,
103
+ status: "pending",
104
+ });
105
+ upsertTaskPlanning(params.milestoneId, params.sliceId, updatedTask.taskId, {
106
+ title: updatedTask.title,
107
+ description: updatedTask.description || "",
108
+ estimate: updatedTask.estimate || "",
109
+ files: updatedTask.files || [],
110
+ verify: updatedTask.verify || "",
111
+ inputs: updatedTask.inputs || [],
112
+ expectedOutput: updatedTask.expectedOutput || [],
113
+ });
114
+ }
115
+ }
116
+ // Delete removed tasks
117
+ for (const removedId of params.removedTaskIds) {
118
+ deleteTask(params.milestoneId, params.sliceId, removedId);
119
+ }
120
+ });
121
+ }
122
+ catch (err) {
123
+ return { error: `db write failed: ${err.message}` };
124
+ }
125
+ // ── Render artifacts ──────────────────────────────────────────────
126
+ try {
127
+ const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
128
+ const replanResult = await renderReplanFromDb(basePath, params.milestoneId, params.sliceId, {
129
+ blockerTaskId: params.blockerTaskId,
130
+ blockerDescription: params.blockerDescription,
131
+ whatChanged: params.whatChanged,
132
+ });
133
+ // ── Invalidate caches ─────────────────────────────────────────
134
+ invalidateStateCache();
135
+ clearParseCache();
136
+ return {
137
+ milestoneId: params.milestoneId,
138
+ sliceId: params.sliceId,
139
+ replanPath: replanResult.replanPath,
140
+ planPath: renderResult.planPath,
141
+ };
142
+ }
143
+ catch (err) {
144
+ return { error: `render failed: ${err.message}` };
145
+ }
146
+ }
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
13
13
  import { join } from "node:path";
14
+ import { createRequire } from "node:module";
14
15
  import { gsdRoot, milestonesDir } from "./paths.js";
15
16
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
16
17
  import { loadAllCaptures, loadActionableCaptures, markCaptureExecuted, } from "./captures.js";
@@ -65,18 +66,33 @@ export function executeInject(basePath, mid, sid, capture) {
65
66
  export function executeReplan(basePath, mid, sid, capture) {
66
67
  try {
67
68
  const triggerPath = join(basePath, ".gsd", "milestones", mid, "slices", sid, `${sid}-REPLAN-TRIGGER.md`);
69
+ const ts = new Date().toISOString();
68
70
  const content = [
69
71
  `# Replan Trigger`,
70
72
  ``,
71
73
  `**Source:** Capture ${capture.id}`,
72
74
  `**Capture:** ${capture.text}`,
73
75
  `**Rationale:** ${capture.rationale ?? "User-initiated replan via capture triage"}`,
74
- `**Triggered:** ${new Date().toISOString()}`,
76
+ `**Triggered:** ${ts}`,
75
77
  ``,
76
78
  `This file was created by the triage pipeline. The next dispatch cycle`,
77
79
  `will detect it and enter the replanning-slice phase.`,
78
80
  ].join("\n");
79
81
  writeFileSync(triggerPath, content, "utf-8");
82
+ // Also write replan_triggered_at column for DB-backed detection
83
+ try {
84
+ const req = createRequire(import.meta.url);
85
+ const { isDbAvailable, _getAdapter } = req("./gsd-db.js");
86
+ if (isDbAvailable()) {
87
+ const adapter = _getAdapter();
88
+ if (adapter) {
89
+ adapter.prepare("UPDATE slices SET replan_triggered_at = :ts WHERE milestone_id = :mid AND id = :sid").run({ ":ts": ts, ":mid": mid, ":sid": sid });
90
+ }
91
+ }
92
+ }
93
+ catch {
94
+ // DB write is best-effort — disk file is the primary trigger for fallback path
95
+ }
80
96
  return true;
81
97
  }
82
98
  catch {
@@ -1,12 +1,16 @@
1
- // GSD Extension — Undo Last Unit
2
- // Rollback the most recent completed unit: revert git, remove state, uncheck plans.
1
+ // GSD Extension — Undo Last Unit + Targeted State Reset
2
+ // handleUndo: Rollback the most recent completed unit (revert git, remove state, uncheck plans).
3
+ // handleUndoTask: Reset a single task's DB status to "pending" and re-render markdown.
4
+ // handleResetSlice: Reset a slice and all its tasks, re-rendering plan + roadmap.
3
5
  import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
4
6
  import { join } from "node:path";
5
7
  import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
6
8
  import { deriveState } from "./state.js";
7
9
  import { invalidateAllCaches } from "./cache.js";
8
- import { gsdRoot, resolveTasksDir, resolveSlicePath, buildTaskFileName } from "./paths.js";
10
+ import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
9
11
  import { sendDesktopNotification } from "./notifications.js";
12
+ import { getTask, getSlice, getSliceTasks, updateTaskStatus, updateSliceStatus } from "./gsd-db.js";
13
+ import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
10
14
  /**
11
15
  * Undo the last completed unit: revert git commits,
12
16
  * delete summary artifacts, and uncheck the task in PLAN.
@@ -121,6 +125,196 @@ export async function handleUndo(args, ctx, _pi, basePath) {
121
125
  ctx.ui.notify(results.join("\n"), "success");
122
126
  sendDesktopNotification("GSD", `Undone: ${unitType} (${unitId})`, "info", "complete");
123
127
  }
128
+ // ─── Targeted State Reset ────────────────────────────────────────────────────
129
+ /**
130
+ * Parse a task identifier from args. Accepts:
131
+ * T01, S01/T01, M001/S01/T01
132
+ * Resolves missing parts from current state via deriveState().
133
+ */
134
+ async function parseTaskId(raw, basePath) {
135
+ const parts = raw.split("/");
136
+ if (parts.length === 3) {
137
+ return { mid: parts[0], sid: parts[1], tid: parts[2] };
138
+ }
139
+ // Need to resolve from state
140
+ const state = await deriveState(basePath);
141
+ if (parts.length === 2) {
142
+ // S01/T01 — resolve milestone
143
+ const mid = state.activeMilestone?.id;
144
+ if (!mid)
145
+ return "Cannot resolve milestone — no active milestone in state.";
146
+ return { mid, sid: parts[0], tid: parts[1] };
147
+ }
148
+ if (parts.length === 1) {
149
+ // T01 — resolve milestone + slice
150
+ const mid = state.activeMilestone?.id;
151
+ const sid = state.activeSlice?.id;
152
+ if (!mid)
153
+ return "Cannot resolve milestone — no active milestone in state.";
154
+ if (!sid)
155
+ return "Cannot resolve slice — no active slice in state.";
156
+ return { mid, sid, tid: parts[0] };
157
+ }
158
+ return "Invalid task ID format. Use T01, S01/T01, or M001/S01/T01.";
159
+ }
160
+ /**
161
+ * Parse a slice identifier from args. Accepts:
162
+ * S01, M001/S01
163
+ * Resolves missing milestone from current state.
164
+ */
165
+ async function parseSliceId(raw, basePath) {
166
+ const parts = raw.split("/");
167
+ if (parts.length === 2) {
168
+ return { mid: parts[0], sid: parts[1] };
169
+ }
170
+ if (parts.length === 1) {
171
+ const state = await deriveState(basePath);
172
+ const mid = state.activeMilestone?.id;
173
+ if (!mid)
174
+ return "Cannot resolve milestone — no active milestone in state.";
175
+ return { mid, sid: parts[0] };
176
+ }
177
+ return "Invalid slice ID format. Use S01 or M001/S01.";
178
+ }
179
+ /**
180
+ * Reset a single task's completion state:
181
+ * - Set DB status to "pending"
182
+ * - Delete the task summary file
183
+ * - Re-render plan checkboxes
184
+ */
185
+ export async function handleUndoTask(args, ctx, _pi, basePath) {
186
+ const force = args.includes("--force");
187
+ const rawId = args.replace("--force", "").trim();
188
+ if (!rawId) {
189
+ ctx.ui.notify("Usage: /gsd undo-task <taskId> [--force]\n\n" +
190
+ "Accepts: T01, S01/T01, or M001/S01/T01\n" +
191
+ "Resets the task's DB status to pending and re-renders plan checkboxes.", "warning");
192
+ return;
193
+ }
194
+ const parsed = await parseTaskId(rawId, basePath);
195
+ if (typeof parsed === "string") {
196
+ ctx.ui.notify(parsed, "error");
197
+ return;
198
+ }
199
+ const { mid, sid, tid } = parsed;
200
+ // Validate task exists in DB
201
+ const task = getTask(mid, sid, tid);
202
+ if (!task) {
203
+ ctx.ui.notify(`Task ${mid}/${sid}/${tid} not found in database.`, "error");
204
+ return;
205
+ }
206
+ if (!force) {
207
+ ctx.ui.notify(`Will reset: task ${mid}/${sid}/${tid}\n` +
208
+ ` Current status: ${task.status}\n` +
209
+ `This will:\n` +
210
+ ` - Set task status to "pending" in DB\n` +
211
+ ` - Delete task summary file (if exists)\n` +
212
+ ` - Re-render plan checkboxes\n\n` +
213
+ `Run /gsd undo-task ${rawId} --force to confirm.`, "warning");
214
+ return;
215
+ }
216
+ // Reset DB status
217
+ updateTaskStatus(mid, sid, tid, "pending");
218
+ // Delete summary file
219
+ let summaryDeleted = false;
220
+ const summaryPath = resolveTaskFile(basePath, mid, sid, tid, "SUMMARY");
221
+ if (summaryPath && existsSync(summaryPath)) {
222
+ unlinkSync(summaryPath);
223
+ summaryDeleted = true;
224
+ }
225
+ // Re-render plan checkboxes
226
+ await renderPlanCheckboxes(basePath, mid, sid);
227
+ // Invalidate caches
228
+ invalidateAllCaches();
229
+ const results = [`Reset task ${mid}/${sid}/${tid} to "pending".`];
230
+ if (summaryDeleted)
231
+ results.push(" - Deleted task summary file");
232
+ results.push(" - Plan checkboxes re-rendered");
233
+ ctx.ui.notify(results.join("\n"), "success");
234
+ }
235
+ /**
236
+ * Reset a slice and all its tasks:
237
+ * - Set all task DB statuses to "pending"
238
+ * - Set slice DB status to "active"
239
+ * - Delete task summary files, slice summary, and UAT files
240
+ * - Re-render plan + roadmap checkboxes
241
+ */
242
+ export async function handleResetSlice(args, ctx, _pi, basePath) {
243
+ const force = args.includes("--force");
244
+ const rawId = args.replace("--force", "").trim();
245
+ if (!rawId) {
246
+ ctx.ui.notify("Usage: /gsd reset-slice <sliceId> [--force]\n\n" +
247
+ "Accepts: S01 or M001/S01\n" +
248
+ "Resets the slice and all its tasks, re-renders plan + roadmap checkboxes.", "warning");
249
+ return;
250
+ }
251
+ const parsed = await parseSliceId(rawId, basePath);
252
+ if (typeof parsed === "string") {
253
+ ctx.ui.notify(parsed, "error");
254
+ return;
255
+ }
256
+ const { mid, sid } = parsed;
257
+ // Validate slice exists in DB
258
+ const slice = getSlice(mid, sid);
259
+ if (!slice) {
260
+ ctx.ui.notify(`Slice ${mid}/${sid} not found in database.`, "error");
261
+ return;
262
+ }
263
+ const tasks = getSliceTasks(mid, sid);
264
+ if (!force) {
265
+ ctx.ui.notify(`Will reset: slice ${mid}/${sid}\n` +
266
+ ` Current status: ${slice.status}\n` +
267
+ ` Tasks to reset: ${tasks.length}\n` +
268
+ `This will:\n` +
269
+ ` - Set all task statuses to "pending" in DB\n` +
270
+ ` - Set slice status to "active" in DB\n` +
271
+ ` - Delete task summary files, slice summary, and UAT files\n` +
272
+ ` - Re-render plan + roadmap checkboxes\n\n` +
273
+ `Run /gsd reset-slice ${rawId} --force to confirm.`, "warning");
274
+ return;
275
+ }
276
+ // Reset all tasks
277
+ let tasksReset = 0;
278
+ let summariesDeleted = 0;
279
+ for (const t of tasks) {
280
+ updateTaskStatus(mid, sid, t.id, "pending");
281
+ tasksReset++;
282
+ const summaryPath = resolveTaskFile(basePath, mid, sid, t.id, "SUMMARY");
283
+ if (summaryPath && existsSync(summaryPath)) {
284
+ unlinkSync(summaryPath);
285
+ summariesDeleted++;
286
+ }
287
+ }
288
+ // Reset slice status
289
+ updateSliceStatus(mid, sid, "active");
290
+ // Delete slice summary and UAT files
291
+ let sliceFilesDeleted = 0;
292
+ const slicePath = resolveSlicePath(basePath, mid, sid);
293
+ if (slicePath) {
294
+ for (const suffix of ["SUMMARY", "UAT"]) {
295
+ const filePath = join(slicePath, buildSliceFileName(sid, suffix));
296
+ if (existsSync(filePath)) {
297
+ unlinkSync(filePath);
298
+ sliceFilesDeleted++;
299
+ }
300
+ }
301
+ }
302
+ // Re-render plan + roadmap checkboxes
303
+ await renderPlanCheckboxes(basePath, mid, sid);
304
+ await renderRoadmapCheckboxes(basePath, mid);
305
+ // Invalidate caches
306
+ invalidateAllCaches();
307
+ const results = [
308
+ `Reset slice ${mid}/${sid} to "active".`,
309
+ ` - ${tasksReset} task(s) reset to "pending"`,
310
+ ];
311
+ if (summariesDeleted > 0)
312
+ results.push(` - ${summariesDeleted} task summary file(s) deleted`);
313
+ if (sliceFilesDeleted > 0)
314
+ results.push(` - ${sliceFilesDeleted} slice file(s) deleted (summary/UAT)`);
315
+ results.push(" - Plan + roadmap checkboxes re-rendered");
316
+ ctx.ui.notify(results.join("\n"), "success");
317
+ }
124
318
  // ─── Helpers ──────────────────────────────────────────────────────────────────
125
319
  export function uncheckTaskInPlan(basePath, mid, sid, tid) {
126
320
  const slicePath = resolveSlicePath(basePath, mid, sid);
@@ -2,7 +2,9 @@
2
2
  import { existsSync, readFileSync, statSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { deriveState } from './state.js';
5
- import { parseRoadmap, parsePlan, parseSummary, loadFile } from './files.js';
5
+ import { parseSummary, loadFile } from './files.js';
6
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from './gsd-db.js';
7
+ import { parseRoadmap, parsePlan } from './parsers-legacy.js';
6
8
  import { findMilestoneIds } from './milestone-ids.js';
7
9
  import { resolveMilestoneFile, resolveSliceFile, resolveGsdRootFile, gsdRoot } from './paths.js';
8
10
  import { getLedger, getProjectTotals, aggregateByPhase, aggregateBySlice, aggregateByModel, aggregateByTier, formatTierSavings, loadLedgerFromDisk, } from './metrics.js';
@@ -532,25 +534,60 @@ export async function loadVisualizerData(basePath) {
532
534
  const slices = [];
533
535
  const roadmapFile = resolveMilestoneFile(basePath, mid, 'ROADMAP');
534
536
  const roadmapContent = roadmapFile ? readFileCached(roadmapFile) : null;
535
- if (roadmapContent) {
536
- const roadmap = parseRoadmap(roadmapContent);
537
- for (const s of roadmap.slices) {
537
+ if (roadmapContent || isDbAvailable()) {
538
+ let normSlices = null;
539
+ if (isDbAvailable()) {
540
+ const dbSlices = getMilestoneSlices(mid);
541
+ if (dbSlices.length > 0) {
542
+ normSlices = dbSlices.map(s => ({ id: s.id, done: s.status === 'complete', title: s.title, risk: s.risk || 'medium', depends: s.depends, demo: s.demo }));
543
+ }
544
+ }
545
+ if (!normSlices && roadmapContent) {
546
+ // File-based fallback: parse roadmap for slice entries
547
+ const parsed = parseRoadmap(roadmapContent);
548
+ normSlices = parsed.slices.map(s => ({ id: s.id, done: s.done, title: s.title, risk: s.risk || 'medium', depends: s.depends, demo: '' }));
549
+ }
550
+ if (!normSlices)
551
+ normSlices = [];
552
+ for (const s of normSlices) {
538
553
  const isActiveSlice = state.activeMilestone?.id === mid &&
539
554
  state.activeSlice?.id === s.id;
540
555
  const tasks = [];
541
556
  if (isActiveSlice) {
542
- const planFile = resolveSliceFile(basePath, mid, s.id, 'PLAN');
543
- const planContent = planFile ? readFileCached(planFile) : null;
544
- if (planContent) {
545
- const plan = parsePlan(planContent);
546
- for (const t of plan.tasks) {
547
- tasks.push({
548
- id: t.id,
549
- title: t.title,
550
- done: t.done,
551
- active: state.activeTask?.id === t.id,
552
- estimate: t.estimate || undefined,
553
- });
557
+ // Normalize tasks from DB, fall back to file parsing when DB has no data
558
+ let usedDbTasks = false;
559
+ if (isDbAvailable()) {
560
+ const dbTasks = getSliceTasks(mid, s.id);
561
+ if (dbTasks.length > 0) {
562
+ usedDbTasks = true;
563
+ for (const t of dbTasks) {
564
+ tasks.push({
565
+ id: t.id,
566
+ title: t.title,
567
+ done: t.status === 'complete' || t.status === 'done',
568
+ active: state.activeTask?.id === t.id,
569
+ estimate: t.estimate || undefined,
570
+ });
571
+ }
572
+ }
573
+ }
574
+ if (!usedDbTasks) {
575
+ // File-based fallback: parse slice plan for task entries
576
+ const slicePlanFile = resolveSliceFile(basePath, mid, s.id, 'PLAN');
577
+ if (slicePlanFile) {
578
+ const planContent = readFileCached(slicePlanFile);
579
+ if (planContent) {
580
+ const parsed = parsePlan(planContent);
581
+ for (const t of parsed.tasks) {
582
+ tasks.push({
583
+ id: t.id,
584
+ title: t.title,
585
+ done: t.done,
586
+ active: state.activeTask?.id === t.id,
587
+ estimate: t.estimate || undefined,
588
+ });
589
+ }
590
+ }
554
591
  }
555
592
  }
556
593
  }
@@ -1,12 +1,16 @@
1
- import { loadFile, parsePlan, parseRoadmap } from "./files.js";
1
+ import { loadFile } from "./files.js";
2
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
3
+ import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
2
4
  import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, resolveTasksDir, } from "./paths.js";
3
5
  import { deriveState } from "./state.js";
4
6
  import { findMilestoneIds } from "./guided-flow.js";
5
- import { validateCompleteBoundary, validatePlanBoundary } from "./observability-validator.js";
6
7
  import { getSliceBranchName, detectWorktreeName } from "./worktree.js";
8
+ // Extract milestone title from roadmap header without using parsers.
9
+ // Falls back to the milestone ID if no title line found.
7
10
  function titleFromRoadmapHeader(content, fallbackId) {
8
- const roadmap = parseRoadmap(content);
9
- return roadmap.title.replace(/^M\d+(?:-[a-z0-9]{6})?[^:]*:\s*/, "") || fallbackId;
11
+ // Parse the "# M001: Title" header directly
12
+ const match = content.match(/^#\s+M\d+(?:-[a-z0-9]{6})?[^:]*:\s*(.+)/m);
13
+ return match?.[1]?.trim() || fallbackId;
10
14
  }
11
15
  async function indexSlice(basePath, milestoneId, sliceId, fallbackTitle, done, roadmapMeta) {
12
16
  const planPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN") ?? undefined;
@@ -15,12 +19,30 @@ async function indexSlice(basePath, milestoneId, sliceId, fallbackTitle, done, r
15
19
  const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? undefined;
16
20
  const tasks = [];
17
21
  let title = fallbackTitle;
18
- if (planPath) {
19
- const content = await loadFile(planPath);
20
- if (content) {
21
- const plan = parsePlan(content);
22
- title = plan.title || fallbackTitle;
23
- for (const task of plan.tasks) {
22
+ // Prefer DB for task data, fall back to file parsing when DB has no data
23
+ let usedDb = false;
24
+ if (isDbAvailable()) {
25
+ const dbTasks = getSliceTasks(milestoneId, sliceId);
26
+ if (dbTasks.length > 0) {
27
+ usedDb = true;
28
+ for (const task of dbTasks) {
29
+ title = fallbackTitle; // title comes from slice-level data, not plan
30
+ tasks.push({
31
+ id: task.id,
32
+ title: task.title,
33
+ done: task.status === "complete" || task.status === "done",
34
+ planPath: resolveTaskFile(basePath, milestoneId, sliceId, task.id, "PLAN") ?? undefined,
35
+ summaryPath: resolveTaskFile(basePath, milestoneId, sliceId, task.id, "SUMMARY") ?? undefined,
36
+ });
37
+ }
38
+ }
39
+ }
40
+ if (!usedDb && planPath) {
41
+ // File-based fallback: parse slice plan for task entries
42
+ const planContent = await loadFile(planPath);
43
+ if (planContent) {
44
+ const parsed = parsePlan(planContent);
45
+ for (const task of parsed.tasks) {
24
46
  tasks.push({
25
47
  id: task.id,
26
48
  title: task.title,
@@ -49,36 +71,41 @@ async function indexSlice(basePath, milestoneId, sliceId, fallbackTitle, done, r
49
71
  export async function indexWorkspace(basePath, opts = {}) {
50
72
  const milestoneIds = findMilestoneIds(basePath);
51
73
  const milestones = [];
52
- const validationIssues = [];
53
- const runValidation = opts.validate === true;
54
74
  for (const milestoneId of milestoneIds) {
55
75
  const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP") ?? undefined;
56
76
  let title = milestoneId;
57
77
  const slices = [];
58
- if (roadmapPath) {
59
- const roadmapContent = await loadFile(roadmapPath);
60
- if (roadmapContent) {
61
- const roadmap = parseRoadmap(roadmapContent);
62
- title = titleFromRoadmapHeader(roadmapContent, milestoneId);
63
- // Parallelise all per-slice I/O: indexSlice + (optional) validation calls run concurrently.
64
- // Order is preserved via Promise.all on an array built from roadmap.slices.
65
- const sliceResults = await Promise.all(roadmap.slices.map(async (slice) => {
66
- if (runValidation) {
67
- const [indexedSlice, planIssues, completeIssues] = await Promise.all([
68
- indexSlice(basePath, milestoneId, slice.id, slice.title, slice.done, { risk: slice.risk, depends: slice.depends, demo: slice.demo }),
69
- validatePlanBoundary(basePath, milestoneId, slice.id),
70
- validateCompleteBoundary(basePath, milestoneId, slice.id),
71
- ]);
72
- return { indexedSlice, issues: [...planIssues, ...completeIssues] };
73
- }
74
- const indexedSlice = await indexSlice(basePath, milestoneId, slice.id, slice.title, slice.done, { risk: slice.risk, depends: slice.depends, demo: slice.demo });
75
- return { indexedSlice, issues: [] };
76
- }));
77
- for (const { indexedSlice, issues } of sliceResults) {
78
- slices.push(indexedSlice);
79
- validationIssues.push(...issues);
78
+ if (roadmapPath || isDbAvailable()) {
79
+ let normSlices = null;
80
+ if (isDbAvailable()) {
81
+ const dbSlices = getMilestoneSlices(milestoneId);
82
+ if (dbSlices.length > 0) {
83
+ normSlices = dbSlices.map(s => ({ id: s.id, done: s.status === "complete", title: s.title, risk: s.risk || "medium", depends: s.depends, demo: s.demo }));
84
+ }
85
+ // Get title from roadmap header
86
+ if (roadmapPath) {
87
+ const roadmapContent = await loadFile(roadmapPath);
88
+ if (roadmapContent)
89
+ title = titleFromRoadmapHeader(roadmapContent, milestoneId);
90
+ }
91
+ }
92
+ if (!normSlices && roadmapPath) {
93
+ // File-based fallback: parse roadmap for slice entries
94
+ const roadmapContent = await loadFile(roadmapPath);
95
+ if (roadmapContent) {
96
+ title = titleFromRoadmapHeader(roadmapContent, milestoneId);
97
+ const parsed = parseRoadmap(roadmapContent);
98
+ normSlices = parsed.slices.map(s => ({ id: s.id, done: s.done, title: s.title, risk: s.risk || "medium", depends: s.depends, demo: s.demo || "" }));
80
99
  }
81
100
  }
101
+ if (!normSlices)
102
+ normSlices = [];
103
+ if (normSlices.length > 0) {
104
+ const sliceResults = await Promise.all(normSlices.map(async (slice) => {
105
+ return indexSlice(basePath, milestoneId, slice.id, slice.title, slice.done, { risk: slice.risk, depends: slice.depends, demo: slice.demo });
106
+ }));
107
+ slices.push(...sliceResults);
108
+ }
82
109
  }
83
110
  milestones.push({ id: milestoneId, title, roadmapPath, slices });
84
111
  }
@@ -103,7 +130,7 @@ export async function indexWorkspace(basePath, opts = {}) {
103
130
  }
104
131
  }
105
132
  }
106
- return { milestones, active, scopes, validationIssues };
133
+ return { milestones, active, scopes, validationIssues: [] };
107
134
  }
108
135
  export async function listDoctorScopeSuggestions(basePath) {
109
136
  const index = await indexWorkspace(basePath);
@@ -121,8 +148,7 @@ export async function listDoctorScopeSuggestions(basePath) {
121
148
  return ordered.map(scope => ({ value: scope.scope, label: scope.label }));
122
149
  }
123
150
  export async function getSuggestedNextCommands(basePath) {
124
- // Run validation here since we surface a /gsd doctor audit hint when issues exist.
125
- const index = await indexWorkspace(basePath, { validate: true });
151
+ const index = await indexWorkspace(basePath);
126
152
  const scope = index.active.milestoneId && index.active.sliceId
127
153
  ? `${index.active.milestoneId}/${index.active.sliceId}`
128
154
  : index.active.milestoneId;
@@ -135,8 +161,6 @@ export async function getSuggestedNextCommands(basePath) {
135
161
  commands.add(`/gsd doctor ${scope}`);
136
162
  if (scope)
137
163
  commands.add(`/gsd doctor fix ${scope}`);
138
- if (index.validationIssues.length > 0 && scope)
139
- commands.add(`/gsd doctor audit ${scope}`);
140
164
  commands.add("/gsd status");
141
165
  return [...commands];
142
166
  }
@@ -1 +1 @@
1
- VvclDCW6TAWjEyLU-EYL1
1
+ fOnWQBjWXMKUs4bqTg530