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
@@ -1,5 +1,7 @@
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
 
4
6
  import type { ExtensionCommandContext, ExtensionAPI } from "@gsd/pi-coding-agent";
5
7
  import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
@@ -7,8 +9,10 @@ import { join } from "node:path";
7
9
  import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
8
10
  import { deriveState } from "./state.js";
9
11
  import { invalidateAllCaches } from "./cache.js";
10
- import { gsdRoot, resolveTasksDir, resolveSlicePath, buildTaskFileName } from "./paths.js";
12
+ import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
11
13
  import { sendDesktopNotification } from "./notifications.js";
14
+ import { getTask, getSlice, getSliceTasks, updateTaskStatus, updateSliceStatus } from "./gsd-db.js";
15
+ import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
12
16
 
13
17
  /**
14
18
  * Undo the last completed unit: revert git commits,
@@ -131,6 +135,246 @@ export async function handleUndo(args: string, ctx: ExtensionCommandContext, _pi
131
135
  sendDesktopNotification("GSD", `Undone: ${unitType} (${unitId})`, "info", "complete");
132
136
  }
133
137
 
138
+ // ─── Targeted State Reset ────────────────────────────────────────────────────
139
+
140
+ /**
141
+ * Parse a task identifier from args. Accepts:
142
+ * T01, S01/T01, M001/S01/T01
143
+ * Resolves missing parts from current state via deriveState().
144
+ */
145
+ async function parseTaskId(
146
+ raw: string,
147
+ basePath: string,
148
+ ): Promise<{ mid: string; sid: string; tid: string } | string> {
149
+ const parts = raw.split("/");
150
+ if (parts.length === 3) {
151
+ return { mid: parts[0], sid: parts[1], tid: parts[2] };
152
+ }
153
+ // Need to resolve from state
154
+ const state = await deriveState(basePath);
155
+ if (parts.length === 2) {
156
+ // S01/T01 — resolve milestone
157
+ const mid = state.activeMilestone?.id;
158
+ if (!mid) return "Cannot resolve milestone — no active milestone in state.";
159
+ return { mid, sid: parts[0], tid: parts[1] };
160
+ }
161
+ if (parts.length === 1) {
162
+ // T01 — resolve milestone + slice
163
+ const mid = state.activeMilestone?.id;
164
+ const sid = state.activeSlice?.id;
165
+ if (!mid) return "Cannot resolve milestone — no active milestone in state.";
166
+ if (!sid) return "Cannot resolve slice — no active slice in state.";
167
+ return { mid, sid, tid: parts[0] };
168
+ }
169
+ return "Invalid task ID format. Use T01, S01/T01, or M001/S01/T01.";
170
+ }
171
+
172
+ /**
173
+ * Parse a slice identifier from args. Accepts:
174
+ * S01, M001/S01
175
+ * Resolves missing milestone from current state.
176
+ */
177
+ async function parseSliceId(
178
+ raw: string,
179
+ basePath: string,
180
+ ): Promise<{ mid: string; sid: string } | string> {
181
+ const parts = raw.split("/");
182
+ if (parts.length === 2) {
183
+ return { mid: parts[0], sid: parts[1] };
184
+ }
185
+ if (parts.length === 1) {
186
+ const state = await deriveState(basePath);
187
+ const mid = state.activeMilestone?.id;
188
+ if (!mid) return "Cannot resolve milestone — no active milestone in state.";
189
+ return { mid, sid: parts[0] };
190
+ }
191
+ return "Invalid slice ID format. Use S01 or M001/S01.";
192
+ }
193
+
194
+ /**
195
+ * Reset a single task's completion state:
196
+ * - Set DB status to "pending"
197
+ * - Delete the task summary file
198
+ * - Re-render plan checkboxes
199
+ */
200
+ export async function handleUndoTask(
201
+ args: string,
202
+ ctx: ExtensionCommandContext,
203
+ _pi: ExtensionAPI,
204
+ basePath: string,
205
+ ): Promise<void> {
206
+ const force = args.includes("--force");
207
+ const rawId = args.replace("--force", "").trim();
208
+
209
+ if (!rawId) {
210
+ ctx.ui.notify(
211
+ "Usage: /gsd undo-task <taskId> [--force]\n\n" +
212
+ "Accepts: T01, S01/T01, or M001/S01/T01\n" +
213
+ "Resets the task's DB status to pending and re-renders plan checkboxes.",
214
+ "warning",
215
+ );
216
+ return;
217
+ }
218
+
219
+ const parsed = await parseTaskId(rawId, basePath);
220
+ if (typeof parsed === "string") {
221
+ ctx.ui.notify(parsed, "error");
222
+ return;
223
+ }
224
+
225
+ const { mid, sid, tid } = parsed;
226
+
227
+ // Validate task exists in DB
228
+ const task = getTask(mid, sid, tid);
229
+ if (!task) {
230
+ ctx.ui.notify(`Task ${mid}/${sid}/${tid} not found in database.`, "error");
231
+ return;
232
+ }
233
+
234
+ if (!force) {
235
+ ctx.ui.notify(
236
+ `Will reset: task ${mid}/${sid}/${tid}\n` +
237
+ ` Current status: ${task.status}\n` +
238
+ `This will:\n` +
239
+ ` - Set task status to "pending" in DB\n` +
240
+ ` - Delete task summary file (if exists)\n` +
241
+ ` - Re-render plan checkboxes\n\n` +
242
+ `Run /gsd undo-task ${rawId} --force to confirm.`,
243
+ "warning",
244
+ );
245
+ return;
246
+ }
247
+
248
+ // Reset DB status
249
+ updateTaskStatus(mid, sid, tid, "pending");
250
+
251
+ // Delete summary file
252
+ let summaryDeleted = false;
253
+ const summaryPath = resolveTaskFile(basePath, mid, sid, tid, "SUMMARY");
254
+ if (summaryPath && existsSync(summaryPath)) {
255
+ unlinkSync(summaryPath);
256
+ summaryDeleted = true;
257
+ }
258
+
259
+ // Re-render plan checkboxes
260
+ await renderPlanCheckboxes(basePath, mid, sid);
261
+
262
+ // Invalidate caches
263
+ invalidateAllCaches();
264
+
265
+ const results: string[] = [`Reset task ${mid}/${sid}/${tid} to "pending".`];
266
+ if (summaryDeleted) results.push(" - Deleted task summary file");
267
+ results.push(" - Plan checkboxes re-rendered");
268
+
269
+ ctx.ui.notify(results.join("\n"), "success");
270
+ }
271
+
272
+ /**
273
+ * Reset a slice and all its tasks:
274
+ * - Set all task DB statuses to "pending"
275
+ * - Set slice DB status to "active"
276
+ * - Delete task summary files, slice summary, and UAT files
277
+ * - Re-render plan + roadmap checkboxes
278
+ */
279
+ export async function handleResetSlice(
280
+ args: string,
281
+ ctx: ExtensionCommandContext,
282
+ _pi: ExtensionAPI,
283
+ basePath: string,
284
+ ): Promise<void> {
285
+ const force = args.includes("--force");
286
+ const rawId = args.replace("--force", "").trim();
287
+
288
+ if (!rawId) {
289
+ ctx.ui.notify(
290
+ "Usage: /gsd reset-slice <sliceId> [--force]\n\n" +
291
+ "Accepts: S01 or M001/S01\n" +
292
+ "Resets the slice and all its tasks, re-renders plan + roadmap checkboxes.",
293
+ "warning",
294
+ );
295
+ return;
296
+ }
297
+
298
+ const parsed = await parseSliceId(rawId, basePath);
299
+ if (typeof parsed === "string") {
300
+ ctx.ui.notify(parsed, "error");
301
+ return;
302
+ }
303
+
304
+ const { mid, sid } = parsed;
305
+
306
+ // Validate slice exists in DB
307
+ const slice = getSlice(mid, sid);
308
+ if (!slice) {
309
+ ctx.ui.notify(`Slice ${mid}/${sid} not found in database.`, "error");
310
+ return;
311
+ }
312
+
313
+ const tasks = getSliceTasks(mid, sid);
314
+
315
+ if (!force) {
316
+ ctx.ui.notify(
317
+ `Will reset: slice ${mid}/${sid}\n` +
318
+ ` Current status: ${slice.status}\n` +
319
+ ` Tasks to reset: ${tasks.length}\n` +
320
+ `This will:\n` +
321
+ ` - Set all task statuses to "pending" in DB\n` +
322
+ ` - Set slice status to "active" in DB\n` +
323
+ ` - Delete task summary files, slice summary, and UAT files\n` +
324
+ ` - Re-render plan + roadmap checkboxes\n\n` +
325
+ `Run /gsd reset-slice ${rawId} --force to confirm.`,
326
+ "warning",
327
+ );
328
+ return;
329
+ }
330
+
331
+ // Reset all tasks
332
+ let tasksReset = 0;
333
+ let summariesDeleted = 0;
334
+ for (const t of tasks) {
335
+ updateTaskStatus(mid, sid, t.id, "pending");
336
+ tasksReset++;
337
+ const summaryPath = resolveTaskFile(basePath, mid, sid, t.id, "SUMMARY");
338
+ if (summaryPath && existsSync(summaryPath)) {
339
+ unlinkSync(summaryPath);
340
+ summariesDeleted++;
341
+ }
342
+ }
343
+
344
+ // Reset slice status
345
+ updateSliceStatus(mid, sid, "active");
346
+
347
+ // Delete slice summary and UAT files
348
+ let sliceFilesDeleted = 0;
349
+ const slicePath = resolveSlicePath(basePath, mid, sid);
350
+ if (slicePath) {
351
+ for (const suffix of ["SUMMARY", "UAT"]) {
352
+ const filePath = join(slicePath, buildSliceFileName(sid, suffix));
353
+ if (existsSync(filePath)) {
354
+ unlinkSync(filePath);
355
+ sliceFilesDeleted++;
356
+ }
357
+ }
358
+ }
359
+
360
+ // Re-render plan + roadmap checkboxes
361
+ await renderPlanCheckboxes(basePath, mid, sid);
362
+ await renderRoadmapCheckboxes(basePath, mid);
363
+
364
+ // Invalidate caches
365
+ invalidateAllCaches();
366
+
367
+ const results: string[] = [
368
+ `Reset slice ${mid}/${sid} to "active".`,
369
+ ` - ${tasksReset} task(s) reset to "pending"`,
370
+ ];
371
+ if (summariesDeleted > 0) results.push(` - ${summariesDeleted} task summary file(s) deleted`);
372
+ if (sliceFilesDeleted > 0) results.push(` - ${sliceFilesDeleted} slice file(s) deleted (summary/UAT)`);
373
+ results.push(" - Plan + roadmap checkboxes re-rendered");
374
+
375
+ ctx.ui.notify(results.join("\n"), "success");
376
+ }
377
+
134
378
  // ─── Helpers ──────────────────────────────────────────────────────────────────
135
379
 
136
380
  export function uncheckTaskInPlan(basePath: string, mid: string, sid: string, tid: string): boolean {
@@ -3,7 +3,9 @@
3
3
  import { existsSync, readFileSync, statSync } from 'node:fs';
4
4
  import { join } from 'node:path';
5
5
  import { deriveState } from './state.js';
6
- import { parseRoadmap, parsePlan, parseSummary, loadFile } from './files.js';
6
+ import { parseSummary, loadFile } from './files.js';
7
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from './gsd-db.js';
8
+ import { parseRoadmap, parsePlan } from './parsers-legacy.js';
7
9
  import { findMilestoneIds } from './milestone-ids.js';
8
10
  import { resolveMilestoneFile, resolveSliceFile, resolveGsdRootFile, gsdRoot } from './paths.js';
9
11
  import {
@@ -796,10 +798,24 @@ export async function loadVisualizerData(basePath: string): Promise<VisualizerDa
796
798
  const roadmapFile = resolveMilestoneFile(basePath, mid, 'ROADMAP');
797
799
  const roadmapContent = roadmapFile ? readFileCached(roadmapFile) : null;
798
800
 
799
- if (roadmapContent) {
800
- const roadmap = parseRoadmap(roadmapContent);
801
+ if (roadmapContent || isDbAvailable()) {
802
+ // Normalize slices from DB, fall back to file-based parsing when DB has no data
803
+ type NormSlice = { id: string; done: boolean; title: string; risk: string; depends: string[]; demo: string };
804
+ let normSlices: NormSlice[] | null = null;
805
+ if (isDbAvailable()) {
806
+ const dbSlices = getMilestoneSlices(mid);
807
+ if (dbSlices.length > 0) {
808
+ normSlices = dbSlices.map(s => ({ id: s.id, done: s.status === 'complete', title: s.title, risk: s.risk || 'medium', depends: s.depends, demo: s.demo }));
809
+ }
810
+ }
811
+ if (!normSlices && roadmapContent) {
812
+ // File-based fallback: parse roadmap for slice entries
813
+ const parsed = parseRoadmap(roadmapContent);
814
+ normSlices = parsed.slices.map(s => ({ id: s.id, done: s.done, title: s.title, risk: s.risk || 'medium', depends: s.depends, demo: '' }));
815
+ }
816
+ if (!normSlices) normSlices = [];
801
817
 
802
- for (const s of roadmap.slices) {
818
+ for (const s of normSlices) {
803
819
  const isActiveSlice =
804
820
  state.activeMilestone?.id === mid &&
805
821
  state.activeSlice?.id === s.id;
@@ -807,19 +823,40 @@ export async function loadVisualizerData(basePath: string): Promise<VisualizerDa
807
823
  const tasks: VisualizerTask[] = [];
808
824
 
809
825
  if (isActiveSlice) {
810
- const planFile = resolveSliceFile(basePath, mid, s.id, 'PLAN');
811
- const planContent = planFile ? readFileCached(planFile) : null;
812
-
813
- if (planContent) {
814
- const plan = parsePlan(planContent);
815
- for (const t of plan.tasks) {
816
- tasks.push({
817
- id: t.id,
818
- title: t.title,
819
- done: t.done,
820
- active: state.activeTask?.id === t.id,
821
- estimate: t.estimate || undefined,
822
- });
826
+ // Normalize tasks from DB, fall back to file parsing when DB has no data
827
+ let usedDbTasks = false;
828
+ if (isDbAvailable()) {
829
+ const dbTasks = getSliceTasks(mid, s.id);
830
+ if (dbTasks.length > 0) {
831
+ usedDbTasks = true;
832
+ for (const t of dbTasks) {
833
+ tasks.push({
834
+ id: t.id,
835
+ title: t.title,
836
+ done: t.status === 'complete' || t.status === 'done',
837
+ active: state.activeTask?.id === t.id,
838
+ estimate: t.estimate || undefined,
839
+ });
840
+ }
841
+ }
842
+ }
843
+ if (!usedDbTasks) {
844
+ // File-based fallback: parse slice plan for task entries
845
+ const slicePlanFile = resolveSliceFile(basePath, mid, s.id, 'PLAN');
846
+ if (slicePlanFile) {
847
+ const planContent = readFileCached(slicePlanFile);
848
+ if (planContent) {
849
+ const parsed = parsePlan(planContent);
850
+ for (const t of parsed.tasks) {
851
+ tasks.push({
852
+ id: t.id,
853
+ title: t.title,
854
+ done: t.done,
855
+ active: state.activeTask?.id === t.id,
856
+ estimate: t.estimate || undefined,
857
+ });
858
+ }
859
+ }
823
860
  }
824
861
  }
825
862
  }
@@ -1,6 +1,8 @@
1
1
  import { join } from "node:path";
2
2
 
3
- import { loadFile, parsePlan, parseRoadmap } from "./files.js";
3
+ import { loadFile } from "./files.js";
4
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
5
+ import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
4
6
  import {
5
7
  resolveMilestoneFile,
6
8
  resolveSliceFile,
@@ -11,7 +13,6 @@ import {
11
13
  import { deriveState } from "./state.js";
12
14
  import { milestoneIdSort, findMilestoneIds } from "./guided-flow.js";
13
15
  import type { RiskLevel } from "./types.js";
14
- import { type ValidationIssue, validateCompleteBoundary, validatePlanBoundary } from "./observability-validator.js";
15
16
  import { getSliceBranchName, detectWorktreeName } from "./worktree.js";
16
17
 
17
18
  export interface WorkspaceTaskTarget {
@@ -59,13 +60,15 @@ export interface GSDWorkspaceIndex {
59
60
  phase: string;
60
61
  };
61
62
  scopes: WorkspaceScopeTarget[];
62
- validationIssues: ValidationIssue[];
63
+ validationIssues: Array<Record<string, unknown>>;
63
64
  }
64
65
 
65
-
66
+ // Extract milestone title from roadmap header without using parsers.
67
+ // Falls back to the milestone ID if no title line found.
66
68
  function titleFromRoadmapHeader(content: string, fallbackId: string): string {
67
- const roadmap = parseRoadmap(content);
68
- return roadmap.title.replace(/^M\d+(?:-[a-z0-9]{6})?[^:]*:\s*/, "") || fallbackId;
69
+ // Parse the "# M001: Title" header directly
70
+ const match = content.match(/^#\s+M\d+(?:-[a-z0-9]{6})?[^:]*:\s*(.+)/m);
71
+ return match?.[1]?.trim() || fallbackId;
69
72
  }
70
73
 
71
74
  async function indexSlice(basePath: string, milestoneId: string, sliceId: string, fallbackTitle: string, done: boolean, roadmapMeta?: { risk?: RiskLevel; depends?: string[]; demo?: string }): Promise<WorkspaceSliceTarget> {
@@ -77,12 +80,30 @@ async function indexSlice(basePath: string, milestoneId: string, sliceId: string
77
80
  const tasks: WorkspaceTaskTarget[] = [];
78
81
  let title = fallbackTitle;
79
82
 
80
- if (planPath) {
81
- const content = await loadFile(planPath);
82
- if (content) {
83
- const plan = parsePlan(content);
84
- title = plan.title || fallbackTitle;
85
- for (const task of plan.tasks) {
83
+ // Prefer DB for task data, fall back to file parsing when DB has no data
84
+ let usedDb = false;
85
+ if (isDbAvailable()) {
86
+ const dbTasks = getSliceTasks(milestoneId, sliceId);
87
+ if (dbTasks.length > 0) {
88
+ usedDb = true;
89
+ for (const task of dbTasks) {
90
+ title = fallbackTitle; // title comes from slice-level data, not plan
91
+ tasks.push({
92
+ id: task.id,
93
+ title: task.title,
94
+ done: task.status === "complete" || task.status === "done",
95
+ planPath: resolveTaskFile(basePath, milestoneId, sliceId, task.id, "PLAN") ?? undefined,
96
+ summaryPath: resolveTaskFile(basePath, milestoneId, sliceId, task.id, "SUMMARY") ?? undefined,
97
+ });
98
+ }
99
+ }
100
+ }
101
+ if (!usedDb && planPath) {
102
+ // File-based fallback: parse slice plan for task entries
103
+ const planContent = await loadFile(planPath);
104
+ if (planContent) {
105
+ const parsed = parsePlan(planContent);
106
+ for (const task of parsed.tasks) {
86
107
  tasks.push({
87
108
  id: task.id,
88
109
  title: task.title,
@@ -111,53 +132,52 @@ async function indexSlice(basePath: string, milestoneId: string, sliceId: string
111
132
  }
112
133
 
113
134
  export interface IndexWorkspaceOptions {
114
- /**
115
- * When true, run validatePlanBoundary and validateCompleteBoundary for each slice.
116
- * Skipped by default — validation is expensive (content analysis) and only needed
117
- * for explicit doctor/audit flows. The /gsd status dashboard and scope pickers
118
- * don't need the full issue list.
119
- */
120
135
  validate?: boolean;
121
136
  }
122
137
 
123
138
  export async function indexWorkspace(basePath: string, opts: IndexWorkspaceOptions = {}): Promise<GSDWorkspaceIndex> {
124
139
  const milestoneIds = findMilestoneIds(basePath);
125
140
  const milestones: WorkspaceMilestoneTarget[] = [];
126
- const validationIssues: ValidationIssue[] = [];
127
- const runValidation = opts.validate === true;
128
141
 
129
142
  for (const milestoneId of milestoneIds) {
130
143
  const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP") ?? undefined;
131
144
  let title = milestoneId;
132
145
  const slices: WorkspaceSliceTarget[] = [];
133
146
 
134
- if (roadmapPath) {
135
- const roadmapContent = await loadFile(roadmapPath);
136
- if (roadmapContent) {
137
- const roadmap = parseRoadmap(roadmapContent);
138
- title = titleFromRoadmapHeader(roadmapContent, milestoneId);
147
+ if (roadmapPath || isDbAvailable()) {
148
+ // Normalize slices from DB, fall back to file-based parsing when DB has no data
149
+ type NormSlice = { id: string; done: boolean; title: string; risk: string; depends: string[]; demo: string };
150
+ let normSlices: NormSlice[] | null = null;
151
+ if (isDbAvailable()) {
152
+ const dbSlices = getMilestoneSlices(milestoneId);
153
+ if (dbSlices.length > 0) {
154
+ normSlices = dbSlices.map(s => ({ id: s.id, done: s.status === "complete", title: s.title, risk: s.risk || "medium", depends: s.depends, demo: s.demo }));
155
+ }
156
+ // Get title from roadmap header
157
+ if (roadmapPath) {
158
+ const roadmapContent = await loadFile(roadmapPath);
159
+ if (roadmapContent) title = titleFromRoadmapHeader(roadmapContent, milestoneId);
160
+ }
161
+ }
162
+ if (!normSlices && roadmapPath) {
163
+ // File-based fallback: parse roadmap for slice entries
164
+ const roadmapContent = await loadFile(roadmapPath);
165
+ if (roadmapContent) {
166
+ title = titleFromRoadmapHeader(roadmapContent, milestoneId);
167
+ const parsed = parseRoadmap(roadmapContent);
168
+ normSlices = parsed.slices.map(s => ({ id: s.id, done: s.done, title: s.title, risk: s.risk || "medium", depends: s.depends, demo: s.demo || "" }));
169
+ }
170
+ }
171
+ if (!normSlices) normSlices = [];
139
172
 
140
- // Parallelise all per-slice I/O: indexSlice + (optional) validation calls run concurrently.
141
- // Order is preserved via Promise.all on an array built from roadmap.slices.
173
+ if (normSlices.length > 0) {
142
174
  const sliceResults = await Promise.all(
143
- roadmap.slices.map(async (slice) => {
144
- if (runValidation) {
145
- const [indexedSlice, planIssues, completeIssues] = await Promise.all([
146
- indexSlice(basePath, milestoneId, slice.id, slice.title, slice.done, { risk: slice.risk, depends: slice.depends, demo: slice.demo }),
147
- validatePlanBoundary(basePath, milestoneId, slice.id),
148
- validateCompleteBoundary(basePath, milestoneId, slice.id),
149
- ]);
150
- return { indexedSlice, issues: [...planIssues, ...completeIssues] };
151
- }
152
- const indexedSlice = await indexSlice(basePath, milestoneId, slice.id, slice.title, slice.done, { risk: slice.risk, depends: slice.depends, demo: slice.demo });
153
- return { indexedSlice, issues: [] as ValidationIssue[] };
175
+ normSlices.map(async (slice) => {
176
+ return indexSlice(basePath, milestoneId, slice.id, slice.title, slice.done, { risk: slice.risk as RiskLevel, depends: slice.depends, demo: slice.demo });
154
177
  }),
155
178
  );
156
179
 
157
- for (const { indexedSlice, issues } of sliceResults) {
158
- slices.push(indexedSlice);
159
- validationIssues.push(...issues);
160
- }
180
+ slices.push(...sliceResults);
161
181
  }
162
182
  }
163
183
 
@@ -187,7 +207,7 @@ export async function indexWorkspace(basePath: string, opts: IndexWorkspaceOptio
187
207
  }
188
208
  }
189
209
 
190
- return { milestones, active, scopes, validationIssues };
210
+ return { milestones, active, scopes, validationIssues: [] };
191
211
  }
192
212
 
193
213
  export async function listDoctorScopeSuggestions(basePath: string): Promise<Array<{ value: string; label: string }>> {
@@ -207,8 +227,7 @@ export async function listDoctorScopeSuggestions(basePath: string): Promise<Arra
207
227
  }
208
228
 
209
229
  export async function getSuggestedNextCommands(basePath: string): Promise<string[]> {
210
- // Run validation here since we surface a /gsd doctor audit hint when issues exist.
211
- const index = await indexWorkspace(basePath, { validate: true });
230
+ const index = await indexWorkspace(basePath);
212
231
  const scope = index.active.milestoneId && index.active.sliceId
213
232
  ? `${index.active.milestoneId}/${index.active.sliceId}`
214
233
  : index.active.milestoneId;
@@ -218,7 +237,6 @@ export async function getSuggestedNextCommands(basePath: string): Promise<string
218
237
  if (index.active.phase === "executing" || index.active.phase === "summarizing") commands.add("/gsd auto");
219
238
  if (scope) commands.add(`/gsd doctor ${scope}`);
220
239
  if (scope) commands.add(`/gsd doctor fix ${scope}`);
221
- if (index.validationIssues.length > 0 && scope) commands.add(`/gsd doctor audit ${scope}`);
222
240
  commands.add("/gsd status");
223
241
  return [...commands];
224
242
  }
@@ -1,56 +0,0 @@
1
- /**
2
- * Pre-dispatch observability checks for auto-mode units.
3
- * Validates plan/summary file quality and builds repair instructions
4
- * for the agent to fix gaps before proceeding with the unit.
5
- */
6
- import { validatePlanBoundary, validateExecuteBoundary, validateCompleteBoundary, formatValidationIssues, } from "./observability-validator.js";
7
- export async function collectObservabilityWarnings(ctx, basePath, unitType, unitId) {
8
- // Hook units have custom artifacts — skip standard observability checks
9
- if (unitType.startsWith("hook/"))
10
- return [];
11
- const parts = unitId.split("/");
12
- const mid = parts[0];
13
- const sid = parts[1];
14
- const tid = parts[2];
15
- if (!mid || !sid)
16
- return [];
17
- let issues = [];
18
- if (unitType === "plan-slice") {
19
- issues = await validatePlanBoundary(basePath, mid, sid);
20
- }
21
- else if (unitType === "execute-task" && tid) {
22
- issues = await validateExecuteBoundary(basePath, mid, sid, tid);
23
- }
24
- else if (unitType === "complete-slice") {
25
- issues = await validateCompleteBoundary(basePath, mid, sid);
26
- }
27
- if (issues.length > 0) {
28
- ctx.ui.notify(`Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`, "warning");
29
- }
30
- return issues;
31
- }
32
- export function buildObservabilityRepairBlock(issues) {
33
- if (issues.length === 0)
34
- return "";
35
- const items = issues.map(issue => {
36
- const fileName = issue.file.split("/").pop() || issue.file;
37
- let line = `- **${fileName}**: ${issue.message}`;
38
- if (issue.suggestion)
39
- line += ` → ${issue.suggestion}`;
40
- return line;
41
- });
42
- return [
43
- "",
44
- "---",
45
- "",
46
- "## Pre-flight: Observability gaps to fix FIRST",
47
- "",
48
- "The following issues were detected in plan/summary files for this unit.",
49
- "**Read each flagged file, apply the fix described, then proceed with the unit.**",
50
- "",
51
- ...items,
52
- "",
53
- "---",
54
- "",
55
- ].join("\n");
56
- }