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,189 +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
- import { gsdRoot } from "../gsd/paths.js";
5
- import { formatTokenCount } from "./format-utils.js";
6
- import { buildRtkEnv, isRtkEnabled, resolveRtkBinaryPath } from "./rtk.js";
7
- const SESSION_BASELINES_FILE = "rtk-session-baselines.json";
8
- const CURRENT_SUMMARY_TTL_MS = 15_000;
9
- const CURRENT_SUMMARY_TIMEOUT_MS = 5_000;
10
- const MAX_BASELINE_SESSIONS = 200;
11
- let cachedSummary = null;
12
- function getRuntimeDir(basePath) {
13
- return join(gsdRoot(basePath), "runtime");
14
- }
15
- function getBaselinesPath(basePath) {
16
- return join(getRuntimeDir(basePath), SESSION_BASELINES_FILE);
17
- }
18
- function defaultStore() {
19
- return { version: 1, sessions: {} };
20
- }
21
- function loadBaselineStore(basePath) {
22
- const path = getBaselinesPath(basePath);
23
- if (!existsSync(path))
24
- return defaultStore();
25
- try {
26
- const parsed = JSON.parse(readFileSync(path, "utf-8"));
27
- if (parsed.version !== 1 || typeof parsed.sessions !== "object" || parsed.sessions === null) {
28
- return defaultStore();
29
- }
30
- return {
31
- version: 1,
32
- sessions: parsed.sessions,
33
- };
34
- }
35
- catch {
36
- return defaultStore();
37
- }
38
- }
39
- function saveBaselineStore(basePath, store) {
40
- const runtimeDir = getRuntimeDir(basePath);
41
- mkdirSync(runtimeDir, { recursive: true });
42
- const entries = Object.entries(store.sessions)
43
- .sort((left, right) => right[1].updatedAt.localeCompare(left[1].updatedAt))
44
- .slice(0, MAX_BASELINE_SESSIONS);
45
- const normalized = {
46
- version: 1,
47
- sessions: Object.fromEntries(entries),
48
- };
49
- writeFileSync(getBaselinesPath(basePath), JSON.stringify(normalized, null, 2), "utf-8");
50
- }
51
- function normalizeSummary(raw) {
52
- if (!raw || typeof raw !== "object")
53
- return null;
54
- const summary = raw;
55
- return {
56
- totalCommands: Number(summary.total_commands ?? 0),
57
- totalInput: Number(summary.total_input ?? 0),
58
- totalOutput: Number(summary.total_output ?? 0),
59
- totalSaved: Number(summary.total_saved ?? 0),
60
- avgSavingsPct: Number(summary.avg_savings_pct ?? 0),
61
- totalTimeMs: Number(summary.total_time_ms ?? 0),
62
- avgTimeMs: Number(summary.avg_time_ms ?? 0),
63
- };
64
- }
65
- export function readCurrentRtkGainSummary(env = process.env) {
66
- if (!isRtkEnabled(env))
67
- return null;
68
- const binaryPath = resolveRtkBinaryPath({ env });
69
- if (!binaryPath)
70
- return null;
71
- if (cachedSummary &&
72
- cachedSummary.binaryPath === binaryPath &&
73
- Date.now() - cachedSummary.at < CURRENT_SUMMARY_TTL_MS) {
74
- return cachedSummary.summary;
75
- }
76
- const result = spawnSync(binaryPath, ["gain", "--all", "--format", "json"], {
77
- encoding: "utf-8",
78
- env: buildRtkEnv(env),
79
- stdio: ["ignore", "pipe", "ignore"],
80
- timeout: CURRENT_SUMMARY_TIMEOUT_MS,
81
- // .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
82
- shell: /\.(cmd|bat)$/i.test(binaryPath),
83
- });
84
- if (result.error || result.status !== 0) {
85
- cachedSummary = { at: Date.now(), binaryPath, summary: null };
86
- return null;
87
- }
88
- try {
89
- const parsed = JSON.parse(result.stdout ?? "{}");
90
- const summary = normalizeSummary(parsed.summary ?? null);
91
- cachedSummary = { at: Date.now(), binaryPath, summary };
92
- return summary;
93
- }
94
- catch {
95
- cachedSummary = { at: Date.now(), binaryPath, summary: null };
96
- return null;
97
- }
98
- }
99
- function computeSavingsDelta(current, baseline) {
100
- const commands = Math.max(0, current.totalCommands - baseline.totalCommands);
101
- const inputTokens = Math.max(0, current.totalInput - baseline.totalInput);
102
- const outputTokens = Math.max(0, current.totalOutput - baseline.totalOutput);
103
- const savedTokens = Math.max(0, current.totalSaved - baseline.totalSaved);
104
- const totalTimeMs = Math.max(0, current.totalTimeMs - baseline.totalTimeMs);
105
- const avgTimeMs = commands > 0 ? Math.round(totalTimeMs / commands) : 0;
106
- const savingsPct = inputTokens > 0 ? (savedTokens / inputTokens) * 100 : 0;
107
- return {
108
- commands,
109
- inputTokens,
110
- outputTokens,
111
- savedTokens,
112
- savingsPct,
113
- totalTimeMs,
114
- avgTimeMs,
115
- updatedAt: new Date().toISOString(),
116
- };
117
- }
118
- export function ensureRtkSessionBaseline(basePath, sessionId, env = process.env) {
119
- if (!sessionId)
120
- return null;
121
- const current = readCurrentRtkGainSummary(env);
122
- if (!current)
123
- return null;
124
- const store = loadBaselineStore(basePath);
125
- const existing = store.sessions[sessionId];
126
- if (existing)
127
- return existing.summary;
128
- const now = new Date().toISOString();
129
- store.sessions[sessionId] = {
130
- summary: current,
131
- createdAt: now,
132
- updatedAt: now,
133
- };
134
- saveBaselineStore(basePath, store);
135
- return current;
136
- }
137
- export function getRtkSessionSavings(basePath, sessionId, env = process.env) {
138
- if (!sessionId)
139
- return null;
140
- const current = readCurrentRtkGainSummary(env);
141
- if (!current)
142
- return null;
143
- const store = loadBaselineStore(basePath);
144
- const existing = store.sessions[sessionId];
145
- if (!existing) {
146
- const now = new Date().toISOString();
147
- store.sessions[sessionId] = {
148
- summary: current,
149
- createdAt: now,
150
- updatedAt: now,
151
- };
152
- saveBaselineStore(basePath, store);
153
- return computeSavingsDelta(current, current);
154
- }
155
- if (current.totalCommands < existing.summary.totalCommands ||
156
- current.totalInput < existing.summary.totalInput ||
157
- current.totalSaved < existing.summary.totalSaved) {
158
- const now = new Date().toISOString();
159
- store.sessions[sessionId] = {
160
- summary: current,
161
- createdAt: existing.createdAt,
162
- updatedAt: now,
163
- };
164
- saveBaselineStore(basePath, store);
165
- return computeSavingsDelta(current, current);
166
- }
167
- existing.updatedAt = new Date().toISOString();
168
- saveBaselineStore(basePath, store);
169
- return computeSavingsDelta(current, existing.summary);
170
- }
171
- export function clearRtkSessionBaseline(basePath, sessionId) {
172
- if (!sessionId)
173
- return;
174
- const store = loadBaselineStore(basePath);
175
- if (!(sessionId in store.sessions))
176
- return;
177
- delete store.sessions[sessionId];
178
- saveBaselineStore(basePath, store);
179
- }
180
- export function formatRtkSavingsLabel(savings) {
181
- if (!savings)
182
- return null;
183
- if (savings.commands <= 0)
184
- return "rtk: waiting for shell usage";
185
- if (savings.inputTokens <= 0 && savings.outputTokens <= 0) {
186
- return `rtk: active (${savings.commands} cmd${savings.commands === 1 ? "" : "s"})`;
187
- }
188
- return `rtk: ${formatTokenCount(savings.savedTokens)} saved (${Math.round(savings.savingsPct)}%)`;
189
- }
@@ -1,100 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { existsSync } from "node:fs";
3
- import { homedir } from "node:os";
4
- import { delimiter, join } from "node:path";
5
- const GSD_RTK_PATH_ENV = "GSD_RTK_PATH";
6
- const GSD_RTK_DISABLED_ENV = "GSD_RTK_DISABLED";
7
- const RTK_TELEMETRY_DISABLED_ENV = "RTK_TELEMETRY_DISABLED";
8
- const RTK_REWRITE_TIMEOUT_MS = 5_000;
9
- function isTruthy(value) {
10
- if (!value)
11
- return false;
12
- const normalized = value.trim().toLowerCase();
13
- return normalized === "1" || normalized === "true" || normalized === "yes";
14
- }
15
- export function isRtkEnabled(env = process.env) {
16
- return !isTruthy(env[GSD_RTK_DISABLED_ENV]);
17
- }
18
- export function buildRtkEnv(env = process.env) {
19
- return {
20
- ...env,
21
- [RTK_TELEMETRY_DISABLED_ENV]: "1",
22
- };
23
- }
24
- function getManagedRtkDir(env = process.env) {
25
- return join(env.GSD_HOME || join(homedir(), ".gsd"), "agent", "bin");
26
- }
27
- function getRtkBinaryName(platform = process.platform) {
28
- return platform === "win32" ? "rtk.exe" : "rtk";
29
- }
30
- function getPathValue(env) {
31
- const pathKey = Object.keys(env).find((key) => key.toLowerCase() === "path");
32
- return pathKey ? env[pathKey] : env.PATH;
33
- }
34
- function resolvePathCandidates(pathValue) {
35
- if (!pathValue)
36
- return [];
37
- return pathValue
38
- .split(delimiter)
39
- .map((part) => part.trim())
40
- .filter(Boolean);
41
- }
42
- function resolveSystemRtkPath(pathValue, platform = process.platform) {
43
- const candidates = platform === "win32"
44
- ? ["rtk.exe", "rtk.cmd", "rtk.bat", "rtk"]
45
- : ["rtk"];
46
- for (const dir of resolvePathCandidates(pathValue)) {
47
- for (const candidate of candidates) {
48
- const fullPath = join(dir, candidate);
49
- if (existsSync(fullPath)) {
50
- return fullPath;
51
- }
52
- }
53
- }
54
- return null;
55
- }
56
- export function resolveRtkBinaryPath(options = {}) {
57
- const env = options.env ?? process.env;
58
- const platform = options.platform ?? process.platform;
59
- const explicitPath = options.binaryPath ?? env[GSD_RTK_PATH_ENV];
60
- if (explicitPath && existsSync(explicitPath)) {
61
- return explicitPath;
62
- }
63
- const managedDir = getManagedRtkDir(env);
64
- const managedPath = join(managedDir, getRtkBinaryName(platform));
65
- if (existsSync(managedPath)) {
66
- return managedPath;
67
- }
68
- // On Windows, also check for rtk.cmd in the managed dir (used by test fake RTK
69
- // and any wrapper-style installs where a .cmd launcher accompanies the binary).
70
- if (platform === "win32") {
71
- const managedCmd = join(managedDir, "rtk.cmd");
72
- if (existsSync(managedCmd)) {
73
- return managedCmd;
74
- }
75
- }
76
- return resolveSystemRtkPath(options.pathValue ?? getPathValue(env), platform);
77
- }
78
- export function rewriteCommandWithRtk(command, env = process.env) {
79
- if (!command.trim())
80
- return command;
81
- if (!isRtkEnabled(env))
82
- return command;
83
- const binaryPath = resolveRtkBinaryPath({ env });
84
- if (!binaryPath)
85
- return command;
86
- const result = spawnSync(binaryPath, ["rewrite", command], {
87
- encoding: "utf-8",
88
- env: buildRtkEnv(env),
89
- stdio: ["ignore", "pipe", "ignore"],
90
- timeout: RTK_REWRITE_TIMEOUT_MS,
91
- // .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
92
- shell: /\.(cmd|bat)$/i.test(binaryPath),
93
- });
94
- if (result.error)
95
- return command;
96
- if (result.status !== 0 && result.status !== 3)
97
- return command;
98
- const rewritten = (result.stdout ?? "").trimEnd();
99
- return rewritten || command;
100
- }
package/dist/rtk.d.ts DELETED
@@ -1,52 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- export declare const RTK_VERSION = "0.33.1";
3
- export declare const GSD_RTK_DISABLED_ENV = "GSD_RTK_DISABLED";
4
- export declare const GSD_SKIP_RTK_INSTALL_ENV = "GSD_SKIP_RTK_INSTALL";
5
- export declare const GSD_RTK_PATH_ENV = "GSD_RTK_PATH";
6
- export declare const RTK_TELEMETRY_DISABLED_ENV = "RTK_TELEMETRY_DISABLED";
7
- export interface EnsureRtkOptions {
8
- targetDir?: string;
9
- allowDownload?: boolean;
10
- env?: NodeJS.ProcessEnv;
11
- pathValue?: string;
12
- releaseVersion?: string;
13
- log?: (message: string) => void;
14
- }
15
- export interface EnsureRtkResult {
16
- enabled: boolean;
17
- supported: boolean;
18
- available: boolean;
19
- source: "disabled" | "unsupported" | "managed" | "system" | "downloaded" | "missing";
20
- binaryPath?: string;
21
- reason?: string;
22
- }
23
- export declare function isRtkEnabled(env?: NodeJS.ProcessEnv): boolean;
24
- export declare function getManagedRtkDir(env?: NodeJS.ProcessEnv): string;
25
- export declare function getRtkBinaryName(platform?: NodeJS.Platform): string;
26
- export declare function getManagedRtkPath(platform?: NodeJS.Platform, targetDir?: string): string;
27
- export declare function prependPathEntry(env: NodeJS.ProcessEnv, entry: string): NodeJS.ProcessEnv;
28
- export declare function applyRtkProcessEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
29
- export declare function buildRtkEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
30
- export declare function resolveRtkAssetName(platform: NodeJS.Platform, arch: string, version?: string): string | null;
31
- export interface ResolveRtkBinaryPathOptions {
32
- binaryPath?: string;
33
- env?: NodeJS.ProcessEnv;
34
- pathValue?: string;
35
- platform?: NodeJS.Platform;
36
- targetDir?: string;
37
- }
38
- export declare function resolveRtkBinaryPath(options?: ResolveRtkBinaryPathOptions): string | null;
39
- export interface RewriteCommandOptions {
40
- binaryPath?: string;
41
- env?: NodeJS.ProcessEnv;
42
- timeoutMs?: number;
43
- spawnSyncImpl?: typeof spawnSync;
44
- }
45
- export declare function rewriteCommandWithRtk(command: string, options?: RewriteCommandOptions): string;
46
- export interface ValidateRtkBinaryOptions {
47
- spawnSyncImpl?: typeof spawnSync;
48
- env?: NodeJS.ProcessEnv;
49
- }
50
- export declare function validateRtkBinary(binaryPath: string, options?: ValidateRtkBinaryOptions): boolean;
51
- export declare function ensureRtkAvailable(options?: EnsureRtkOptions): Promise<EnsureRtkResult>;
52
- export declare function bootstrapRtk(options?: EnsureRtkOptions): Promise<EnsureRtkResult>;
package/dist/rtk.js DELETED
@@ -1,332 +0,0 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { spawnSync } from "node:child_process";
3
- import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, chmodSync, readdirSync } from "node:fs";
4
- import { createWriteStream } from "node:fs";
5
- import { arch as osArch, homedir as osHomedir } from "node:os";
6
- import { delimiter, join } from "node:path";
7
- import { Readable } from "node:stream";
8
- import { finished } from "node:stream/promises";
9
- import extractZip from "extract-zip";
10
- export const RTK_VERSION = "0.33.1";
11
- export const GSD_RTK_DISABLED_ENV = "GSD_RTK_DISABLED";
12
- export const GSD_SKIP_RTK_INSTALL_ENV = "GSD_SKIP_RTK_INSTALL";
13
- export const GSD_RTK_PATH_ENV = "GSD_RTK_PATH";
14
- export const RTK_TELEMETRY_DISABLED_ENV = "RTK_TELEMETRY_DISABLED";
15
- const RTK_REPO = "rtk-ai/rtk";
16
- const RTK_REWRITE_TIMEOUT_MS = 5_000;
17
- function isTruthy(value) {
18
- if (!value)
19
- return false;
20
- const normalized = value.trim().toLowerCase();
21
- return normalized === "1" || normalized === "true" || normalized === "yes";
22
- }
23
- export function isRtkEnabled(env = process.env) {
24
- return !isTruthy(env[GSD_RTK_DISABLED_ENV]);
25
- }
26
- function resolveAppRoot(env = process.env) {
27
- return env.GSD_HOME || join(osHomedir(), ".gsd");
28
- }
29
- export function getManagedRtkDir(env = process.env) {
30
- return join(resolveAppRoot(env), "agent", "bin");
31
- }
32
- export function getRtkBinaryName(platform = process.platform) {
33
- return platform === "win32" ? "rtk.exe" : "rtk";
34
- }
35
- export function getManagedRtkPath(platform = process.platform, targetDir = getManagedRtkDir()) {
36
- return join(targetDir, getRtkBinaryName(platform));
37
- }
38
- export function prependPathEntry(env, entry) {
39
- const pathKey = Object.keys(env).find((key) => key.toLowerCase() === "path") ?? (process.platform === "win32" ? "Path" : "PATH");
40
- const currentPath = env[pathKey] ?? "";
41
- const parts = currentPath.split(delimiter).filter(Boolean);
42
- if (!parts.includes(entry)) {
43
- env[pathKey] = [entry, currentPath].filter(Boolean).join(delimiter);
44
- }
45
- return env;
46
- }
47
- export function applyRtkProcessEnv(env = process.env) {
48
- prependPathEntry(env, getManagedRtkDir(env));
49
- env[RTK_TELEMETRY_DISABLED_ENV] = "1";
50
- return env;
51
- }
52
- function getPathValue(env) {
53
- const pathKey = Object.keys(env).find((key) => key.toLowerCase() === "path");
54
- return pathKey ? env[pathKey] : env.PATH;
55
- }
56
- export function buildRtkEnv(env = process.env) {
57
- return applyRtkProcessEnv({ ...env });
58
- }
59
- export function resolveRtkAssetName(platform, arch, version = RTK_VERSION) {
60
- void version;
61
- if (platform === "darwin" && arch === "arm64")
62
- return "rtk-aarch64-apple-darwin.tar.gz";
63
- if (platform === "darwin" && arch === "x64")
64
- return "rtk-x86_64-apple-darwin.tar.gz";
65
- if (platform === "linux" && arch === "arm64")
66
- return "rtk-aarch64-unknown-linux-gnu.tar.gz";
67
- if (platform === "linux" && arch === "x64")
68
- return "rtk-x86_64-unknown-linux-musl.tar.gz";
69
- if (platform === "win32" && arch === "x64")
70
- return "rtk-x86_64-pc-windows-msvc.zip";
71
- return null;
72
- }
73
- function getReleaseBaseUrl(version) {
74
- return `https://github.com/${RTK_REPO}/releases/download/v${version}`;
75
- }
76
- function getChecksumsUrl(version) {
77
- return `${getReleaseBaseUrl(version)}/checksums.txt`;
78
- }
79
- function buildAssetUrl(version, assetName) {
80
- return `${getReleaseBaseUrl(version)}/${assetName}`;
81
- }
82
- function parseChecksums(content) {
83
- const checksums = new Map();
84
- for (const rawLine of content.split(/\r?\n/)) {
85
- const line = rawLine.trim();
86
- if (!line)
87
- continue;
88
- const match = line.match(/^([a-f0-9]{64})\s+(.+)$/i);
89
- if (!match)
90
- continue;
91
- checksums.set(match[2], match[1].toLowerCase());
92
- }
93
- return checksums;
94
- }
95
- function sha256File(path) {
96
- const hash = createHash("sha256");
97
- hash.update(readFileSync(path));
98
- return hash.digest("hex");
99
- }
100
- async function downloadToFile(url, destination) {
101
- const response = await fetch(url, {
102
- headers: { "User-Agent": "gsd-pi-rtk" },
103
- });
104
- if (!response.ok) {
105
- throw new Error(`download failed (${response.status}) for ${url}`);
106
- }
107
- if (!response.body) {
108
- throw new Error(`download returned no body for ${url}`);
109
- }
110
- const output = createWriteStream(destination);
111
- await finished(Readable.fromWeb(response.body).pipe(output));
112
- }
113
- function findBinaryRecursively(rootDir, binaryName) {
114
- const stack = [rootDir];
115
- while (stack.length > 0) {
116
- const current = stack.pop();
117
- if (!current)
118
- continue;
119
- const entries = readdirSync(current, { withFileTypes: true });
120
- for (const entry of entries) {
121
- const fullPath = join(current, entry.name);
122
- if (entry.isFile() && entry.name === binaryName) {
123
- return fullPath;
124
- }
125
- if (entry.isDirectory()) {
126
- stack.push(fullPath);
127
- }
128
- }
129
- }
130
- return null;
131
- }
132
- function extractArchive(assetName, archivePath, extractDir) {
133
- if (!assetName.endsWith(".tar.gz")) {
134
- throw new Error(`unsupported RTK archive format: ${assetName}`);
135
- }
136
- mkdirSync(extractDir, { recursive: true });
137
- const result = spawnSync("tar", ["xzf", archivePath, "-C", extractDir], {
138
- encoding: "utf-8",
139
- timeout: 30_000,
140
- });
141
- if (result.error || result.status !== 0) {
142
- throw new Error(result.error?.message ?? result.stderr?.trim() ?? `tar extraction failed for ${assetName}`);
143
- }
144
- }
145
- async function extractArchiveAsync(assetName, archivePath, extractDir) {
146
- if (assetName.endsWith(".zip")) {
147
- mkdirSync(extractDir, { recursive: true });
148
- await extractZip(archivePath, { dir: extractDir });
149
- return;
150
- }
151
- extractArchive(assetName, archivePath, extractDir);
152
- }
153
- function resolvePathCandidates(pathValue) {
154
- if (!pathValue)
155
- return [];
156
- return pathValue
157
- .split(delimiter)
158
- .map((part) => part.trim())
159
- .filter(Boolean);
160
- }
161
- function resolveSystemRtkPath(pathValue, platform = process.platform) {
162
- const candidates = platform === "win32"
163
- ? ["rtk.exe", "rtk.cmd", "rtk.bat", "rtk"]
164
- : ["rtk"];
165
- for (const dir of resolvePathCandidates(pathValue)) {
166
- for (const candidate of candidates) {
167
- const fullPath = join(dir, candidate);
168
- if (existsSync(fullPath)) {
169
- return fullPath;
170
- }
171
- }
172
- }
173
- return null;
174
- }
175
- export function resolveRtkBinaryPath(options = {}) {
176
- const env = options.env ?? process.env;
177
- const platform = options.platform ?? process.platform;
178
- const explicitPath = options.binaryPath ?? env[GSD_RTK_PATH_ENV];
179
- if (explicitPath && existsSync(explicitPath)) {
180
- return explicitPath;
181
- }
182
- const managedPath = getManagedRtkPath(platform, options.targetDir ?? getManagedRtkDir(env));
183
- if (existsSync(managedPath)) {
184
- return managedPath;
185
- }
186
- // On Windows, also check for rtk.cmd in the managed dir (used by test fake RTK
187
- // and any wrapper-style installs where a .cmd launcher accompanies the binary).
188
- if (platform === "win32") {
189
- const managedDir = options.targetDir ?? getManagedRtkDir(env);
190
- const managedCmd = join(managedDir, "rtk.cmd");
191
- if (existsSync(managedCmd)) {
192
- return managedCmd;
193
- }
194
- }
195
- return resolveSystemRtkPath(options.pathValue ?? getPathValue(env), platform);
196
- }
197
- export function rewriteCommandWithRtk(command, options = {}) {
198
- if (!command.trim())
199
- return command;
200
- if (!isRtkEnabled(options.env ?? process.env))
201
- return command;
202
- const env = options.env ?? process.env;
203
- const binaryPath = resolveRtkBinaryPath({
204
- env,
205
- binaryPath: options.binaryPath,
206
- });
207
- if (!binaryPath)
208
- return command;
209
- const run = options.spawnSyncImpl ?? spawnSync;
210
- const result = run(binaryPath, ["rewrite", command], {
211
- encoding: "utf-8",
212
- env: buildRtkEnv(options.env ?? process.env),
213
- stdio: ["ignore", "pipe", "ignore"],
214
- timeout: options.timeoutMs ?? RTK_REWRITE_TIMEOUT_MS,
215
- // .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
216
- shell: /\.(cmd|bat)$/i.test(binaryPath),
217
- });
218
- if (result.error)
219
- return command;
220
- if (result.status !== 0 && result.status !== 3)
221
- return command;
222
- const rewritten = (result.stdout ?? "").trimEnd();
223
- return rewritten || command;
224
- }
225
- export function validateRtkBinary(binaryPath, options = {}) {
226
- const run = options.spawnSyncImpl ?? spawnSync;
227
- const result = run(binaryPath, ["rewrite", "git status"], {
228
- encoding: "utf-8",
229
- env: buildRtkEnv(options.env ?? process.env),
230
- stdio: ["ignore", "pipe", "ignore"],
231
- timeout: RTK_REWRITE_TIMEOUT_MS,
232
- });
233
- if (result.error)
234
- return false;
235
- if (result.status !== 0)
236
- return false;
237
- return (result.stdout ?? "").trim() === "rtk git status";
238
- }
239
- export async function ensureRtkAvailable(options = {}) {
240
- const env = options.env ?? process.env;
241
- if (!isRtkEnabled(env)) {
242
- return { enabled: false, supported: true, available: false, source: "disabled", reason: `${GSD_RTK_DISABLED_ENV} is set` };
243
- }
244
- if (isTruthy(env[GSD_SKIP_RTK_INSTALL_ENV])) {
245
- const configuredPath = env[GSD_RTK_PATH_ENV];
246
- if (configuredPath && existsSync(configuredPath)) {
247
- return { enabled: true, supported: true, available: true, source: "managed", binaryPath: configuredPath };
248
- }
249
- return { enabled: true, supported: true, available: false, source: "missing", reason: `${GSD_SKIP_RTK_INSTALL_ENV} is set` };
250
- }
251
- const targetDir = options.targetDir ?? getManagedRtkDir(env);
252
- const managedPath = getManagedRtkPath(process.platform, targetDir);
253
- if (existsSync(managedPath) && validateRtkBinary(managedPath, { env })) {
254
- return { enabled: true, supported: true, available: true, source: "managed", binaryPath: managedPath };
255
- }
256
- const systemPath = resolveSystemRtkPath(options.pathValue ?? getPathValue(env));
257
- if (systemPath && validateRtkBinary(systemPath, { env })) {
258
- return { enabled: true, supported: true, available: true, source: "system", binaryPath: systemPath };
259
- }
260
- const version = options.releaseVersion ?? RTK_VERSION;
261
- const assetName = resolveRtkAssetName(process.platform, osArch(), version);
262
- if (!assetName) {
263
- return {
264
- enabled: true,
265
- supported: false,
266
- available: false,
267
- source: "unsupported",
268
- reason: `RTK release asset unavailable for ${process.platform}/${osArch()}`,
269
- };
270
- }
271
- if (options.allowDownload === false) {
272
- return { enabled: true, supported: true, available: false, source: "missing", reason: "download disabled" };
273
- }
274
- mkdirSync(targetDir, { recursive: true });
275
- const tempRoot = join(targetDir, `.rtk-install-${randomUUID().slice(0, 8)}`);
276
- const archivePath = join(tempRoot, assetName);
277
- const extractDir = join(tempRoot, "extract");
278
- mkdirSync(tempRoot, { recursive: true });
279
- try {
280
- const checksumsUrl = getChecksumsUrl(version);
281
- const checksumsResponse = await fetch(checksumsUrl, { headers: { "User-Agent": "gsd-pi-rtk" } });
282
- if (!checksumsResponse.ok) {
283
- throw new Error(`failed to fetch RTK checksums (${checksumsResponse.status})`);
284
- }
285
- const checksums = parseChecksums(await checksumsResponse.text());
286
- const expectedSha = checksums.get(assetName);
287
- if (!expectedSha) {
288
- throw new Error(`missing checksum for ${assetName}`);
289
- }
290
- await downloadToFile(buildAssetUrl(version, assetName), archivePath);
291
- const actualSha = sha256File(archivePath);
292
- if (actualSha !== expectedSha) {
293
- throw new Error(`checksum mismatch for ${assetName}`);
294
- }
295
- await extractArchiveAsync(assetName, archivePath, extractDir);
296
- const extractedBinary = findBinaryRecursively(extractDir, getRtkBinaryName(process.platform));
297
- if (!extractedBinary) {
298
- throw new Error(`RTK binary not found in ${assetName}`);
299
- }
300
- copyFileSync(extractedBinary, managedPath);
301
- if (process.platform !== "win32") {
302
- chmodSync(managedPath, 0o755);
303
- }
304
- if (!validateRtkBinary(managedPath, { env })) {
305
- rmSync(managedPath, { force: true });
306
- throw new Error("downloaded RTK binary failed validation");
307
- }
308
- options.log?.(`installed RTK ${version} to ${managedPath}`);
309
- return { enabled: true, supported: true, available: true, source: "downloaded", binaryPath: managedPath };
310
- }
311
- catch (error) {
312
- options.log?.(`RTK install skipped: ${error instanceof Error ? error.message : String(error)}`);
313
- return {
314
- enabled: true,
315
- supported: true,
316
- available: false,
317
- source: "missing",
318
- reason: error instanceof Error ? error.message : String(error),
319
- };
320
- }
321
- finally {
322
- rmSync(tempRoot, { recursive: true, force: true });
323
- }
324
- }
325
- export async function bootstrapRtk(options = {}) {
326
- const result = await ensureRtkAvailable(options);
327
- applyRtkProcessEnv(process.env);
328
- if (result.binaryPath) {
329
- process.env[GSD_RTK_PATH_ENV] = result.binaryPath;
330
- }
331
- return result;
332
- }