gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/dist/cli.js +13 -1
  2. package/dist/help-text.js +24 -0
  3. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  4. package/dist/resources/extensions/github-sync/sync.js +2 -1
  5. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  7. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  8. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  11. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  12. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  13. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  14. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  15. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  16. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  17. package/dist/resources/extensions/gsd/auto.js +1 -4
  18. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  19. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  21. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  22. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  23. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  26. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  28. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  29. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  30. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  31. package/dist/resources/extensions/gsd/doctor.js +46 -282
  32. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  33. package/dist/resources/extensions/gsd/files.js +14 -198
  34. package/dist/resources/extensions/gsd/git-service.js +4 -0
  35. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  37. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  38. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  39. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  40. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  41. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  42. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  43. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  44. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  45. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  46. package/dist/resources/extensions/gsd/preferences.js +1 -0
  47. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  48. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  49. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  50. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  54. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  55. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  57. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  58. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  59. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  60. package/dist/resources/extensions/gsd/state.js +484 -30
  61. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  62. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  63. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  64. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  65. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  66. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  67. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  68. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  69. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  70. package/dist/resources/extensions/gsd/undo.js +197 -3
  71. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  72. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  73. package/dist/web/standalone/.next/BUILD_ID +1 -1
  74. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -16
  75. package/dist/web/standalone/.next/build-manifest.json +4 -4
  76. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  77. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  78. package/dist/web/standalone/.next/required-server-files.json +4 -4
  79. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  80. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  81. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  91. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  100. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  145. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  151. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  172. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/index.html +1 -1
  182. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  183. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/page.js +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -16
  191. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  192. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  193. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  194. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/middleware.js +2 -2
  197. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  199. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  200. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  201. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  202. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  203. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  207. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  210. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  211. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  212. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  254. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  255. package/dist/web/standalone/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +1 -0
  256. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  257. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  258. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  259. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  260. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  261. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  262. package/dist/web/standalone/server.js +1 -1
  263. package/package.json +4 -4
  264. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  265. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  266. package/packages/pi-ai/dist/models.custom.js +170 -0
  267. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  268. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models.js +16 -1
  270. package/packages/pi-ai/dist/models.js.map +1 -1
  271. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  272. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/models.test.js +67 -0
  274. package/packages/pi-ai/dist/models.test.js.map +1 -0
  275. package/packages/pi-ai/src/models.custom.ts +172 -0
  276. package/packages/pi-ai/src/models.test.ts +85 -0
  277. package/packages/pi-ai/src/models.ts +17 -1
  278. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  279. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  281. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  289. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  291. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  294. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  296. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  300. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  304. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  306. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  308. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  310. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  312. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  314. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  318. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  322. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  324. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  326. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  328. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  330. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  333. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/index.js +1 -0
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/main.js +11 -199
  340. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  348. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  351. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  353. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  355. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/package.json +1 -1
  360. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  361. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  362. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  363. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  364. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  365. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  366. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  367. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  368. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  369. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  370. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  371. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  372. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  373. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  374. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  375. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  376. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  377. package/packages/pi-coding-agent/src/index.ts +7 -0
  378. package/packages/pi-coding-agent/src/main.ts +11 -232
  379. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  383. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/package.json +1 -1
  389. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  390. package/src/resources/extensions/github-sync/sync.ts +2 -1
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  392. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  393. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  394. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  395. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  396. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  397. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  398. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  399. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  400. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  401. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  402. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  403. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  404. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  405. package/src/resources/extensions/gsd/auto.ts +0 -9
  406. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  407. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  409. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  410. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  411. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  412. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  413. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  414. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  415. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  416. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  417. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  418. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  419. package/src/resources/extensions/gsd/doctor.ts +45 -295
  420. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  421. package/src/resources/extensions/gsd/files.ts +16 -220
  422. package/src/resources/extensions/gsd/git-service.ts +4 -0
  423. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  424. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  425. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  426. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  427. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  428. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  429. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  430. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  431. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  432. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  433. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  434. package/src/resources/extensions/gsd/preferences.ts +1 -0
  435. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  436. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  437. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  438. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  442. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  443. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  445. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  446. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  447. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  448. package/src/resources/extensions/gsd/state.ts +547 -29
  449. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  450. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  451. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
  453. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
  457. package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
  458. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  459. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
  460. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
  461. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
  462. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
  463. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
  464. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
  465. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
  466. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
  467. package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
  468. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
  469. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
  470. package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
  471. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
  473. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
  474. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  475. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  476. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1205 -0
  477. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  479. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
  480. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
  481. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  487. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  488. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  489. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  490. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  491. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  492. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  493. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  494. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
  495. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  496. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
  497. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  498. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  499. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  500. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  501. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  502. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  503. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  504. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  505. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  506. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  507. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  508. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  509. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  510. package/src/resources/extensions/gsd/types.ts +50 -0
  511. package/src/resources/extensions/gsd/undo.ts +247 -3
  512. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  513. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  514. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  515. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  516. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  517. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  519. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  520. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  521. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  522. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  523. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  526. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  528. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  529. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  530. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  531. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  532. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  533. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  562. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  563. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  564. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  565. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  566. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  567. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  568. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
@@ -1,133 +1,196 @@
1
- // Tests for inlinePriorMilestoneSummary — the cross-milestone context bridging helper.
2
- //
3
- // Scenarios covered:
4
- // (A) M002 with M001-SUMMARY.md present → returns string containing "Prior Milestone Summary" and summary content
5
- // (B) M001 (no prior milestone in dir) → returns null
6
- // (C) M002 with no M001-SUMMARY.md written → returns null
7
- // (D) M003 with M002 dir present but no M002-SUMMARY.md → returns null
8
-
9
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
10
- import { join, dirname } from 'node:path';
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync, writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
11
5
  import { tmpdir } from 'node:os';
12
- import { fileURLToPath } from 'node:url';
13
6
 
14
- import { inlinePriorMilestoneSummary } from '../files.ts';
15
- import { createTestContext } from './test-helpers.ts';
7
+ import { openDatabase, closeDatabase, getMilestone, getMilestoneSlices } from '../gsd-db.ts';
8
+ import { handlePlanMilestone } from '../tools/plan-milestone.ts';
9
+ import { parseRoadmap } from '../parsers-legacy.ts';
16
10
 
17
- // ─── Worktree-aware prompt loader ──────────────────────────────────────────
18
- const __dirname = dirname(fileURLToPath(import.meta.url));
19
-
20
-
21
- const { assertEq, assertTrue, report } = createTestContext();
22
- // ─── Fixture helpers ───────────────────────────────────────────────────────
23
-
24
- function createFixtureBase(): string {
25
- const base = mkdtempSync(join(tmpdir(), 'gsd-plan-ms-test-'));
26
- mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
11
+ function makeTmpBase(): string {
12
+ const base = mkdtempSync(join(tmpdir(), 'gsd-plan-milestone-'));
13
+ mkdirSync(join(base, '.gsd', 'milestones', 'M001'), { recursive: true });
27
14
  return base;
28
15
  }
29
16
 
30
- function writeMilestoneDir(base: string, mid: string): void {
31
- mkdirSync(join(base, '.gsd', 'milestones', mid), { recursive: true });
17
+ function cleanup(base: string): void {
18
+ try { closeDatabase(); } catch { /* noop */ }
19
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
32
20
  }
33
21
 
34
- function writeMilestoneSummary(base: string, mid: string, content: string): void {
35
- const dir = join(base, '.gsd', 'milestones', mid);
36
- mkdirSync(dir, { recursive: true });
37
- writeFileSync(join(dir, `${mid}-SUMMARY.md`), content);
22
+ function validParams() {
23
+ return {
24
+ milestoneId: 'M001',
25
+ title: 'DB-backed planning',
26
+ vision: 'Make planning write through the database.',
27
+ successCriteria: ['Planning persists', 'Roadmap renders from DB'],
28
+ keyRisks: [
29
+ { risk: 'Renderer mismatch', whyItMatters: 'Rendered roadmap may stop round-tripping.' },
30
+ ],
31
+ proofStrategy: [
32
+ { riskOrUnknown: 'Render correctness', retireIn: 'S01', whatWillBeProven: 'ROADMAP output matches DB state.' },
33
+ ],
34
+ verificationContract: 'Contract verification text',
35
+ verificationIntegration: 'Integration verification text',
36
+ verificationOperational: 'Operational verification text',
37
+ verificationUat: 'UAT verification text',
38
+ definitionOfDone: ['Tests pass', 'Tool reruns cleanly'],
39
+ requirementCoverage: 'Covers R015.',
40
+ boundaryMapMarkdown: '| From | To | Produces | Consumes |\n|------|----|----------|----------|\n| S01 | terminal | roadmap | nothing |',
41
+ slices: [
42
+ {
43
+ sliceId: 'S01',
44
+ title: 'Tool wiring',
45
+ risk: 'medium',
46
+ depends: [],
47
+ demo: 'The tool writes roadmap state.',
48
+ goal: 'Wire the handler.',
49
+ successCriteria: 'Handler persists state and renders markdown.',
50
+ proofLevel: 'integration',
51
+ integrationClosure: 'Downstream callers read rendered roadmap output.',
52
+ observabilityImpact: 'Tests expose render and validation failures.',
53
+ },
54
+ {
55
+ sliceId: 'S02',
56
+ title: 'Prompt migration',
57
+ risk: 'low',
58
+ depends: ['S01'],
59
+ demo: 'Prompts call the tool.',
60
+ goal: 'Migrate prompts to DB-backed path.',
61
+ successCriteria: 'Prompt contracts reference the new tool.',
62
+ proofLevel: 'integration',
63
+ integrationClosure: 'Prompt tests cover the new planning route.',
64
+ observabilityImpact: 'Prompt and rogue-write failures become explicit.',
65
+ },
66
+ ],
67
+ };
38
68
  }
39
69
 
40
- function cleanup(base: string): void {
41
- rmSync(base, { recursive: true, force: true });
42
- }
70
+ test('handlePlanMilestone writes milestone and slice planning state and renders roadmap', async () => {
71
+ const base = makeTmpBase();
72
+ const dbPath = join(base, '.gsd', 'gsd.db');
73
+ openDatabase(dbPath);
74
+
75
+ try {
76
+ const result = await handlePlanMilestone(validParams(), base);
77
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
78
+
79
+ const milestone = getMilestone('M001');
80
+ assert.ok(milestone, 'milestone should exist');
81
+ assert.equal(milestone?.vision, 'Make planning write through the database.');
82
+ assert.deepEqual(milestone?.success_criteria, ['Planning persists', 'Roadmap renders from DB']);
83
+ assert.equal(milestone?.verification_contract, 'Contract verification text');
84
+
85
+ const slices = getMilestoneSlices('M001');
86
+ assert.equal(slices.length, 2);
87
+ assert.equal(slices[0]?.id, 'S01');
88
+ assert.equal(slices[0]?.goal, 'Wire the handler.');
89
+ assert.equal(slices[1]?.depends[0], 'S01');
90
+
91
+ const roadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
92
+ assert.ok(existsSync(roadmapPath), 'roadmap should be rendered to disk');
93
+ const roadmap = readFileSync(roadmapPath, 'utf-8');
94
+ assert.match(roadmap, /# M001: DB-backed planning/);
95
+ assert.match(roadmap, /\*\*Vision:\*\* Make planning write through the database\./);
96
+ assert.match(roadmap, /- \[ \] \*\*S01: Tool wiring\*\* `risk:medium` `depends:\[\]`/);
97
+ assert.match(roadmap, /- \[ \] \*\*S02: Prompt migration\*\* `risk:low` `depends:\[S01\]`/);
98
+ } finally {
99
+ cleanup(base);
100
+ }
101
+ });
102
+
103
+ test('handlePlanMilestone rejects invalid payloads', async () => {
104
+ const base = makeTmpBase();
105
+ const dbPath = join(base, '.gsd', 'gsd.db');
106
+ openDatabase(dbPath);
107
+
108
+ try {
109
+ const params = validParams();
110
+ const result = await handlePlanMilestone({ ...params, slices: [] }, base);
111
+ assert.ok('error' in result);
112
+ assert.match(result.error, /validation failed: slices must be a non-empty array/);
113
+ } finally {
114
+ cleanup(base);
115
+ }
116
+ });
43
117
 
44
- // ═══════════════════════════════════════════════════════════════════════════
45
- // Tests
46
- // ═══════════════════════════════════════════════════════════════════════════
47
-
48
- async function main(): Promise<void> {
49
-
50
- // ─── (A) M002 with M001-SUMMARY.md present ────────────────────────────────
51
- console.log('\n── (A) M002 with M001-SUMMARY.md present → string containing "Prior Milestone Summary"');
52
- {
53
- const base = createFixtureBase();
54
- try {
55
- writeMilestoneDir(base, 'M001');
56
- writeMilestoneDir(base, 'M002');
57
- writeMilestoneSummary(base, 'M001', '# M001 Summary\n\nKey decisions: used TypeScript throughout.\n');
58
-
59
- const result = await inlinePriorMilestoneSummary('M002', base);
60
-
61
- assertTrue(result !== null, '(A) result is not null when prior milestone has SUMMARY');
62
- assertTrue(
63
- typeof result === 'string' && result.includes('Prior Milestone Summary'),
64
- '(A) result contains "Prior Milestone Summary" label',
65
- );
66
- assertTrue(
67
- typeof result === 'string' && result.includes('Key decisions: used TypeScript throughout.'),
68
- '(A) result contains the summary file content',
69
- );
70
- } finally {
71
- cleanup(base);
72
- }
118
+ test('handlePlanMilestone surfaces render failures and does not clear parse-visible state on failure', async () => {
119
+ const base = makeTmpBase();
120
+ const dbPath = join(base, '.gsd', 'gsd.db');
121
+ openDatabase(dbPath);
122
+
123
+ try {
124
+ const fallbackRoadmapPath = join(base, '.gsd', 'milestones', 'MISSING', 'MISSING-ROADMAP.md');
125
+ mkdirSync(fallbackRoadmapPath, { recursive: true });
126
+
127
+ const result = await handlePlanMilestone({ ...validParams(), milestoneId: 'MISSING' }, base);
128
+ assert.ok('error' in result);
129
+ assert.match(result.error, /render failed:/);
130
+
131
+ const existingRoadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
132
+ writeFileSync(existingRoadmapPath, '# M001: Cached roadmap\n\n**Vision:** old value\n\n## Slices\n\n', 'utf-8');
133
+ const cachedAfter = parseRoadmap(readFileSync(existingRoadmapPath, 'utf-8'));
134
+ assert.equal(cachedAfter.vision, 'old value');
135
+ } finally {
136
+ cleanup(base);
73
137
  }
138
+ });
74
139
 
75
- // ─── (B) M001 (no prior milestone in dir) ─────────────────────────────────
76
- console.log('\n── (B) M001 — first milestone, no prior → null');
77
- {
78
- const base = createFixtureBase();
79
- try {
80
- writeMilestoneDir(base, 'M001');
140
+ test('handlePlanMilestone clears parse-visible roadmap state after successful render', async () => {
141
+ const base = makeTmpBase();
142
+ const dbPath = join(base, '.gsd', 'gsd.db');
143
+ openDatabase(dbPath);
81
144
 
82
- const result = await inlinePriorMilestoneSummary('M001', base);
145
+ try {
146
+ const roadmapPath = join(base, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md');
147
+ writeFileSync(roadmapPath, '# M001: Cached roadmap\n\n**Vision:** old value\n\n## Slices\n\n', 'utf-8');
83
148
 
84
- assertEq(result, null, '(B) M001 with no prior milestone → null');
85
- } finally {
86
- cleanup(base);
87
- }
88
- }
149
+ const cachedBefore = parseRoadmap(readFileSync(roadmapPath, 'utf-8'));
150
+ assert.equal(cachedBefore.vision, 'old value');
89
151
 
90
- // ─── (C) M002 with no M001-SUMMARY.md ────────────────────────────────────
91
- console.log('\n── (C) M002 with M001 dir but no M001-SUMMARY.md → null');
92
- {
93
- const base = createFixtureBase();
94
- try {
95
- writeMilestoneDir(base, 'M001');
96
- writeMilestoneDir(base, 'M002');
97
- // Intentionally do NOT write M001-SUMMARY.md
98
-
99
- const result = await inlinePriorMilestoneSummary('M002', base);
100
-
101
- assertEq(result, null, '(C) M002 when M001 has no SUMMARY file → null');
102
- } finally {
103
- cleanup(base);
104
- }
105
- }
152
+ const result = await handlePlanMilestone(validParams(), base);
153
+ assert.ok(!('error' in result));
106
154
 
107
- // ─── (D) M003 with M002 dir but no M002-SUMMARY.md ───────────────────────
108
- console.log('\n── (D) M003, M002 is immediately prior but has no SUMMARY → null');
109
- {
110
- const base = createFixtureBase();
111
- try {
112
- writeMilestoneDir(base, 'M001');
113
- writeMilestoneDir(base, 'M002');
114
- writeMilestoneDir(base, 'M003');
115
- // M001 has a summary — but M002 (the immediately prior to M003) does NOT
116
- writeMilestoneSummary(base, 'M001', '# M001 Summary\n\nOld context.\n');
117
- // Intentionally do NOT write M002-SUMMARY.md
118
-
119
- const result = await inlinePriorMilestoneSummary('M003', base);
120
-
121
- assertEq(result, null, '(D) M003 when M002 (immediately prior) has no SUMMARY → null');
122
- } finally {
123
- cleanup(base);
124
- }
155
+ const parsedAfter = parseRoadmap(readFileSync(roadmapPath, 'utf-8'));
156
+ assert.equal(parsedAfter.vision, 'Make planning write through the database.');
157
+ assert.equal(parsedAfter.slices.length, 2);
158
+ } finally {
159
+ cleanup(base);
125
160
  }
161
+ });
126
162
 
127
- report();
128
- }
129
-
130
- main().catch((error) => {
131
- console.error(error);
132
- process.exit(1);
163
+ test('handlePlanMilestone reruns idempotently and updates existing planning state', async () => {
164
+ const base = makeTmpBase();
165
+ const dbPath = join(base, '.gsd', 'gsd.db');
166
+ openDatabase(dbPath);
167
+
168
+ try {
169
+ const first = await handlePlanMilestone(validParams(), base);
170
+ assert.ok(!('error' in first));
171
+
172
+ const second = await handlePlanMilestone({
173
+ ...validParams(),
174
+ vision: 'Updated vision',
175
+ slices: [
176
+ {
177
+ ...validParams().slices[0],
178
+ goal: 'Updated goal',
179
+ observabilityImpact: 'Updated observability',
180
+ },
181
+ validParams().slices[1],
182
+ ],
183
+ }, base);
184
+ assert.ok(!('error' in second));
185
+
186
+ const milestone = getMilestone('M001');
187
+ assert.equal(milestone?.vision, 'Updated vision');
188
+
189
+ const slices = getMilestoneSlices('M001');
190
+ assert.equal(slices.length, 2);
191
+ assert.equal(slices[0]?.goal, 'Updated goal');
192
+ assert.equal(slices[0]?.observability_impact, 'Updated observability');
193
+ } finally {
194
+ cleanup(base);
195
+ }
133
196
  });
@@ -54,6 +54,13 @@ test("plan-slice prompt: all variables substituted", () => {
54
54
  assert.ok(result.includes("S01"));
55
55
  });
56
56
 
57
+ test("plan-slice prompt: DB-backed tool names survive template substitution", () => {
58
+ const result = loadPrompt("plan-slice", { ...BASE_VARS, commitInstruction: "Do not commit." });
59
+ assert.ok(result.includes("gsd_plan_slice"), "gsd_plan_slice should appear in rendered prompt");
60
+ assert.ok(result.includes("gsd_plan_task"), "gsd_plan_task should appear in rendered prompt");
61
+ assert.ok(result.includes("canonical write path"), "canonical write path language should survive substitution");
62
+ });
63
+
57
64
  test("domain-work prompts use skillActivation placeholder", () => {
58
65
  const prompts = [
59
66
  "research-milestone",
@@ -0,0 +1,179 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync, writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+
7
+ import { openDatabase, closeDatabase, insertMilestone, insertSlice, getSlice, getSliceTasks, getTask } from '../gsd-db.ts';
8
+ import { handlePlanSlice } from '../tools/plan-slice.ts';
9
+ import { parsePlan } from '../parsers-legacy.ts';
10
+ import { parseTaskPlanFile } from '../files.ts';
11
+
12
+ function makeTmpBase(): string {
13
+ const base = mkdtempSync(join(tmpdir(), 'gsd-plan-slice-'));
14
+ mkdirSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks'), { recursive: true });
15
+ return base;
16
+ }
17
+
18
+ function cleanup(base: string): void {
19
+ try { closeDatabase(); } catch { /* noop */ }
20
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
21
+ }
22
+
23
+ function seedParentSlice(): void {
24
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
25
+ insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Planning slice', status: 'pending', demo: 'Rendered plans exist.' });
26
+ }
27
+
28
+ function validParams() {
29
+ return {
30
+ milestoneId: 'M001',
31
+ sliceId: 'S02',
32
+ goal: 'Persist slice planning through the DB.',
33
+ successCriteria: '- Slice plan renders from DB\n- Task plan files are regenerated',
34
+ proofLevel: 'integration',
35
+ integrationClosure: 'Planning handlers now write DB rows and render plan artifacts.',
36
+ observabilityImpact: '- Validation failures return structured errors\n- Cache invalidation is proven by parse-visible state updates',
37
+ tasks: [
38
+ {
39
+ taskId: 'T01',
40
+ title: 'Write slice handler',
41
+ description: 'Implement the slice planning handler.',
42
+ estimate: '45m',
43
+ files: ['src/resources/extensions/gsd/tools/plan-slice.ts'],
44
+ verify: 'node --test src/resources/extensions/gsd/tests/plan-slice.test.ts',
45
+ inputs: ['src/resources/extensions/gsd/tools/plan-milestone.ts'],
46
+ expectedOutput: ['src/resources/extensions/gsd/tools/plan-slice.ts'],
47
+ observabilityImpact: 'Tests exercise cache invalidation and render failure paths.',
48
+ },
49
+ {
50
+ taskId: 'T02',
51
+ title: 'Write task handler',
52
+ description: 'Implement the task planning handler.',
53
+ estimate: '30m',
54
+ files: ['src/resources/extensions/gsd/tools/plan-task.ts'],
55
+ verify: 'node --test src/resources/extensions/gsd/tests/plan-task.test.ts',
56
+ inputs: ['src/resources/extensions/gsd/tools/plan-task.ts'],
57
+ expectedOutput: ['src/resources/extensions/gsd/tests/plan-task.test.ts'],
58
+ observabilityImpact: 'Task-plan renders remain parse-compatible.',
59
+ },
60
+ ],
61
+ };
62
+ }
63
+
64
+ test('handlePlanSlice writes slice/task planning state and renders plan artifacts', async () => {
65
+ const base = makeTmpBase();
66
+ openDatabase(join(base, '.gsd', 'gsd.db'));
67
+
68
+ try {
69
+ seedParentSlice();
70
+
71
+ const result = await handlePlanSlice(validParams(), base);
72
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
73
+
74
+ const slice = getSlice('M001', 'S02');
75
+ assert.ok(slice);
76
+ assert.equal(slice?.goal, 'Persist slice planning through the DB.');
77
+ assert.equal(slice?.proof_level, 'integration');
78
+
79
+ const tasks = getSliceTasks('M001', 'S02');
80
+ assert.equal(tasks.length, 2);
81
+ assert.equal(tasks[0]?.title, 'Write slice handler');
82
+ assert.equal(tasks[0]?.description, 'Implement the slice planning handler.');
83
+ assert.equal(tasks[1]?.estimate, '30m');
84
+
85
+ const planPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md');
86
+ assert.ok(existsSync(planPath), 'slice plan should be rendered to disk');
87
+ const parsedPlan = parsePlan(readFileSync(planPath, 'utf-8'));
88
+ assert.equal(parsedPlan.goal, 'Persist slice planning through the DB.');
89
+ assert.equal(parsedPlan.tasks.length, 2);
90
+ assert.equal(parsedPlan.tasks[0]?.id, 'T01');
91
+
92
+ const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T01-PLAN.md');
93
+ assert.ok(existsSync(taskPlanPath), 'task plan should be rendered to disk');
94
+ const taskPlan = parseTaskPlanFile(readFileSync(taskPlanPath, 'utf-8'));
95
+ assert.deepEqual(taskPlan.frontmatter.skills_used, []);
96
+ } finally {
97
+ cleanup(base);
98
+ }
99
+ });
100
+
101
+ test('handlePlanSlice rejects invalid payloads', async () => {
102
+ const base = makeTmpBase();
103
+ openDatabase(join(base, '.gsd', 'gsd.db'));
104
+
105
+ try {
106
+ seedParentSlice();
107
+ const result = await handlePlanSlice({ ...validParams(), tasks: [] }, base);
108
+ assert.ok('error' in result);
109
+ assert.match(result.error, /validation failed: tasks must be a non-empty array/);
110
+ } finally {
111
+ cleanup(base);
112
+ }
113
+ });
114
+
115
+ test('handlePlanSlice rejects missing parent slice', async () => {
116
+ const base = makeTmpBase();
117
+ openDatabase(join(base, '.gsd', 'gsd.db'));
118
+
119
+ try {
120
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
121
+ const result = await handlePlanSlice(validParams(), base);
122
+ assert.ok('error' in result);
123
+ assert.match(result.error, /missing parent slice: M001\/S02/);
124
+ } finally {
125
+ cleanup(base);
126
+ }
127
+ });
128
+
129
+ test('handlePlanSlice surfaces render failures without changing parse-visible task-plan state for the failing task', async () => {
130
+ const base = makeTmpBase();
131
+ openDatabase(join(base, '.gsd', 'gsd.db'));
132
+
133
+ try {
134
+ seedParentSlice();
135
+ const failingTaskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T01-PLAN.md');
136
+ writeFileSync(failingTaskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# T01: Cached task\n', 'utf-8');
137
+ rmSync(failingTaskPlanPath, { force: true });
138
+ mkdirSync(failingTaskPlanPath, { recursive: true });
139
+
140
+ const result = await handlePlanSlice(validParams(), base);
141
+ assert.ok('error' in result);
142
+ assert.match(result.error, /render failed:/);
143
+
144
+ assert.ok(existsSync(failingTaskPlanPath), 'failing task plan path should remain the blocking directory');
145
+ assert.equal(getTask('M001', 'S02', 'T01')?.description, 'Implement the slice planning handler.');
146
+ } finally {
147
+ cleanup(base);
148
+ }
149
+ });
150
+
151
+ test('handlePlanSlice reruns idempotently and refreshes parse-visible state', async () => {
152
+ const base = makeTmpBase();
153
+ openDatabase(join(base, '.gsd', 'gsd.db'));
154
+
155
+ try {
156
+ seedParentSlice();
157
+ writeFileSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md'), '# S02: Cached\n\n**Goal:** old value\n\n## Tasks\n\n- [ ] **T01: Cached task**\n', 'utf-8');
158
+
159
+ const first = await handlePlanSlice(validParams(), base);
160
+ assert.ok(!('error' in first));
161
+
162
+ const second = await handlePlanSlice({
163
+ ...validParams(),
164
+ goal: 'Updated goal from rerun.',
165
+ tasks: [
166
+ { ...validParams().tasks[0], description: 'Updated slice handler description.' },
167
+ validParams().tasks[1],
168
+ ],
169
+ }, base);
170
+ assert.ok(!('error' in second));
171
+
172
+ const parsedAfter = parsePlan(readFileSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md'), 'utf-8'));
173
+ assert.equal(parsedAfter.goal, 'Updated goal from rerun.');
174
+ const task = getTask('M001', 'S02', 'T01');
175
+ assert.equal(task?.description, 'Updated slice handler description.');
176
+ } finally {
177
+ cleanup(base);
178
+ }
179
+ });
@@ -0,0 +1,145 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync, writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+
7
+ import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, getTask } from '../gsd-db.ts';
8
+ import { handlePlanTask } from '../tools/plan-task.ts';
9
+ import { parseTaskPlanFile } from '../files.ts';
10
+
11
+ function makeTmpBase(): string {
12
+ const base = mkdtempSync(join(tmpdir(), 'gsd-plan-task-'));
13
+ mkdirSync(join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks'), { recursive: true });
14
+ return base;
15
+ }
16
+
17
+ function cleanup(base: string): void {
18
+ try { closeDatabase(); } catch { /* noop */ }
19
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
20
+ }
21
+
22
+ function seedParent(): void {
23
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
24
+ insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Planning slice', status: 'pending', demo: 'Rendered plans exist.' });
25
+ }
26
+
27
+ function validParams() {
28
+ return {
29
+ milestoneId: 'M001',
30
+ sliceId: 'S02',
31
+ taskId: 'T02',
32
+ title: 'Write task handler',
33
+ description: 'Implement the DB-backed task planning handler.',
34
+ estimate: '30m',
35
+ files: ['src/resources/extensions/gsd/tools/plan-task.ts'],
36
+ verify: 'node --test src/resources/extensions/gsd/tests/plan-task.test.ts',
37
+ inputs: ['src/resources/extensions/gsd/tools/plan-task.ts'],
38
+ expectedOutput: ['src/resources/extensions/gsd/tests/plan-task.test.ts'],
39
+ observabilityImpact: 'Tests exercise validation, render failure, and cache refresh behavior.',
40
+ };
41
+ }
42
+
43
+ test('handlePlanTask writes planning state and renders task plan', async () => {
44
+ const base = makeTmpBase();
45
+ openDatabase(join(base, '.gsd', 'gsd.db'));
46
+
47
+ try {
48
+ seedParent();
49
+ const result = await handlePlanTask(validParams(), base);
50
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
51
+
52
+ const task = getTask('M001', 'S02', 'T02');
53
+ assert.ok(task);
54
+ assert.equal(task?.title, 'Write task handler');
55
+ assert.equal(task?.description, 'Implement the DB-backed task planning handler.');
56
+ assert.equal(task?.estimate, '30m');
57
+
58
+ const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T02-PLAN.md');
59
+ assert.ok(existsSync(taskPlanPath), 'task plan should be rendered to disk');
60
+ const taskPlan = parseTaskPlanFile(readFileSync(taskPlanPath, 'utf-8'));
61
+ assert.equal(taskPlan.frontmatter.estimated_files, 1);
62
+ assert.deepEqual(taskPlan.frontmatter.skills_used, []);
63
+ } finally {
64
+ cleanup(base);
65
+ }
66
+ });
67
+
68
+ test('handlePlanTask rejects invalid payloads', async () => {
69
+ const base = makeTmpBase();
70
+ openDatabase(join(base, '.gsd', 'gsd.db'));
71
+
72
+ try {
73
+ seedParent();
74
+ const result = await handlePlanTask({ ...validParams(), files: [''] }, base);
75
+ assert.ok('error' in result);
76
+ assert.match(result.error, /validation failed: files must contain only non-empty strings/);
77
+ } finally {
78
+ cleanup(base);
79
+ }
80
+ });
81
+
82
+ test('handlePlanTask rejects missing parent slice', async () => {
83
+ const base = makeTmpBase();
84
+ openDatabase(join(base, '.gsd', 'gsd.db'));
85
+
86
+ try {
87
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
88
+ const result = await handlePlanTask(validParams(), base);
89
+ assert.ok('error' in result);
90
+ assert.match(result.error, /missing parent slice: M001\/S02/);
91
+ } finally {
92
+ cleanup(base);
93
+ }
94
+ });
95
+
96
+ test('handlePlanTask surfaces render failures without changing parse-visible task plan state', async () => {
97
+ const base = makeTmpBase();
98
+ openDatabase(join(base, '.gsd', 'gsd.db'));
99
+
100
+ try {
101
+ seedParent();
102
+ insertTask({ id: 'T02', sliceId: 'S02', milestoneId: 'M001', title: 'Cached task', status: 'pending' });
103
+ const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T02-PLAN.md');
104
+ writeFileSync(taskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# T02: Cached task\n', 'utf-8');
105
+ rmSync(taskPlanPath, { force: true });
106
+ mkdirSync(taskPlanPath, { recursive: true });
107
+
108
+ const result = await handlePlanTask(validParams(), base);
109
+ assert.ok('error' in result);
110
+ assert.match(result.error, /render failed:/);
111
+ } finally {
112
+ cleanup(base);
113
+ }
114
+ });
115
+
116
+ test('handlePlanTask reruns idempotently and refreshes parse-visible state', async () => {
117
+ const base = makeTmpBase();
118
+ openDatabase(join(base, '.gsd', 'gsd.db'));
119
+
120
+ try {
121
+ seedParent();
122
+ const taskPlanPath = join(base, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'tasks', 'T02-PLAN.md');
123
+ writeFileSync(taskPlanPath, '---\nestimated_steps: 1\nestimated_files: 1\nskills_used: []\n---\n\n# T02: Cached task\n', 'utf-8');
124
+
125
+ const first = await handlePlanTask(validParams(), base);
126
+ assert.ok(!('error' in first));
127
+
128
+ const second = await handlePlanTask({
129
+ ...validParams(),
130
+ description: 'Updated task handler description.',
131
+ estimate: '1h',
132
+ }, base);
133
+ assert.ok(!('error' in second));
134
+
135
+ const task = getTask('M001', 'S02', 'T02');
136
+ assert.equal(task?.description, 'Updated task handler description.');
137
+ assert.equal(task?.estimate, '1h');
138
+
139
+ const parsed = parseTaskPlanFile(readFileSync(taskPlanPath, 'utf-8'));
140
+ assert.equal(parsed.frontmatter.estimated_steps, 1);
141
+ assert.match(readFileSync(taskPlanPath, 'utf-8'), /Updated task handler description\./);
142
+ } finally {
143
+ cleanup(base);
144
+ }
145
+ });