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
@@ -7,28 +7,17 @@ const require = createRequire(import.meta.url);
7
7
  const ROOT = new URL("../../../../../", import.meta.url);
8
8
 
9
9
  export function resolve(specifier, context, nextResolve) {
10
- // 1. Redirect all workspace package bare imports to source.
11
- // CI portability runs don't build any packages/ dist artifacts, so every
12
- // @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
13
- // source itself) must resolve to the TypeScript source entrypoint.
10
+ // 1. Direct redirects to dist/ for specific packages
14
11
  if (specifier === "../../packages/pi-coding-agent/src/index.js") {
15
- specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
16
- } else if (specifier === "@gsd/pi-coding-agent") {
17
- specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
12
+ specifier = new URL("packages/pi-coding-agent/dist/index.js", ROOT).href;
18
13
  } else if (specifier === "@gsd/pi-ai/oauth") {
19
- specifier = new URL("packages/pi-ai/src/utils/oauth/index.ts", ROOT).href;
14
+ specifier = new URL("packages/pi-ai/dist/utils/oauth/index.js", ROOT).href;
20
15
  } else if (specifier === "@gsd/pi-ai") {
21
- specifier = new URL("packages/pi-ai/src/index.ts", ROOT).href;
16
+ specifier = new URL("packages/pi-ai/dist/index.js", ROOT).href;
22
17
  } else if (specifier === "@gsd/pi-agent-core") {
23
- specifier = new URL("packages/pi-agent-core/src/index.ts", ROOT).href;
18
+ specifier = new URL("packages/pi-agent-core/dist/index.js", ROOT).href;
24
19
  } else if (specifier === "@gsd/pi-tui") {
25
- specifier = new URL("packages/pi-tui/src/index.ts", ROOT).href;
26
- } else if (specifier === "@gsd/native") {
27
- specifier = new URL("packages/native/src/index.ts", ROOT).href;
28
- } else if (specifier.startsWith("@gsd/native/")) {
29
- // Sub-path imports like @gsd/native/fd, @gsd/native/text, etc.
30
- const subpath = specifier.slice("@gsd/native/".length);
31
- specifier = new URL(`packages/native/src/${subpath}/index.ts`, ROOT).href;
20
+ specifier = new URL("packages/pi-tui/dist/index.js", ROOT).href;
32
21
  }
33
22
  // 2. Redirect packages/*/dist/ → packages/*/src/ with .js→.ts for strip-types
34
23
  // Also handles local imports — skip rewrite for dist/ paths that are real compiled artifacts.
@@ -65,15 +54,9 @@ export function resolve(specifier, context, nextResolve) {
65
54
  }
66
55
 
67
56
  export function load(url, context, nextLoad) {
68
- // Node's --experimental-strip-types handles plain .ts but not .tsx and not
69
- // all TypeScript syntax used by workspace packages (parameter properties,
70
- // decorators, etc.). Transpile all workspace package source files and .tsx
71
- // files through TypeScript's transpileModule to avoid those crashes.
72
- const shouldTranspileWithTypeScript =
73
- url.endsWith('.tsx') ||
74
- (url.endsWith('.ts') && url.includes('/packages/') && url.includes('/src/'));
75
-
76
- if (shouldTranspileWithTypeScript) {
57
+ // Node's --experimental-strip-types handles .ts but not .tsx (which may contain JSX).
58
+ // Use TypeScript to transpile .tsx JS with react-jsx transform, then serve as module.
59
+ if (url.endsWith('.tsx')) {
77
60
  const ts = require('typescript');
78
61
  const source = readFileSync(fileURLToPath(url), 'utf-8');
79
62
  const { outputText } = ts.transpileModule(source, {
@@ -83,8 +66,6 @@ export function load(url, context, nextLoad) {
83
66
  module: ts.ModuleKind.ESNext,
84
67
  target: ts.ScriptTarget.ESNext,
85
68
  esModuleInterop: true,
86
- experimentalDecorators: true,
87
- emitDecoratorMetadata: true,
88
69
  },
89
70
  });
90
71
  return { format: 'module', source: outputText, shortCircuit: true };
@@ -294,66 +294,3 @@ test('verifyExpectedArtifact: hook types always return true', () => {
294
294
  }
295
295
  });
296
296
 
297
-
298
- test('writeBlockerPlaceholder: updates DB task status for execute-task (#2531)', async () => {
299
- const base = createFixtureBase();
300
- try {
301
- const { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, getTask, isDbAvailable } =
302
- await import("../gsd-db.ts");
303
-
304
- const dbPath = join(base, ".gsd", "gsd.db");
305
- // Create the tasks directory (required for artifact path resolution)
306
- mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
307
-
308
- openDatabase(dbPath);
309
- try {
310
- insertMilestone({ id: "M001", title: "Test", status: "active" });
311
- insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active" });
312
- insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Task", status: "pending" });
313
-
314
- // Before fix: writeBlockerPlaceholder wrote the file but left DB as "pending"
315
- writeBlockerPlaceholder("execute-task", "M001/S01/T01", base, "idle recovery exhausted");
316
-
317
- const task = getTask("M001", "S01", "T01");
318
- assert.equal(task?.status, "complete",
319
- "writeBlockerPlaceholder must update DB task status to 'complete' so verifyExpectedArtifact passes");
320
-
321
- // Verify the full chain works: verifyExpectedArtifact should return true
322
- const verified = verifyExpectedArtifact("execute-task", "M001/S01/T01", base);
323
- assert.equal(verified, true,
324
- "verifyExpectedArtifact should pass after writeBlockerPlaceholder updates DB status");
325
- } finally {
326
- if (isDbAvailable()) closeDatabase();
327
- }
328
- } finally {
329
- cleanup(base);
330
- }
331
- });
332
-
333
- test('writeBlockerPlaceholder: does NOT update DB for non-execute-task types', async () => {
334
- const base = createFixtureBase();
335
- try {
336
- const { openDatabase, closeDatabase, insertMilestone, insertSlice, getSlice, isDbAvailable } =
337
- await import("../gsd-db.ts");
338
-
339
- const dbPath = join(base, ".gsd", "gsd.db");
340
- mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
341
-
342
- openDatabase(dbPath);
343
- try {
344
- insertMilestone({ id: "M001", title: "Test", status: "active" });
345
- insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active" });
346
-
347
- // research-slice is NOT execute-task — DB should NOT be updated
348
- writeBlockerPlaceholder("research-slice", "M001/S01", base, "idle recovery exhausted");
349
-
350
- const slice = getSlice("M001", "S01");
351
- assert.equal(slice?.status, "active",
352
- "writeBlockerPlaceholder should not change DB status for non-execute-task types");
353
- } finally {
354
- if (isDbAvailable()) closeDatabase();
355
- }
356
- } finally {
357
- cleanup(base);
358
- }
359
- });
@@ -165,43 +165,3 @@ test("falls back to configured model when no light-tier model available", () =>
165
165
  assert.equal(result.modelId, "claude-opus-4-6");
166
166
  assert.equal(result.wasDowngraded, false);
167
167
  });
168
-
169
- // ─── #2192: Unknown models honor explicit config ─────────────────────────────
170
-
171
- test("#2192: unknown model is not downgraded — respects user config", () => {
172
- const config = { ...defaultRoutingConfig(), enabled: true };
173
- const result = resolveModelForComplexity(
174
- makeClassification("light"),
175
- { primary: "gpt-5.4", fallbacks: [] },
176
- config,
177
- ["gpt-5.4", ...AVAILABLE_MODELS],
178
- );
179
- assert.equal(result.modelId, "gpt-5.4", "unknown model should be used as-is");
180
- assert.equal(result.wasDowngraded, false, "should not be downgraded");
181
- assert.ok(result.reason.includes("not in the known tier map"), "reason should explain why");
182
- });
183
-
184
- test("#2192: unknown model with provider prefix is not downgraded", () => {
185
- const config = { ...defaultRoutingConfig(), enabled: true };
186
- const result = resolveModelForComplexity(
187
- makeClassification("standard"),
188
- { primary: "custom-provider/my-model-v3", fallbacks: [] },
189
- config,
190
- ["custom-provider/my-model-v3", ...AVAILABLE_MODELS],
191
- );
192
- assert.equal(result.modelId, "custom-provider/my-model-v3");
193
- assert.equal(result.wasDowngraded, false);
194
- });
195
-
196
- test("#2192: known model is still downgraded normally", () => {
197
- const config = { ...defaultRoutingConfig(), enabled: true };
198
- // claude-opus-4-6 is known as "heavy" — a light request should downgrade
199
- const result = resolveModelForComplexity(
200
- makeClassification("light"),
201
- { primary: "claude-opus-4-6", fallbacks: [] },
202
- config,
203
- AVAILABLE_MODELS,
204
- );
205
- assert.equal(result.wasDowngraded, true, "known heavy model should still be downgraded for light tasks");
206
- assert.notEqual(result.modelId, "claude-opus-4-6");
207
- });
@@ -31,10 +31,7 @@ test("shouldSendDesktopNotification disables all categories when notifications a
31
31
  assert.equal(shouldSendDesktopNotification("milestone", prefs), false);
32
32
  });
33
33
 
34
- test("buildDesktopNotificationCommand falls back to osascript on macOS when terminal-notifier is absent", () => {
35
- // When terminal-notifier is not on PATH, falls back to osascript.
36
- // This test runs in CI where terminal-notifier is typically not installed.
37
- // If terminal-notifier IS installed, we verify it returns that instead.
34
+ test("buildDesktopNotificationCommand uses argument arrays for macOS notifications", () => {
38
35
  const command = buildDesktopNotificationCommand(
39
36
  "darwin",
40
37
  `Bob's "Milestone"`,
@@ -43,30 +40,11 @@ test("buildDesktopNotificationCommand falls back to osascript on macOS when term
43
40
  );
44
41
 
45
42
  assert.ok(command);
46
- if (command.file.includes("terminal-notifier")) {
47
- // terminal-notifier path — verify args structure
48
- assert.ok(command.args.includes("-title"));
49
- assert.ok(command.args.includes("-message"));
50
- assert.ok(command.args.includes("-sound"));
51
- assert.ok(command.args.includes("Basso")); // error level
52
- } else {
53
- // osascript fallback path
54
- assert.equal(command.file, "osascript");
55
- assert.deepEqual(command.args.slice(0, 1), ["-e"]);
56
- assert.match(command.args[1], /Bob's \\"Milestone\\"/);
57
- assert.match(command.args[1], /Budget! Path: C:\\\\temp/);
58
- assert.doesNotMatch(command.args[1], /\n/);
59
- }
60
- });
61
-
62
- test("buildDesktopNotificationCommand uses Glass sound for non-error on macOS", () => {
63
- const command = buildDesktopNotificationCommand("darwin", "Title", "Message", "info");
64
- assert.ok(command);
65
- if (command.file.includes("terminal-notifier")) {
66
- assert.ok(command.args.includes("Glass"));
67
- } else {
68
- assert.match(command.args[1], /sound name "Glass"/);
69
- }
43
+ assert.equal(command.file, "osascript");
44
+ assert.deepEqual(command.args.slice(0, 1), ["-e"]);
45
+ assert.match(command.args[1], /Bob's \\"Milestone\\"/);
46
+ assert.match(command.args[1], /Budget! Path: C:\\\\temp/);
47
+ assert.doesNotMatch(command.args[1], /\n/);
70
48
  });
71
49
 
72
50
  test("buildDesktopNotificationCommand preserves literal shell characters on linux", () => {
@@ -377,53 +377,3 @@ test("unrecognized format warning is emitted at most once (#2373)", () => {
377
377
  _resetParseWarningFlag();
378
378
  }
379
379
  });
380
-
381
- // ── Experimental preferences ─────────────────────────────────────────────────
382
-
383
- test("experimental.rtk: true is accepted and stored", () => {
384
- const result = validatePreferences({ experimental: { rtk: true } });
385
- assert.deepEqual(result.errors, []);
386
- assert.equal(result.preferences.experimental?.rtk, true);
387
- });
388
-
389
- test("experimental.rtk: false is accepted and stored", () => {
390
- const result = validatePreferences({ experimental: { rtk: false } });
391
- assert.deepEqual(result.errors, []);
392
- assert.equal(result.preferences.experimental?.rtk, false);
393
- });
394
-
395
- test("experimental.rtk: non-boolean produces error", () => {
396
- const result = validatePreferences({ experimental: { rtk: "yes" } } as unknown as GSDPreferences);
397
- assert.ok(result.errors.some(e => e.includes("experimental.rtk")), `expected rtk error in: ${JSON.stringify(result.errors)}`);
398
- });
399
-
400
- test("experimental: non-object produces error", () => {
401
- const result = validatePreferences({ experimental: true } as unknown as GSDPreferences);
402
- assert.ok(result.errors.some(e => e.includes("experimental must be an object")));
403
- });
404
-
405
- test("experimental: unknown key produces warning", () => {
406
- const result = validatePreferences({ experimental: { rtk: true, future_flag: true } } as unknown as GSDPreferences);
407
- assert.ok(result.warnings.some(w => w.includes("future_flag")), `expected unknown-key warning in: ${JSON.stringify(result.warnings)}`);
408
- assert.equal(result.preferences.experimental?.rtk, true);
409
- });
410
-
411
- test("experimental: omitting rtk defaults to undefined (opt-in)", () => {
412
- const result = validatePreferences({ version: 1 });
413
- assert.equal(result.preferences.experimental, undefined);
414
- });
415
-
416
- test("experimental.rtk parses correctly from preferences markdown", () => {
417
- const content = "---\nversion: 1\nexperimental:\n rtk: true\n---\n";
418
- const prefs = parsePreferencesMarkdown(content);
419
- assert.notEqual(prefs, null);
420
- assert.equal(prefs!.experimental?.rtk, true);
421
- });
422
-
423
- test("experimental.rtk defaults to off in new project preferences", () => {
424
- // No experimental key → feature is disabled
425
- const content = "---\nversion: 1\n---\n";
426
- const prefs = parsePreferencesMarkdown(content);
427
- assert.notEqual(prefs, null);
428
- assert.equal(prefs!.experimental?.rtk, undefined);
429
- });
@@ -292,44 +292,4 @@ test('E2E: depends_on inline format preserved after partial removal', () => {
292
292
  }
293
293
  });
294
294
 
295
- test('E2E: DB-backed path respects queue order (#2556)', async () => {
296
- // Regression test for #2556: getActiveMilestoneId and deriveStateFromDb
297
- // used lexicographic sort instead of queue order, causing a deadlock when
298
- // the dispatch guard (which respects queue order) blocked completion.
299
- const base = createFixtureBase();
300
- try {
301
- const { openDatabase, closeDatabase, insertMilestone, isDbAvailable } = await import('../gsd-db.ts');
302
- const dbPath = join(base, '.gsd', 'gsd.db');
303
-
304
- // Create milestone directories (required for findMilestoneIds)
305
- writeMilestoneDir(base, 'M006');
306
- writeContext(base, 'M006', '', 'Earlier milestone');
307
- writeMilestoneDir(base, 'M008');
308
- writeContext(base, 'M008', '', 'Later milestone');
309
-
310
- // Open DB and insert milestones
311
- openDatabase(dbPath);
312
- try {
313
- insertMilestone({ id: 'M006', title: 'Earlier', status: 'active' });
314
- insertMilestone({ id: 'M008', title: 'Later', status: 'active' });
315
-
316
- // Set queue order: M008 should come FIRST (user reordered via /gsd queue)
317
- saveQueueOrder(base, ['M008', 'M006']);
318
-
319
- // deriveState should pick M008 (queue-first), not M006 (ID-first)
320
- invalidateStateCache();
321
- const state = await deriveState(base);
322
- assert.equal(
323
- state.activeMilestone?.id,
324
- 'M008',
325
- 'DB-backed deriveState must respect queue order — M008 is queued first',
326
- );
327
- } finally {
328
- if (isDbAvailable()) closeDatabase();
329
- }
330
- } finally {
331
- cleanup(base);
332
- }
333
- });
334
-
335
295
  });
@@ -15,7 +15,6 @@ import {
15
15
  } from "../reactive-graph.ts";
16
16
  import { validatePreferences } from "../preferences-validation.ts";
17
17
  import type { ReactiveExecutionState } from "../types.ts";
18
- import { parseUnitId } from "../unit-id.ts";
19
18
 
20
19
  // ─── Preference Validation ────────────────────────────────────────────────
21
20
 
@@ -442,12 +441,13 @@ test("unitId batch encoding round-trips correctly", () => {
442
441
  const unitId = `${mid}/${sid}/reactive+${selected.join(",")}`;
443
442
 
444
443
  // Parse it back
445
- const { milestone, slice, task: batchPart } = parseUnitId(unitId);
446
- assert.equal(milestone, "M001");
447
- assert.equal(slice, "S01");
448
- const plusIdx = batchPart!.indexOf("+");
444
+ const parts = unitId.split("/");
445
+ assert.equal(parts[0], "M001");
446
+ assert.equal(parts[1], "S01");
447
+ const batchPart = parts[2];
448
+ const plusIdx = batchPart.indexOf("+");
449
449
  assert.ok(plusIdx > 0, "Should have + separator");
450
- const batchIds = batchPart!.slice(plusIdx + 1).split(",");
450
+ const batchIds = batchPart.slice(plusIdx + 1).split(",");
451
451
  assert.deepEqual(batchIds, ["T02", "T03", "T05"]);
452
452
  });
453
453
 
@@ -16,7 +16,6 @@ import {
16
16
  resolveHookArtifactPath,
17
17
  } from "../post-unit-hooks.ts";
18
18
  import { uncheckTaskInPlan } from "../undo.ts";
19
- import { parseUnitId } from "../unit-id.ts";
20
19
 
21
20
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
22
21
 
@@ -184,7 +183,8 @@ test('Full retry reset: all steps combined', () => {
184
183
  retryArtifact: "NEEDS-REWORK.md",
185
184
  };
186
185
 
187
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(trigger.unitId);
186
+ const parts = trigger.unitId.split("/");
187
+ const [mid, sid, tid] = parts;
188
188
 
189
189
  // Simulate completedUnits
190
190
  let completedUnits = [
@@ -264,10 +264,11 @@ test('Retry reset: idempotent when artifacts already missing', () => {
264
264
  };
265
265
 
266
266
  // These should not throw even with missing files
267
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(trigger.unitId);
267
+ const parts = trigger.unitId.split("/");
268
+ const [mid, sid, tid] = parts;
268
269
 
269
270
  // Uncheck — returns false because no PLAN file
270
- const uncheckResult = uncheckTaskInPlan(base, mid, sid!, tid!);
271
+ const uncheckResult = uncheckTaskInPlan(base, mid, sid, tid);
271
272
  assert.ok(!uncheckResult, "uncheck returns false when no PLAN exists");
272
273
 
273
274
  // Summary does not exist — no crash
@@ -460,150 +460,4 @@ test('(n) stale replay guard', async () => {
460
460
  }
461
461
  });
462
462
 
463
- test('(q) verdict in ASSESSMENT file skips UAT dispatch (file-based path)', async () => {
464
- // Regression test for #2644: run-uat prompt writes the verdict to
465
- // S{sid}-ASSESSMENT.md (via gsd_summary_save artifact_type:"ASSESSMENT"),
466
- // but checkNeedsRunUat only checked S{sid}-UAT.md — causing a stuck loop.
467
- const base = createFixtureBase();
468
- try {
469
- const roadmapDir = join(base, '.gsd', 'milestones', 'M001');
470
- mkdirSync(roadmapDir, { recursive: true });
471
- writeFileSync(
472
- join(roadmapDir, 'M001-ROADMAP.md'),
473
- [
474
- '# M001: Test roadmap',
475
- '',
476
- '## Slices',
477
- '',
478
- '- [x] **S01: First slice** `risk:low` `depends:[]`',
479
- '- [ ] **S02: Next slice** `risk:low` `depends:[S01]`',
480
- '',
481
- '## Boundary Map',
482
- '',
483
- ].join('\n'),
484
- );
485
-
486
- // UAT spec file WITHOUT a verdict (the spec never gets one)
487
- writeSliceFile(base, 'M001', 'S01', 'UAT', makeUatContent('artifact-driven'));
488
- // ASSESSMENT file WITH a verdict (where run-uat actually writes it)
489
- writeSliceFile(base, 'M001', 'S01', 'ASSESSMENT', '---\nverdict: PASS\n---\n# UAT Assessment\n');
490
-
491
- const state = {
492
- activeMilestone: { id: 'M001', title: 'Test roadmap' },
493
- activeSlice: { id: 'S02', title: 'Next slice' },
494
- activeTask: null,
495
- phase: 'planning',
496
- recentDecisions: [],
497
- blockers: [],
498
- nextAction: 'Plan S02',
499
- registry: [],
500
- } as const;
501
-
502
- const result = await checkNeedsRunUat(base, 'M001', state as any, { uat_dispatch: true } as any);
503
- assert.deepStrictEqual(
504
- result,
505
- null,
506
- 'verdict in ASSESSMENT file should prevent re-dispatch of run-uat',
507
- );
508
- } finally {
509
- cleanup(base);
510
- }
511
- });
512
-
513
- test('(r) no ASSESSMENT file still dispatches UAT (no false skip)', async () => {
514
- // Guard: when there is no ASSESSMENT file at all, UAT should still dispatch
515
- // normally. The ASSESSMENT check must not cause a false-negative skip.
516
- const base = createFixtureBase();
517
- try {
518
- const roadmapDir = join(base, '.gsd', 'milestones', 'M001');
519
- mkdirSync(roadmapDir, { recursive: true });
520
- writeFileSync(
521
- join(roadmapDir, 'M001-ROADMAP.md'),
522
- [
523
- '# M001: Test roadmap',
524
- '',
525
- '## Slices',
526
- '',
527
- '- [x] **S01: First slice** `risk:low` `depends:[]`',
528
- '- [ ] **S02: Next slice** `risk:low` `depends:[S01]`',
529
- '',
530
- '## Boundary Map',
531
- '',
532
- ].join('\n'),
533
- );
534
-
535
- // UAT spec file WITHOUT a verdict, and NO ASSESSMENT file
536
- writeSliceFile(base, 'M001', 'S01', 'UAT', makeUatContent('artifact-driven'));
537
-
538
- const state = {
539
- activeMilestone: { id: 'M001', title: 'Test roadmap' },
540
- activeSlice: { id: 'S02', title: 'Next slice' },
541
- activeTask: null,
542
- phase: 'planning',
543
- recentDecisions: [],
544
- blockers: [],
545
- nextAction: 'Plan S02',
546
- registry: [],
547
- } as const;
548
-
549
- const result = await checkNeedsRunUat(base, 'M001', state as any, { uat_dispatch: true } as any);
550
- assert.deepStrictEqual(
551
- result,
552
- { sliceId: 'S01', uatType: 'artifact-driven' },
553
- 'without ASSESSMENT file, UAT still dispatches normally',
554
- );
555
- } finally {
556
- cleanup(base);
557
- }
558
- });
559
-
560
- test('(s) ASSESSMENT without verdict does not skip UAT dispatch', async () => {
561
- // Guard: an ASSESSMENT file that exists but has no verdict line should
562
- // NOT suppress UAT dispatch — only a file with an actual verdict should.
563
- const base = createFixtureBase();
564
- try {
565
- const roadmapDir = join(base, '.gsd', 'milestones', 'M001');
566
- mkdirSync(roadmapDir, { recursive: true });
567
- writeFileSync(
568
- join(roadmapDir, 'M001-ROADMAP.md'),
569
- [
570
- '# M001: Test roadmap',
571
- '',
572
- '## Slices',
573
- '',
574
- '- [x] **S01: First slice** `risk:low` `depends:[]`',
575
- '- [ ] **S02: Next slice** `risk:low` `depends:[S01]`',
576
- '',
577
- '## Boundary Map',
578
- '',
579
- ].join('\n'),
580
- );
581
-
582
- // UAT spec WITHOUT verdict
583
- writeSliceFile(base, 'M001', 'S01', 'UAT', makeUatContent('artifact-driven'));
584
- // ASSESSMENT file WITHOUT verdict (partial/incomplete assessment)
585
- writeSliceFile(base, 'M001', 'S01', 'ASSESSMENT', '# UAT Assessment\n\nStill running checks...\n');
586
-
587
- const state = {
588
- activeMilestone: { id: 'M001', title: 'Test roadmap' },
589
- activeSlice: { id: 'S02', title: 'Next slice' },
590
- activeTask: null,
591
- phase: 'planning',
592
- recentDecisions: [],
593
- blockers: [],
594
- nextAction: 'Plan S02',
595
- registry: [],
596
- } as const;
597
-
598
- const result = await checkNeedsRunUat(base, 'M001', state as any, { uat_dispatch: true } as any);
599
- assert.deepStrictEqual(
600
- result,
601
- { sliceId: 'S01', uatType: 'artifact-driven' },
602
- 'ASSESSMENT without verdict should not suppress UAT dispatch',
603
- );
604
- } finally {
605
- cleanup(base);
606
- }
607
- });
608
-
609
463
  });
@@ -113,12 +113,12 @@ test("postUnitPostVerification pushes to sidecarQueue for hooks", () => {
113
113
  assert.ok(triageSectionStart > -1, "auto-post-unit.ts must have a triage check section");
114
114
  const hookSection = source.slice(hookSectionStart, triageSectionStart);
115
115
  assert.ok(
116
- hookSection.includes("enqueueSidecar(") || hookSection.includes("s.sidecarQueue.push("),
117
- "hook section must enqueue to sidecarQueue (via enqueueSidecar or direct push)",
116
+ hookSection.includes("s.sidecarQueue.push("),
117
+ "hook section must push to s.sidecarQueue",
118
118
  );
119
119
  assert.ok(
120
- hookSection.includes('"hook"'),
121
- "hook sidecar item must reference kind 'hook'",
120
+ hookSection.includes('kind: "hook"'),
121
+ "hook sidecar item must have kind: 'hook'",
122
122
  );
123
123
  });
124
124
 
@@ -132,12 +132,12 @@ test("postUnitPostVerification pushes to sidecarQueue for triage", () => {
132
132
  assert.ok(quickTaskSectionStart > -1, "auto-post-unit.ts must have a quick-task dispatch section");
133
133
  const triageSection = source.slice(triageSectionStart, quickTaskSectionStart);
134
134
  assert.ok(
135
- triageSection.includes("enqueueSidecar(") || triageSection.includes("s.sidecarQueue.push("),
136
- "triage section must enqueue to sidecarQueue (via enqueueSidecar or direct push)",
135
+ triageSection.includes("s.sidecarQueue.push("),
136
+ "triage section must push to s.sidecarQueue",
137
137
  );
138
138
  assert.ok(
139
- triageSection.includes('"triage"'),
140
- "triage sidecar item must reference kind 'triage'",
139
+ triageSection.includes('kind: "triage"'),
140
+ "triage sidecar item must have kind: 'triage'",
141
141
  );
142
142
  });
143
143
 
@@ -149,12 +149,12 @@ test("postUnitPostVerification pushes to sidecarQueue for quick-tasks", () => {
149
149
  assert.ok(quickTaskSectionStart > -1, "auto-post-unit.ts must have a quick-task dispatch section");
150
150
  const quickTaskSection = source.slice(quickTaskSectionStart);
151
151
  assert.ok(
152
- quickTaskSection.includes("enqueueSidecar(") || quickTaskSection.includes("s.sidecarQueue.push("),
153
- "quick-task section must enqueue to sidecarQueue (via enqueueSidecar or direct push)",
152
+ quickTaskSection.includes("s.sidecarQueue.push("),
153
+ "quick-task section must push to s.sidecarQueue",
154
154
  );
155
155
  assert.ok(
156
- quickTaskSection.includes('"quick-task"'),
157
- "quick-task sidecar item must reference kind 'quick-task'",
156
+ quickTaskSection.includes('kind: "quick-task"'),
157
+ "quick-task sidecar item must have kind: 'quick-task'",
158
158
  );
159
159
  });
160
160
 
@@ -47,27 +47,3 @@ test("#2309: rate limits are still transient", () => {
47
47
  assert.equal(rlResult.isTransient, true, "rate limits are still transient");
48
48
  assert.equal(rlResult.isRateLimit, true, "rate limits are flagged as rate limits");
49
49
  });
50
-
51
- // --- #2572: stream-truncation JSON parse errors should be transient ---
52
-
53
- test("#2572: 'Expected double-quoted property name' (truncated stream) is transient", () => {
54
- const result = classifyProviderError("Expected double-quoted property name in JSON at position 23 (line 1 column 24)");
55
- assert.equal(result.isTransient, true, "truncated-stream JSON parse error should be transient");
56
- assert.equal(result.isRateLimit, false, "not a rate limit");
57
- assert.equal(result.suggestedDelayMs, 15_000, "should use 15s backoff like connection errors");
58
- });
59
-
60
- test("#2572: 'Unexpected end of JSON input' (truncated stream) is transient", () => {
61
- const result = classifyProviderError("Unexpected end of JSON input");
62
- assert.equal(result.isTransient, true, "'Unexpected end of JSON input' should be transient");
63
- });
64
-
65
- test("#2572: 'Unexpected token' in JSON (truncated stream) is transient", () => {
66
- const result = classifyProviderError("Unexpected token < in JSON at position 0");
67
- assert.equal(result.isTransient, true, "'Unexpected token in JSON' should be transient");
68
- });
69
-
70
- test("#2572: 'SyntaxError' with JSON context (truncated stream) is transient", () => {
71
- const result = classifyProviderError("SyntaxError: JSON.parse: unexpected character at line 1 column 1");
72
- assert.equal(result.isTransient, true, "'SyntaxError...JSON' should be transient");
73
- });
@@ -119,7 +119,7 @@ test("dispatch: triage dispatch keeps the loop in continue mode", () => {
119
119
  postUnitSrc.indexOf("// ── Quick-task dispatch"),
120
120
  );
121
121
  assert.ok(
122
- triageBlock.includes('return "continue"') || triageBlock.includes("return enqueueSidecar("),
122
+ triageBlock.includes('return "continue"'),
123
123
  "triage dispatch should return 'continue' after enqueuing sidecar work",
124
124
  );
125
125
  });
@@ -320,7 +320,7 @@ test("dispatch: quick-task dispatch keeps the loop in continue mode", () => {
320
320
  postUnitSrc.indexOf("if (s.stepMode)"),
321
321
  );
322
322
  assert.ok(
323
- quickTaskSection.includes('return "continue"') || quickTaskSection.includes("return enqueueSidecar("),
323
+ quickTaskSection.includes('return "continue"'),
324
324
  "quick-task dispatch should return 'continue' after enqueuing sidecar work",
325
325
  );
326
326
  });
@@ -157,8 +157,6 @@ export interface Summary {
157
157
  whatHappened: string;
158
158
  deviations: string;
159
159
  filesModified: FileModified[];
160
- followUps: string;
161
- knownLimitations: string;
162
160
  }
163
161
 
164
162
  // ─── Continue-Here ─────────────────────────────────────────────────────────