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
package/dist/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import { AuthStorage, DefaultResourceLoader, ModelRegistry, SettingsManager, SessionManager, createAgentSession, InteractiveMode, runPrintMode, runRpcMode, } from '@gsd/pi-coding-agent';
1
+ import { AuthStorage, DefaultResourceLoader, ModelRegistry, runPackageCommand, SettingsManager, SessionManager, createAgentSession, InteractiveMode, runPrintMode, runRpcMode, } from '@gsd/pi-coding-agent';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { agentDir, sessionsDir, authFilePath } from './app-paths.js';
@@ -121,6 +121,18 @@ if (subcommand && process.argv.includes('--help')) {
121
121
  process.exit(0);
122
122
  }
123
123
  }
124
+ const packageCommand = await runPackageCommand({
125
+ appName: 'gsd',
126
+ args: process.argv.slice(2),
127
+ cwd: process.cwd(),
128
+ agentDir,
129
+ stdout: process.stdout,
130
+ stderr: process.stderr,
131
+ allowedCommands: new Set(['install', 'remove', 'list']),
132
+ });
133
+ if (packageCommand.handled) {
134
+ process.exit(packageCommand.exitCode);
135
+ }
124
136
  // `gsd config` — replay the setup wizard and exit
125
137
  if (cliFlags.messages[0] === 'config') {
126
138
  const authStorage = AuthStorage.create(authFilePath);
package/dist/help-text.js CHANGED
@@ -29,6 +29,27 @@ const SUBCOMMAND_HELP = {
29
29
  '',
30
30
  'Compare with --continue (-c) which always resumes the most recent session.',
31
31
  ].join('\n'),
32
+ install: [
33
+ 'Usage: gsd install <source> [-l, --local]',
34
+ '',
35
+ 'Install a package/extension source and run declared lifecycle hooks.',
36
+ '',
37
+ 'Examples:',
38
+ ' gsd install npm:@foo/bar',
39
+ ' gsd install git:github.com/user/repo',
40
+ ' gsd install https://github.com/user/repo',
41
+ ' gsd install ./local/path',
42
+ ].join('\n'),
43
+ remove: [
44
+ 'Usage: gsd remove <source> [-l, --local]',
45
+ '',
46
+ 'Remove an installed package source and its settings entry.',
47
+ ].join('\n'),
48
+ list: [
49
+ 'Usage: gsd list',
50
+ '',
51
+ 'List installed package sources from user and project settings.',
52
+ ].join('\n'),
32
53
  worktree: [
33
54
  'Usage: gsd worktree <command> [args]',
34
55
  '',
@@ -122,6 +143,9 @@ export function printHelp(version) {
122
143
  process.stdout.write(' --help, -h Print this help and exit\n');
123
144
  process.stdout.write('\nSubcommands:\n');
124
145
  process.stdout.write(' config Re-run the setup wizard\n');
146
+ process.stdout.write(' install <source> Install a package/extension source\n');
147
+ process.stdout.write(' remove <source> Remove an installed package source\n');
148
+ process.stdout.write(' list List installed package sources\n');
125
149
  process.stdout.write(' update Update GSD to the latest version\n');
126
150
  process.stdout.write(' sessions List and resume a past session\n');
127
151
  process.stdout.write(' worktree <cmd> Manage worktrees (list, merge, clean, remove)\n');
@@ -371,6 +371,9 @@ export class BgManagerOverlay {
371
371
  inner.push(th.fg("dim", "↑↓ scroll · tab output · q back"));
372
372
  return this.box(inner, width);
373
373
  }
374
+ dispose() {
375
+ clearInterval(this.refreshTimer);
376
+ }
374
377
  invalidate() {
375
378
  this.cachedWidth = undefined;
376
379
  this.cachedLines = undefined;
@@ -9,7 +9,8 @@
9
9
  */
10
10
  import { existsSync, readdirSync } from "node:fs";
11
11
  import { join } from "node:path";
12
- import { loadFile, parseRoadmap, parsePlan, parseSummary } from "../gsd/files.js";
12
+ import { loadFile, parseSummary } from "../gsd/files.js";
13
+ import { parseRoadmap, parsePlan } from "../gsd/parsers-legacy.js";
13
14
  import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, } from "../gsd/paths.js";
14
15
  import { debugLog } from "../gsd/debug-logger.js";
15
16
  import { loadEffectiveGSDPreferences } from "../gsd/preferences.js";
@@ -120,7 +120,6 @@ export async function autoLoop(ctx, pi, s, deps) {
120
120
  prompt: step.prompt,
121
121
  finalPrompt: step.prompt,
122
122
  pauseAfterUatDispatch: false,
123
- observabilityIssues: [],
124
123
  state: gsdState,
125
124
  mid: s.currentMilestoneId ?? "workflow",
126
125
  midTitle: "Workflow",
@@ -191,7 +190,6 @@ export async function autoLoop(ctx, pi, s, deps) {
191
190
  prompt: sidecarItem.prompt,
192
191
  finalPrompt: sidecarItem.prompt,
193
192
  pauseAfterUatDispatch: false,
194
- observabilityIssues: [],
195
193
  state: sidecarState,
196
194
  mid: sidecarState.activeMilestone?.id,
197
195
  midTitle: sidecarState.activeMilestone?.title,
@@ -428,12 +428,11 @@ export async function runDispatch(ic, preData, loopState) {
428
428
  debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
429
429
  return { action: "break", reason: "prior-slice-blocker" };
430
430
  }
431
- const observabilityIssues = await deps.collectObservabilityWarnings(ctx, s.basePath, unitType, unitId);
432
431
  return {
433
432
  action: "next",
434
433
  data: {
435
434
  unitType, unitId, prompt, finalPrompt: prompt,
436
- pauseAfterUatDispatch, observabilityIssues,
435
+ pauseAfterUatDispatch,
437
436
  state, mid, midTitle,
438
437
  isRetry: false, previousTier: undefined,
439
438
  hookModelOverride: preDispatchResult.model,
@@ -543,7 +542,7 @@ export async function runGuards(ic, mid) {
543
542
  */
544
543
  export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
545
544
  const { ctx, pi, s, deps, prefs } = ic;
546
- const { unitType, unitId, prompt, observabilityIssues, state, mid } = iterData;
545
+ const { unitType, unitId, prompt, state, mid } = iterData;
547
546
  debugLog("autoLoop", {
548
547
  phase: "unit-execution",
549
548
  iteration: ic.iteration,
@@ -569,11 +568,11 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
569
568
  const hasProjectFile = PROJECT_FILES.some((f) => deps.existsSync(join(s.basePath, f)));
570
569
  const hasSrcDir = deps.existsSync(join(s.basePath, "src"));
571
570
  if (!hasProjectFile && !hasSrcDir) {
572
- const msg = `Worktree health check failed: ${s.basePath} has no recognized project files — refusing to dispatch ${unitType} ${unitId}`;
573
- debugLog("runUnitPhase", { phase: "worktree-health-fail", basePath: s.basePath, hasProjectFile, hasSrcDir });
574
- ctx.ui.notify(msg, "error");
575
- await deps.stopAuto(ctx, pi, msg);
576
- return { action: "break", reason: "worktree-invalid" };
571
+ // Greenfield projects won't have project files yet the first task creates them.
572
+ // Log a warning but allow execution to proceed. The .git check above is sufficient
573
+ // to ensure we're in a valid working directory.
574
+ debugLog("runUnitPhase", { phase: "worktree-health-warn-greenfield", basePath: s.basePath, hasProjectFile, hasSrcDir });
575
+ ctx.ui.notify(`Warning: ${s.basePath} has no recognized project files — proceeding as greenfield project`, "warning");
577
576
  }
578
577
  }
579
578
  // Detect retry and capture previous tier for escalation
@@ -628,10 +627,6 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
628
627
  finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\nFix whatever went wrong and make sure you write the required file this time.\n\n---\n\n${finalPrompt}`;
629
628
  }
630
629
  }
631
- const repairBlock = deps.buildObservabilityRepairBlock(observabilityIssues);
632
- if (repairBlock) {
633
- finalPrompt = `${finalPrompt}${repairBlock}`;
634
- }
635
630
  // Prompt char measurement
636
631
  s.lastPromptCharCount = finalPrompt.length;
637
632
  s.lastBaselineCharCount = undefined;
@@ -8,8 +8,7 @@
8
8
  import { getCurrentBranch } from "./worktree.js";
9
9
  import { getActiveHook } from "./post-unit-hooks.js";
10
10
  import { getLedger, getProjectTotals } from "./metrics.js";
11
- import { resolveMilestoneFile, resolveSliceFile, } from "./paths.js";
12
- import { parseRoadmap, parsePlan } from "./files.js";
11
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
13
12
  import { readFileSync, writeFileSync, existsSync } from "node:fs";
14
13
  import { execFileSync } from "node:child_process";
15
14
  import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
@@ -192,24 +191,26 @@ export function estimateTimeRemaining() {
192
191
  let cachedSliceProgress = null;
193
192
  export function updateSliceProgressCache(base, mid, activeSid) {
194
193
  try {
195
- const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
196
- if (!roadmapFile)
197
- return;
198
- const content = readFileSync(roadmapFile, "utf-8");
199
- const roadmap = parseRoadmap(content);
194
+ let normSlices;
195
+ if (isDbAvailable()) {
196
+ normSlices = getMilestoneSlices(mid).map(s => ({ id: s.id, done: s.status === "complete", title: s.title }));
197
+ }
198
+ else {
199
+ normSlices = [];
200
+ }
200
201
  let activeSliceTasks = null;
201
202
  let taskDetails = null;
202
203
  if (activeSid) {
203
204
  try {
204
- const planFile = resolveSliceFile(base, mid, activeSid, "PLAN");
205
- if (planFile && existsSync(planFile)) {
206
- const planContent = readFileSync(planFile, "utf-8");
207
- const plan = parsePlan(planContent);
208
- activeSliceTasks = {
209
- done: plan.tasks.filter(t => t.done).length,
210
- total: plan.tasks.length,
211
- };
212
- taskDetails = plan.tasks.map(t => ({ id: t.id, title: t.title, done: t.done }));
205
+ if (isDbAvailable()) {
206
+ const dbTasks = getSliceTasks(mid, activeSid);
207
+ if (dbTasks.length > 0) {
208
+ activeSliceTasks = {
209
+ done: dbTasks.filter(t => t.status === "complete" || t.status === "done").length,
210
+ total: dbTasks.length,
211
+ };
212
+ taskDetails = dbTasks.map(t => ({ id: t.id, title: t.title, done: t.status === "complete" || t.status === "done" }));
213
+ }
213
214
  }
214
215
  }
215
216
  catch {
@@ -217,8 +218,8 @@ export function updateSliceProgressCache(base, mid, activeSid) {
217
218
  }
218
219
  }
219
220
  cachedSliceProgress = {
220
- done: roadmap.slices.filter(s => s.done).length,
221
- total: roadmap.slices.length,
221
+ done: normSlices.filter(s => s.done).length,
222
+ total: normSlices.length,
222
223
  milestoneId: mid,
223
224
  activeSliceTasks,
224
225
  taskDetails,
@@ -3,7 +3,9 @@
3
3
  * Resolves phase name → unit type + prompt, creates a session, and sends the message.
4
4
  */
5
5
  import { deriveState } from "./state.js";
6
- import { loadFile, parseRoadmap } from "./files.js";
6
+ import { loadFile } from "./files.js";
7
+ import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
8
+ import { parseRoadmap } from "./parsers-legacy.js";
7
9
  import { resolveMilestoneFile, resolveSliceFile, relSliceFile, } from "./paths.js";
8
10
  import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
9
11
  import { loadEffectiveGSDPreferences } from "./preferences.js";
@@ -117,19 +119,26 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
117
119
  }
118
120
  case "reassess":
119
121
  case "reassess-roadmap": {
120
- const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
121
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
122
- if (!roadmapContent) {
123
- ctx.ui.notify("Cannot dispatch reassess-roadmap: no roadmap found.", "warning");
124
- return;
122
+ // DB primary path — get completed slices, fall back to file parsing when DB has no data
123
+ let completedSliceIds = [];
124
+ if (isDbAvailable()) {
125
+ completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
126
+ }
127
+ if (completedSliceIds.length === 0) {
128
+ // File-based fallback: parse roadmap checkboxes
129
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
130
+ if (roadmapPath) {
131
+ const roadmapContent = await loadFile(roadmapPath);
132
+ if (roadmapContent) {
133
+ completedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
134
+ }
135
+ }
125
136
  }
126
- const roadmap = parseRoadmap(roadmapContent);
127
- const completedSlices = roadmap.slices.filter(s => s.done);
128
- if (completedSlices.length === 0) {
137
+ if (completedSliceIds.length === 0) {
129
138
  ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
130
139
  return;
131
140
  }
132
- const completedSliceId = completedSlices[completedSlices.length - 1].id;
141
+ const completedSliceId = completedSliceIds[completedSliceIds.length - 1];
133
142
  unitType = "reassess-roadmap";
134
143
  unitId = `${mid}/${completedSliceId}`;
135
144
  prompt = await buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base);
@@ -141,19 +150,25 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
141
150
  // incomplete) slice. After slice completion, state.activeSlice advances
142
151
  // to the next incomplete slice, so we find the last done slice from the
143
152
  // roadmap instead (#1693).
144
- const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
145
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
146
- if (!roadmapContent) {
147
- ctx.ui.notify("Cannot dispatch run-uat: no roadmap found.", "warning");
148
- return;
153
+ let uatCompletedSliceIds = [];
154
+ if (isDbAvailable()) {
155
+ uatCompletedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
156
+ }
157
+ if (uatCompletedSliceIds.length === 0) {
158
+ // File-based fallback: parse roadmap checkboxes
159
+ const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
160
+ if (roadmapPath) {
161
+ const roadmapContent = await loadFile(roadmapPath);
162
+ if (roadmapContent) {
163
+ uatCompletedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
164
+ }
165
+ }
149
166
  }
150
- const roadmap = parseRoadmap(roadmapContent);
151
- const completedSlices = roadmap.slices.filter(s => s.done);
152
- if (completedSlices.length === 0) {
167
+ if (uatCompletedSliceIds.length === 0) {
153
168
  ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
154
169
  return;
155
170
  }
156
- const sid = completedSlices[completedSlices.length - 1].id;
171
+ const sid = uatCompletedSliceIds[uatCompletedSliceIds.length - 1];
157
172
  const uatFile = resolveSliceFile(base, mid, sid, "UAT");
158
173
  if (!uatFile) {
159
174
  ctx.ui.notify("Cannot dispatch run-uat: no UAT file found.", "warning");
@@ -8,7 +8,8 @@
8
8
  * data structure that is inspectable, testable per-rule, and extensible
9
9
  * without modifying orchestration code.
10
10
  */
11
- import { loadFile, loadActiveOverrides, parseRoadmap } from "./files.js";
11
+ import { loadFile, loadActiveOverrides } from "./files.js";
12
+ import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
12
13
  import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
13
14
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
14
15
  import { join } from "node:path";
@@ -92,12 +93,18 @@ export const DISPATCH_RULES = [
92
93
  if (!prefs?.uat_dispatch)
93
94
  return null;
94
95
  const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
95
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
96
- if (!roadmapContent)
96
+ // DB-first: get completed slices from DB
97
+ let completedSliceIds;
98
+ if (isDbAvailable()) {
99
+ completedSliceIds = getMilestoneSlices(mid)
100
+ .filter(s => s.status === "complete")
101
+ .map(s => s.id);
102
+ }
103
+ else {
97
104
  return null;
98
- const roadmap = parseRoadmap(roadmapContent);
99
- for (const slice of roadmap.slices.filter(s => s.done)) {
100
- const resultFile = resolveSliceFile(basePath, mid, slice.id, "UAT-RESULT");
105
+ }
106
+ for (const sliceId of completedSliceIds) {
107
+ const resultFile = resolveSliceFile(basePath, mid, sliceId, "UAT-RESULT");
101
108
  if (!resultFile)
102
109
  continue;
103
110
  const content = await loadFile(resultFile);
@@ -108,7 +115,7 @@ export const DISPATCH_RULES = [
108
115
  if (verdict && verdict !== "pass" && verdict !== "passed") {
109
116
  return {
110
117
  action: "stop",
111
- reason: `UAT verdict for ${slice.id} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
118
+ reason: `UAT verdict for ${sliceId} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
112
119
  level: "warning",
113
120
  };
114
121
  }
@@ -376,15 +383,19 @@ export const DISPATCH_RULES = [
376
383
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files before
377
384
  // allowing milestone validation. If any slice lacks a summary, the milestone
378
385
  // is not genuinely complete — something skipped earlier slices.
379
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
380
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
381
- if (roadmapContent) {
382
- const roadmap = parseRoadmap(roadmapContent);
386
+ let sliceIds;
387
+ if (isDbAvailable()) {
388
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
389
+ }
390
+ else {
391
+ sliceIds = [];
392
+ }
393
+ if (sliceIds.length > 0) {
383
394
  const missingSlices = [];
384
- for (const slice of roadmap.slices) {
385
- const summaryPath = resolveSliceFile(basePath, mid, slice.id, "SUMMARY");
395
+ for (const sid of sliceIds) {
396
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
386
397
  if (!summaryPath || !existsSync(summaryPath)) {
387
- missingSlices.push(slice.id);
398
+ missingSlices.push(sid);
388
399
  }
389
400
  }
390
401
  if (missingSlices.length > 0) {
@@ -430,15 +441,19 @@ export const DISPATCH_RULES = [
430
441
  if (state.phase !== "completing-milestone")
431
442
  return null;
432
443
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files.
433
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
434
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
435
- if (roadmapContent) {
436
- const roadmap = parseRoadmap(roadmapContent);
444
+ let sliceIds;
445
+ if (isDbAvailable()) {
446
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
447
+ }
448
+ else {
449
+ sliceIds = [];
450
+ }
451
+ if (sliceIds.length > 0) {
437
452
  const missingSlices = [];
438
- for (const slice of roadmap.slices) {
439
- const summaryPath = resolveSliceFile(basePath, mid, slice.id, "SUMMARY");
453
+ for (const sid of sliceIds) {
454
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
440
455
  if (!summaryPath || !existsSync(summaryPath)) {
441
- missingSlices.push(slice.id);
456
+ missingSlices.push(sid);
442
457
  }
443
458
  }
444
459
  if (missingSlices.length > 0) {
@@ -22,16 +22,121 @@ import { writeUnitRuntimeRecord, clearUnitRuntimeRecord } from "./unit-runtime.j
22
22
  import { runGSDDoctor, rebuildState, summarizeDoctorIssues } from "./doctor.js";
23
23
  import { recordHealthSnapshot, checkHealEscalation } from "./doctor-proactive.js";
24
24
  import { syncStateToProjectRoot } from "./auto-worktree-sync.js";
25
- import { isDbAvailable } from "./gsd-db.js";
25
+ import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
26
+ import { renderPlanCheckboxes } from "./markdown-renderer.js";
26
27
  import { consumeSignal } from "./session-status-io.js";
27
28
  import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
28
29
  import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
29
30
  import { debugLog } from "./debug-logger.js";
30
31
  import { existsSync, unlinkSync } from "node:fs";
31
32
  import { join } from "node:path";
32
- import { uncheckTaskInPlan } from "./undo.js";
33
33
  import { atomicWriteSync } from "./atomic-write.js";
34
34
  import { _resetHasChangesCache } from "./native-git-bridge.js";
35
+ /**
36
+ * Detect summary files written directly to disk without the LLM calling
37
+ * the completion tool. A "rogue" file is one that exists on disk but has
38
+ * no corresponding DB row with status "complete".
39
+ *
40
+ * This is a safety-net diagnostic (D003). The existing migrateFromMarkdown()
41
+ * in postUnitPostVerification() eventually ingests rogue files, but explicit
42
+ * detection provides immediate diagnostics so operators know the prompt failed.
43
+ */
44
+ export function detectRogueFileWrites(unitType, unitId, basePath) {
45
+ if (!isDbAvailable())
46
+ return [];
47
+ const parts = unitId.split("/");
48
+ const rogues = [];
49
+ if (unitType === "execute-task") {
50
+ const [mid, sid, tid] = parts;
51
+ if (!mid || !sid || !tid)
52
+ return [];
53
+ const summaryPath = resolveTaskFile(basePath, mid, sid, tid, "SUMMARY");
54
+ if (!summaryPath || !existsSync(summaryPath))
55
+ return [];
56
+ const dbRow = getTask(mid, sid, tid);
57
+ if (!dbRow || dbRow.status !== "complete") {
58
+ rogues.push({ path: summaryPath, unitType, unitId });
59
+ }
60
+ }
61
+ else if (unitType === "complete-slice") {
62
+ const [mid, sid] = parts;
63
+ if (!mid || !sid)
64
+ return [];
65
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
66
+ if (!summaryPath || !existsSync(summaryPath))
67
+ return [];
68
+ const dbRow = getSlice(mid, sid);
69
+ if (!dbRow || dbRow.status !== "complete") {
70
+ rogues.push({ path: summaryPath, unitType, unitId });
71
+ }
72
+ }
73
+ else if (unitType === "plan-milestone") {
74
+ const [mid] = parts;
75
+ if (!mid)
76
+ return [];
77
+ const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
78
+ if (!roadmapPath || !existsSync(roadmapPath))
79
+ return [];
80
+ const dbRow = getMilestone(mid);
81
+ const hasPlanningState = !!dbRow && (String(dbRow.title || "").trim().length > 0 ||
82
+ String(dbRow.vision || "").trim().length > 0 ||
83
+ String(dbRow.requirement_coverage || "").trim().length > 0 ||
84
+ String(dbRow.boundary_map_markdown || "").trim().length > 0);
85
+ if (!hasPlanningState) {
86
+ rogues.push({ path: roadmapPath, unitType, unitId });
87
+ }
88
+ }
89
+ else if (unitType === "plan-slice" || unitType === "replan-slice") {
90
+ const [mid, sid] = parts;
91
+ if (!mid || !sid)
92
+ return [];
93
+ const planPath = resolveSliceFile(basePath, mid, sid, "PLAN");
94
+ if (!planPath || !existsSync(planPath))
95
+ return [];
96
+ const dbRow = getSlice(mid, sid);
97
+ const hasPlanningState = !!dbRow && (String(dbRow.title || "").trim().length > 0 ||
98
+ String(dbRow.demo || "").trim().length > 0 ||
99
+ String(dbRow.risk || "").trim().length > 0 ||
100
+ String(dbRow.depends || "").trim().length > 0);
101
+ if (!hasPlanningState) {
102
+ rogues.push({ path: planPath, unitType, unitId });
103
+ }
104
+ // Also check for rogue REPLAN.md
105
+ const replanPath = resolveSliceFile(basePath, mid, sid, "REPLAN");
106
+ if (replanPath && existsSync(replanPath) && !hasPlanningState) {
107
+ rogues.push({ path: replanPath, unitType, unitId });
108
+ }
109
+ }
110
+ else if (unitType === "reassess-roadmap") {
111
+ const [mid, sid] = parts;
112
+ if (!mid || !sid)
113
+ return [];
114
+ const assessPath = resolveSliceFile(basePath, mid, sid, "ASSESSMENT");
115
+ if (!assessPath || !existsSync(assessPath))
116
+ return [];
117
+ // Assessment file exists on disk — check if DB knows about it via the artifacts table
118
+ const adapter = _getAdapter();
119
+ if (adapter) {
120
+ const row = adapter.prepare(`SELECT 1 FROM artifacts WHERE path LIKE :pattern AND artifact_type = 'ASSESSMENT' LIMIT 1`).get({ ":pattern": `%${sid}-ASSESSMENT.md` });
121
+ if (!row) {
122
+ rogues.push({ path: assessPath, unitType, unitId });
123
+ }
124
+ }
125
+ }
126
+ else if (unitType === "plan-task") {
127
+ const [mid, sid, tid] = parts;
128
+ if (!mid || !sid || !tid)
129
+ return [];
130
+ const taskPlanPath = resolveTaskFile(basePath, mid, sid, tid, "PLAN");
131
+ if (!taskPlanPath || !existsSync(taskPlanPath))
132
+ return [];
133
+ const dbRow = getTask(mid, sid, tid);
134
+ if (!dbRow) {
135
+ rogues.push({ path: taskPlanPath, unitType, unitId });
136
+ }
137
+ }
138
+ return rogues;
139
+ }
35
140
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
36
141
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
37
142
  /**
@@ -283,6 +388,17 @@ export async function postUnitPreVerification(pctx, opts) {
283
388
  process.stderr.write(`gsd-triage: resolution execution failed: ${err.message}\n`);
284
389
  }
285
390
  }
391
+ // Rogue file detection — safety net for LLM bypassing completion tools (D003)
392
+ try {
393
+ const rogueFiles = detectRogueFileWrites(s.currentUnit.type, s.currentUnit.id, s.basePath);
394
+ for (const rogue of rogueFiles) {
395
+ process.stderr.write(`gsd-rogue: detected rogue file write: ${rogue.path} (unit: ${rogue.unitId})\n`);
396
+ ctx.ui.notify(`Rogue file write detected: ${rogue.path}`, "warning");
397
+ }
398
+ }
399
+ catch (e) {
400
+ debugLog("postUnit", { phase: "rogue-detection", error: String(e) });
401
+ }
286
402
  // Artifact verification
287
403
  let triggerArtifactVerified = false;
288
404
  if (!s.currentUnit.type.startsWith("hook/")) {
@@ -346,16 +462,6 @@ export async function postUnitPreVerification(pctx, opts) {
346
462
  */
347
463
  export async function postUnitPostVerification(pctx) {
348
464
  const { s, ctx, pi, buildSnapshotOpts, lockBase, stopAuto, pauseAuto, updateProgressWidget } = pctx;
349
- // ── DB dual-write ──
350
- if (isDbAvailable()) {
351
- try {
352
- const { migrateFromMarkdown } = await import("./md-importer.js");
353
- migrateFromMarkdown(s.basePath);
354
- }
355
- catch (err) {
356
- process.stderr.write(`gsd-db: re-import failed: ${err.message}\n`);
357
- }
358
- }
359
465
  // ── Post-unit hooks ──
360
466
  if (s.currentUnit && !s.stepMode) {
361
467
  const hookUnit = checkPostUnitHooks(s.currentUnit.type, s.currentUnit.id, s.basePath);
@@ -389,9 +495,17 @@ export async function postUnitPostVerification(pctx) {
389
495
  try {
390
496
  const parts = trigger.unitId.split("/");
391
497
  const [mid, sid, tid] = parts;
392
- // 1. Uncheck [x] [ ] in PLAN.md
498
+ // 1. Reset task status in DB and re-render plan checkboxes
393
499
  if (mid && sid && tid) {
394
- uncheckTaskInPlan(s.basePath, mid, sid, tid);
500
+ try {
501
+ updateTaskStatus(mid, sid, tid, "pending");
502
+ await renderPlanCheckboxes(s.basePath, mid, sid);
503
+ }
504
+ catch (dbErr) {
505
+ // DB unavailable — fail explicitly rather than silently reverting to markdown mutation.
506
+ // Use 'gsd recover' to rebuild DB state from disk if needed.
507
+ process.stderr.write(`gsd: retry state-reset failed (DB unavailable): ${dbErr.message}. Run 'gsd recover' to reconcile.\n`);
508
+ }
395
509
  }
396
510
  // 2. Delete SUMMARY.md for the task
397
511
  if (mid && sid && tid) {