gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/dist/cli.js +13 -1
  2. package/dist/help-text.js +24 -0
  3. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  4. package/dist/resources/extensions/github-sync/sync.js +2 -1
  5. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  7. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  8. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  11. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  12. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  13. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  14. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  15. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  16. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  17. package/dist/resources/extensions/gsd/auto.js +1 -4
  18. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  19. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  21. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  22. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  23. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  26. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  28. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  29. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  30. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  31. package/dist/resources/extensions/gsd/doctor.js +46 -282
  32. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  33. package/dist/resources/extensions/gsd/files.js +14 -198
  34. package/dist/resources/extensions/gsd/git-service.js +4 -0
  35. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  37. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  38. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  39. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  40. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  41. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  42. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  43. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  44. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  45. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  46. package/dist/resources/extensions/gsd/preferences.js +1 -0
  47. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  48. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  49. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  50. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  54. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  55. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  57. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  58. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  59. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  60. package/dist/resources/extensions/gsd/state.js +484 -30
  61. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  62. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  63. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  64. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  65. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  66. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  67. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  68. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  69. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  70. package/dist/resources/extensions/gsd/undo.js +197 -3
  71. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  72. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  73. package/dist/web/standalone/.next/BUILD_ID +1 -1
  74. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -16
  75. package/dist/web/standalone/.next/build-manifest.json +4 -4
  76. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  77. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  78. package/dist/web/standalone/.next/required-server-files.json +4 -4
  79. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  80. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  81. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  91. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  100. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  145. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  151. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  172. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/index.html +1 -1
  182. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  183. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/page.js +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -16
  191. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  192. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  193. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  194. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/middleware.js +2 -2
  197. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  199. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  200. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  201. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  202. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  203. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  207. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  210. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  211. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  212. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  254. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  255. package/dist/web/standalone/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +1 -0
  256. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  257. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  258. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  259. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  260. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  261. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  262. package/dist/web/standalone/server.js +1 -1
  263. package/package.json +4 -4
  264. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  265. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  266. package/packages/pi-ai/dist/models.custom.js +170 -0
  267. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  268. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models.js +16 -1
  270. package/packages/pi-ai/dist/models.js.map +1 -1
  271. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  272. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/models.test.js +67 -0
  274. package/packages/pi-ai/dist/models.test.js.map +1 -0
  275. package/packages/pi-ai/src/models.custom.ts +172 -0
  276. package/packages/pi-ai/src/models.test.ts +85 -0
  277. package/packages/pi-ai/src/models.ts +17 -1
  278. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  279. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  281. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  289. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  291. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  294. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  296. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  300. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  304. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  306. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  308. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  310. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  312. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  314. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  318. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  322. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  324. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  326. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  328. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  330. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  333. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/index.js +1 -0
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/main.js +11 -199
  340. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  348. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  351. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  353. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  355. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/package.json +1 -1
  360. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  361. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  362. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  363. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  364. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  365. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  366. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  367. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  368. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  369. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  370. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  371. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  372. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  373. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  374. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  375. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  376. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  377. package/packages/pi-coding-agent/src/index.ts +7 -0
  378. package/packages/pi-coding-agent/src/main.ts +11 -232
  379. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  383. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/package.json +1 -1
  389. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  390. package/src/resources/extensions/github-sync/sync.ts +2 -1
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  392. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  393. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  394. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  395. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  396. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  397. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  398. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  399. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  400. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  401. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  402. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  403. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  404. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  405. package/src/resources/extensions/gsd/auto.ts +0 -9
  406. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  407. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  409. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  410. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  411. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  412. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  413. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  414. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  415. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  416. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  417. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  418. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  419. package/src/resources/extensions/gsd/doctor.ts +45 -295
  420. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  421. package/src/resources/extensions/gsd/files.ts +16 -220
  422. package/src/resources/extensions/gsd/git-service.ts +4 -0
  423. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  424. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  425. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  426. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  427. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  428. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  429. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  430. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  431. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  432. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  433. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  434. package/src/resources/extensions/gsd/preferences.ts +1 -0
  435. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  436. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  437. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  438. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  442. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  443. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  445. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  446. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  447. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  448. package/src/resources/extensions/gsd/state.ts +547 -29
  449. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  450. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  451. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
  453. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
  457. package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
  458. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  459. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
  460. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
  461. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
  462. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
  463. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
  464. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
  465. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
  466. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
  467. package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
  468. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
  469. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
  470. package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
  471. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
  473. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
  474. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  475. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  476. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1205 -0
  477. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  479. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
  480. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
  481. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  487. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  488. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  489. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  490. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  491. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  492. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  493. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  494. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
  495. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  496. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
  497. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  498. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  499. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  500. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  501. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  502. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  503. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  504. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  505. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  506. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  507. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  508. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  509. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  510. package/src/resources/extensions/gsd/types.ts +50 -0
  511. package/src/resources/extensions/gsd/undo.ts +247 -3
  512. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  513. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  514. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  515. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  516. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  517. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  519. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  520. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  521. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  522. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  523. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  526. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  528. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  529. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  530. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  531. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  532. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  533. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  562. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  563. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  564. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  565. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  566. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  567. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  568. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
@@ -0,0 +1,462 @@
1
+ // gsd-recover.test.ts — Tests for the `gsd recover` recovery logic.
2
+ // Verifies: populate DB → clear hierarchy → recover from markdown → state matches.
3
+
4
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { tmpdir } from 'node:os';
7
+
8
+ import {
9
+ openDatabase,
10
+ closeDatabase,
11
+ transaction,
12
+ getAllMilestones,
13
+ getMilestoneSlices,
14
+ getSliceTasks,
15
+ _getAdapter,
16
+ insertMilestone,
17
+ insertSlice,
18
+ insertTask,
19
+ getMilestone,
20
+ getSlice,
21
+ getTask,
22
+ } from '../gsd-db.ts';
23
+ import { migrateHierarchyToDb } from '../md-importer.ts';
24
+ import { deriveStateFromDb, invalidateStateCache } from '../state.ts';
25
+ import { createTestContext } from './test-helpers.ts';
26
+
27
+ const { assertEq, assertTrue, report } = createTestContext();
28
+
29
+ // ─── Fixture Helpers ───────────────────────────────────────────────────────
30
+
31
+ function createFixtureBase(): string {
32
+ const base = mkdtempSync(join(tmpdir(), 'gsd-recover-'));
33
+ mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
34
+ return base;
35
+ }
36
+
37
+ function writeFile(base: string, relativePath: string, content: string): void {
38
+ const full = join(base, '.gsd', relativePath);
39
+ mkdirSync(join(full, '..'), { recursive: true });
40
+ writeFileSync(full, content);
41
+ }
42
+
43
+ function cleanup(base: string): void {
44
+ rmSync(base, { recursive: true, force: true });
45
+ }
46
+
47
+ // ─── Fixture Content ──────────────────────────────────────────────────────
48
+
49
+ const ROADMAP_M001 = `# M001: Recovery Test
50
+
51
+ **Vision:** Test recovery round-trip.
52
+
53
+ ## Success Criteria
54
+
55
+ - All recovery tests pass
56
+ - State matches after round-trip
57
+
58
+
59
+ ## Slices
60
+
61
+ - [x] **S01: Setup** \`risk:low\` \`depends:[]\`
62
+ > After this: Setup complete.
63
+
64
+ - [ ] **S02: Core** \`risk:medium\` \`depends:[S01]\`
65
+ > After this: Core done.
66
+
67
+ ## Boundary Map
68
+
69
+ | From | To | Produces | Consumes |
70
+ |------|-----|----------|----------|
71
+ | S01 | S02 | setup artifacts | setup artifacts |
72
+ `;
73
+
74
+ const PLAN_S01_COMPLETE = `---
75
+ estimated_steps: 2
76
+ estimated_files: 1
77
+ skills_used: []
78
+ ---
79
+
80
+ # S01: Setup
81
+
82
+ **Goal:** Setup fixtures.
83
+ **Demo:** Tasks done.
84
+
85
+ ## Tasks
86
+
87
+ - [x] **T01: Init** \`est:15m\`
88
+ Initialize things.
89
+ - Files: \`init.ts\`, \`config.ts\`
90
+ - Verify: \`node test-init.ts\`
91
+
92
+ - [x] **T02: Config** \`est:10m\`
93
+ Configure things.
94
+ - Files: \`settings.ts\`
95
+ - Verify: \`node test-config.ts\`
96
+ `;
97
+
98
+ const PLAN_S02_PARTIAL = `---
99
+ estimated_steps: 1
100
+ estimated_files: 1
101
+ skills_used: []
102
+ ---
103
+
104
+ # S02: Core
105
+
106
+ **Goal:** Build core.
107
+ **Demo:** Core works.
108
+
109
+ ## Tasks
110
+
111
+ - [x] **T01: Build** \`est:30m\`
112
+ Build it.
113
+ - Files: \`core.ts\`
114
+ - Verify: \`node test-build.ts\`
115
+
116
+ - [ ] **T02: Test** \`est:20m\`
117
+ Test it.
118
+ - Files: \`test-core.ts\`, \`helpers.ts\`
119
+ - Verify: \`npm test\`
120
+
121
+ - [ ] **T03: Polish** \`est:15m\`
122
+ Polish it.
123
+ - Files: \`polish.ts\`
124
+ - Verify: \`node test-polish.ts\`
125
+ `;
126
+
127
+ const SUMMARY_S01 = `---
128
+ id: S01
129
+ parent: M001
130
+ milestone: M001
131
+ ---
132
+
133
+ # S01: Setup — Summary
134
+
135
+ Setup is complete.
136
+ `;
137
+
138
+ // ─── Recovery helpers (mirrors gsd recover handler logic) ─────────────────
139
+
140
+ function clearHierarchyTables(): void {
141
+ const db = _getAdapter()!;
142
+ transaction(() => {
143
+ db.exec("DELETE FROM tasks");
144
+ db.exec("DELETE FROM slices");
145
+ db.exec("DELETE FROM milestones");
146
+ });
147
+ }
148
+
149
+ // ─── Tests ────────────────────────────────────────────────────────────────
150
+
151
+ async function main() {
152
+ // ─── Test (a): Full recovery round-trip ─────────────────────────────────
153
+ console.log('\n=== recover: full round-trip (populate → clear → recover → verify) ===');
154
+ {
155
+ const base = createFixtureBase();
156
+ try {
157
+ // Set up markdown fixtures
158
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
159
+ writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
160
+ writeFile(base, 'milestones/M001/slices/S01/S01-SUMMARY.md', SUMMARY_S01);
161
+ writeFile(base, 'milestones/M001/slices/S02/S02-PLAN.md', PLAN_S02_PARTIAL);
162
+
163
+ // Step 1: Open DB and populate from markdown
164
+ openDatabase(':memory:');
165
+ const counts1 = migrateHierarchyToDb(base);
166
+ assertEq(counts1.milestones, 1, 'round-trip: initial migration — 1 milestone');
167
+ assertEq(counts1.slices, 2, 'round-trip: initial migration — 2 slices');
168
+ assertTrue(counts1.tasks >= 5, 'round-trip: initial migration — at least 5 tasks');
169
+
170
+ // Step 2: Capture state from DB before clearing
171
+ invalidateStateCache();
172
+ const stateBefore = await deriveStateFromDb(base);
173
+ assertTrue(stateBefore.activeMilestone !== null, 'round-trip: state before has active milestone');
174
+ const milestonesBefore = getAllMilestones();
175
+ const slicesBefore = getMilestoneSlices('M001');
176
+ const s01TasksBefore = getSliceTasks('M001', 'S01');
177
+ const s02TasksBefore = getSliceTasks('M001', 'S02');
178
+
179
+ // Step 3: Clear hierarchy tables
180
+ clearHierarchyTables();
181
+ const milestonesAfterClear = getAllMilestones();
182
+ assertEq(milestonesAfterClear.length, 0, 'round-trip: milestones cleared');
183
+
184
+ // Step 4: Recover from markdown
185
+ const counts2 = migrateHierarchyToDb(base);
186
+ assertEq(counts2.milestones, counts1.milestones, 'round-trip: recovery milestone count matches');
187
+ assertEq(counts2.slices, counts1.slices, 'round-trip: recovery slice count matches');
188
+ assertEq(counts2.tasks, counts1.tasks, 'round-trip: recovery task count matches');
189
+
190
+ // Step 5: Verify state matches
191
+ invalidateStateCache();
192
+ const stateAfter = await deriveStateFromDb(base);
193
+
194
+ assertEq(stateAfter.phase, stateBefore.phase, 'round-trip: phase matches');
195
+ assertEq(
196
+ stateAfter.activeMilestone?.id,
197
+ stateBefore.activeMilestone?.id,
198
+ 'round-trip: active milestone ID matches',
199
+ );
200
+ assertEq(
201
+ stateAfter.activeSlice?.id,
202
+ stateBefore.activeSlice?.id,
203
+ 'round-trip: active slice ID matches',
204
+ );
205
+ assertEq(
206
+ stateAfter.activeTask?.id,
207
+ stateBefore.activeTask?.id,
208
+ 'round-trip: active task ID matches',
209
+ );
210
+
211
+ // Verify row-level data matches
212
+ const milestonesAfter = getAllMilestones();
213
+ assertEq(milestonesAfter.length, milestonesBefore.length, 'round-trip: milestone row count');
214
+ assertEq(milestonesAfter[0]?.id, milestonesBefore[0]?.id, 'round-trip: milestone ID');
215
+ assertEq(milestonesAfter[0]?.title, milestonesBefore[0]?.title, 'round-trip: milestone title');
216
+
217
+ const slicesAfter = getMilestoneSlices('M001');
218
+ assertEq(slicesAfter.length, slicesBefore.length, 'round-trip: slice row count');
219
+ assertEq(slicesAfter[0]?.id, slicesBefore[0]?.id, 'round-trip: S01 ID');
220
+ assertEq(slicesAfter[0]?.status, slicesBefore[0]?.status, 'round-trip: S01 status');
221
+ assertEq(slicesAfter[1]?.id, slicesBefore[1]?.id, 'round-trip: S02 ID');
222
+
223
+ const s01TasksAfter = getSliceTasks('M001', 'S01');
224
+ assertEq(s01TasksAfter.length, s01TasksBefore.length, 'round-trip: S01 task count');
225
+
226
+ const s02TasksAfter = getSliceTasks('M001', 'S02');
227
+ assertEq(s02TasksAfter.length, s02TasksBefore.length, 'round-trip: S02 task count');
228
+
229
+ closeDatabase();
230
+ } finally {
231
+ closeDatabase();
232
+ cleanup(base);
233
+ }
234
+ }
235
+
236
+ // ─── Test (a2): v8 planning columns populated after recovery ───────────
237
+ console.log('\n=== recover: v8 planning columns populated ===');
238
+ {
239
+ const base = createFixtureBase();
240
+ try {
241
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
242
+ writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
243
+ writeFile(base, 'milestones/M001/slices/S01/S01-SUMMARY.md', SUMMARY_S01);
244
+ writeFile(base, 'milestones/M001/slices/S02/S02-PLAN.md', PLAN_S02_PARTIAL);
245
+
246
+ openDatabase(':memory:');
247
+ migrateHierarchyToDb(base);
248
+
249
+ // Milestone planning columns
250
+ const milestone = getMilestone('M001');
251
+ assertTrue(milestone !== null, 'v8: milestone exists');
252
+ assertEq(milestone!.vision, 'Test recovery round-trip.', 'v8: milestone vision populated');
253
+ assertTrue(milestone!.success_criteria.length >= 2, 'v8: milestone success_criteria has entries');
254
+ assertEq(milestone!.success_criteria[0], 'All recovery tests pass', 'v8: first success criterion');
255
+ assertTrue(milestone!.boundary_map_markdown.includes('Boundary Map'), 'v8: boundary_map_markdown populated');
256
+ assertTrue(milestone!.boundary_map_markdown.includes('S01'), 'v8: boundary_map_markdown has S01');
257
+
258
+ // Tool-only fields left empty per D004
259
+ assertEq(milestone!.key_risks.length, 0, 'v8: key_risks left empty (tool-only per D004)');
260
+ assertEq(milestone!.requirement_coverage, '', 'v8: requirement_coverage left empty (tool-only per D004)');
261
+
262
+ // Slice planning columns
263
+ const sliceS01 = getSlice('M001', 'S01');
264
+ assertTrue(sliceS01 !== null, 'v8: slice S01 exists');
265
+ assertEq(sliceS01!.goal, 'Setup fixtures.', 'v8: S01 goal populated');
266
+
267
+ const sliceS02 = getSlice('M001', 'S02');
268
+ assertTrue(sliceS02 !== null, 'v8: slice S02 exists');
269
+ assertEq(sliceS02!.goal, 'Build core.', 'v8: S02 goal populated');
270
+
271
+ // Slice tool-only fields left empty per D004
272
+ assertEq(sliceS01!.proof_level, '', 'v8: S01 proof_level left empty (tool-only per D004)');
273
+
274
+ // Task planning columns — S01/T01
275
+ const taskS01T01 = getTask('M001', 'S01', 'T01');
276
+ assertTrue(taskS01T01 !== null, 'v8: task S01/T01 exists');
277
+ assertTrue(taskS01T01!.files.length >= 2, 'v8: S01/T01 files populated');
278
+ assertTrue(taskS01T01!.files.includes('init.ts'), 'v8: S01/T01 files includes init.ts');
279
+ assertTrue(taskS01T01!.files.includes('config.ts'), 'v8: S01/T01 files includes config.ts');
280
+ assertEq(taskS01T01!.verify, '`node test-init.ts`', 'v8: S01/T01 verify populated');
281
+
282
+ // Task planning columns — S02/T02
283
+ const taskS02T02 = getTask('M001', 'S02', 'T02');
284
+ assertTrue(taskS02T02 !== null, 'v8: task S02/T02 exists');
285
+ assertTrue(taskS02T02!.files.length >= 2, 'v8: S02/T02 files populated');
286
+ assertTrue(taskS02T02!.files.includes('test-core.ts'), 'v8: S02/T02 files includes test-core.ts');
287
+ assertEq(taskS02T02!.verify, '`npm test`', 'v8: S02/T02 verify populated');
288
+
289
+ // Task with no Files/Verify — not applicable since all fixtures now have them,
290
+ // but confirm a task from S02 has correct data
291
+ const taskS02T03 = getTask('M001', 'S02', 'T03');
292
+ assertTrue(taskS02T03 !== null, 'v8: task S02/T03 exists');
293
+ assertTrue(taskS02T03!.files.includes('polish.ts'), 'v8: S02/T03 files includes polish.ts');
294
+ assertEq(taskS02T03!.verify, '`node test-polish.ts`', 'v8: S02/T03 verify populated');
295
+
296
+ // Diagnostic: v8 planning columns queryable via SQL
297
+ const db = _getAdapter()!;
298
+ const milestoneRow = db.prepare("SELECT vision, success_criteria, boundary_map_markdown FROM milestones WHERE id = 'M001'").get() as any;
299
+ assertTrue(milestoneRow.vision.length > 0, 'v8-diag: vision column queryable');
300
+ assertTrue(milestoneRow.boundary_map_markdown.length > 0, 'v8-diag: boundary_map_markdown column queryable');
301
+
302
+ const sliceRow = db.prepare("SELECT goal FROM slices WHERE milestone_id = 'M001' AND id = 'S01'").get() as any;
303
+ assertTrue(sliceRow.goal.length > 0, 'v8-diag: goal column queryable');
304
+
305
+ const taskRow = db.prepare("SELECT files, verify FROM tasks WHERE milestone_id = 'M001' AND slice_id = 'S01' AND id = 'T01'").get() as any;
306
+ assertTrue(taskRow.files.length > 2, 'v8-diag: files column queryable (JSON array)');
307
+ assertTrue(taskRow.verify.length > 0, 'v8-diag: verify column queryable');
308
+
309
+ closeDatabase();
310
+ } finally {
311
+ closeDatabase();
312
+ cleanup(base);
313
+ }
314
+ }
315
+
316
+
317
+ // ─── Test (b): Idempotent recovery — double recover ────────────────────
318
+ console.log('\n=== recover: idempotent — double recovery produces same state ===');
319
+ {
320
+ const base = createFixtureBase();
321
+ try {
322
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
323
+ writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
324
+ writeFile(base, 'milestones/M001/slices/S01/S01-SUMMARY.md', SUMMARY_S01);
325
+ writeFile(base, 'milestones/M001/slices/S02/S02-PLAN.md', PLAN_S02_PARTIAL);
326
+
327
+ openDatabase(':memory:');
328
+
329
+ // First recovery
330
+ migrateHierarchyToDb(base);
331
+ invalidateStateCache();
332
+ const state1 = await deriveStateFromDb(base);
333
+
334
+ // Clear and recover again
335
+ clearHierarchyTables();
336
+ migrateHierarchyToDb(base);
337
+ invalidateStateCache();
338
+ const state2 = await deriveStateFromDb(base);
339
+
340
+ assertEq(state2.phase, state1.phase, 'idempotent: phase matches');
341
+ assertEq(
342
+ state2.activeMilestone?.id,
343
+ state1.activeMilestone?.id,
344
+ 'idempotent: active milestone matches',
345
+ );
346
+ assertEq(
347
+ state2.activeSlice?.id,
348
+ state1.activeSlice?.id,
349
+ 'idempotent: active slice matches',
350
+ );
351
+ assertEq(
352
+ state2.activeTask?.id,
353
+ state1.activeTask?.id,
354
+ 'idempotent: active task matches',
355
+ );
356
+
357
+ closeDatabase();
358
+ } finally {
359
+ closeDatabase();
360
+ cleanup(base);
361
+ }
362
+ }
363
+
364
+ // ─── Test (c): Recovery preserves non-hierarchy data ───────────────────
365
+ console.log('\n=== recover: preserves decisions/requirements ===');
366
+ {
367
+ const base = createFixtureBase();
368
+ try {
369
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
370
+ writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
371
+
372
+ openDatabase(':memory:');
373
+ migrateHierarchyToDb(base);
374
+
375
+ // Insert a decision and requirement manually
376
+ const db = _getAdapter()!;
377
+ db.prepare(
378
+ `INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable)
379
+ VALUES (:id, :when, :scope, :decision, :choice, :rationale, :revisable)`,
380
+ ).run({
381
+ ':id': 'D001',
382
+ ':when': 'T03',
383
+ ':scope': 'architecture',
384
+ ':decision': 'Use shared WAL',
385
+ ':choice': 'Single DB',
386
+ ':rationale': 'Simpler',
387
+ ':revisable': 'Yes',
388
+ });
389
+
390
+ db.prepare(
391
+ `INSERT INTO requirements (id, class, status, description)
392
+ VALUES (:id, :class, :status, :desc)`,
393
+ ).run({
394
+ ':id': 'R001',
395
+ ':class': 'functional',
396
+ ':status': 'active',
397
+ ':desc': 'Recovery works',
398
+ });
399
+
400
+ // Clear hierarchy only
401
+ clearHierarchyTables();
402
+
403
+ // Verify decisions and requirements survived
404
+ const decisions = db.prepare('SELECT * FROM decisions').all();
405
+ assertEq(decisions.length, 1, 'preserve: decision survives clear');
406
+ assertEq((decisions[0] as any).id, 'D001', 'preserve: decision ID intact');
407
+
408
+ const requirements = db.prepare('SELECT * FROM requirements').all();
409
+ assertEq(requirements.length, 1, 'preserve: requirement survives clear');
410
+ assertEq((requirements[0] as any).id, 'R001', 'preserve: requirement ID intact');
411
+
412
+ // Recover hierarchy
413
+ migrateHierarchyToDb(base);
414
+ const milestones = getAllMilestones();
415
+ assertTrue(milestones.length > 0, 'preserve: milestones recovered after clear');
416
+
417
+ // Verify non-hierarchy data still intact after recovery
418
+ const decisionsAfter = db.prepare('SELECT * FROM decisions').all();
419
+ assertEq(decisionsAfter.length, 1, 'preserve: decision still present after recovery');
420
+
421
+ closeDatabase();
422
+ } finally {
423
+ closeDatabase();
424
+ cleanup(base);
425
+ }
426
+ }
427
+
428
+ // ─── Test (d): Recovery from empty markdown dir ────────────────────────
429
+ console.log('\n=== recover: empty milestones dir ===');
430
+ {
431
+ const base = createFixtureBase();
432
+ try {
433
+ // No milestones written — just the empty dir
434
+ openDatabase(':memory:');
435
+
436
+ // Pre-populate to simulate existing state
437
+ insertMilestone({ id: 'M001', title: 'Ghost', status: 'active' });
438
+
439
+ // Clear and recover from empty
440
+ clearHierarchyTables();
441
+ const counts = migrateHierarchyToDb(base);
442
+ assertEq(counts.milestones, 0, 'empty: zero milestones recovered');
443
+ assertEq(counts.slices, 0, 'empty: zero slices recovered');
444
+ assertEq(counts.tasks, 0, 'empty: zero tasks recovered');
445
+
446
+ const all = getAllMilestones();
447
+ assertEq(all.length, 0, 'empty: no milestones in DB after recovery');
448
+
449
+ closeDatabase();
450
+ } finally {
451
+ closeDatabase();
452
+ cleanup(base);
453
+ }
454
+ }
455
+
456
+ report();
457
+ }
458
+
459
+ main().catch((error) => {
460
+ console.error(error);
461
+ process.exit(1);
462
+ });
@@ -5,7 +5,6 @@ import { execSync } from "node:child_process";
5
5
  import {
6
6
  resolveExpectedArtifactPath,
7
7
  writeBlockerPlaceholder,
8
- skipExecuteTask,
9
8
  verifyExpectedArtifact,
10
9
  buildLoopRemediationSteps,
11
10
  } from "../auto.ts";
@@ -157,129 +156,6 @@ function cleanup(base: string): void {
157
156
  }
158
157
  }
159
158
 
160
- // ═══ skipExecuteTask ═════════════════════════════════════════════════════════
161
-
162
- {
163
- console.log("\n=== skipExecuteTask: writes summary and checks plan checkbox ===");
164
- const base = createFixtureBase();
165
- try {
166
- const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
167
- writeFileSync(planPath, [
168
- "# S01: Test Slice",
169
- "",
170
- "## Tasks",
171
- "",
172
- "- [ ] **T01: First task** `est:10m`",
173
- " Do the first thing.",
174
- "- [ ] **T02: Second task** `est:15m`",
175
- " Do the second thing.",
176
- ].join("\n"), "utf-8");
177
-
178
- const result = skipExecuteTask(
179
- base, "M001", "S01", "T01",
180
- { summaryExists: false, taskChecked: false },
181
- "idle", 2,
182
- );
183
-
184
- assertTrue(result === true, "should return true");
185
-
186
- // Check summary was written
187
- const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
188
- assertTrue(existsSync(summaryPath), "task summary should exist");
189
- const summaryContent = readFileSync(summaryPath, "utf-8");
190
- assertTrue(summaryContent.includes("BLOCKER"), "summary should contain BLOCKER");
191
- assertTrue(summaryContent.includes("T01"), "summary should mention task ID");
192
-
193
- // Check plan checkbox was marked
194
- const planContent = readFileSync(planPath, "utf-8");
195
- assertTrue(planContent.includes("- [x] **T01:"), "T01 should be checked");
196
- assertTrue(planContent.includes("- [ ] **T02:"), "T02 should remain unchecked");
197
- } finally {
198
- cleanup(base);
199
- }
200
- }
201
-
202
- {
203
- console.log("\n=== skipExecuteTask: skips summary if already exists ===");
204
- const base = createFixtureBase();
205
- try {
206
- const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
207
- writeFileSync(planPath, "- [ ] **T01: Task** `est:10m`\n", "utf-8");
208
-
209
- // Pre-write a summary
210
- const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
211
- writeFileSync(summaryPath, "# Real summary\nActual work done.", "utf-8");
212
-
213
- const result = skipExecuteTask(
214
- base, "M001", "S01", "T01",
215
- { summaryExists: true, taskChecked: false },
216
- "idle", 2,
217
- );
218
-
219
- assertTrue(result === true, "should return true");
220
-
221
- // Summary should be untouched (not overwritten with blocker)
222
- const content = readFileSync(summaryPath, "utf-8");
223
- assertTrue(content.includes("Real summary"), "original summary should be preserved");
224
- assertTrue(!content.includes("BLOCKER"), "should not contain BLOCKER");
225
-
226
- // Plan checkbox should still be marked
227
- const planContent = readFileSync(planPath, "utf-8");
228
- assertTrue(planContent.includes("- [x] **T01:"), "T01 should be checked");
229
- } finally {
230
- cleanup(base);
231
- }
232
- }
233
-
234
- {
235
- console.log("\n=== skipExecuteTask: skips checkbox if already checked ===");
236
- const base = createFixtureBase();
237
- try {
238
- const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
239
- writeFileSync(planPath, "- [x] **T01: Task** `est:10m`\n", "utf-8");
240
-
241
- const result = skipExecuteTask(
242
- base, "M001", "S01", "T01",
243
- { summaryExists: false, taskChecked: true },
244
- "idle", 2,
245
- );
246
-
247
- assertTrue(result === true, "should return true");
248
-
249
- // Summary should be written (since summaryExists was false)
250
- const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
251
- assertTrue(existsSync(summaryPath), "task summary should exist");
252
-
253
- // Plan checkbox should be untouched
254
- const planContent = readFileSync(planPath, "utf-8");
255
- assertTrue(planContent.includes("- [x] **T01:"), "T01 should remain checked");
256
- } finally {
257
- cleanup(base);
258
- }
259
- }
260
-
261
- {
262
- console.log("\n=== skipExecuteTask: handles special regex chars in task ID ===");
263
- const base = createFixtureBase();
264
- try {
265
- const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
266
- writeFileSync(planPath, "- [ ] **T01.1: Sub-task** `est:10m`\n", "utf-8");
267
-
268
- const result = skipExecuteTask(
269
- base, "M001", "S01", "T01.1",
270
- { summaryExists: false, taskChecked: false },
271
- "idle", 2,
272
- );
273
-
274
- assertTrue(result === true, "should return true");
275
-
276
- const planContent = readFileSync(planPath, "utf-8");
277
- assertTrue(planContent.includes("- [x] **T01.1:"), "T01.1 should be checked (regex chars escaped)");
278
- } finally {
279
- cleanup(base);
280
- }
281
- }
282
-
283
159
  // ═══ verifyExpectedArtifact: complete-slice roadmap check ════════════════════
284
160
  // Regression for #indefinite-hang: complete-slice must verify roadmap [x] or
285
161
  // the idempotency skip loops forever after a crash that wrote SUMMARY+UAT but
@@ -370,12 +246,9 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
370
246
  mkdirSync(join(base, ".gsd", "milestones", "M002", "slices", "S03", "tasks"), { recursive: true });
371
247
  const result = buildLoopRemediationSteps("execute-task", "M002/S03/T01", base);
372
248
  assertTrue(result !== null, "should return remediation steps");
373
- assertTrue(result!.includes("T01-SUMMARY.md"), "steps mention the summary file");
374
- assertTrue(result!.includes("S03-PLAN.md"), "steps mention the slice plan");
249
+ assertTrue(result!.includes("gsd undo-task"), "steps include undo-task command");
375
250
  assertTrue(result!.includes("T01"), "steps mention the task ID");
376
- assertTrue(result!.includes("gsd doctor"), "steps include gsd doctor command");
377
- // Exact slice plan checkbox syntax (no trailing **)
378
- assertTrue(result!.includes('"- [x] **T01:"'), "steps show exact checkbox syntax without trailing **");
251
+ assertTrue(result!.includes("gsd undo-task"), "steps include gsd undo-task command");
379
252
  } finally {
380
253
  rmSync(base, { recursive: true, force: true });
381
254
  }
@@ -389,7 +262,7 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
389
262
  const result = buildLoopRemediationSteps("plan-slice", "M001/S01", base);
390
263
  assertTrue(result !== null, "should return remediation steps for plan-slice");
391
264
  assertTrue(result!.includes("S01-PLAN.md"), "steps mention the slice plan file");
392
- assertTrue(result!.includes("gsd doctor"), "steps include gsd doctor command");
265
+ assertTrue(result!.includes("gsd recover"), "steps include gsd recover command");
393
266
  } finally {
394
267
  rmSync(base, { recursive: true, force: true });
395
268
  }
@@ -403,7 +276,7 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
403
276
  const result = buildLoopRemediationSteps("research-slice", "M001/S01", base);
404
277
  assertTrue(result !== null, "should return remediation steps for research-slice");
405
278
  assertTrue(result!.includes("S01-RESEARCH.md"), "steps mention the slice research file");
406
- assertTrue(result!.includes("gsd doctor"), "steps include gsd doctor command");
279
+ assertTrue(result!.includes("gsd recover"), "steps include gsd recover command");
407
280
  } finally {
408
281
  rmSync(base, { recursive: true, force: true });
409
282
  }
@@ -420,47 +293,6 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
420
293
  }
421
294
  }
422
295
 
423
- {
424
- console.log("\n=== skipExecuteTask: loop-recovery writes blocker when both summary and checkbox missing ===");
425
- const base = mkdtempSync(join(tmpdir(), "gsd-loop-recovery-test-"));
426
- try {
427
- mkdirSync(join(base, ".gsd", "milestones", "M002", "slices", "S03", "tasks"), { recursive: true });
428
- const planPath = join(base, ".gsd", "milestones", "M002", "slices", "S03", "S03-PLAN.md");
429
- writeFileSync(planPath, [
430
- "# S03: Harden guided session",
431
- "",
432
- "## Tasks",
433
- "",
434
- "- [ ] **T01: Harden contract usage** `est:30m`",
435
- " Harden guided session contract usage in desktop flow.",
436
- ].join("\n"), "utf-8");
437
-
438
- const result = skipExecuteTask(
439
- base, "M002", "S03", "T01",
440
- { summaryExists: false, taskChecked: false },
441
- "loop-recovery",
442
- // 3 == MAX_UNIT_DISPATCHES: represents the prevCount when the final
443
- // reconciliation path runs (loop detected, reconciling before halting).
444
- 3,
445
- );
446
-
447
- assertTrue(result === true, "loop-recovery should succeed");
448
-
449
- // Blocker summary written
450
- const summaryPath = join(base, ".gsd", "milestones", "M002", "slices", "S03", "tasks", "T01-SUMMARY.md");
451
- assertTrue(existsSync(summaryPath), "blocker summary should be written");
452
- const summaryContent = readFileSync(summaryPath, "utf-8");
453
- assertTrue(summaryContent.includes("BLOCKER"), "summary should be a blocker placeholder");
454
- assertTrue(summaryContent.includes("loop-recovery"), "summary should mention the recovery reason");
455
-
456
- // Checkbox marked
457
- const planContent = readFileSync(planPath, "utf-8");
458
- assertTrue(planContent.includes("- [x] **T01:"), "T01 checkbox should be marked [x] after loop-recovery");
459
- } finally {
460
- rmSync(base, { recursive: true, force: true });
461
- }
462
- }
463
-
464
296
  // ═══ verifyExpectedArtifact: hook unit types ═════════════════════════════════
465
297
 
466
298
  console.log("\n=== verifyExpectedArtifact: hook types always return true ===");