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,643 @@
1
+ /**
2
+ * integration-proof.test.ts — End-to-end integration proof for M001.
3
+ *
4
+ * Proves all S01–S06 subsystems compose correctly:
5
+ * auto-migration → complete_task → complete_slice → deriveState crossval →
6
+ * doctor zero-fix → rogue detection → DB recovery → undo/reset
7
+ *
8
+ * Requirement coverage:
9
+ * R001 (task completion) — step 3c
10
+ * R002 (slice completion) — step 3e
11
+ * R003 (auto-migration) — step 3b
12
+ * R004 (markdown rendering) — steps 3d, 3f
13
+ * R005 (deriveState crossval) — step 3g
14
+ * R006 (prompt migration) — deferred to T02 grep
15
+ * R007 (hierarchy migration) — step 3b
16
+ * R008 (rogue detection) — step 3i
17
+ * R009 (doctor zero-fix) — step 3h
18
+ * R010 (DB recovery) — step 4
19
+ * R011 (undo/reset) — step 5
20
+ * R012 (shared WAL) — implicit (file-backed DB uses WAL throughout)
21
+ * R013 (stale render) — step 4 stale detection
22
+ */
23
+
24
+ import test from "node:test";
25
+ import assert from "node:assert/strict";
26
+ import {
27
+ mkdtempSync,
28
+ mkdirSync,
29
+ writeFileSync,
30
+ readFileSync,
31
+ rmSync,
32
+ existsSync,
33
+ unlinkSync,
34
+ } from "node:fs";
35
+ import { tmpdir } from "node:os";
36
+ import { join } from "node:path";
37
+
38
+ // ── DB layer ──────────────────────────────────────────────────────────────
39
+ import {
40
+ openDatabase,
41
+ closeDatabase,
42
+ insertMilestone,
43
+ insertSlice,
44
+ insertTask,
45
+ getTask,
46
+ getSliceTasks,
47
+ getSlice,
48
+ updateTaskStatus,
49
+ updateSliceStatus,
50
+ transaction,
51
+ isDbAvailable,
52
+ _getAdapter,
53
+ } from "../gsd-db.ts";
54
+
55
+ // ── Tool handlers ─────────────────────────────────────────────────────────
56
+ import { handleCompleteTask } from "../tools/complete-task.ts";
57
+ import { handleCompleteSlice } from "../tools/complete-slice.ts";
58
+
59
+ // ── Markdown renderer ─────────────────────────────────────────────────────
60
+ import {
61
+ renderPlanCheckboxes,
62
+ renderRoadmapCheckboxes,
63
+ renderAllFromDb,
64
+ detectStaleRenders,
65
+ repairStaleRenders,
66
+ } from "../markdown-renderer.ts";
67
+
68
+ // ── State derivation ──────────────────────────────────────────────────────
69
+ import {
70
+ deriveStateFromDb,
71
+ _deriveStateImpl,
72
+ invalidateStateCache,
73
+ } from "../state.ts";
74
+
75
+ // ── Auto-migration ───────────────────────────────────────────────────────
76
+ import {
77
+ migrateHierarchyToDb,
78
+ migrateFromMarkdown,
79
+ } from "../md-importer.ts";
80
+
81
+ // ── Post-unit diagnostics ─────────────────────────────────────────────────
82
+ import { detectRogueFileWrites } from "../auto-post-unit.ts";
83
+
84
+ // ── Doctor ────────────────────────────────────────────────────────────────
85
+ import { runGSDDoctor } from "../doctor.ts";
86
+
87
+ // ── Undo/reset ────────────────────────────────────────────────────────────
88
+ import { handleUndoTask, handleResetSlice } from "../undo.ts";
89
+
90
+ // ── Cache invalidation ───────────────────────────────────────────────────
91
+ import { invalidateAllCaches } from "../cache.ts";
92
+
93
+ // ═══════════════════════════════════════════════════════════════════════════
94
+ // Helpers
95
+ // ═══════════════════════════════════════════════════════════════════════════
96
+
97
+ function makeTempDir(): string {
98
+ return mkdtempSync(join(tmpdir(), "gsd-integration-proof-"));
99
+ }
100
+
101
+ function makeCtx(): { notifications: Array<{ message: string; level: string }>; ctx: any } {
102
+ const notifications: Array<{ message: string; level: string }> = [];
103
+ const ctx = {
104
+ ui: {
105
+ notify(message: string, level: string) {
106
+ notifications.push({ message, level });
107
+ },
108
+ },
109
+ };
110
+ return { notifications, ctx };
111
+ }
112
+
113
+ /**
114
+ * Create a temp directory with a realistic .gsd/ structure:
115
+ * - M001-ROADMAP.md with one slice (S01, two tasks T01/T02)
116
+ * - S01-PLAN.md with two task checkboxes
117
+ * - REQUIREMENTS.md and DECISIONS.md stubs to keep doctor happy
118
+ */
119
+ function createRealisticFixture(): string {
120
+ const base = makeTempDir();
121
+ const gsdDir = join(base, ".gsd");
122
+ const mDir = join(gsdDir, "milestones", "M001");
123
+ const sliceDir = join(mDir, "slices", "S01");
124
+ const tasksDir = join(sliceDir, "tasks");
125
+
126
+ mkdirSync(tasksDir, { recursive: true });
127
+ mkdirSync(join(gsdDir, "activity"), { recursive: true });
128
+
129
+ // Roadmap with exact format
130
+ writeFileSync(
131
+ join(mDir, "M001-ROADMAP.md"),
132
+ `# M001: Integration Proof Milestone
133
+
134
+ ## Vision
135
+
136
+ Prove all subsystems compose.
137
+
138
+ ## Success Criteria
139
+
140
+ - All tests pass
141
+
142
+ ## Slices
143
+
144
+ - [ ] **S01: Core Feature** \`risk:low\` \`depends:[]\`
145
+ - After this: Core feature is proven end-to-end.
146
+
147
+ ## Boundary Map
148
+
149
+ | From | To | Produces | Consumes |
150
+ |------|----|----------|----------|
151
+ | S01 | terminal | Working feature | nothing |
152
+ `,
153
+ "utf-8",
154
+ );
155
+
156
+ // Plan with exact format
157
+ writeFileSync(
158
+ join(sliceDir, "S01-PLAN.md"),
159
+ `# S01: Core Feature
160
+
161
+ **Goal:** Implement and prove the core feature.
162
+ **Demo:** Feature works end-to-end.
163
+
164
+ ## Must-Haves
165
+
166
+ - Feature works correctly
167
+
168
+ ## Tasks
169
+
170
+ - [ ] **T01: First implementation** \`est:30m\`
171
+ - Do: Implement the first part
172
+ - Verify: Run tests
173
+
174
+ - [ ] **T02: Second implementation** \`est:30m\`
175
+ - Do: Implement the second part
176
+ - Verify: Run tests
177
+
178
+ ## Files Likely Touched
179
+
180
+ - src/feature.ts
181
+ `,
182
+ "utf-8",
183
+ );
184
+
185
+ // Minimal REQUIREMENTS.md
186
+ writeFileSync(
187
+ join(gsdDir, "REQUIREMENTS.md"),
188
+ `# Requirements
189
+
190
+ ## Active
191
+
192
+ | ID | Description | Owner |
193
+ |----|-------------|-------|
194
+ | R001 | Task completion | S01 |
195
+ `,
196
+ "utf-8",
197
+ );
198
+
199
+ // Minimal DECISIONS.md
200
+ writeFileSync(
201
+ join(gsdDir, "DECISIONS.md"),
202
+ `# Decisions
203
+
204
+ | ID | Decision | Choice | Rationale |
205
+ |----|----------|--------|-----------|
206
+ `,
207
+ "utf-8",
208
+ );
209
+
210
+ // PROJECT.md stub
211
+ writeFileSync(
212
+ join(gsdDir, "PROJECT.md"),
213
+ "# Integration Proof Project\n\nTest project for integration proof.\n",
214
+ "utf-8",
215
+ );
216
+
217
+ return base;
218
+ }
219
+
220
+ function makeCompleteTaskParams(taskId: string): any {
221
+ return {
222
+ taskId,
223
+ sliceId: "S01",
224
+ milestoneId: "M001",
225
+ oneLiner: `Completed ${taskId} successfully`,
226
+ narrative: `Implemented ${taskId} with full coverage.`,
227
+ verification: "All tests pass.",
228
+ keyFiles: ["src/feature.ts"],
229
+ keyDecisions: [],
230
+ deviations: "None.",
231
+ knownIssues: "None.",
232
+ blockerDiscovered: false,
233
+ verificationEvidence: [
234
+ {
235
+ command: "npm run test:unit",
236
+ exitCode: 0,
237
+ verdict: "✅ pass",
238
+ durationMs: 3000,
239
+ },
240
+ ],
241
+ };
242
+ }
243
+
244
+ function makeCompleteSliceParams(): any {
245
+ return {
246
+ sliceId: "S01",
247
+ milestoneId: "M001",
248
+ sliceTitle: "Core Feature",
249
+ oneLiner: "Core feature proven end-to-end",
250
+ narrative: "All tasks completed and verified.",
251
+ verification: "Full test suite passes.",
252
+ keyFiles: ["src/feature.ts"],
253
+ keyDecisions: [],
254
+ patternsEstablished: [],
255
+ observabilitySurfaces: [],
256
+ deviations: "None.",
257
+ knownLimitations: "None.",
258
+ followUps: "None.",
259
+ requirementsAdvanced: [],
260
+ requirementsValidated: [],
261
+ requirementsSurfaced: [],
262
+ requirementsInvalidated: [],
263
+ filesModified: [{ path: "src/feature.ts", description: "Core feature" }],
264
+ uatContent: "All acceptance criteria met.",
265
+ provides: ["core-feature"],
266
+ requires: [],
267
+ affects: [],
268
+ drillDownPaths: [],
269
+ };
270
+ }
271
+
272
+ // ═══════════════════════════════════════════════════════════════════════════
273
+ // Core lifecycle: migrate → complete_task × 2 → complete_slice →
274
+ // deriveState crossval → doctor → rogue detection
275
+ // ═══════════════════════════════════════════════════════════════════════════
276
+
277
+ test("full lifecycle: migration through completion through doctor", async (t) => {
278
+ const base = createRealisticFixture();
279
+ const dbPath = join(base, ".gsd", "gsd.db");
280
+
281
+ try {
282
+ // ── (a) Open file-backed DB ──────────────────────────────────────
283
+ const opened = openDatabase(dbPath);
284
+ assert.equal(opened, true, "DB should open successfully");
285
+ assert.equal(isDbAvailable(), true, "DB should be available");
286
+
287
+ // Verify WAL mode (R012 — implicit proof via file-backed DB)
288
+ const adapter = _getAdapter()!;
289
+ const journalMode = adapter.prepare("PRAGMA journal_mode").get();
290
+ assert.equal(
291
+ (journalMode as any)?.journal_mode,
292
+ "wal",
293
+ "file-backed DB should use WAL mode",
294
+ );
295
+
296
+ // ── (b) Auto-migrate markdown → DB (R003, R007) ─────────────────
297
+ const counts = migrateHierarchyToDb(base);
298
+ assert.equal(counts.milestones, 1, "should migrate 1 milestone");
299
+ assert.equal(counts.slices, 1, "should migrate 1 slice");
300
+ assert.equal(counts.tasks, 2, "should migrate 2 tasks");
301
+
302
+ // Verify DB rows after migration
303
+ const t1Before = getTask("M001", "S01", "T01");
304
+ assert.ok(t1Before, "T01 should exist in DB after migration");
305
+ assert.equal(t1Before!.status, "pending", "T01 should be pending after migration");
306
+
307
+ const t2Before = getTask("M001", "S01", "T02");
308
+ assert.ok(t2Before, "T02 should exist in DB after migration");
309
+ assert.equal(t2Before!.status, "pending", "T02 should be pending after migration");
310
+
311
+ // ── (c) Complete T01 and T02 via handleCompleteTask (R001) ───────
312
+ const r1 = await handleCompleteTask(makeCompleteTaskParams("T01"), base);
313
+ assert.ok(!("error" in r1), `T01 completion should succeed: ${JSON.stringify(r1)}`);
314
+
315
+ const r2 = await handleCompleteTask(makeCompleteTaskParams("T02"), base);
316
+ assert.ok(!("error" in r2), `T02 completion should succeed: ${JSON.stringify(r2)}`);
317
+
318
+ // ── (d) Verify DB rows and markdown summaries on disk (R004) ─────
319
+ const t1After = getTask("M001", "S01", "T01");
320
+ assert.equal(t1After!.status, "complete", "T01 should be complete in DB");
321
+ assert.ok(t1After!.one_liner, "T01 should have one_liner in DB");
322
+
323
+ const t2After = getTask("M001", "S01", "T02");
324
+ assert.equal(t2After!.status, "complete", "T02 should be complete in DB");
325
+
326
+ // Verify T01-SUMMARY.md on disk
327
+ if (!("error" in r1)) {
328
+ assert.ok(existsSync(r1.summaryPath), "T01 summary file should exist on disk");
329
+ const t1Summary = readFileSync(r1.summaryPath, "utf-8");
330
+ assert.match(t1Summary, /id: T01/, "T01 summary should contain frontmatter");
331
+ assert.match(t1Summary, /Completed T01 successfully/, "T01 summary should contain one-liner");
332
+ }
333
+
334
+ // Verify plan checkboxes toggled
335
+ const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
336
+ const planAfterTasks = readFileSync(planPath, "utf-8");
337
+ assert.match(planAfterTasks, /\[x\]\s+\*\*T01:/, "T01 should be checked in plan");
338
+ assert.match(planAfterTasks, /\[x\]\s+\*\*T02:/, "T02 should be checked in plan");
339
+
340
+ // ── (e) Complete slice via handleCompleteSlice (R002) ─────────────
341
+ invalidateAllCaches();
342
+ const sliceResult = await handleCompleteSlice(makeCompleteSliceParams(), base);
343
+ assert.ok(!("error" in sliceResult), `Slice completion should succeed: ${JSON.stringify(sliceResult)}`);
344
+
345
+ // ── (f) Verify slice artifacts on disk (R004) ────────────────────
346
+ if (!("error" in sliceResult)) {
347
+ assert.ok(existsSync(sliceResult.summaryPath), "Slice summary should exist on disk");
348
+ assert.ok(existsSync(sliceResult.uatPath), "Slice UAT should exist on disk");
349
+
350
+ const sliceSummary = readFileSync(sliceResult.summaryPath, "utf-8");
351
+ assert.match(sliceSummary, /id: S01/, "Slice summary should contain frontmatter");
352
+ assert.match(sliceSummary, /Core feature proven/, "Slice summary should contain one-liner");
353
+ }
354
+
355
+ // Verify roadmap checkbox toggled
356
+ const roadmapPath = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
357
+ const roadmapAfter = readFileSync(roadmapPath, "utf-8");
358
+ assert.match(roadmapAfter, /\[x\]\s+\*\*S01:/, "S01 should be checked in roadmap");
359
+
360
+ // Verify slice status in DB
361
+ const sliceRow = getSlice("M001", "S01");
362
+ assert.equal(sliceRow?.status, "complete", "S01 should be complete in DB");
363
+
364
+ // ── (g) deriveState cross-validation (R005) ──────────────────────
365
+ invalidateStateCache();
366
+ invalidateAllCaches();
367
+ const dbState = await deriveStateFromDb(base);
368
+ const fileState = await _deriveStateImpl(base);
369
+
370
+ // Both paths should agree on key fields
371
+ assert.equal(
372
+ dbState.activeMilestone?.id ?? null,
373
+ fileState.activeMilestone?.id ?? null,
374
+ "activeMilestone.id should match between DB and filesystem paths",
375
+ );
376
+ assert.equal(
377
+ dbState.activeSlice?.id ?? null,
378
+ fileState.activeSlice?.id ?? null,
379
+ "activeSlice.id should match between DB and filesystem paths",
380
+ );
381
+ assert.equal(dbState.phase, fileState.phase, "phase should match between DB and filesystem paths");
382
+ assert.equal(
383
+ dbState.registry.length,
384
+ fileState.registry.length,
385
+ "registry length should match",
386
+ );
387
+
388
+ // ── (h) Doctor zero-fix (R009) ───────────────────────────────────
389
+ const doctorReport = await runGSDDoctor(base, {
390
+ fix: false,
391
+ isolationMode: "none",
392
+ });
393
+ // Filter to only errors (warnings/info about env, git, etc. are expected in a temp dir)
394
+ const errors = doctorReport.issues.filter(i => i.severity === "error");
395
+ // Doctor should produce zero fixable reconciliation issues on a healthy state
396
+ const reconciliationErrors = errors.filter(i =>
397
+ i.code.includes("checkbox") || i.code.includes("reconcil") || i.code.includes("cascade"),
398
+ );
399
+ assert.equal(
400
+ reconciliationErrors.length,
401
+ 0,
402
+ `Doctor should find zero reconciliation errors, got: ${JSON.stringify(reconciliationErrors)}`,
403
+ );
404
+
405
+ // ── (i) Rogue file detection (R008) ──────────────────────────────
406
+ // Write a fake summary for a non-DB-tracked task T99
407
+ const rogueDir = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks");
408
+ writeFileSync(join(rogueDir, "T99-SUMMARY.md"), "# Rogue Summary\n", "utf-8");
409
+
410
+ // Clear path cache so resolveTaskFile sees the newly written file
411
+ const { clearPathCache } = await import("../paths.ts");
412
+ clearPathCache();
413
+
414
+ const rogues = detectRogueFileWrites("execute-task", "M001/S01/T99", base);
415
+ assert.ok(rogues.length > 0, "Should detect rogue file write for T99");
416
+ assert.equal(rogues[0].unitId, "M001/S01/T99", "Rogue detection should identify the correct unit");
417
+ } finally {
418
+ closeDatabase();
419
+ rmSync(base, { recursive: true, force: true });
420
+ }
421
+ });
422
+
423
+ // ═══════════════════════════════════════════════════════════════════════════
424
+ // Recovery: DB deletion → migrateFromMarkdown → state reconstruction (R010)
425
+ // Stale render detection (R013)
426
+ // ═══════════════════════════════════════════════════════════════════════════
427
+
428
+ test("recovery: DB loss → migrateFromMarkdown restores state, stale render detection", async (t) => {
429
+ const base = createRealisticFixture();
430
+ const dbPath = join(base, ".gsd", "gsd.db");
431
+
432
+ try {
433
+ // Set up a completed state first
434
+ openDatabase(dbPath);
435
+ migrateHierarchyToDb(base);
436
+ await handleCompleteTask(makeCompleteTaskParams("T01"), base);
437
+ await handleCompleteTask(makeCompleteTaskParams("T02"), base);
438
+ invalidateAllCaches();
439
+ await handleCompleteSlice(makeCompleteSliceParams(), base);
440
+
441
+ // Verify we have a healthy DB with completed state
442
+ const sliceBefore = getSlice("M001", "S01");
443
+ assert.equal(sliceBefore?.status, "complete", "Slice should be complete before recovery test");
444
+
445
+ // ── Stale render detection (R013) ────────────────────────────────
446
+ // Mutate a task status in DB to create a stale condition
447
+ // (DB says pending but plan checkbox says [x])
448
+ updateTaskStatus("M001", "S01", "T01", "pending", new Date().toISOString());
449
+ invalidateAllCaches();
450
+
451
+ const staleEntries = detectStaleRenders(base);
452
+ assert.ok(staleEntries.length > 0, "Should detect stale renders after DB mutation");
453
+
454
+ // Restore the task status for the recovery test
455
+ updateTaskStatus("M001", "S01", "T01", "complete", new Date().toISOString());
456
+
457
+ // ── DB deletion + recovery (R010) ────────────────────────────────
458
+ closeDatabase();
459
+
460
+ // Delete the DB file and any WAL/SHM files
461
+ for (const suffix of ["", "-wal", "-shm"]) {
462
+ const f = dbPath + suffix;
463
+ if (existsSync(f)) unlinkSync(f);
464
+ }
465
+
466
+ assert.equal(existsSync(dbPath), false, "DB file should be deleted");
467
+
468
+ // Clear path caches so gsdRoot re-probes after DB deletion
469
+ const { clearPathCache: clearPaths } = await import("../paths.ts");
470
+ clearPaths();
471
+ invalidateAllCaches();
472
+
473
+ // Recover from markdown — migrateFromMarkdown takes basePath (project root)
474
+ const recoveryResult = migrateFromMarkdown(base);
475
+
476
+ assert.ok(
477
+ recoveryResult.hierarchy.milestones >= 1,
478
+ "Recovery should import at least 1 milestone",
479
+ );
480
+ assert.ok(
481
+ recoveryResult.hierarchy.slices >= 1,
482
+ "Recovery should import at least 1 slice",
483
+ );
484
+ assert.ok(
485
+ recoveryResult.hierarchy.tasks >= 2,
486
+ "Recovery should import at least 2 tasks",
487
+ );
488
+
489
+ // Verify state is reconstructed — slice should be complete (roadmap says [x])
490
+ const sliceAfter = getSlice("M001", "S01");
491
+ assert.ok(sliceAfter, "S01 should exist in DB after recovery");
492
+ assert.equal(
493
+ sliceAfter!.status,
494
+ "complete",
495
+ "S01 should be complete after recovery (roadmap checkbox was [x])",
496
+ );
497
+
498
+ // Tasks should be complete too (plan checkboxes were [x])
499
+ const t1Recovered = getTask("M001", "S01", "T01");
500
+ assert.ok(t1Recovered, "T01 should exist after recovery");
501
+ assert.equal(t1Recovered!.status, "complete", "T01 should be complete after recovery");
502
+
503
+ const t2Recovered = getTask("M001", "S01", "T02");
504
+ assert.ok(t2Recovered, "T02 should exist after recovery");
505
+ assert.equal(t2Recovered!.status, "complete", "T02 should be complete after recovery");
506
+ } finally {
507
+ closeDatabase();
508
+ rmSync(base, { recursive: true, force: true });
509
+ }
510
+ });
511
+
512
+ // ═══════════════════════════════════════════════════════════════════════════
513
+ // Undo/reset: handleUndoTask + handleResetSlice (R011)
514
+ // ═══════════════════════════════════════════════════════════════════════════
515
+
516
+ test("undo/reset: undo task and reset slice revert DB + markdown", async (t) => {
517
+ const base = createRealisticFixture();
518
+ const dbPath = join(base, ".gsd", "gsd.db");
519
+
520
+ try {
521
+ // Build up completed state
522
+ openDatabase(dbPath);
523
+ migrateHierarchyToDb(base);
524
+ await handleCompleteTask(makeCompleteTaskParams("T01"), base);
525
+ await handleCompleteTask(makeCompleteTaskParams("T02"), base);
526
+ invalidateAllCaches();
527
+ await handleCompleteSlice(makeCompleteSliceParams(), base);
528
+
529
+ // Verify completed state
530
+ assert.equal(getTask("M001", "S01", "T01")?.status, "complete");
531
+ assert.equal(getTask("M001", "S01", "T02")?.status, "complete");
532
+ assert.equal(getSlice("M001", "S01")?.status, "complete");
533
+
534
+ // ── Undo T01 ─────────────────────────────────────────────────────
535
+ const { notifications: undoNotifs, ctx: undoCtx } = makeCtx();
536
+ await handleUndoTask("M001/S01/T01 --force", undoCtx, {} as any, base);
537
+
538
+ // DB status should revert
539
+ const t1Undone = getTask("M001", "S01", "T01");
540
+ assert.equal(t1Undone?.status, "pending", "T01 should be pending after undo");
541
+
542
+ // T01 summary file should be deleted
543
+ const t1SummaryPath = join(
544
+ base,
545
+ ".gsd",
546
+ "milestones",
547
+ "M001",
548
+ "slices",
549
+ "S01",
550
+ "tasks",
551
+ "T01-SUMMARY.md",
552
+ );
553
+ assert.equal(existsSync(t1SummaryPath), false, "T01 summary should be deleted after undo");
554
+
555
+ // Plan checkbox should be unchecked
556
+ const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
557
+ const planAfterUndo = readFileSync(planPath, "utf-8");
558
+ assert.match(planAfterUndo, /\[ \]\s+\*\*T01:/, "T01 should be unchecked in plan after undo");
559
+
560
+ // T02 should still be complete
561
+ assert.equal(getTask("M001", "S01", "T02")?.status, "complete", "T02 should still be complete");
562
+
563
+ // Undo notification should be success
564
+ assert.ok(
565
+ undoNotifs.some(n => n.level === "success"),
566
+ "Undo should produce success notification",
567
+ );
568
+
569
+ // ── Reset S01 ────────────────────────────────────────────────────
570
+ // Re-complete T01 first so we can reset the whole slice
571
+ await handleCompleteTask(makeCompleteTaskParams("T01"), base);
572
+ invalidateAllCaches();
573
+
574
+ // Re-complete slice
575
+ await handleCompleteSlice(makeCompleteSliceParams(), base);
576
+
577
+ const { notifications: resetNotifs, ctx: resetCtx } = makeCtx();
578
+ await handleResetSlice("M001/S01 --force", resetCtx, {} as any, base);
579
+
580
+ // All tasks should be pending
581
+ assert.equal(getTask("M001", "S01", "T01")?.status, "pending", "T01 should be pending after reset");
582
+ assert.equal(getTask("M001", "S01", "T02")?.status, "pending", "T02 should be pending after reset");
583
+
584
+ // Slice should be active (not complete)
585
+ const sliceAfterReset = getSlice("M001", "S01");
586
+ assert.equal(sliceAfterReset?.status, "active", "S01 should be active after reset");
587
+
588
+ // Task summaries should be deleted
589
+ assert.equal(existsSync(t1SummaryPath), false, "T01 summary should be deleted after reset");
590
+ const t2SummaryPath = join(
591
+ base,
592
+ ".gsd",
593
+ "milestones",
594
+ "M001",
595
+ "slices",
596
+ "S01",
597
+ "tasks",
598
+ "T02-SUMMARY.md",
599
+ );
600
+ assert.equal(existsSync(t2SummaryPath), false, "T02 summary should be deleted after reset");
601
+
602
+ // Slice summary and UAT should be deleted
603
+ const sliceSummaryPath = join(
604
+ base,
605
+ ".gsd",
606
+ "milestones",
607
+ "M001",
608
+ "slices",
609
+ "S01",
610
+ "S01-SUMMARY.md",
611
+ );
612
+ const sliceUatPath = join(
613
+ base,
614
+ ".gsd",
615
+ "milestones",
616
+ "M001",
617
+ "slices",
618
+ "S01",
619
+ "S01-UAT.md",
620
+ );
621
+ assert.equal(existsSync(sliceSummaryPath), false, "Slice summary should be deleted after reset");
622
+ assert.equal(existsSync(sliceUatPath), false, "Slice UAT should be deleted after reset");
623
+
624
+ // Plan checkboxes should be unchecked
625
+ const planAfterReset = readFileSync(planPath, "utf-8");
626
+ assert.match(planAfterReset, /\[ \]\s+\*\*T01:/, "T01 should be unchecked after reset");
627
+ assert.match(planAfterReset, /\[ \]\s+\*\*T02:/, "T02 should be unchecked after reset");
628
+
629
+ // Roadmap checkbox should be unchecked
630
+ const roadmapPath = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
631
+ const roadmapAfterReset = readFileSync(roadmapPath, "utf-8");
632
+ assert.match(roadmapAfterReset, /\[ \]\s+\*\*S01:/, "S01 should be unchecked in roadmap after reset");
633
+
634
+ // Reset notification should be success
635
+ assert.ok(
636
+ resetNotifs.some(n => n.level === "success"),
637
+ "Reset should produce success notification",
638
+ );
639
+ } finally {
640
+ closeDatabase();
641
+ rmSync(base, { recursive: true, force: true });
642
+ }
643
+ });
@@ -91,8 +91,6 @@ function makeMockDeps(
91
91
  runPreDispatchHooks: () => ({ firedHooks: [], action: "proceed" }),
92
92
  getPriorSliceCompletionBlocker: () => null,
93
93
  getMainBranch: () => "main",
94
- collectObservabilityWarnings: async () => [],
95
- buildObservabilityRepairBlock: () => null,
96
94
  closeoutUnit: async () => {},
97
95
  verifyExpectedArtifact: () => true,
98
96
  clearUnitRuntimeRecord: () => {},
@@ -287,7 +285,6 @@ test("runUnitPhase emits unit-start and unit-end with causedBy reference", async
287
285
  prompt: "do stuff",
288
286
  finalPrompt: "do stuff",
289
287
  pauseAfterUatDispatch: false,
290
- observabilityIssues: [],
291
288
  state: { phase: "executing", activeMilestone: { id: "M001" }, activeSlice: { id: "S01" }, registry: [], blockers: [] } as any,
292
289
  mid: "M001",
293
290
  midTitle: "Test",