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,118 @@
1
+ /**
2
+ * Tests for the show_token_cost preference (#1515).
3
+ *
4
+ * Covers:
5
+ * - Preference recognition and validation
6
+ * - Cost formatting accuracy (inline re-implementation for test isolation)
7
+ * - Disabled-by-default behavior
8
+ * - Preference parsing from markdown frontmatter
9
+ */
10
+
11
+ import test from "node:test";
12
+ import assert from "node:assert/strict";
13
+ import {
14
+ validatePreferences,
15
+ parsePreferencesMarkdown,
16
+ } from "../preferences.ts";
17
+ import { KNOWN_PREFERENCE_KEYS } from "../preferences-types.ts";
18
+
19
+ // Re-implement formatPromptCost here for test isolation (avoids pi-coding-agent build dep).
20
+ // The canonical implementation lives in footer.ts.
21
+ function formatPromptCost(cost: number): string {
22
+ if (cost < 0.001) return `$${cost.toFixed(4)}`;
23
+ if (cost < 0.01) return `$${cost.toFixed(3)}`;
24
+ if (cost < 1) return `$${cost.toFixed(3)}`;
25
+ return `$${cost.toFixed(2)}`;
26
+ }
27
+
28
+ // ── Preference recognition ──────────────────────────────────────────────────
29
+
30
+ test("show_token_cost is a known preference key", () => {
31
+ assert.ok(KNOWN_PREFERENCE_KEYS.has("show_token_cost"));
32
+ });
33
+
34
+ test("show_token_cost: true validates without errors", () => {
35
+ const { errors, preferences } = validatePreferences({ show_token_cost: true });
36
+ assert.equal(errors.length, 0);
37
+ assert.equal(preferences.show_token_cost, true);
38
+ });
39
+
40
+ test("show_token_cost: false validates without errors", () => {
41
+ const { errors, preferences } = validatePreferences({ show_token_cost: false });
42
+ assert.equal(errors.length, 0);
43
+ assert.equal(preferences.show_token_cost, false);
44
+ });
45
+
46
+ test("show_token_cost: non-boolean produces validation error", () => {
47
+ const { errors } = validatePreferences({ show_token_cost: "yes" as any });
48
+ assert.ok(errors.length > 0);
49
+ assert.ok(errors[0].includes("show_token_cost"));
50
+ assert.ok(errors[0].includes("boolean"));
51
+ });
52
+
53
+ test("show_token_cost does not produce unknown-key warning", () => {
54
+ const { warnings } = validatePreferences({ show_token_cost: true });
55
+ const unknownWarnings = warnings.filter(w => w.includes("show_token_cost"));
56
+ assert.equal(unknownWarnings.length, 0);
57
+ });
58
+
59
+ // ── Disabled by default ─────────────────────────────────────────────────────
60
+
61
+ test("show_token_cost defaults to undefined (disabled) when not set", () => {
62
+ const { preferences } = validatePreferences({});
63
+ assert.equal(preferences.show_token_cost, undefined);
64
+ });
65
+
66
+ test("empty preferences.md does not enable show_token_cost", () => {
67
+ const prefs = parsePreferencesMarkdown("---\nversion: 1\n---\n");
68
+ assert.ok(prefs);
69
+ assert.equal(prefs.show_token_cost, undefined);
70
+ });
71
+
72
+ test("preferences.md with show_token_cost: true enables the preference", () => {
73
+ const prefs = parsePreferencesMarkdown("---\nshow_token_cost: true\n---\n");
74
+ assert.ok(prefs);
75
+ assert.equal(prefs.show_token_cost, true);
76
+ });
77
+
78
+ // ── Cost formatting ─────────────────────────────────────────────────────────
79
+
80
+ test("formatPromptCost formats sub-cent amounts with 4 decimals", () => {
81
+ assert.equal(formatPromptCost(0.0003), "$0.0003");
82
+ assert.equal(formatPromptCost(0.0009), "$0.0009");
83
+ });
84
+
85
+ test("formatPromptCost formats cent-range amounts with 3 decimals", () => {
86
+ assert.equal(formatPromptCost(0.003), "$0.003");
87
+ assert.equal(formatPromptCost(0.012), "$0.012");
88
+ assert.equal(formatPromptCost(0.1), "$0.100");
89
+ });
90
+
91
+ test("formatPromptCost formats dollar-range amounts with 2 decimals", () => {
92
+ assert.equal(formatPromptCost(1.5), "$1.50");
93
+ assert.equal(formatPromptCost(12.345), "$12.35");
94
+ });
95
+
96
+ test("formatPromptCost handles zero", () => {
97
+ assert.equal(formatPromptCost(0), "$0.0000");
98
+ });
99
+
100
+ // ── Cost calculation correctness ────────────────────────────────────────────
101
+
102
+ test("cost calculation formula matches Model cost structure", () => {
103
+ // Simulates: usage.input * model.cost.input / 1_000_000 + usage.output * model.cost.output / 1_000_000
104
+ // Model.cost fields are $/million tokens
105
+ const modelCost = { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 }; // claude-opus-4 pricing
106
+ const usage = { input: 2000, output: 500, cacheRead: 10000, cacheWrite: 1000 };
107
+
108
+ const cost =
109
+ (usage.input * modelCost.input / 1_000_000) +
110
+ (usage.output * modelCost.output / 1_000_000) +
111
+ (usage.cacheRead * modelCost.cacheRead / 1_000_000) +
112
+ (usage.cacheWrite * modelCost.cacheWrite / 1_000_000);
113
+
114
+ // 2000*15/1M + 500*75/1M + 10000*1.5/1M + 1000*18.75/1M
115
+ // = 0.03 + 0.0375 + 0.015 + 0.01875 = 0.10125
116
+ assert.ok(Math.abs(cost - 0.10125) < 0.0001, `Expected ~$0.10125 but got $${cost}`);
117
+ assert.equal(formatPromptCost(cost), "$0.101");
118
+ });
@@ -1,7 +1,7 @@
1
1
  // tool-naming — Verifies canonical + alias tool registration for GSD DB tools.
2
2
  //
3
- // Each of the 4 DB tools must register under its canonical gsd_concept_action name
4
- // AND under the old gsd_action_concept name as a backward-compatible alias.
3
+ // Each DB tool must register under its canonical gsd_concept_action name
4
+ // AND under a backward-compatible alias name.
5
5
  // The alias must share the exact same execute function reference as the canonical tool.
6
6
 
7
7
  import { createTestContext } from './test-helpers.ts';
@@ -26,6 +26,14 @@ const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
26
26
  { canonical: "gsd_requirement_update", alias: "gsd_update_requirement" },
27
27
  { canonical: "gsd_summary_save", alias: "gsd_save_summary" },
28
28
  { canonical: "gsd_milestone_generate_id", alias: "gsd_generate_milestone_id" },
29
+ { canonical: "gsd_task_complete", alias: "gsd_complete_task" },
30
+ { canonical: "gsd_slice_complete", alias: "gsd_complete_slice" },
31
+ { canonical: "gsd_plan_milestone", alias: "gsd_milestone_plan" },
32
+ { canonical: "gsd_plan_slice", alias: "gsd_slice_plan" },
33
+ { canonical: "gsd_plan_task", alias: "gsd_task_plan" },
34
+ { canonical: "gsd_replan_slice", alias: "gsd_slice_replan" },
35
+ { canonical: "gsd_reassess_roadmap", alias: "gsd_roadmap_reassess" },
36
+ { canonical: "gsd_complete_milestone", alias: "gsd_milestone_complete" },
29
37
  ];
30
38
 
31
39
  // ─── Registration count ──────────────────────────────────────────────────────
@@ -35,7 +43,7 @@ console.log('\n── Tool naming: registration count ──');
35
43
  const pi = makeMockPi();
36
44
  registerDbTools(pi);
37
45
 
38
- assertEq(pi.tools.length, 8, 'Should register exactly 8 tools (4 canonical + 4 aliases)');
46
+ assertEq(pi.tools.length, 24, 'Should register exactly 24 tools (12 canonical + 12 aliases)');
39
47
 
40
48
  // ─── Both names exist for each pair ──────────────────────────────────────────
41
49
 
@@ -8,8 +8,21 @@ import {
8
8
  extractCommitShas,
9
9
  findCommitsForUnit,
10
10
  handleUndo,
11
+ handleUndoTask,
12
+ handleResetSlice,
11
13
  uncheckTaskInPlan,
12
- } from "../undo.js";
14
+ } from "../undo.ts";
15
+ import {
16
+ openDatabase,
17
+ closeDatabase,
18
+ insertMilestone,
19
+ insertSlice,
20
+ insertTask,
21
+ getTask,
22
+ getSlice,
23
+ } from "../gsd-db.ts";
24
+ import { invalidateAllCaches } from "../cache.ts";
25
+ import { existsSync } from "node:fs";
13
26
 
14
27
  function makeTempDir(prefix: string): string {
15
28
  return mkdtempSync(join(tmpdir(), `${prefix}-`));
@@ -140,3 +153,310 @@ test("extractCommitShas ignores malformed commit tokens", () => {
140
153
 
141
154
  assert.deepEqual(extractCommitShas(content), ["1234567"]);
142
155
  });
156
+
157
+ // ─── handleUndoTask tests ────────────────────────────────────────────────────
158
+
159
+ function makeCtx(): { notifications: Array<{ message: string; level: string }>; ctx: any } {
160
+ const notifications: Array<{ message: string; level: string }> = [];
161
+ const ctx = {
162
+ ui: {
163
+ notify(message: string, level: string) {
164
+ notifications.push({ message, level });
165
+ },
166
+ },
167
+ };
168
+ return { notifications, ctx };
169
+ }
170
+
171
+ function setupTaskFixture(base: string): void {
172
+ // Create milestone/slice/task directory structure
173
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
174
+ const tasksDir = join(sliceDir, "tasks");
175
+ mkdirSync(tasksDir, { recursive: true });
176
+
177
+ // Write plan file with checked task
178
+ writeFileSync(
179
+ join(sliceDir, "S01-PLAN.md"),
180
+ [
181
+ "# S01: Test Slice",
182
+ "",
183
+ "## Tasks",
184
+ "",
185
+ "- [x] **T01: First task** `est:30m`",
186
+ "- [ ] **T02: Second task** `est:30m`",
187
+ ].join("\n"),
188
+ "utf-8",
189
+ );
190
+
191
+ // Write task summary file
192
+ writeFileSync(
193
+ join(tasksDir, "T01-SUMMARY.md"),
194
+ "# T01 Summary\nDone.",
195
+ "utf-8",
196
+ );
197
+
198
+ // Set up DB
199
+ openDatabase(":memory:");
200
+ insertMilestone({ id: "M001", title: "Test Milestone", status: "active" });
201
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Test Slice", status: "active", risk: "low", depends: [] });
202
+ insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "First task", status: "complete" });
203
+ insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", title: "Second task", status: "pending" });
204
+ invalidateAllCaches();
205
+ }
206
+
207
+ test("handleUndoTask without args shows usage", async () => {
208
+ const { notifications, ctx } = makeCtx();
209
+ const base = makeTempDir("gsd-undo-task-usage");
210
+ try {
211
+ await handleUndoTask("", ctx, {} as any, base);
212
+ assert.equal(notifications.length, 1);
213
+ assert.equal(notifications[0]?.level, "warning");
214
+ assert.match(notifications[0]?.message ?? "", /Usage:/);
215
+ } finally {
216
+ rmSync(base, { recursive: true, force: true });
217
+ }
218
+ });
219
+
220
+ test("handleUndoTask without --force shows confirmation", async () => {
221
+ const base = makeTempDir("gsd-undo-task-confirm");
222
+ try {
223
+ setupTaskFixture(base);
224
+ const { notifications, ctx } = makeCtx();
225
+ await handleUndoTask("M001/S01/T01", ctx, {} as any, base);
226
+ assert.equal(notifications.length, 1);
227
+ assert.equal(notifications[0]?.level, "warning");
228
+ assert.match(notifications[0]?.message ?? "", /--force to confirm/);
229
+ // Verify state was NOT modified
230
+ const task = getTask("M001", "S01", "T01");
231
+ assert.equal(task?.status, "complete");
232
+ } finally {
233
+ closeDatabase();
234
+ rmSync(base, { recursive: true, force: true });
235
+ }
236
+ });
237
+
238
+ test("handleUndoTask with --force resets task and re-renders plan", async () => {
239
+ const base = makeTempDir("gsd-undo-task-force");
240
+ try {
241
+ setupTaskFixture(base);
242
+ const { notifications, ctx } = makeCtx();
243
+ await handleUndoTask("M001/S01/T01 --force", ctx, {} as any, base);
244
+
245
+ // DB status reset
246
+ const task = getTask("M001", "S01", "T01");
247
+ assert.equal(task?.status, "pending");
248
+
249
+ // Summary file deleted
250
+ const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
251
+ assert.equal(existsSync(summaryPath), false);
252
+
253
+ // Plan checkbox unchecked
254
+ const planContent = readFileSync(
255
+ join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"),
256
+ "utf-8",
257
+ );
258
+ assert.match(planContent, /\[ \] \*\*T01:/);
259
+
260
+ // Success notification
261
+ assert.equal(notifications[0]?.level, "success");
262
+ assert.match(notifications[0]?.message ?? "", /Reset task M001\/S01\/T01/);
263
+ } finally {
264
+ closeDatabase();
265
+ rmSync(base, { recursive: true, force: true });
266
+ }
267
+ });
268
+
269
+ test("handleUndoTask with non-existent task returns error", async () => {
270
+ const base = makeTempDir("gsd-undo-task-notfound");
271
+ try {
272
+ openDatabase(":memory:");
273
+ insertMilestone({ id: "M001", title: "Test", status: "active" });
274
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Test", status: "active", risk: "low", depends: [] });
275
+
276
+ const { notifications, ctx } = makeCtx();
277
+ await handleUndoTask("M001/S01/T99 --force", ctx, {} as any, base);
278
+ assert.equal(notifications[0]?.level, "error");
279
+ assert.match(notifications[0]?.message ?? "", /not found/);
280
+ } finally {
281
+ closeDatabase();
282
+ rmSync(base, { recursive: true, force: true });
283
+ }
284
+ });
285
+
286
+ test("handleUndoTask accepts partial ID (T01) and resolves from state", async () => {
287
+ const base = makeTempDir("gsd-undo-task-partial");
288
+ try {
289
+ setupTaskFixture(base);
290
+
291
+ // Create STATE.md so deriveState can resolve the active milestone/slice
292
+ mkdirSync(join(base, ".gsd"), { recursive: true });
293
+ writeFileSync(
294
+ join(base, ".gsd", "STATE.md"),
295
+ [
296
+ "# GSD State",
297
+ "",
298
+ "- Phase: executing",
299
+ "- Active Milestone: M001",
300
+ "- Active Slice: S01",
301
+ "- Active Task: T01",
302
+ ].join("\n"),
303
+ "utf-8",
304
+ );
305
+
306
+ const { notifications, ctx } = makeCtx();
307
+ await handleUndoTask("T01 --force", ctx, {} as any, base);
308
+
309
+ const task = getTask("M001", "S01", "T01");
310
+ assert.equal(task?.status, "pending");
311
+ assert.equal(notifications[0]?.level, "success");
312
+ } finally {
313
+ closeDatabase();
314
+ rmSync(base, { recursive: true, force: true });
315
+ }
316
+ });
317
+
318
+ // ─── handleResetSlice tests ──────────────────────────────────────────────────
319
+
320
+ function setupSliceFixture(base: string): void {
321
+ const mDir = join(base, ".gsd", "milestones", "M001");
322
+ const sliceDir = join(mDir, "slices", "S01");
323
+ const tasksDir = join(sliceDir, "tasks");
324
+ mkdirSync(tasksDir, { recursive: true });
325
+
326
+ // Write roadmap file
327
+ writeFileSync(
328
+ join(mDir, "M001-ROADMAP.md"),
329
+ [
330
+ "# Roadmap",
331
+ "",
332
+ "## Slices",
333
+ "",
334
+ "- [x] **S01: Test Slice** `risk:low` `depends:[]`",
335
+ "- [ ] **S02: Next Slice** `risk:low` `depends:[S01]`",
336
+ ].join("\n"),
337
+ "utf-8",
338
+ );
339
+
340
+ // Write plan file
341
+ writeFileSync(
342
+ join(sliceDir, "S01-PLAN.md"),
343
+ [
344
+ "# S01: Test Slice",
345
+ "",
346
+ "## Tasks",
347
+ "",
348
+ "- [x] **T01: First task** `est:30m`",
349
+ "- [x] **T02: Second task** `est:30m`",
350
+ ].join("\n"),
351
+ "utf-8",
352
+ );
353
+
354
+ // Write task summaries
355
+ writeFileSync(join(tasksDir, "T01-SUMMARY.md"), "# T01 Summary\nDone.", "utf-8");
356
+ writeFileSync(join(tasksDir, "T02-SUMMARY.md"), "# T02 Summary\nDone.", "utf-8");
357
+
358
+ // Write slice summary and UAT
359
+ writeFileSync(join(sliceDir, "S01-SUMMARY.md"), "# Slice Summary\nDone.", "utf-8");
360
+ writeFileSync(join(sliceDir, "S01-UAT.md"), "# UAT\nPassed.", "utf-8");
361
+
362
+ // Set up DB
363
+ openDatabase(":memory:");
364
+ insertMilestone({ id: "M001", title: "Test Milestone", status: "active" });
365
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Test Slice", status: "complete", risk: "low", depends: [] });
366
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Next Slice", status: "pending", risk: "low", depends: ["S01"] });
367
+ insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "First task", status: "complete" });
368
+ insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", title: "Second task", status: "complete" });
369
+ invalidateAllCaches();
370
+ }
371
+
372
+ test("handleResetSlice without args shows usage", async () => {
373
+ const { notifications, ctx } = makeCtx();
374
+ const base = makeTempDir("gsd-reset-slice-usage");
375
+ try {
376
+ await handleResetSlice("", ctx, {} as any, base);
377
+ assert.equal(notifications.length, 1);
378
+ assert.equal(notifications[0]?.level, "warning");
379
+ assert.match(notifications[0]?.message ?? "", /Usage:/);
380
+ } finally {
381
+ rmSync(base, { recursive: true, force: true });
382
+ }
383
+ });
384
+
385
+ test("handleResetSlice without --force shows confirmation", async () => {
386
+ const base = makeTempDir("gsd-reset-slice-confirm");
387
+ try {
388
+ setupSliceFixture(base);
389
+ const { notifications, ctx } = makeCtx();
390
+ await handleResetSlice("M001/S01", ctx, {} as any, base);
391
+ assert.equal(notifications[0]?.level, "warning");
392
+ assert.match(notifications[0]?.message ?? "", /--force to confirm/);
393
+ // State not modified
394
+ const slice = getSlice("M001", "S01");
395
+ assert.equal(slice?.status, "complete");
396
+ } finally {
397
+ closeDatabase();
398
+ rmSync(base, { recursive: true, force: true });
399
+ }
400
+ });
401
+
402
+ test("handleResetSlice with --force resets slice and all tasks", async () => {
403
+ const base = makeTempDir("gsd-reset-slice-force");
404
+ try {
405
+ setupSliceFixture(base);
406
+ const { notifications, ctx } = makeCtx();
407
+ await handleResetSlice("M001/S01 --force", ctx, {} as any, base);
408
+
409
+ // DB status reset
410
+ const slice = getSlice("M001", "S01");
411
+ assert.equal(slice?.status, "active");
412
+ const t1 = getTask("M001", "S01", "T01");
413
+ assert.equal(t1?.status, "pending");
414
+ const t2 = getTask("M001", "S01", "T02");
415
+ assert.equal(t2?.status, "pending");
416
+
417
+ // Task summaries deleted
418
+ const tasksDir = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks");
419
+ assert.equal(existsSync(join(tasksDir, "T01-SUMMARY.md")), false);
420
+ assert.equal(existsSync(join(tasksDir, "T02-SUMMARY.md")), false);
421
+
422
+ // Slice summary and UAT deleted
423
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
424
+ assert.equal(existsSync(join(sliceDir, "S01-SUMMARY.md")), false);
425
+ assert.equal(existsSync(join(sliceDir, "S01-UAT.md")), false);
426
+
427
+ // Plan checkboxes unchecked
428
+ const planContent = readFileSync(join(sliceDir, "S01-PLAN.md"), "utf-8");
429
+ assert.match(planContent, /\[ \] \*\*T01:/);
430
+ assert.match(planContent, /\[ \] \*\*T02:/);
431
+
432
+ // Roadmap checkbox unchecked
433
+ const roadmapContent = readFileSync(
434
+ join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
435
+ "utf-8",
436
+ );
437
+ assert.match(roadmapContent, /\[ \] \*\*S01:/);
438
+
439
+ // Success notification
440
+ assert.equal(notifications[0]?.level, "success");
441
+ assert.match(notifications[0]?.message ?? "", /Reset slice M001\/S01/);
442
+ } finally {
443
+ closeDatabase();
444
+ rmSync(base, { recursive: true, force: true });
445
+ }
446
+ });
447
+
448
+ test("handleResetSlice with non-existent slice returns error", async () => {
449
+ const base = makeTempDir("gsd-reset-slice-notfound");
450
+ try {
451
+ openDatabase(":memory:");
452
+ insertMilestone({ id: "M001", title: "Test", status: "active" });
453
+
454
+ const { notifications, ctx } = makeCtx();
455
+ await handleResetSlice("M001/S99 --force", ctx, {} as any, base);
456
+ assert.equal(notifications[0]?.level, "error");
457
+ assert.match(notifications[0]?.message ?? "", /not found/);
458
+ } finally {
459
+ closeDatabase();
460
+ rmSync(base, { recursive: true, force: true });
461
+ }
462
+ });
@@ -375,7 +375,7 @@ test("buildLoopRemediationSteps returns steps for validate-milestone", () => {
375
375
  assert.ok(result);
376
376
  assert.ok(result!.includes("VALIDATION"));
377
377
  assert.ok(result!.includes("verdict: pass"));
378
- assert.ok(result!.includes("gsd doctor"));
378
+ assert.ok(result!.includes("gsd recover"));
379
379
  } finally {
380
380
  cleanup(base);
381
381
  }
@@ -240,148 +240,6 @@ test("verification-evidence: formatEvidenceTable uses ✅/❌ emoji for pass/fai
240
240
  assert.ok(table.includes("❌ fail"), "failing check should have ❌ fail");
241
241
  });
242
242
 
243
- // ─── Validator Rule Tests (T03) ──────────────────────────────────────────────
244
-
245
- import { validateTaskSummaryContent } from "../observability-validator.ts";
246
-
247
- const MINIMAL_SUMMARY_WITH_EVIDENCE = `---
248
- observability_surfaces:
249
- - gate-output
250
- ---
251
- # T03 Summary
252
-
253
- ## Diagnostics
254
- Run \`npm test\` to verify.
255
-
256
- ## Verification Evidence
257
- | # | Command | Exit Code | Verdict | Duration |
258
- |---|---------|-----------|---------|----------|
259
- | 1 | npm run typecheck | 0 | ✅ pass | 2.3s |
260
- `;
261
-
262
- const MINIMAL_SUMMARY_NO_EVIDENCE = `---
263
- observability_surfaces:
264
- - gate-output
265
- ---
266
- # T03 Summary
267
-
268
- ## Diagnostics
269
- Run \`npm test\` to verify.
270
- `;
271
-
272
- const MINIMAL_SUMMARY_PLACEHOLDER_EVIDENCE = `---
273
- observability_surfaces:
274
- - gate-output
275
- ---
276
- # T03 Summary
277
-
278
- ## Diagnostics
279
- Run \`npm test\` to verify.
280
-
281
- ## Verification Evidence
282
- {{evidence_table}}
283
- `;
284
-
285
- const MINIMAL_SUMMARY_NO_CHECKS_EVIDENCE = `---
286
- observability_surfaces:
287
- - gate-output
288
- ---
289
- # T03 Summary
290
-
291
- ## Diagnostics
292
- Run \`npm test\` to verify.
293
-
294
- ## Verification Evidence
295
- _No verification checks discovered._
296
- `;
297
-
298
- test("verification-evidence: validator accepts summary with real evidence table", () => {
299
- const issues = validateTaskSummaryContent("T03-SUMMARY.md", MINIMAL_SUMMARY_WITH_EVIDENCE);
300
- const evidenceIssues = issues.filter(
301
- (i) => i.ruleId === "evidence_block_missing" || i.ruleId === "evidence_block_placeholder",
302
- );
303
- assert.equal(evidenceIssues.length, 0, "no evidence warnings for real table");
304
- });
305
-
306
- test("verification-evidence: validator warns when evidence section is missing", () => {
307
- const issues = validateTaskSummaryContent("T03-SUMMARY.md", MINIMAL_SUMMARY_NO_EVIDENCE);
308
- const match = issues.find((i) => i.ruleId === "evidence_block_missing");
309
- assert.ok(match, "should produce evidence_block_missing warning");
310
- assert.equal(match!.severity, "warning");
311
- assert.equal(match!.scope, "task-summary");
312
- });
313
-
314
- test("verification-evidence: validator warns when evidence section has only placeholder text", () => {
315
- const issues = validateTaskSummaryContent("T03-SUMMARY.md", MINIMAL_SUMMARY_PLACEHOLDER_EVIDENCE);
316
- const match = issues.find((i) => i.ruleId === "evidence_block_placeholder");
317
- assert.ok(match, "should produce evidence_block_placeholder warning");
318
- assert.equal(match!.severity, "warning");
319
- });
320
-
321
- test("verification-evidence: validator accepts 'no checks discovered' as valid content", () => {
322
- const issues = validateTaskSummaryContent("T03-SUMMARY.md", MINIMAL_SUMMARY_NO_CHECKS_EVIDENCE);
323
- const evidenceIssues = issues.filter(
324
- (i) => i.ruleId === "evidence_block_missing" || i.ruleId === "evidence_block_placeholder",
325
- );
326
- assert.equal(evidenceIssues.length, 0, "no evidence warnings for 'no checks discovered'");
327
- });
328
-
329
- // ─── Integration Test: Full Chain (T03) ──────────────────────────────────────
330
-
331
- test("verification-evidence: integration — VerificationResult → JSON → table → validator accepts", () => {
332
- const tmp = makeTempDir("ve-integration");
333
- try {
334
- // 1. Create a VerificationResult with 2 checks (1 pass, 1 fail)
335
- const result = makeResult({
336
- passed: false,
337
- checks: [
338
- { command: "npm run typecheck", exitCode: 0, stdout: "ok", stderr: "", durationMs: 1500 },
339
- { command: "npm run test:unit", exitCode: 1, stdout: "", stderr: "1 failed", durationMs: 3200 },
340
- ],
341
- discoverySource: "package-json",
342
- });
343
-
344
- // 2. Write JSON to temp dir and read it back
345
- writeVerificationJSON(result, tmp, "T03");
346
- const jsonPath = join(tmp, "T03-VERIFY.json");
347
- assert.ok(existsSync(jsonPath), "JSON file should exist");
348
-
349
- const json = JSON.parse(readFileSync(jsonPath, "utf-8"));
350
- assert.equal(json.schemaVersion, 1, "schemaVersion should be 1");
351
- assert.equal(json.passed, false, "passed should be false");
352
- assert.equal(json.checks.length, 2, "should have 2 checks");
353
- assert.equal(json.checks[0].verdict, "pass", "first check should pass");
354
- assert.equal(json.checks[1].verdict, "fail", "second check should fail");
355
-
356
- // 3. Generate evidence table and embed in a mock summary
357
- const table = formatEvidenceTable(result);
358
- assert.ok(table.includes("npm run typecheck"), "table should contain first command");
359
- assert.ok(table.includes("npm run test:unit"), "table should contain second command");
360
-
361
- const fullSummary = `---
362
- observability_surfaces:
363
- - gate-output
364
- ---
365
- # T03 Summary
366
-
367
- ## Diagnostics
368
- Run \`npm test\` to verify.
369
-
370
- ## Verification Evidence
371
- ${table}
372
- `;
373
-
374
- // 4. Validate — no evidence warnings
375
- const issues = validateTaskSummaryContent("T03-SUMMARY.md", fullSummary);
376
- const evidenceIssues = issues.filter(
377
- (i) => i.ruleId === "evidence_block_missing" || i.ruleId === "evidence_block_placeholder",
378
- );
379
- assert.equal(evidenceIssues.length, 0, "validator should accept real evidence from formatEvidenceTable");
380
- } finally {
381
- rmSync(tmp, { recursive: true, force: true });
382
- }
383
- });
384
-
385
243
  // ─── Retry Evidence Field Tests (S03/T01) ─────────────────────────────────────
386
244
 
387
245
  test("verification-evidence: writeVerificationJSON with retryAttempt and maxRetries includes them in output", () => {
@@ -36,18 +36,24 @@ function createGitRepo(): string {
36
36
  * Returns true when the directory would PASS the health check (dispatch
37
37
  * proceeds), false when it would FAIL (dispatch blocked).
38
38
  *
39
- * This mirrors the fixed logic: .git must exist, AND at least one
40
- * PROJECT_FILES entry or a src/ directory must exist.
39
+ * The only hard gate is .git project files are advisory (greenfield
40
+ * projects won't have them yet). Returns { pass, greenfield } to
41
+ * distinguish "pass with project files" from "pass as greenfield".
41
42
  */
42
43
  function wouldPassHealthCheck(basePath: string, existsSyncFn: (p: string) => boolean): boolean {
43
44
  const hasGit = existsSyncFn(join(basePath, ".git"));
44
45
  if (!hasGit) return false;
45
46
 
47
+ // .git is sufficient — greenfield projects proceed with a warning
48
+ return true;
49
+ }
50
+
51
+ /** Whether the directory has recognized project files (used for greenfield detection). */
52
+ function hasRecognizedProjectFiles(basePath: string, existsSyncFn: (p: string) => boolean): boolean {
46
53
  for (const file of PROJECT_FILES) {
47
54
  if (existsSyncFn(join(basePath, file))) return true;
48
55
  }
49
56
  if (existsSyncFn(join(basePath, "src"))) return true;
50
-
51
57
  return false;
52
58
  }
53
59
 
@@ -118,8 +124,9 @@ describe("health check with git repo", () => {
118
124
  assert.ok(wouldPassHealthCheck(dir, existsSync), "src/-only project should pass health check");
119
125
  });
120
126
 
121
- test("health check fails for empty git repo with no project files", () => {
122
- assert.ok(!wouldPassHealthCheck(dir, existsSync), "empty git repo should fail health check");
127
+ test("health check passes for empty git repo (greenfield project)", () => {
128
+ assert.ok(wouldPassHealthCheck(dir, existsSync), "empty git repo should pass health check (greenfield)");
129
+ assert.ok(!hasRecognizedProjectFiles(dir, existsSync), "empty git repo has no recognized project files");
123
130
  });
124
131
  });
125
132