gsd-pi 2.50.0-dev.d210a87 → 2.50.0

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 (509) hide show
  1. package/README.md +0 -2
  2. package/dist/cli.js +0 -26
  3. package/dist/loader.js +0 -4
  4. package/dist/resource-loader.d.ts +1 -4
  5. package/dist/resource-loader.js +3 -138
  6. package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -3
  7. package/dist/resources/extensions/bg-shell/interaction.js +1 -3
  8. package/dist/resources/extensions/bg-shell/process-manager.js +1 -4
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +0 -5
  10. package/dist/resources/extensions/gsd/auto/phases.js +1 -16
  11. package/dist/resources/extensions/gsd/auto/session.js +0 -5
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -22
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +54 -81
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +76 -37
  15. package/dist/resources/extensions/gsd/auto-prompts.js +0 -57
  16. package/dist/resources/extensions/gsd/auto-recovery.js +25 -21
  17. package/dist/resources/extensions/gsd/auto.js +5 -15
  18. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -16
  19. package/dist/resources/extensions/gsd/crash-recovery.js +2 -6
  20. package/dist/resources/extensions/gsd/custom-execution-policy.js +2 -3
  21. package/dist/resources/extensions/gsd/custom-verification.js +1 -3
  22. package/dist/resources/extensions/gsd/custom-workflow-engine.js +2 -3
  23. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -4
  24. package/dist/resources/extensions/gsd/detection.js +3 -589
  25. package/dist/resources/extensions/gsd/dispatch-guard.js +1 -2
  26. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -15
  27. package/dist/resources/extensions/gsd/files.js +1 -5
  28. package/dist/resources/extensions/gsd/guided-flow.js +0 -10
  29. package/dist/resources/extensions/gsd/init-wizard.js +1 -9
  30. package/dist/resources/extensions/gsd/model-router.js +0 -25
  31. package/dist/resources/extensions/gsd/notifications.js +0 -23
  32. package/dist/resources/extensions/gsd/preferences-skills.js +5 -11
  33. package/dist/resources/extensions/gsd/preferences-types.js +0 -1
  34. package/dist/resources/extensions/gsd/preferences-validation.js +0 -25
  35. package/dist/resources/extensions/gsd/preferences.js +0 -3
  36. package/dist/resources/extensions/gsd/prompts/forensics.md +7 -11
  37. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
  38. package/dist/resources/extensions/gsd/provider-error-pause.js +0 -8
  39. package/dist/resources/extensions/gsd/rule-registry.js +11 -10
  40. package/dist/resources/extensions/gsd/session-forensics.js +3 -7
  41. package/dist/resources/extensions/gsd/skill-discovery.js +2 -3
  42. package/dist/resources/extensions/gsd/skill-health.js +2 -2
  43. package/dist/resources/extensions/gsd/skill-telemetry.js +5 -15
  44. package/dist/resources/extensions/gsd/state.js +5 -17
  45. package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -12
  46. package/dist/resources/extensions/gsd/templates/preferences.md +0 -2
  47. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
  48. package/dist/resources/extensions/gsd/undo.js +7 -8
  49. package/dist/resources/extensions/gsd/unit-runtime.js +1 -2
  50. package/dist/resources/extensions/gsd/verification-gate.js +1 -3
  51. package/dist/web/standalone/.next/BUILD_ID +1 -1
  52. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -17
  53. package/dist/web/standalone/.next/build-manifest.json +4 -4
  54. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  55. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  56. package/dist/web/standalone/.next/required-server-files.json +3 -3
  57. package/dist/web/standalone/.next/routes-manifest.json +0 -6
  58. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  59. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  62. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  70. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  80. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  82. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  90. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  91. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  97. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  100. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  106. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  112. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  115. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  118. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  121. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +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.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +26 -2
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/page.js +2 -2
  208. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -17
  211. package/dist/web/standalone/.next/server/chunks/229.js +12 -0
  212. package/dist/web/standalone/.next/server/chunks/441.js +2 -0
  213. package/dist/web/standalone/.next/server/chunks/471.js +13 -0
  214. package/dist/web/standalone/.next/server/chunks/{4741.js → 741.js} +1 -1
  215. package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -1
  216. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/middleware.js +3 -3
  219. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  221. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  222. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  223. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  224. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  225. package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +9 -0
  227. package/dist/web/standalone/.next/static/chunks/{2008.817d0885545aaea9.js → 485.243af25f0cdf50d6.js} +6 -6
  228. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  271. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +1 -0
  279. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  280. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  281. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  282. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  283. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  284. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  285. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  286. package/dist/web/standalone/server.js +1 -1
  287. package/package.json +1 -1
  288. package/packages/pi-ai/dist/types.d.ts +0 -1
  289. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/types.js.map +1 -1
  291. package/packages/pi-ai/pnpm-lock.yaml +2022 -0
  292. package/packages/pi-ai/src/types.ts +1 -1
  293. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -1
  294. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -1
  296. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +1 -3
  298. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/bash-executor.js +1 -10
  300. package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -1
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  307. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +1 -19
  309. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +0 -8
  313. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/package-manager.js +1 -8
  316. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/skills.d.ts +1 -11
  318. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/skills.js +8 -30
  320. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/slash-commands.js +0 -1
  323. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  325. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/index.js +1 -1
  327. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -3
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -6
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +0 -5
  335. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +0 -12
  337. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -2
  340. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  341. package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
  342. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -2
  343. package/packages/pi-coding-agent/src/core/bash-executor.ts +2 -10
  344. package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -2
  345. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -18
  346. package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -21
  347. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +0 -9
  348. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -10
  349. package/packages/pi-coding-agent/src/core/skills.ts +10 -35
  350. package/packages/pi-coding-agent/src/core/slash-commands.ts +0 -1
  351. package/packages/pi-coding-agent/src/index.ts +0 -4
  352. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -3
  353. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -6
  354. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +0 -15
  355. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -2
  356. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  357. package/pkg/dist/modes/interactive/theme/themes.js +1 -2
  358. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  359. package/scripts/postinstall.js +6 -163
  360. package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -3
  361. package/src/resources/extensions/bg-shell/interaction.ts +1 -3
  362. package/src/resources/extensions/bg-shell/process-manager.ts +1 -4
  363. package/src/resources/extensions/claude-code-cli/partial-builder.ts +0 -5
  364. package/src/resources/extensions/gsd/auto/phases.ts +1 -15
  365. package/src/resources/extensions/gsd/auto/session.ts +0 -6
  366. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -31
  367. package/src/resources/extensions/gsd/auto-dispatch.ts +51 -84
  368. package/src/resources/extensions/gsd/auto-post-unit.ts +83 -56
  369. package/src/resources/extensions/gsd/auto-prompts.ts +0 -48
  370. package/src/resources/extensions/gsd/auto-recovery.ts +26 -19
  371. package/src/resources/extensions/gsd/auto.ts +5 -15
  372. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -17
  373. package/src/resources/extensions/gsd/crash-recovery.ts +2 -6
  374. package/src/resources/extensions/gsd/custom-execution-policy.ts +2 -3
  375. package/src/resources/extensions/gsd/custom-verification.ts +1 -3
  376. package/src/resources/extensions/gsd/custom-workflow-engine.ts +2 -3
  377. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -7
  378. package/src/resources/extensions/gsd/detection.ts +3 -662
  379. package/src/resources/extensions/gsd/dispatch-guard.ts +1 -2
  380. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -15
  381. package/src/resources/extensions/gsd/files.ts +1 -6
  382. package/src/resources/extensions/gsd/guided-flow.ts +0 -11
  383. package/src/resources/extensions/gsd/init-wizard.ts +1 -9
  384. package/src/resources/extensions/gsd/model-router.ts +0 -25
  385. package/src/resources/extensions/gsd/notifications.ts +0 -23
  386. package/src/resources/extensions/gsd/preferences-skills.ts +5 -11
  387. package/src/resources/extensions/gsd/preferences-types.ts +0 -20
  388. package/src/resources/extensions/gsd/preferences-validation.ts +0 -26
  389. package/src/resources/extensions/gsd/preferences.ts +0 -3
  390. package/src/resources/extensions/gsd/prompts/forensics.md +7 -11
  391. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
  392. package/src/resources/extensions/gsd/provider-error-pause.ts +0 -9
  393. package/src/resources/extensions/gsd/rule-registry.ts +11 -10
  394. package/src/resources/extensions/gsd/session-forensics.ts +3 -7
  395. package/src/resources/extensions/gsd/skill-discovery.ts +2 -3
  396. package/src/resources/extensions/gsd/skill-health.ts +2 -2
  397. package/src/resources/extensions/gsd/skill-telemetry.ts +5 -15
  398. package/src/resources/extensions/gsd/state.ts +5 -16
  399. package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -12
  400. package/src/resources/extensions/gsd/templates/preferences.md +0 -2
  401. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -16
  402. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
  403. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -68
  404. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
  405. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +3 -5
  406. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -33
  407. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -4
  408. package/src/resources/extensions/gsd/tests/detection.test.ts +0 -838
  409. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
  410. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -63
  411. package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -40
  412. package/src/resources/extensions/gsd/tests/notifications.test.ts +6 -28
  413. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -50
  414. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -40
  415. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
  416. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +5 -4
  417. package/src/resources/extensions/gsd/tests/run-uat.test.ts +0 -146
  418. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
  419. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -24
  420. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
  421. package/src/resources/extensions/gsd/types.ts +0 -2
  422. package/src/resources/extensions/gsd/undo.ts +7 -8
  423. package/src/resources/extensions/gsd/unit-runtime.ts +1 -2
  424. package/src/resources/extensions/gsd/verification-gate.ts +1 -3
  425. package/dist/resources/extensions/gsd/auto-observability.js +0 -54
  426. package/dist/resources/extensions/gsd/auto-utils.js +0 -20
  427. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  428. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  429. package/dist/resources/extensions/gsd/rtk-status.js +0 -43
  430. package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
  431. package/dist/resources/extensions/shared/rtk-session-stats.js +0 -189
  432. package/dist/resources/extensions/shared/rtk.js +0 -100
  433. package/dist/rtk.d.ts +0 -52
  434. package/dist/rtk.js +0 -332
  435. package/dist/web/standalone/.next/server/app/api/experimental/route.js +0 -3
  436. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +0 -1
  437. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +0 -1
  438. package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
  439. package/dist/web/standalone/.next/server/chunks/2331.js +0 -25
  440. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  441. package/dist/web/standalone/.next/server/chunks/7471.js +0 -13
  442. package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +0 -9
  443. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
  444. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
  445. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
  446. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  447. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  448. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
  449. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
  450. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
  451. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
  452. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
  453. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
  454. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
  455. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
  456. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
  457. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
  459. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
  461. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
  462. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
  463. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
  464. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
  465. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
  466. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
  467. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
  468. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
  469. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
  470. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
  471. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
  472. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
  473. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
  474. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
  475. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
  476. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
  477. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
  478. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  479. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
  480. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
  483. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +0 -1
  486. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  487. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
  488. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
  489. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  490. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
  491. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
  492. package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +0 -1
  493. package/dist/web/standalone/.next/static/css/de141508b083f922.css +0 -1
  494. package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +0 -1
  495. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -105
  496. package/src/resources/extensions/gsd/auto-observability.ts +0 -72
  497. package/src/resources/extensions/gsd/auto-utils.ts +0 -25
  498. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  499. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  500. package/src/resources/extensions/gsd/rtk-status.ts +0 -53
  501. package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
  502. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
  503. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  504. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
  505. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
  506. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
  507. package/src/resources/extensions/shared/rtk-session-stats.ts +0 -249
  508. package/src/resources/extensions/shared/rtk.ts +0 -120
  509. /package/dist/web/standalone/.next/static/{yJIyd5cXPNpmXTv18ZlyC → MQOhBnkC_TLtNn_JvZWDj}/_ssgManifest.js +0 -0
@@ -9,10 +9,10 @@
9
9
  * without modifying orchestration code.
10
10
  */
11
11
  import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
12
- import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
12
+ import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted } from "./gsd-db.js";
13
13
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
14
- import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
15
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
14
+ import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
15
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
16
16
  import { join } from "node:path";
17
17
  import { hasImplementationArtifacts } from "./auto-recovery.js";
18
18
  import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
@@ -23,42 +23,8 @@ function missingSliceStop(mid, phase) {
23
23
  level: "error",
24
24
  };
25
25
  }
26
- /**
27
- * Check for milestone slices missing SUMMARY files.
28
- * Returns array of missing slice IDs, or empty array if all present or DB unavailable.
29
- */
30
- function findMissingSummaries(basePath, mid) {
31
- if (!isDbAvailable())
32
- return [];
33
- const sliceIds = getMilestoneSlices(mid).map(s => s.id);
34
- return sliceIds.filter(sid => {
35
- const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
36
- return !summaryPath || !existsSync(summaryPath);
37
- });
38
- }
39
26
  // ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
40
27
  const MAX_REWRITE_ATTEMPTS = 3;
41
- // ─── Disk-persisted rewrite attempt counter ──────────────────────────────────
42
- // The counter must survive session restarts (crash recovery, pause/resume,
43
- // step-mode). Storing it on the in-memory session object caused the circuit
44
- // breaker to never trip — see https://github.com/gsd-build/gsd-2/issues/2203
45
- function rewriteCountPath(basePath) {
46
- return join(gsdRoot(basePath), "runtime", "rewrite-count.json");
47
- }
48
- export function getRewriteCount(basePath) {
49
- try {
50
- const data = JSON.parse(readFileSync(rewriteCountPath(basePath), "utf-8"));
51
- return typeof data.count === "number" ? data.count : 0;
52
- }
53
- catch {
54
- return 0;
55
- }
56
- }
57
- export function setRewriteCount(basePath, count) {
58
- const filePath = rewriteCountPath(basePath);
59
- mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
60
- writeFileSync(filePath, JSON.stringify({ count, updatedAt: new Date().toISOString() }) + "\n");
61
- }
62
28
  // ─── Rules ────────────────────────────────────────────────────────────────
63
29
  export const DISPATCH_RULES = [
64
30
  {
@@ -67,14 +33,16 @@ export const DISPATCH_RULES = [
67
33
  const pendingOverrides = await loadActiveOverrides(basePath);
68
34
  if (pendingOverrides.length === 0)
69
35
  return null;
70
- const count = getRewriteCount(basePath);
36
+ const count = session?.rewriteAttemptCount ?? 0;
71
37
  if (count >= MAX_REWRITE_ATTEMPTS) {
72
38
  const { resolveAllOverrides } = await import("./files.js");
73
39
  await resolveAllOverrides(basePath);
74
- setRewriteCount(basePath, 0);
40
+ if (session)
41
+ session.rewriteAttemptCount = 0;
75
42
  return null;
76
43
  }
77
- setRewriteCount(basePath, count + 1);
44
+ if (session)
45
+ session.rewriteAttemptCount++;
78
46
  const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
79
47
  return {
80
48
  action: "dispatch",
@@ -440,14 +408,30 @@ export const DISPATCH_RULES = [
440
408
  if (state.phase !== "validating-milestone")
441
409
  return null;
442
410
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files before
443
- // allowing milestone validation.
444
- const missingSlices = findMissingSummaries(basePath, mid);
445
- if (missingSlices.length > 0) {
446
- return {
447
- action: "stop",
448
- reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
449
- level: "error",
450
- };
411
+ // allowing milestone validation. If any slice lacks a summary, the milestone
412
+ // is not genuinely complete — something skipped earlier slices.
413
+ let sliceIds;
414
+ if (isDbAvailable()) {
415
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
416
+ }
417
+ else {
418
+ sliceIds = [];
419
+ }
420
+ if (sliceIds.length > 0) {
421
+ const missingSlices = [];
422
+ for (const sid of sliceIds) {
423
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
424
+ if (!summaryPath || !existsSync(summaryPath)) {
425
+ missingSlices.push(sid);
426
+ }
427
+ }
428
+ if (missingSlices.length > 0) {
429
+ return {
430
+ action: "stop",
431
+ reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
432
+ level: "error",
433
+ };
434
+ }
451
435
  }
452
436
  // Skip preference: write a minimal pass-through VALIDATION file
453
437
  if (prefs?.phases?.skip_milestone_validation) {
@@ -484,13 +468,28 @@ export const DISPATCH_RULES = [
484
468
  if (state.phase !== "completing-milestone")
485
469
  return null;
486
470
  // Safety guard (#1368): verify all roadmap slices have SUMMARY files.
487
- const missingSlices = findMissingSummaries(basePath, mid);
488
- if (missingSlices.length > 0) {
489
- return {
490
- action: "stop",
491
- reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
492
- level: "error",
493
- };
471
+ let sliceIds;
472
+ if (isDbAvailable()) {
473
+ sliceIds = getMilestoneSlices(mid).map(s => s.id);
474
+ }
475
+ else {
476
+ sliceIds = [];
477
+ }
478
+ if (sliceIds.length > 0) {
479
+ const missingSlices = [];
480
+ for (const sid of sliceIds) {
481
+ const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
482
+ if (!summaryPath || !existsSync(summaryPath)) {
483
+ missingSlices.push(sid);
484
+ }
485
+ }
486
+ if (missingSlices.length > 0) {
487
+ return {
488
+ action: "stop",
489
+ reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
490
+ level: "error",
491
+ };
492
+ }
494
493
  }
495
494
  // Safety guard (#1703): verify the milestone produced implementation
496
495
  // artifacts (non-.gsd/ files). A milestone with only plan files and
@@ -502,32 +501,6 @@ export const DISPATCH_RULES = [
502
501
  level: "error",
503
502
  };
504
503
  }
505
- // Verification class compliance: if operational verification was planned,
506
- // ensure the validation output documents it before allowing completion.
507
- try {
508
- if (isDbAvailable()) {
509
- const milestone = getMilestone(mid);
510
- if (milestone?.verification_operational &&
511
- milestone.verification_operational.toLowerCase() !== "none") {
512
- const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
513
- if (validationPath) {
514
- const validationContent = await loadFile(validationPath);
515
- if (validationContent) {
516
- const hasOperationalCheck = validationContent.includes("Operational") &&
517
- (validationContent.includes("MET") || validationContent.includes("N/A"));
518
- if (!hasOperationalCheck) {
519
- return {
520
- action: "stop",
521
- reason: `Milestone ${mid} has planned operational verification ("${milestone.verification_operational.substring(0, 100)}") but the validation output does not address it. Re-run validation with verification class awareness, or update the validation to document operational compliance.`,
522
- level: "warning",
523
- };
524
- }
525
- }
526
- }
527
- }
528
- }
529
- }
530
- catch { /* fall through — don't block on DB errors */ }
531
504
  return {
532
505
  action: "dispatch",
533
506
  unitType: "complete-milestone",
@@ -27,21 +27,6 @@ import { consumeSignal } from "./session-status-io.js";
27
27
  import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
28
28
  import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
29
29
  import { debugLog } from "./debug-logger.js";
30
- import { runSafely } from "./auto-utils.js";
31
- /** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
32
- * drain via runUnit. Logs the enqueue event and notifies the UI. */
33
- function enqueueSidecar(s, ctx, entry, debugExtra, notification) {
34
- s.sidecarQueue.push(entry);
35
- debugLog("postUnitPostVerification", {
36
- phase: "sidecar-enqueue",
37
- kind: entry.kind,
38
- unitId: entry.unitId,
39
- ...debugExtra,
40
- });
41
- if (notification)
42
- ctx.ui.notify(notification, "info");
43
- return "continue";
44
- }
45
30
  /** Unit types that only touch `.gsd/` internal state files (no code changes).
46
31
  * Auto-commit is skipped for these — their state files are picked up by the
47
32
  * next actual task commit via `smartStage()`. */
@@ -189,7 +174,6 @@ export async function postUnitPreVerification(pctx, opts) {
189
174
  }
190
175
  // Auto-commit
191
176
  if (s.currentUnit) {
192
- const unit = s.currentUnit;
193
177
  try {
194
178
  let taskContext;
195
179
  if (s.currentUnit.type === "execute-task") {
@@ -246,51 +230,65 @@ export async function postUnitPreVerification(pctx, opts) {
246
230
  ctx.ui.notify(`Auto-commit failed: ${String(e).split("\n")[0]}`, "warning");
247
231
  }
248
232
  // GitHub sync (non-blocking, opt-in)
249
- await runSafely("postUnit", "github-sync", async () => {
233
+ try {
250
234
  const { runGitHubSync } = await import("../github-sync/sync.js");
251
- await runGitHubSync(s.basePath, unit.type, unit.id);
252
- });
235
+ await runGitHubSync(s.basePath, s.currentUnit.type, s.currentUnit.id);
236
+ }
237
+ catch (e) {
238
+ debugLog("postUnit", { phase: "github-sync", error: String(e) });
239
+ }
253
240
  // Prune dead bg-shell processes
254
- await runSafely("postUnit", "prune-bg-shell", async () => {
241
+ try {
255
242
  const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
256
243
  pruneDeadProcesses();
257
- });
244
+ }
245
+ catch (e) {
246
+ debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
247
+ }
258
248
  // Tear down browser between units to prevent Chrome process accumulation (#1733)
259
- await runSafely("postUnit", "browser-teardown", async () => {
249
+ try {
260
250
  const { getBrowser } = await import("../browser-tools/state.js");
261
251
  if (getBrowser()) {
262
252
  const { closeBrowser } = await import("../browser-tools/lifecycle.js");
263
253
  await closeBrowser();
264
254
  debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
265
255
  }
266
- });
256
+ }
257
+ catch (e) {
258
+ debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
259
+ }
267
260
  // Sync worktree state back to project root (skipped for lightweight sidecars)
268
261
  if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
269
- await runSafely("postUnit", "worktree-sync", () => {
262
+ try {
270
263
  syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
271
- });
264
+ }
265
+ catch (e) {
266
+ debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
267
+ }
272
268
  }
273
269
  // Rewrite-docs completion
274
270
  if (s.currentUnit.type === "rewrite-docs") {
275
- await runSafely("postUnit", "rewrite-docs-resolve", async () => {
271
+ try {
276
272
  await resolveAllOverrides(s.basePath);
277
- // Reset both disk and in-memory counters. Disk counter is authoritative
278
- // (survives restarts); in-memory is kept in sync for the current session.
279
- const { setRewriteCount } = await import("./auto-dispatch.js");
280
- setRewriteCount(s.basePath, 0);
281
273
  s.rewriteAttemptCount = 0;
282
274
  ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
283
- });
275
+ }
276
+ catch (e) {
277
+ debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
278
+ }
284
279
  }
285
280
  // Reactive state cleanup on slice completion
286
281
  if (s.currentUnit.type === "complete-slice") {
287
- await runSafely("postUnit", "reactive-state-cleanup", async () => {
288
- const { milestone: mid, slice: sid } = parseUnitId(unit.id);
282
+ try {
283
+ const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
289
284
  if (mid && sid) {
290
285
  const { clearReactiveState } = await import("./reactive-graph.js");
291
286
  clearReactiveState(s.basePath, mid, sid);
292
287
  }
293
- });
288
+ }
289
+ catch (e) {
290
+ debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
291
+ }
294
292
  }
295
293
  // Post-triage: execute actionable resolutions
296
294
  if (s.currentUnit.type === "triage-captures") {
@@ -417,7 +415,21 @@ export async function postUnitPostVerification(pctx) {
417
415
  await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id));
418
416
  }
419
417
  persistHookState(s.basePath);
420
- return enqueueSidecar(s, ctx, { kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model }, { hookName: hookUnit.hookName });
418
+ s.sidecarQueue.push({
419
+ kind: "hook",
420
+ unitType: hookUnit.unitType,
421
+ unitId: hookUnit.unitId,
422
+ prompt: hookUnit.prompt,
423
+ model: hookUnit.model,
424
+ });
425
+ debugLog("postUnitPostVerification", {
426
+ phase: "sidecar-enqueue",
427
+ kind: "hook",
428
+ unitType: hookUnit.unitType,
429
+ unitId: hookUnit.unitId,
430
+ hookName: hookUnit.hookName,
431
+ });
432
+ return "continue";
421
433
  }
422
434
  // Check if a hook requested a retry of the trigger unit
423
435
  if (isRetryPending()) {
@@ -498,7 +510,20 @@ export async function postUnitPostVerification(pctx) {
498
510
  await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt);
499
511
  }
500
512
  const triageUnitId = `${mid}/${sid}/triage`;
501
- return enqueueSidecar(s, ctx, { kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt }, { pendingCount: pending.length }, `Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`);
513
+ s.sidecarQueue.push({
514
+ kind: "triage",
515
+ unitType: "triage-captures",
516
+ unitId: triageUnitId,
517
+ prompt,
518
+ });
519
+ debugLog("postUnitPostVerification", {
520
+ phase: "sidecar-enqueue",
521
+ kind: "triage",
522
+ unitId: triageUnitId,
523
+ pendingCount: pending.length,
524
+ });
525
+ ctx.ui.notify(`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`, "info");
526
+ return "continue";
502
527
  }
503
528
  }
504
529
  }
@@ -522,7 +547,21 @@ export async function postUnitPostVerification(pctx) {
522
547
  }
523
548
  markCaptureExecuted(s.basePath, capture.id);
524
549
  const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
525
- return enqueueSidecar(s, ctx, { kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id }, { captureId: capture.id }, `Executing quick-task: ${capture.id} — "${capture.text}"`);
550
+ s.sidecarQueue.push({
551
+ kind: "quick-task",
552
+ unitType: "quick-task",
553
+ unitId: qtUnitId,
554
+ prompt,
555
+ captureId: capture.id,
556
+ });
557
+ debugLog("postUnitPostVerification", {
558
+ phase: "sidecar-enqueue",
559
+ kind: "quick-task",
560
+ unitId: qtUnitId,
561
+ captureId: capture.id,
562
+ });
563
+ ctx.ui.notify(`Executing quick-task: ${capture.id} — "${capture.text}"`, "info");
564
+ return "continue";
526
565
  }
527
566
  catch (e) {
528
567
  debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
@@ -675,15 +675,6 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
675
675
  // If the UAT file already contains a verdict, UAT has been run — skip
676
676
  if (hasVerdict(uatContent))
677
677
  return null;
678
- // Also check the ASSESSMENT file — the run-uat prompt writes the verdict
679
- // there (via gsd_summary_save artifact_type:"ASSESSMENT"), not into the
680
- // UAT spec file. Without this check the unit re-dispatches indefinitely.
681
- const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
682
- if (assessmentFile) {
683
- const assessmentContent = await loadFile(assessmentFile);
684
- if (assessmentContent && hasVerdict(assessmentContent))
685
- return null;
686
- }
687
678
  const uatType = getUatType(uatContent);
688
679
  return { sliceId: sid, uatType };
689
680
  }
@@ -715,14 +706,6 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
715
706
  // If the UAT file already contains a verdict, UAT has been run — skip
716
707
  if (hasVerdict(uatContentFb))
717
708
  return null;
718
- // Also check the ASSESSMENT file for the file-based fallback path (same
719
- // reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
720
- const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
721
- if (assessmentFileFb) {
722
- const assessmentContentFb = await loadFile(assessmentFileFb);
723
- if (assessmentContentFb && hasVerdict(assessmentContentFb))
724
- return null;
725
- }
726
709
  const uatTypeFb = getUatType(uatContentFb);
727
710
  return { sliceId: uatSid, uatType: uatTypeFb };
728
711
  }
@@ -1190,28 +1173,6 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
1190
1173
  const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
1191
1174
  const inlined = [];
1192
1175
  inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
1193
- // Inline verification classes from planning (if available in DB)
1194
- try {
1195
- const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
1196
- if (isDbAvailable()) {
1197
- const milestone = getMilestone(mid);
1198
- if (milestone) {
1199
- const classes = [];
1200
- if (milestone.verification_contract)
1201
- classes.push(`- **Contract:** ${milestone.verification_contract}`);
1202
- if (milestone.verification_integration)
1203
- classes.push(`- **Integration:** ${milestone.verification_integration}`);
1204
- if (milestone.verification_operational)
1205
- classes.push(`- **Operational:** ${milestone.verification_operational}`);
1206
- if (milestone.verification_uat)
1207
- classes.push(`- **UAT:** ${milestone.verification_uat}`);
1208
- if (classes.length > 0) {
1209
- inlined.push(`### Verification Classes (from planning)\n\nThese verification tiers were defined during milestone planning. Each non-empty class must be checked for evidence during validation.\n\n${classes.join("\n")}`);
1210
- }
1211
- }
1212
- }
1213
- }
1214
- catch { /* fall through */ }
1215
1176
  // Inline all slice summaries and UAT results
1216
1177
  let valSliceIds = [];
1217
1178
  try {
@@ -1242,24 +1203,6 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
1242
1203
  if (uatInline)
1243
1204
  inlined.push(uatInline);
1244
1205
  }
1245
- // Aggregate unresolved follow-ups and known limitations across slices
1246
- const outstandingItems = [];
1247
- for (const sid of valSliceIds) {
1248
- const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY");
1249
- if (!summaryPath)
1250
- continue;
1251
- const content = await loadFile(summaryPath);
1252
- if (!content)
1253
- continue;
1254
- const summary = parseSummary(content);
1255
- if (summary.followUps)
1256
- outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`);
1257
- if (summary.knownLimitations)
1258
- outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`);
1259
- }
1260
- if (outstandingItems.length > 0) {
1261
- inlined.push(`### Outstanding Items (aggregated from slice summaries)\n\nThese follow-ups and known limitations were documented during slice completion but have not been resolved.\n\n${outstandingItems.join('\n')}`);
1262
- }
1263
1206
  // Inline existing VALIDATION file if this is a re-validation round
1264
1207
  const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
1265
1208
  const validationRel = relMilestoneFile(base, mid, "VALIDATION");
@@ -6,10 +6,9 @@
6
6
  * Pure functions that receive all needed state as parameters — no module-level
7
7
  * globals or AutoContext dependency.
8
8
  */
9
- import { parseUnitId } from "./unit-id.js";
10
9
  import { clearParseCache } from "./files.js";
11
10
  import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
12
- import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
11
+ import { isDbAvailable, getTask, getSlice, getSliceTasks } from "./gsd-db.js";
13
12
  import { isValidationTerminal } from "./state.js";
14
13
  import { nativeConflictFiles, nativeCommit, nativeCheckoutTheirs, nativeAddPaths, nativeMergeAbort, nativeResetHard, } from "./native-git-bridge.js";
15
14
  import { resolveSlicePath, resolveSliceFile, resolveTasksDir, resolveTaskFiles, relMilestoneFile, relSliceFile, buildSliceFileName, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
@@ -149,9 +148,13 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
149
148
  // Reactive-execute: verify that each dispatched task's summary exists.
150
149
  // The unitId encodes the batch: "{mid}/{sid}/reactive+T02,T03"
151
150
  if (unitType === "reactive-execute") {
152
- const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
153
- if (!mid || !sid || !batchPart)
151
+ const parts = unitId.split("/");
152
+ const mid = parts[0];
153
+ const sidAndBatch = parts[1];
154
+ const batchPart = parts[2]; // "reactive+T02,T03"
155
+ if (!mid || !sidAndBatch || !batchPart)
154
156
  return false;
157
+ const sid = sidAndBatch;
155
158
  const plusIdx = batchPart.indexOf("+");
156
159
  if (plusIdx === -1) {
157
160
  // Legacy format "reactive" without batch IDs — fall back to "any summary"
@@ -178,7 +181,10 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
178
181
  // Gate-evaluate: verify that each dispatched gate has been resolved in the DB.
179
182
  // The unitId encodes the batch: "{mid}/{sid}/gates+Q3,Q4"
180
183
  if (unitType === "gate-evaluate") {
181
- const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
184
+ const parts = unitId.split("/");
185
+ const mid = parts[0];
186
+ const sid = parts[1];
187
+ const batchPart = parts[2]; // "gates+Q3,Q4"
182
188
  if (!mid || !sid || !batchPart)
183
189
  return false;
184
190
  const plusIdx = batchPart.indexOf("+");
@@ -230,7 +236,10 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
230
236
  // execute-task: DB status is authoritative. Fall back to heading-style plan
231
237
  // detection when the DB is unavailable (unmigrated projects).
232
238
  if (unitType === "execute-task") {
233
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
239
+ const parts = unitId.split("/");
240
+ const mid = parts[0];
241
+ const sid = parts[1];
242
+ const tid = parts[2];
234
243
  if (mid && sid && tid) {
235
244
  const dbTask = getTask(mid, sid, tid);
236
245
  if (dbTask) {
@@ -262,7 +271,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
262
271
  // but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
263
272
  // to dispatch with a missing task plan (see issue #739).
264
273
  if (unitType === "plan-slice") {
265
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
274
+ const parts = unitId.split("/");
275
+ const mid = parts[0];
276
+ const sid = parts[1];
266
277
  if (mid && sid) {
267
278
  try {
268
279
  // DB primary path — get task IDs to verify task plan files exist
@@ -298,7 +309,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
298
309
  // complete-slice: DB status is authoritative for whether the slice is done.
299
310
  // Fall back to file-based check (roadmap [x]) when DB is unavailable.
300
311
  if (unitType === "complete-slice") {
301
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
312
+ const parts = unitId.split("/");
313
+ const mid = parts[0];
314
+ const sid = parts[1];
302
315
  if (mid && sid) {
303
316
  const dir = resolveSlicePath(base, mid, sid);
304
317
  if (dir) {
@@ -364,18 +377,6 @@ export function writeBlockerPlaceholder(unitType, unitId, base, reason) {
364
377
  `Review and replace this file before relying on downstream artifacts.`,
365
378
  ].join("\n");
366
379
  writeFileSync(absPath, content, "utf-8");
367
- // Mark the task as complete in the DB so verifyExpectedArtifact passes.
368
- // Without this, the DB status stays "pending" and the dispatch loop
369
- // re-derives the same task indefinitely (#2531).
370
- if (unitType === "execute-task" && isDbAvailable()) {
371
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
372
- if (mid && sid && tid) {
373
- try {
374
- updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString());
375
- }
376
- catch { /* non-fatal */ }
377
- }
378
- }
379
380
  return diagnoseExpectedArtifact(unitType, unitId, base);
380
381
  }
381
382
  // ─── Merge State Reconciliation ───────────────────────────────────────────────
@@ -475,7 +476,10 @@ export function reconcileMergeState(basePath, ctx) {
475
476
  * These are shown when automatic reconciliation is not possible.
476
477
  */
477
478
  export function buildLoopRemediationSteps(unitType, unitId, base) {
478
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
479
+ const parts = unitId.split("/");
480
+ const mid = parts[0];
481
+ const sid = parts[1];
482
+ const tid = parts[2];
479
483
  switch (unitType) {
480
484
  case "execute-task": {
481
485
  if (!mid || !sid || !tid)
@@ -10,7 +10,6 @@
10
10
  * telling the LLM which files to read and what to do.
11
11
  */
12
12
  import { deriveState } from "./state.js";
13
- import { parseUnitId } from "./unit-id.js";
14
13
  import { getManifestStatus } from "./files.js";
15
14
  export { inlinePriorMilestoneSummary } from "./files.js";
16
15
  import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
@@ -32,7 +31,6 @@ import { runGSDDoctor, rebuildState } from "./doctor.js";
32
31
  import { preDispatchHealthGate, resetProactiveHealing, setLevelChangeCallback, } from "./doctor-proactive.js";
33
32
  import { clearSkillSnapshot } from "./skill-discovery.js";
34
33
  import { captureAvailableSkills, resetSkillTelemetry, } from "./skill-telemetry.js";
35
- import { getRtkSessionSavings } from "../shared/rtk-session-stats.js";
36
34
  import { initMetrics, resetMetrics, getLedger, getProjectTotals, formatCost, formatTokenCount, } from "./metrics.js";
37
35
  import { join } from "node:path";
38
36
  import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs";
@@ -124,11 +122,6 @@ function deregisterSigtermHandler() {
124
122
  export function getAutoDashboardData() {
125
123
  const ledger = getLedger();
126
124
  const totals = ledger ? getProjectTotals(ledger.units) : null;
127
- const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
128
- const rtkSavings = sessionId && s.basePath
129
- ? getRtkSessionSavings(s.basePath, sessionId)
130
- : null;
131
- const rtkEnabled = loadEffectiveGSDPreferences()?.preferences.experimental?.rtk === true;
132
125
  // Pending capture count — lazy check, non-fatal
133
126
  let pendingCaptureCount = 0;
134
127
  try {
@@ -152,8 +145,6 @@ export function getAutoDashboardData() {
152
145
  totalCost: totals?.cost ?? 0,
153
146
  totalTokens: totals?.tokens.total ?? 0,
154
147
  pendingCaptureCount,
155
- rtkSavings,
156
- rtkEnabled,
157
148
  };
158
149
  }
159
150
  // ─── Public API ───────────────────────────────────────────────────────────────
@@ -370,11 +361,8 @@ export async function stopAuto(ctx, pi, reason) {
370
361
  // When the milestone is complete (has a SUMMARY), merge the worktree branch
371
362
  // back to main so code isn't stranded on the worktree branch (#2317).
372
363
  // For incomplete milestones, preserve the branch for later resumption.
373
- //
374
- // Skip if phases.ts already merged this milestone — avoids the double
375
- // mergeAndExit that fails because the branch was already deleted (#2645).
376
364
  try {
377
- if (s.currentMilestoneId && !s.milestoneMergedInPhases) {
365
+ if (s.currentMilestoneId) {
378
366
  const notifyCtx = ctx
379
367
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
380
368
  : { notify: () => { } };
@@ -939,13 +927,15 @@ const widgetStateAccessors = {
939
927
  * dispatching a unit. The LLM should never need to mkdir or git checkout.
940
928
  */
941
929
  function ensurePreconditions(unitType, unitId, base, state) {
942
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
930
+ const parts = unitId.split("/");
931
+ const mid = parts[0];
943
932
  const mDir = resolveMilestonePath(base, mid);
944
933
  if (!mDir) {
945
934
  const newDir = join(milestonesDir(base), mid);
946
935
  mkdirSync(join(newDir, "slices"), { recursive: true });
947
936
  }
948
- if (sid !== undefined) {
937
+ if (parts.length >= 2) {
938
+ const sid = parts[1];
949
939
  const mDirResolved = resolveMilestonePath(base, mid);
950
940
  if (mDirResolved) {
951
941
  const slicesDir = join(mDirResolved, "slices");