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
@@ -1,161 +0,0 @@
1
- /**
2
- * Regression tests for #2195: formatTraceSummary (used by getDeepDiagnostic →
3
- * retry prompts) must NOT include lastReasoning from prior assistant text.
4
- *
5
- * Including prior assistant free-text in retry diagnostics causes hallucination
6
- * loops when the previous turn was truncated or malformed.
7
- *
8
- * The crash recovery path (formatCrashRecoveryBriefing) has its own safe handling
9
- * of lastReasoning and is NOT affected by this change.
10
- */
11
- import { describe, test } from "node:test";
12
- import assert from "node:assert/strict";
13
- import { mkdirSync, writeFileSync, rmSync, mkdtempSync } from "node:fs";
14
- import { join } from "node:path";
15
- import { tmpdir } from "node:os";
16
-
17
- import { extractTrace, getDeepDiagnostic } from "../session-forensics.ts";
18
-
19
- /** Build a minimal assistant text reasoning entry. */
20
- function makeAssistantText(text: string): unknown {
21
- return {
22
- type: "message",
23
- message: {
24
- role: "assistant",
25
- content: [{ type: "text", text }],
26
- },
27
- };
28
- }
29
-
30
- /** Build a minimal assistant tool call + tool result pair. */
31
- function makeToolPair(
32
- toolName: string,
33
- input: Record<string, unknown>,
34
- resultText: string,
35
- isError: boolean,
36
- ): unknown[] {
37
- const toolCallId = `toolu_${Math.random().toString(36).slice(2, 10)}`;
38
- return [
39
- {
40
- type: "message",
41
- message: {
42
- role: "assistant",
43
- content: [
44
- {
45
- type: "toolCall",
46
- id: toolCallId,
47
- name: toolName,
48
- arguments: input,
49
- },
50
- ],
51
- },
52
- },
53
- {
54
- type: "message",
55
- message: {
56
- role: "toolResult",
57
- toolCallId,
58
- toolName,
59
- isError,
60
- content: [{ type: "text", text: resultText }],
61
- },
62
- },
63
- ];
64
- }
65
-
66
- describe("retry diagnostic excludes lastReasoning (#2195)", () => {
67
- test("extractTrace still captures lastReasoning in the trace object", () => {
68
- const entries = [
69
- makeAssistantText("I am going to write the summary file now"),
70
- ...makeToolPair("write", { path: "/tmp/SUMMARY.md" }, "ok", false),
71
- makeAssistantText("The task is complete — all files written."),
72
- ];
73
-
74
- const trace = extractTrace(entries);
75
- // extractTrace should still collect lastReasoning for crash recovery
76
- assert.ok(trace.lastReasoning.length > 0,
77
- "extractTrace should still populate lastReasoning");
78
- assert.ok(trace.lastReasoning.includes("all files written"),
79
- "lastReasoning should contain the last assistant text");
80
- });
81
-
82
- test("getDeepDiagnostic output does NOT contain lastReasoning", () => {
83
- // Create a temporary activity directory with a JSONL file
84
- const tempBase = mkdtempSync(join(tmpdir(), "gsd-diag-test-"));
85
- const gsdDir = join(tempBase, ".gsd");
86
- const activityDir = join(gsdDir, "activity");
87
- mkdirSync(activityDir, { recursive: true });
88
-
89
- try {
90
- // Build entries with both tool calls and assistant reasoning
91
- const entries = [
92
- makeAssistantText("Let me analyze the codebase structure first"),
93
- ...makeToolPair("bash", { command: "ls src/" }, "index.ts\nutils.ts", false),
94
- makeAssistantText("I see the milestone/M001 branch has a significantly different ... 3. "),
95
- ];
96
-
97
- // Write JSONL activity file
98
- const jsonl = entries.map(e => JSON.stringify(e)).join("\n");
99
- writeFileSync(join(activityDir, "2025-01-01T00-00-00.jsonl"), jsonl);
100
-
101
- const diagnostic = getDeepDiagnostic(tempBase);
102
-
103
- // Diagnostic should exist (we have tool calls)
104
- assert.ok(diagnostic !== null, "diagnostic should not be null");
105
-
106
- // Diagnostic should contain structured execution evidence
107
- assert.ok(diagnostic!.includes("Tool calls completed:"),
108
- "should include tool call count");
109
- assert.ok(diagnostic!.includes("ls src/"),
110
- "should include commands run");
111
-
112
- // Diagnostic must NOT contain the assistant's free-text reasoning
113
- assert.ok(!diagnostic!.includes("Last reasoning"),
114
- "diagnostic must not include 'Last reasoning' label");
115
- assert.ok(!diagnostic!.includes("analyze the codebase"),
116
- "diagnostic must not include prior assistant text");
117
- assert.ok(!diagnostic!.includes("significantly different"),
118
- "diagnostic must not include truncated assistant reasoning");
119
- } finally {
120
- rmSync(tempBase, { recursive: true, force: true });
121
- }
122
- });
123
-
124
- test("getDeepDiagnostic still includes errors and file operations", () => {
125
- const tempBase = mkdtempSync(join(tmpdir(), "gsd-diag-test-"));
126
- const gsdDir = join(tempBase, ".gsd");
127
- const activityDir = join(gsdDir, "activity");
128
- mkdirSync(activityDir, { recursive: true });
129
-
130
- try {
131
- const entries = [
132
- makeAssistantText("Writing the plan file"),
133
- ...makeToolPair("write", { path: "M001/S01/S01-PLAN.md" }, "ok", false),
134
- ...makeToolPair("bash", { command: "npm run build" }, "Error: type mismatch", true),
135
- makeAssistantText("The build failed, let me investigate"),
136
- ];
137
-
138
- const jsonl = entries.map(e => JSON.stringify(e)).join("\n");
139
- writeFileSync(join(activityDir, "2025-01-01T00-00-00.jsonl"), jsonl);
140
-
141
- const diagnostic = getDeepDiagnostic(tempBase);
142
- assert.ok(diagnostic !== null);
143
-
144
- // Structured evidence should be present
145
- assert.ok(diagnostic!.includes("S01-PLAN.md"),
146
- "should include files written");
147
- assert.ok(diagnostic!.includes("npm run build"),
148
- "should include commands run");
149
- assert.ok(diagnostic!.includes("type mismatch"),
150
- "should include errors");
151
-
152
- // But NOT the assistant's free-text
153
- assert.ok(!diagnostic!.includes("Writing the plan"),
154
- "must not include assistant reasoning");
155
- assert.ok(!diagnostic!.includes("build failed"),
156
- "must not include assistant reasoning about failures");
157
- } finally {
158
- rmSync(tempBase, { recursive: true, force: true });
159
- }
160
- });
161
- });
@@ -1,82 +0,0 @@
1
- /**
2
- * Regression tests for #2203: rewrite-docs circuit breaker must persist
3
- * across session restarts.
4
- *
5
- * The rewrite attempt counter was stored in-memory on the session object,
6
- * resetting to 0 on every session restart. This allowed the rewrite-docs
7
- * dispatch rule to fire indefinitely, never tripping the MAX_REWRITE_ATTEMPTS
8
- * circuit breaker.
9
- *
10
- * The fix persists the counter to `.gsd/runtime/rewrite-count.json`.
11
- */
12
- import { describe, test, beforeEach, afterEach } from "node:test";
13
- import assert from "node:assert/strict";
14
- import { mkdirSync, existsSync, readFileSync, writeFileSync, rmSync, mkdtempSync } from "node:fs";
15
- import { join } from "node:path";
16
- import { tmpdir } from "node:os";
17
-
18
- import { getRewriteCount, setRewriteCount } from "../auto-dispatch.ts";
19
-
20
- describe("rewrite-docs circuit breaker persistence (#2203)", () => {
21
- let tempBase: string;
22
-
23
- beforeEach(() => {
24
- tempBase = mkdtempSync(join(tmpdir(), "gsd-rewrite-test-"));
25
- // Create .gsd/ directory so gsdRoot resolves to it
26
- mkdirSync(join(tempBase, ".gsd", "runtime"), { recursive: true });
27
- });
28
-
29
- afterEach(() => {
30
- rmSync(tempBase, { recursive: true, force: true });
31
- });
32
-
33
- test("getRewriteCount returns 0 when no file exists", () => {
34
- const count = getRewriteCount(tempBase);
35
- assert.equal(count, 0);
36
- });
37
-
38
- test("setRewriteCount writes and getRewriteCount reads back", () => {
39
- setRewriteCount(tempBase, 2);
40
- const count = getRewriteCount(tempBase);
41
- assert.equal(count, 2);
42
- });
43
-
44
- test("counter persists across simulated session restarts", () => {
45
- // Session 1: increment to 1
46
- setRewriteCount(tempBase, 1);
47
-
48
- // "Session restart" — only the disk file survives, session object is gone
49
- const countAfterRestart = getRewriteCount(tempBase);
50
- assert.equal(countAfterRestart, 1, "counter should survive session restart");
51
-
52
- // Session 2: increment to 2
53
- setRewriteCount(tempBase, countAfterRestart + 1);
54
- assert.equal(getRewriteCount(tempBase), 2);
55
- });
56
-
57
- test("setRewriteCount(0) resets the counter", () => {
58
- setRewriteCount(tempBase, 3);
59
- assert.equal(getRewriteCount(tempBase), 3);
60
-
61
- setRewriteCount(tempBase, 0);
62
- assert.equal(getRewriteCount(tempBase), 0);
63
- });
64
-
65
- test("getRewriteCount handles corrupt JSON gracefully", () => {
66
- const filePath = join(tempBase, ".gsd", "runtime", "rewrite-count.json");
67
- // writeFileSync is imported at the top of this file
68
- writeFileSync(filePath, "not json{{{");
69
- const count = getRewriteCount(tempBase);
70
- assert.equal(count, 0, "corrupt file should return 0");
71
- });
72
-
73
- test("rewrite-count.json is written to .gsd/runtime/", () => {
74
- setRewriteCount(tempBase, 1);
75
- const filePath = join(tempBase, ".gsd", "runtime", "rewrite-count.json");
76
- assert.ok(existsSync(filePath), "rewrite-count.json should exist");
77
-
78
- const content = JSON.parse(readFileSync(filePath, "utf-8"));
79
- assert.equal(content.count, 1);
80
- assert.ok(content.updatedAt, "should include timestamp");
81
- });
82
- });
@@ -1,193 +0,0 @@
1
- /**
2
- * Unit tests for GSD Skill Catalog — pack matching logic.
3
- *
4
- * Exercises matchPacksForProject() to verify that project signals
5
- * correctly map to skill packs.
6
- */
7
-
8
- import test from "node:test";
9
- import assert from "node:assert/strict";
10
- import { PROJECT_FILES } from "../detection.ts";
11
- import { GREENFIELD_STACKS, SKILL_CATALOG, matchPacksForProject } from "../skill-catalog.ts";
12
- import type { ProjectSignals } from "../detection.ts";
13
-
14
- function makeSignals(overrides: Partial<ProjectSignals> = {}): ProjectSignals {
15
- return {
16
- detectedFiles: [],
17
- isGitRepo: false,
18
- isMonorepo: false,
19
- xcodePlatforms: [],
20
- hasCI: false,
21
- hasTests: false,
22
- verificationCommands: [],
23
- ...overrides,
24
- };
25
- }
26
-
27
- function packLabels(signals: ProjectSignals): string[] {
28
- return matchPacksForProject(signals).map((p) => p.label);
29
- }
30
-
31
- // ── matchAlways packs are always included ────────────────────────────────────
32
-
33
- test("matchPacksForProject: always includes matchAlways packs", () => {
34
- const labels = packLabels(makeSignals());
35
- assert.ok(labels.includes("Skill Discovery"), "should include Skill Discovery");
36
- assert.ok(labels.includes("Skill Authoring"), "should include Skill Authoring");
37
- assert.ok(labels.includes("Browser Automation"), "should include Browser Automation");
38
- assert.ok(labels.includes("Document Handling"), "should include Document Handling");
39
- assert.ok(labels.includes("Code Review & Quality"), "should include Code Review & Quality");
40
- assert.ok(labels.includes("Git Advanced Workflows"), "should include Git Advanced Workflows");
41
- });
42
-
43
- // ── Language matching ────────────────────────────────────────────────────────
44
-
45
- test("matchPacksForProject: Python language matches Python packs", () => {
46
- const labels = packLabels(makeSignals({ primaryLanguage: "python", detectedFiles: ["pyproject.toml"] }));
47
- assert.ok(labels.includes("Python"), "should include Python");
48
- assert.ok(labels.includes("Python Advanced"), "should include Python Advanced");
49
- });
50
-
51
- test("matchPacksForProject: Rust language matches Rust packs", () => {
52
- const labels = packLabels(makeSignals({ primaryLanguage: "rust", detectedFiles: ["Cargo.toml"] }));
53
- assert.ok(labels.includes("Rust"), "should include Rust");
54
- assert.ok(labels.includes("Rust Async Patterns"), "should include Rust Async Patterns");
55
- });
56
-
57
- test("matchPacksForProject: Go language matches Go packs", () => {
58
- const labels = packLabels(makeSignals({ primaryLanguage: "go", detectedFiles: ["go.mod"] }));
59
- assert.ok(labels.includes("Go"), "should include Go");
60
- assert.ok(labels.includes("Go Concurrency Patterns"), "should include Go Concurrency Patterns");
61
- });
62
-
63
- test("matchPacksForProject: JS/TS matches web frontend packs", () => {
64
- const labels = packLabels(makeSignals({ primaryLanguage: "javascript/typescript", detectedFiles: ["package.json"] }));
65
- assert.ok(labels.includes("React & Web Frontend"), "should include React");
66
- assert.ok(labels.includes("TypeScript & JS Development"), "should include TS/JS Dev");
67
- assert.ok(labels.includes("React State & Patterns"), "should include React State");
68
- assert.ok(labels.includes("shadcn/ui"), "should include shadcn");
69
- assert.ok(labels.includes("Frontend Design & UX"), "should include Frontend Design");
70
- });
71
-
72
- // ── File matching ────────────────────────────────────────────────────────────
73
-
74
- test("matchPacksForProject: angular.json triggers Angular packs", () => {
75
- const labels = packLabels(makeSignals({ detectedFiles: ["angular.json"] }));
76
- assert.ok(labels.includes("Angular"), "should include Angular");
77
- assert.ok(labels.includes("Angular Migration"), "should include Angular Migration");
78
- });
79
-
80
- test("matchPacksForProject: next.config.ts triggers Next.js packs", () => {
81
- const labels = packLabels(makeSignals({ detectedFiles: ["next.config.ts"] }));
82
- assert.ok(labels.includes("Next.js"), "should include Next.js");
83
- assert.ok(labels.includes("Next.js App Router Patterns"), "should include Next.js App Router");
84
- });
85
-
86
- test("matchPacksForProject: *.vue triggers Vue.js", () => {
87
- const labels = packLabels(makeSignals({ detectedFiles: ["*.vue"] }));
88
- assert.ok(labels.includes("Vue.js"), "should include Vue.js");
89
- });
90
-
91
- test("matchPacksForProject: Chart.yaml triggers Kubernetes", () => {
92
- const labels = packLabels(makeSignals({ detectedFiles: ["Chart.yaml"] }));
93
- assert.ok(labels.includes("Kubernetes"), "should include Kubernetes");
94
- });
95
-
96
- test("matchPacksForProject: hardhat.config.ts triggers Blockchain", () => {
97
- const labels = packLabels(makeSignals({ detectedFiles: ["hardhat.config.ts"] }));
98
- assert.ok(labels.includes("Blockchain & Web3"), "should include Blockchain & Web3");
99
- });
100
-
101
- test("matchPacksForProject: tailwind.config.ts triggers Tailwind CSS", () => {
102
- const labels = packLabels(makeSignals({ detectedFiles: ["tailwind.config.ts"] }));
103
- assert.ok(labels.includes("Tailwind CSS"), "should include Tailwind CSS");
104
- });
105
-
106
- // ── Xcode platform matching ─────────────────────────────────────────────────
107
-
108
- test("matchPacksForProject: iphoneos triggers iOS packs", () => {
109
- const labels = packLabels(makeSignals({ xcodePlatforms: ["iphoneos"] }));
110
- assert.ok(labels.includes("iOS App Frameworks"), "should include iOS App Frameworks");
111
- assert.ok(labels.includes("iOS Data Frameworks"), "should include iOS Data Frameworks");
112
- assert.ok(labels.includes("iOS AI & ML"), "should include iOS AI & ML");
113
- assert.ok(labels.includes("iOS Engineering"), "should include iOS Engineering");
114
- assert.ok(labels.includes("iOS Hardware"), "should include iOS Hardware");
115
- assert.ok(labels.includes("iOS Platform"), "should include iOS Platform");
116
- });
117
-
118
- // ── Isolation checks — packs that should NOT match ──────────────────────────
119
-
120
- test("matchPacksForProject: FastAPI does not match generic Python", () => {
121
- const labels = packLabels(makeSignals({ primaryLanguage: "python", detectedFiles: ["pyproject.toml"] }));
122
- assert.ok(!labels.includes("FastAPI"), "FastAPI should NOT match generic Python projects");
123
- });
124
-
125
- test("matchPacksForProject: FastAPI matches when dep:fastapi detected", () => {
126
- const labels = packLabels(makeSignals({ primaryLanguage: "python", detectedFiles: ["pyproject.toml", "dep:fastapi"] }));
127
- assert.ok(labels.includes("FastAPI"), "FastAPI should match when dep:fastapi is in detectedFiles");
128
- });
129
-
130
- test("matchPacksForProject: Spring Boot does not match via language alone", () => {
131
- // Simulate Android project: has java/kotlin language but no root pom.xml/build.gradle
132
- const labels = packLabels(makeSignals({ primaryLanguage: "java/kotlin", detectedFiles: ["app/build.gradle"] }));
133
- assert.ok(!labels.includes("Java & Spring Boot"), "Spring Boot should NOT match via language alone");
134
- });
135
-
136
- test("matchPacksForProject: Spring Boot matches only dep:spring-boot", () => {
137
- const positive = packLabels(makeSignals({ detectedFiles: ["dep:spring-boot"] }));
138
- assert.ok(positive.includes("Java & Spring Boot"), "should include Spring Boot pack when dependency marker exists");
139
-
140
- const androidLike = packLabels(makeSignals({ detectedFiles: ["build.gradle", "app/build.gradle"], primaryLanguage: "java/kotlin" }));
141
- assert.ok(!androidLike.includes("Java & Spring Boot"), "generic Gradle + Android markers should not imply Spring Boot");
142
- });
143
-
144
- test("matchPacksForProject: Unity does not include Godot", () => {
145
- const labels = packLabels(makeSignals({ detectedFiles: ["ProjectSettings/ProjectVersion.txt"] }));
146
- assert.ok(labels.includes("Unity"), "should include Unity");
147
- assert.ok(!labels.includes("Godot"), "should NOT include Godot");
148
- });
149
-
150
- test("matchPacksForProject: Godot does not include Unity", () => {
151
- const labels = packLabels(makeSignals({ detectedFiles: ["project.godot"] }));
152
- assert.ok(labels.includes("Godot"), "should include Godot");
153
- assert.ok(!labels.includes("Unity"), "should NOT include Unity");
154
- });
155
-
156
- test("matchPacksForProject: .NET backend patterns match F# and solution markers", () => {
157
- const fsprojLabels = packLabels(makeSignals({ detectedFiles: ["*.fsproj"], primaryLanguage: "fsharp" }));
158
- assert.ok(fsprojLabels.includes(".NET Backend Patterns"), "should include generic .NET backend patterns for F# projects");
159
- assert.ok(!fsprojLabels.includes(".NET & C#"), "should not include C#-specific pack for F# projects");
160
-
161
- const slnLabels = packLabels(makeSignals({ detectedFiles: ["*.sln"], primaryLanguage: "dotnet" }));
162
- assert.ok(slnLabels.includes(".NET Backend Patterns"), "should include generic .NET backend patterns for solution files");
163
- });
164
-
165
- test("SKILL_CATALOG: every matchFiles entry is backed by detection", () => {
166
- const knownMarkers = new Set<string>([
167
- ...PROJECT_FILES,
168
- "*.sqlite",
169
- "*.sql",
170
- "*.csproj",
171
- "*.fsproj",
172
- "*.sln",
173
- "*.vue",
174
- "dep:fastapi",
175
- "dep:spring-boot",
176
- ]);
177
-
178
- for (const pack of SKILL_CATALOG) {
179
- for (const marker of pack.matchFiles ?? []) {
180
- assert.ok(knownMarkers.has(marker), `Unknown detection marker: ${marker} (pack: ${pack.label})`);
181
- }
182
- }
183
- });
184
-
185
- test("GREENFIELD_STACKS: every pack label resolves to SKILL_CATALOG", () => {
186
- const labels = new Set(SKILL_CATALOG.map((pack) => pack.label));
187
-
188
- for (const stack of GREENFIELD_STACKS) {
189
- for (const packLabel of stack.packs) {
190
- assert.ok(labels.has(packLabel), `Unknown pack label: ${packLabel} (stack: ${stack.id})`);
191
- }
192
- }
193
- });
@@ -1,249 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
- import { join } from "node:path";
4
-
5
- import { gsdRoot } from "../gsd/paths.js";
6
- import { formatTokenCount } from "./format-utils.js";
7
- import { buildRtkEnv, isRtkEnabled, resolveRtkBinaryPath } from "./rtk.js";
8
-
9
- const SESSION_BASELINES_FILE = "rtk-session-baselines.json";
10
- const CURRENT_SUMMARY_TTL_MS = 15_000;
11
- const CURRENT_SUMMARY_TIMEOUT_MS = 5_000;
12
- const MAX_BASELINE_SESSIONS = 200;
13
-
14
- export interface RtkGainSummary {
15
- totalCommands: number;
16
- totalInput: number;
17
- totalOutput: number;
18
- totalSaved: number;
19
- avgSavingsPct: number;
20
- totalTimeMs: number;
21
- avgTimeMs: number;
22
- }
23
-
24
- export interface RtkSessionSavings {
25
- commands: number;
26
- inputTokens: number;
27
- outputTokens: number;
28
- savedTokens: number;
29
- savingsPct: number;
30
- totalTimeMs: number;
31
- avgTimeMs: number;
32
- updatedAt: string;
33
- }
34
-
35
- interface BaselineEntry {
36
- summary: RtkGainSummary;
37
- createdAt: string;
38
- updatedAt: string;
39
- }
40
-
41
- interface BaselineStore {
42
- version: 1;
43
- sessions: Record<string, BaselineEntry>;
44
- }
45
-
46
- let cachedSummary: { at: number; binaryPath: string; summary: RtkGainSummary | null } | null = null;
47
-
48
- function getRuntimeDir(basePath: string): string {
49
- return join(gsdRoot(basePath), "runtime");
50
- }
51
-
52
- function getBaselinesPath(basePath: string): string {
53
- return join(getRuntimeDir(basePath), SESSION_BASELINES_FILE);
54
- }
55
-
56
- function defaultStore(): BaselineStore {
57
- return { version: 1, sessions: {} };
58
- }
59
-
60
- function loadBaselineStore(basePath: string): BaselineStore {
61
- const path = getBaselinesPath(basePath);
62
- if (!existsSync(path)) return defaultStore();
63
- try {
64
- const parsed = JSON.parse(readFileSync(path, "utf-8")) as Partial<BaselineStore>;
65
- if (parsed.version !== 1 || typeof parsed.sessions !== "object" || parsed.sessions === null) {
66
- return defaultStore();
67
- }
68
- return {
69
- version: 1,
70
- sessions: parsed.sessions as Record<string, BaselineEntry>,
71
- };
72
- } catch {
73
- return defaultStore();
74
- }
75
- }
76
-
77
- function saveBaselineStore(basePath: string, store: BaselineStore): void {
78
- const runtimeDir = getRuntimeDir(basePath);
79
- mkdirSync(runtimeDir, { recursive: true });
80
-
81
- const entries = Object.entries(store.sessions)
82
- .sort((left, right) => right[1].updatedAt.localeCompare(left[1].updatedAt))
83
- .slice(0, MAX_BASELINE_SESSIONS);
84
-
85
- const normalized: BaselineStore = {
86
- version: 1,
87
- sessions: Object.fromEntries(entries),
88
- };
89
-
90
- writeFileSync(getBaselinesPath(basePath), JSON.stringify(normalized, null, 2), "utf-8");
91
- }
92
-
93
- function normalizeSummary(raw: unknown): RtkGainSummary | null {
94
- if (!raw || typeof raw !== "object") return null;
95
- const summary = raw as Record<string, unknown>;
96
- return {
97
- totalCommands: Number(summary.total_commands ?? 0),
98
- totalInput: Number(summary.total_input ?? 0),
99
- totalOutput: Number(summary.total_output ?? 0),
100
- totalSaved: Number(summary.total_saved ?? 0),
101
- avgSavingsPct: Number(summary.avg_savings_pct ?? 0),
102
- totalTimeMs: Number(summary.total_time_ms ?? 0),
103
- avgTimeMs: Number(summary.avg_time_ms ?? 0),
104
- };
105
- }
106
-
107
- export function readCurrentRtkGainSummary(env: NodeJS.ProcessEnv = process.env): RtkGainSummary | null {
108
- if (!isRtkEnabled(env)) return null;
109
-
110
- const binaryPath = resolveRtkBinaryPath({ env });
111
- if (!binaryPath) return null;
112
-
113
- if (
114
- cachedSummary &&
115
- cachedSummary.binaryPath === binaryPath &&
116
- Date.now() - cachedSummary.at < CURRENT_SUMMARY_TTL_MS
117
- ) {
118
- return cachedSummary.summary;
119
- }
120
-
121
- const result = spawnSync(binaryPath, ["gain", "--all", "--format", "json"], {
122
- encoding: "utf-8",
123
- env: buildRtkEnv(env),
124
- stdio: ["ignore", "pipe", "ignore"],
125
- timeout: CURRENT_SUMMARY_TIMEOUT_MS,
126
- // .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
127
- shell: /\.(cmd|bat)$/i.test(binaryPath),
128
- });
129
-
130
- if (result.error || result.status !== 0) {
131
- cachedSummary = { at: Date.now(), binaryPath, summary: null };
132
- return null;
133
- }
134
-
135
- try {
136
- const parsed = JSON.parse(result.stdout ?? "{}") as { summary?: unknown };
137
- const summary = normalizeSummary(parsed.summary ?? null);
138
- cachedSummary = { at: Date.now(), binaryPath, summary };
139
- return summary;
140
- } catch {
141
- cachedSummary = { at: Date.now(), binaryPath, summary: null };
142
- return null;
143
- }
144
- }
145
-
146
- function computeSavingsDelta(current: RtkGainSummary, baseline: RtkGainSummary): RtkSessionSavings {
147
- const commands = Math.max(0, current.totalCommands - baseline.totalCommands);
148
- const inputTokens = Math.max(0, current.totalInput - baseline.totalInput);
149
- const outputTokens = Math.max(0, current.totalOutput - baseline.totalOutput);
150
- const savedTokens = Math.max(0, current.totalSaved - baseline.totalSaved);
151
- const totalTimeMs = Math.max(0, current.totalTimeMs - baseline.totalTimeMs);
152
- const avgTimeMs = commands > 0 ? Math.round(totalTimeMs / commands) : 0;
153
- const savingsPct = inputTokens > 0 ? (savedTokens / inputTokens) * 100 : 0;
154
-
155
- return {
156
- commands,
157
- inputTokens,
158
- outputTokens,
159
- savedTokens,
160
- savingsPct,
161
- totalTimeMs,
162
- avgTimeMs,
163
- updatedAt: new Date().toISOString(),
164
- };
165
- }
166
-
167
- export function ensureRtkSessionBaseline(
168
- basePath: string,
169
- sessionId: string,
170
- env: NodeJS.ProcessEnv = process.env,
171
- ): RtkGainSummary | null {
172
- if (!sessionId) return null;
173
-
174
- const current = readCurrentRtkGainSummary(env);
175
- if (!current) return null;
176
-
177
- const store = loadBaselineStore(basePath);
178
- const existing = store.sessions[sessionId];
179
- if (existing) return existing.summary;
180
-
181
- const now = new Date().toISOString();
182
- store.sessions[sessionId] = {
183
- summary: current,
184
- createdAt: now,
185
- updatedAt: now,
186
- };
187
- saveBaselineStore(basePath, store);
188
- return current;
189
- }
190
-
191
- export function getRtkSessionSavings(
192
- basePath: string,
193
- sessionId: string | null | undefined,
194
- env: NodeJS.ProcessEnv = process.env,
195
- ): RtkSessionSavings | null {
196
- if (!sessionId) return null;
197
-
198
- const current = readCurrentRtkGainSummary(env);
199
- if (!current) return null;
200
-
201
- const store = loadBaselineStore(basePath);
202
- const existing = store.sessions[sessionId];
203
- if (!existing) {
204
- const now = new Date().toISOString();
205
- store.sessions[sessionId] = {
206
- summary: current,
207
- createdAt: now,
208
- updatedAt: now,
209
- };
210
- saveBaselineStore(basePath, store);
211
- return computeSavingsDelta(current, current);
212
- }
213
-
214
- if (
215
- current.totalCommands < existing.summary.totalCommands ||
216
- current.totalInput < existing.summary.totalInput ||
217
- current.totalSaved < existing.summary.totalSaved
218
- ) {
219
- const now = new Date().toISOString();
220
- store.sessions[sessionId] = {
221
- summary: current,
222
- createdAt: existing.createdAt,
223
- updatedAt: now,
224
- };
225
- saveBaselineStore(basePath, store);
226
- return computeSavingsDelta(current, current);
227
- }
228
-
229
- existing.updatedAt = new Date().toISOString();
230
- saveBaselineStore(basePath, store);
231
- return computeSavingsDelta(current, existing.summary);
232
- }
233
-
234
- export function clearRtkSessionBaseline(basePath: string, sessionId: string): void {
235
- if (!sessionId) return;
236
- const store = loadBaselineStore(basePath);
237
- if (!(sessionId in store.sessions)) return;
238
- delete store.sessions[sessionId];
239
- saveBaselineStore(basePath, store);
240
- }
241
-
242
- export function formatRtkSavingsLabel(savings: RtkSessionSavings | null | undefined): string | null {
243
- if (!savings) return null;
244
- if (savings.commands <= 0) return "rtk: waiting for shell usage";
245
- if (savings.inputTokens <= 0 && savings.outputTokens <= 0) {
246
- return `rtk: active (${savings.commands} cmd${savings.commands === 1 ? "" : "s"})`;
247
- }
248
- return `rtk: ${formatTokenCount(savings.savedTokens)} saved (${Math.round(savings.savingsPct)}%)`;
249
- }