gsd-pi 2.50.0 → 2.51.0-dev.ae8f7cb

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 (511) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.js +26 -0
  3. package/dist/loader.js +4 -0
  4. package/dist/resource-loader.d.ts +4 -1
  5. package/dist/resource-loader.js +138 -3
  6. package/dist/resources/extensions/async-jobs/async-bash-tool.js +3 -1
  7. package/dist/resources/extensions/bg-shell/interaction.js +3 -1
  8. package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/phases.js +16 -1
  11. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +22 -3
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +81 -54
  14. package/dist/resources/extensions/gsd/auto-observability.js +54 -0
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +37 -76
  16. package/dist/resources/extensions/gsd/auto-prompts.js +57 -0
  17. package/dist/resources/extensions/gsd/auto-recovery.js +21 -25
  18. package/dist/resources/extensions/gsd/auto-utils.js +20 -0
  19. package/dist/resources/extensions/gsd/auto.js +15 -5
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -0
  21. package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
  22. package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
  23. package/dist/resources/extensions/gsd/custom-verification.js +3 -1
  24. package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
  26. package/dist/resources/extensions/gsd/detection.js +589 -3
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
  28. package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
  29. package/dist/resources/extensions/gsd/files.js +5 -1
  30. package/dist/resources/extensions/gsd/guided-flow.js +10 -0
  31. package/dist/resources/extensions/gsd/init-wizard.js +9 -1
  32. package/dist/resources/extensions/gsd/model-router.js +25 -0
  33. package/dist/resources/extensions/gsd/notifications.js +23 -0
  34. package/dist/resources/extensions/gsd/observability-validator.js +422 -0
  35. package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
  36. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  37. package/dist/resources/extensions/gsd/preferences-validation.js +25 -0
  38. package/dist/resources/extensions/gsd/preferences.js +3 -0
  39. package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
  40. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
  41. package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
  42. package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
  43. package/dist/resources/extensions/gsd/rtk-status.js +43 -0
  44. package/dist/resources/extensions/gsd/rule-registry.js +10 -11
  45. package/dist/resources/extensions/gsd/session-forensics.js +7 -3
  46. package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
  47. package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
  48. package/dist/resources/extensions/gsd/skill-health.js +2 -2
  49. package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
  50. package/dist/resources/extensions/gsd/state.js +17 -5
  51. package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
  52. package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
  53. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
  54. package/dist/resources/extensions/gsd/undo.js +8 -7
  55. package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
  56. package/dist/resources/extensions/gsd/verification-gate.js +3 -1
  57. package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
  58. package/dist/resources/extensions/shared/rtk.js +100 -0
  59. package/dist/rtk.d.ts +52 -0
  60. package/dist/rtk.js +332 -0
  61. package/dist/web/standalone/.next/BUILD_ID +1 -1
  62. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -11
  63. package/dist/web/standalone/.next/build-manifest.json +4 -4
  64. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  65. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  66. package/dist/web/standalone/.next/required-server-files.json +3 -3
  67. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  68. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  69. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  72. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  80. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  90. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  92. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  95. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  98. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  100. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  104. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  110. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/experimental/route.js +3 -0
  118. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
  119. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
  120. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  128. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  131. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -26
  160. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  190. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  193. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  196. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  199. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/index.html +1 -1
  214. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  215. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  216. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  217. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  219. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/page.js +2 -2
  221. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -11
  224. package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
  225. package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
  226. package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
  227. package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
  228. package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
  229. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  230. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware.js +3 -3
  233. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  235. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  236. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  237. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  239. package/dist/web/standalone/.next/static/5_KeZz1X0tXJK-d_4OhjB/_buildManifest.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
  241. package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +9 -0
  242. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  244. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
  271. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
  279. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
  280. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
  281. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
  282. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
  283. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
  284. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +1 -0
  285. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  286. package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +1 -0
  287. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  288. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +1 -0
  292. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
  293. package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +1 -0
  294. package/dist/web/standalone/.next/static/css/de141508b083f922.css +1 -0
  295. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  296. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  297. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  298. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  299. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  300. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  301. package/dist/web/standalone/server.js +1 -1
  302. package/package.json +1 -1
  303. package/packages/pi-ai/dist/types.d.ts +1 -0
  304. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  305. package/packages/pi-ai/dist/types.js.map +1 -1
  306. package/packages/pi-ai/src/types.ts +1 -1
  307. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -0
  308. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
  310. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
  312. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/bash-executor.js +10 -1
  314. package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  316. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -0
  319. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/extensions/runner.js +13 -0
  321. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +8 -0
  327. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/package-manager.js +8 -1
  330. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
  332. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/skills.js +30 -8
  334. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  337. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  339. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/index.js +1 -1
  341. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +3 -2
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +6 -4
  347. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +5 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +12 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  355. package/packages/pi-coding-agent/package.json +1 -1
  356. package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
  357. package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
  358. package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
  359. package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
  360. package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
  361. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
  362. package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
  363. package/packages/pi-coding-agent/src/core/skills.ts +35 -10
  364. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  365. package/packages/pi-coding-agent/src/index.ts +4 -0
  366. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
  367. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +6 -4
  368. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
  369. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
  370. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  371. package/pkg/dist/modes/interactive/theme/themes.js +2 -1
  372. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  373. package/pkg/package.json +1 -1
  374. package/scripts/postinstall.js +163 -6
  375. package/src/resources/extensions/async-jobs/async-bash-tool.ts +3 -1
  376. package/src/resources/extensions/bg-shell/interaction.ts +3 -1
  377. package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
  378. package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
  379. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
  380. package/src/resources/extensions/gsd/auto/phases.ts +15 -1
  381. package/src/resources/extensions/gsd/auto/session.ts +6 -0
  382. package/src/resources/extensions/gsd/auto-dashboard.ts +31 -3
  383. package/src/resources/extensions/gsd/auto-dispatch.ts +84 -51
  384. package/src/resources/extensions/gsd/auto-observability.ts +72 -0
  385. package/src/resources/extensions/gsd/auto-post-unit.ts +56 -83
  386. package/src/resources/extensions/gsd/auto-prompts.ts +48 -0
  387. package/src/resources/extensions/gsd/auto-recovery.ts +19 -26
  388. package/src/resources/extensions/gsd/auto-utils.ts +25 -0
  389. package/src/resources/extensions/gsd/auto.ts +15 -5
  390. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -0
  391. package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
  392. package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
  393. package/src/resources/extensions/gsd/custom-verification.ts +3 -1
  394. package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
  395. package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
  396. package/src/resources/extensions/gsd/detection.ts +662 -3
  397. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
  398. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
  399. package/src/resources/extensions/gsd/files.ts +6 -1
  400. package/src/resources/extensions/gsd/guided-flow.ts +11 -0
  401. package/src/resources/extensions/gsd/init-wizard.ts +9 -1
  402. package/src/resources/extensions/gsd/model-router.ts +25 -0
  403. package/src/resources/extensions/gsd/notifications.ts +23 -0
  404. package/src/resources/extensions/gsd/observability-validator.ts +456 -0
  405. package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
  406. package/src/resources/extensions/gsd/preferences-types.ts +20 -0
  407. package/src/resources/extensions/gsd/preferences-validation.ts +26 -0
  408. package/src/resources/extensions/gsd/preferences.ts +3 -0
  409. package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
  410. package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
  411. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  412. package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
  413. package/src/resources/extensions/gsd/rtk-status.ts +53 -0
  414. package/src/resources/extensions/gsd/rule-registry.ts +10 -11
  415. package/src/resources/extensions/gsd/session-forensics.ts +7 -3
  416. package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
  417. package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
  418. package/src/resources/extensions/gsd/skill-health.ts +2 -2
  419. package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
  420. package/src/resources/extensions/gsd/state.ts +16 -5
  421. package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
  422. package/src/resources/extensions/gsd/templates/preferences.md +2 -0
  423. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
  424. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
  425. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +68 -0
  426. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
  427. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
  428. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
  429. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
  430. package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
  431. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
  432. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
  433. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
  434. package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
  435. package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
  436. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
  437. package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
  438. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
  439. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
  440. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
  441. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
  442. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
  443. package/src/resources/extensions/gsd/tests/run-uat.test.ts +146 -0
  444. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
  445. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
  446. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
  447. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
  448. package/src/resources/extensions/gsd/types.ts +2 -0
  449. package/src/resources/extensions/gsd/undo.ts +8 -7
  450. package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
  451. package/src/resources/extensions/gsd/verification-gate.ts +3 -1
  452. package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
  453. package/src/resources/extensions/shared/rtk.ts +120 -0
  454. package/dist/web/standalone/.next/server/chunks/229.js +0 -12
  455. package/dist/web/standalone/.next/server/chunks/441.js +0 -2
  456. package/dist/web/standalone/.next/server/chunks/471.js +0 -13
  457. package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +0 -9
  459. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
  461. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
  462. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
  463. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
  464. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
  465. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
  466. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
  467. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
  468. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
  469. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
  470. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
  471. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
  472. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
  473. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
  474. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
  475. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
  476. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
  477. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
  478. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
  479. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
  480. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
  483. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
  486. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
  487. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
  488. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
  489. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
  490. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
  491. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
  492. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
  493. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
  494. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
  495. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
  496. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
  497. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
  498. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
  501. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  502. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +0 -1
  503. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +0 -1
  504. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  505. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +0 -1
  506. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
  507. package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +0 -1
  508. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
  509. package/packages/pi-ai/pnpm-lock.yaml +0 -2022
  510. package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
  511. /package/dist/web/standalone/.next/static/{MQOhBnkC_TLtNn_JvZWDj → 5_KeZz1X0tXJK-d_4OhjB}/_ssgManifest.js +0 -0
@@ -9,8 +9,9 @@
9
9
  */
10
10
  import { existsSync, readdirSync, readFileSync } from "node:fs";
11
11
  import { join } from "node:path";
12
- import { getAgentDir } from "@gsd/pi-coding-agent";
13
- const SKILLS_DIR = join(getAgentDir(), "skills");
12
+ import { homedir } from "node:os";
13
+ /** Industry-standard skills.sh global skills directory */
14
+ const SKILLS_DIR = join(homedir(), ".agents", "skills");
14
15
  /** Snapshot of skill names at auto-mode start */
15
16
  let baselineSkills = null;
16
17
  /**
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import { existsSync } from "node:fs";
16
16
  import { join } from "node:path";
17
- import { getAgentDir } from "@gsd/pi-coding-agent";
17
+ import { homedir } from "node:os";
18
18
  import { formatCost, formatTokenCount, loadLedgerFromDisk } from "./metrics.js";
19
19
  import { detectStaleSkills } from "./skill-telemetry.js";
20
20
  // ─── Constants ────────────────────────────────────────────────────────────────
@@ -141,7 +141,7 @@ export function formatSkillDetail(basePath, skillName) {
141
141
  lines.push(` ${date} ${u.id.padEnd(20)} ${formatTokenCount(u.tokens.total).padStart(8)} tokens ${formatCost(u.cost)}`);
142
142
  }
143
143
  // Check for SKILL.md existence
144
- const skillPath = join(getAgentDir(), "skills", skillName, "SKILL.md");
144
+ const skillPath = join(homedir(), ".agents", "skills", skillName, "SKILL.md");
145
145
  if (existsSync(skillPath)) {
146
146
  const stat = require("node:fs").statSync(skillPath);
147
147
  lines.push("");
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import { existsSync, readdirSync } from "node:fs";
14
14
  import { join } from "node:path";
15
- import { getAgentDir } from "@gsd/pi-coding-agent";
15
+ import { homedir } from "node:os";
16
16
  // ─── In-memory state ──────────────────────────────────────────────────────────
17
17
  /** Skills available in the system prompt for the current unit */
18
18
  let availableSkills = [];
@@ -24,8 +24,14 @@ const activelyLoadedSkills = new Set();
24
24
  * Called before each unit starts.
25
25
  */
26
26
  export function captureAvailableSkills() {
27
- const skillsDir = join(getAgentDir(), "skills");
28
- availableSkills = listSkillNames(skillsDir);
27
+ const skillsDir = join(homedir(), ".agents", "skills");
28
+ const legacyDir = join(homedir(), ".gsd", "agent", "skills");
29
+ const names = listSkillNames(skillsDir);
30
+ // Include skills still in the legacy directory only if migration hasn't completed
31
+ const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
32
+ const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
33
+ const all = new Set([...names, ...legacyNames]);
34
+ availableSkills = [...all];
29
35
  activelyLoadedSkills.clear();
30
36
  }
31
37
  /**
@@ -85,8 +91,12 @@ export function detectStaleSkills(units, thresholdDays) {
85
91
  const cutoff = Date.now() - (thresholdDays * 24 * 60 * 60 * 1000);
86
92
  const stale = [];
87
93
  // Check all installed skills, not just those with usage data
88
- const skillsDir = join(getAgentDir(), "skills");
89
- const installed = listSkillNames(skillsDir);
94
+ const skillsDir = join(homedir(), ".agents", "skills");
95
+ const legacyDir = join(homedir(), ".gsd", "agent", "skills");
96
+ const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
97
+ const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
98
+ const installedSet = new Set([...listSkillNames(skillsDir), ...legacyNames]);
99
+ const installed = [...installedSet];
90
100
  for (const skill of installed) {
91
101
  const lastTs = lastUsed.get(skill);
92
102
  if (lastTs === undefined || lastTs < cutoff) {
@@ -4,7 +4,8 @@
4
4
  import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
5
5
  import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
6
6
  import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
7
- import { milestoneIdSort, findMilestoneIds } from './milestone-ids.js';
7
+ import { findMilestoneIds } from './milestone-ids.js';
8
+ import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
8
9
  import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
9
10
  import { join, resolve } from 'path';
10
11
  import { existsSync, readdirSync } from 'node:fs';
@@ -84,8 +85,14 @@ export async function getActiveMilestoneId(basePath) {
84
85
  if (isDbAvailable()) {
85
86
  const allMilestones = getAllMilestones();
86
87
  if (allMilestones.length > 0) {
87
- const sorted = [...allMilestones].sort((a, b) => a.id.localeCompare(b.id));
88
- for (const m of sorted) {
88
+ // Respect queue-order.json so /gsd queue reordering is honored (#2556).
89
+ // Without this, the DB path uses lexicographic sort while the dispatch
90
+ // guard uses queue order — causing a deadlock.
91
+ const customOrder = loadQueueOrder(basePath);
92
+ const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
93
+ const byId = new Map(allMilestones.map(m => [m.id, m]));
94
+ for (const id of sortedIds) {
95
+ const m = byId.get(id);
89
96
  if (m.status === "complete" || m.status === "done" || m.status === "parked")
90
97
  continue;
91
98
  return m.id;
@@ -233,8 +240,13 @@ export async function deriveStateFromDb(basePath) {
233
240
  });
234
241
  }
235
242
  }
236
- // Re-sort so milestones are in canonical order after injection
237
- allMilestones.sort((a, b) => milestoneIdSort(a.id, b.id));
243
+ // Re-sort so milestones follow queue order (same as dispatch guard) (#2556)
244
+ const customOrder = loadQueueOrder(basePath);
245
+ const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
246
+ const byId = new Map(allMilestones.map(m => [m.id, m]));
247
+ allMilestones.length = 0;
248
+ for (const id of sortedIds)
249
+ allMilestones.push(byId.get(id));
238
250
  // Parallel worker isolation: when locked, filter to just the locked milestone
239
251
  const milestoneLock = process.env.GSD_MILESTONE_LOCK;
240
252
  const milestones = milestoneLock
@@ -35,6 +35,18 @@ validated_at: {{date}}
35
35
 
36
36
  - **{{requirementId}}**: {{status}} — {{disposition: covered by remediation slice / acceptable gap / needs attention}}
37
37
 
38
+ ## Verification Class Compliance
39
+
40
+ <!-- If verification classes were defined during planning, document whether each
41
+ was addressed. Use N/A for classes that were empty or "none" in planning. -->
42
+
43
+ | Class | Planned | Evidence | Status |
44
+ |-------|---------|----------|--------|
45
+ | Contract | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
46
+ | Integration | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
47
+ | Operational | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
48
+ | UAT | {{planned_or_none}} | {{evidence_or_none}} | {{MET / NOT MET / N/A}} |
49
+
38
50
  ## Remediation Slices
39
51
 
40
52
  <!-- New slices appended to the roadmap to address auto-remediable gaps.
@@ -71,6 +71,8 @@ remote_questions:
71
71
  uat_dispatch:
72
72
  post_unit_hooks: []
73
73
  pre_dispatch_hooks: []
74
+ # experimental:
75
+ # rtk: false
74
76
  ---
75
77
 
76
78
  # GSD Skill Preferences
@@ -7,17 +7,28 @@ const require = createRequire(import.meta.url);
7
7
  const ROOT = new URL("../../../../../", import.meta.url);
8
8
 
9
9
  export function resolve(specifier, context, nextResolve) {
10
- // 1. Direct redirects to dist/ for specific packages
10
+ // 1. Redirect all workspace package bare imports to source.
11
+ // CI portability runs don't build any packages/ dist artifacts, so every
12
+ // @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
13
+ // source itself) must resolve to the TypeScript source entrypoint.
11
14
  if (specifier === "../../packages/pi-coding-agent/src/index.js") {
12
- specifier = new URL("packages/pi-coding-agent/dist/index.js", ROOT).href;
15
+ specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
16
+ } else if (specifier === "@gsd/pi-coding-agent") {
17
+ specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
13
18
  } else if (specifier === "@gsd/pi-ai/oauth") {
14
- specifier = new URL("packages/pi-ai/dist/utils/oauth/index.js", ROOT).href;
19
+ specifier = new URL("packages/pi-ai/src/utils/oauth/index.ts", ROOT).href;
15
20
  } else if (specifier === "@gsd/pi-ai") {
16
- specifier = new URL("packages/pi-ai/dist/index.js", ROOT).href;
21
+ specifier = new URL("packages/pi-ai/src/index.ts", ROOT).href;
17
22
  } else if (specifier === "@gsd/pi-agent-core") {
18
- specifier = new URL("packages/pi-agent-core/dist/index.js", ROOT).href;
23
+ specifier = new URL("packages/pi-agent-core/src/index.ts", ROOT).href;
19
24
  } else if (specifier === "@gsd/pi-tui") {
20
- specifier = new URL("packages/pi-tui/dist/index.js", ROOT).href;
25
+ specifier = new URL("packages/pi-tui/src/index.ts", ROOT).href;
26
+ } else if (specifier === "@gsd/native") {
27
+ specifier = new URL("packages/native/src/index.ts", ROOT).href;
28
+ } else if (specifier.startsWith("@gsd/native/")) {
29
+ // Sub-path imports like @gsd/native/fd, @gsd/native/text, etc.
30
+ const subpath = specifier.slice("@gsd/native/".length);
31
+ specifier = new URL(`packages/native/src/${subpath}/index.ts`, ROOT).href;
21
32
  }
22
33
  // 2. Redirect packages/*/dist/ → packages/*/src/ with .js→.ts for strip-types
23
34
  // Also handles local imports — skip rewrite for dist/ paths that are real compiled artifacts.
@@ -54,9 +65,15 @@ export function resolve(specifier, context, nextResolve) {
54
65
  }
55
66
 
56
67
  export function load(url, context, nextLoad) {
57
- // Node's --experimental-strip-types handles .ts but not .tsx (which may contain JSX).
58
- // Use TypeScript to transpile .tsx JS with react-jsx transform, then serve as module.
59
- if (url.endsWith('.tsx')) {
68
+ // Node's --experimental-strip-types handles plain .ts but not .tsx and not
69
+ // all TypeScript syntax used by workspace packages (parameter properties,
70
+ // decorators, etc.). Transpile all workspace package source files and .tsx
71
+ // files through TypeScript's transpileModule to avoid those crashes.
72
+ const shouldTranspileWithTypeScript =
73
+ url.endsWith('.tsx') ||
74
+ (url.endsWith('.ts') && url.includes('/packages/') && url.includes('/src/'));
75
+
76
+ if (shouldTranspileWithTypeScript) {
60
77
  const ts = require('typescript');
61
78
  const source = readFileSync(fileURLToPath(url), 'utf-8');
62
79
  const { outputText } = ts.transpileModule(source, {
@@ -66,6 +83,8 @@ export function load(url, context, nextLoad) {
66
83
  module: ts.ModuleKind.ESNext,
67
84
  target: ts.ScriptTarget.ESNext,
68
85
  esModuleInterop: true,
86
+ experimentalDecorators: true,
87
+ emitDecoratorMetadata: true,
69
88
  },
70
89
  });
71
90
  return { format: 'module', source: outputText, shortCircuit: true };
@@ -5,6 +5,7 @@
5
5
  import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
8
+ import { parseUnitId } from "./unit-id.js";
8
9
  import { deriveState } from "./state.js";
9
10
  import { invalidateAllCaches } from "./cache.js";
10
11
  import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
@@ -52,11 +53,11 @@ export async function handleUndo(args, ctx, _pi, basePath) {
52
53
  return;
53
54
  }
54
55
  // 1. Delete summary artifact
55
- const parts = unitId.split("/");
56
+ const { milestone, slice, task } = parseUnitId(unitId);
56
57
  let summaryRemoved = false;
57
- if (parts.length === 3) {
58
+ if (task !== undefined && slice !== undefined) {
58
59
  // Task-level: M001/S01/T01
59
- const [mid, sid, tid] = parts;
60
+ const [mid, sid, tid] = [milestone, slice, task];
60
61
  const tasksDir = resolveTasksDir(basePath, mid, sid);
61
62
  if (tasksDir) {
62
63
  const summaryFile = join(tasksDir, buildTaskFileName(tid, "SUMMARY"));
@@ -66,9 +67,9 @@ export async function handleUndo(args, ctx, _pi, basePath) {
66
67
  }
67
68
  }
68
69
  }
69
- else if (parts.length === 2) {
70
+ else if (slice !== undefined) {
70
71
  // Slice-level: M001/S01
71
- const [mid, sid] = parts;
72
+ const [mid, sid] = [milestone, slice];
72
73
  const slicePath = resolveSlicePath(basePath, mid, sid);
73
74
  if (slicePath) {
74
75
  for (const suffix of ["SUMMARY", "COMPLETE"]) {
@@ -82,8 +83,8 @@ export async function handleUndo(args, ctx, _pi, basePath) {
82
83
  }
83
84
  // 2. Uncheck task in PLAN if execute-task
84
85
  let planUpdated = false;
85
- if (unitType === "execute-task" && parts.length === 3) {
86
- const [mid, sid, tid] = parts;
86
+ if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
87
+ const [mid, sid, tid] = [milestone, slice, task];
87
88
  planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
88
89
  }
89
90
  // 3. Try to revert git commits from activity log
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlink
2
2
  import { join } from "node:path";
3
3
  import { gsdRoot, relSliceFile, relTaskFile, resolveSliceFile, resolveTaskFile, } from "./paths.js";
4
4
  import { loadFile, parseTaskPlanMustHaves, countMustHavesMentionedInSummary } from "./files.js";
5
+ import { parseUnitId } from "./unit-id.js";
5
6
  function runtimeDir(basePath) {
6
7
  return join(gsdRoot(basePath), "runtime", "units");
7
8
  }
@@ -75,7 +76,7 @@ export function listUnitRuntimeRecords(basePath) {
75
76
  return results;
76
77
  }
77
78
  export async function inspectExecuteTaskDurability(basePath, unitId) {
78
- const [mid, sid, tid] = unitId.split("/");
79
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
79
80
  if (!mid || !sid || !tid)
80
81
  return null;
81
82
  const planAbs = resolveSliceFile(basePath, mid, sid, "PLAN");
@@ -6,6 +6,7 @@ import { spawnSync } from "node:child_process";
6
6
  import { existsSync, readFileSync } from "node:fs";
7
7
  import { join, basename } from "node:path";
8
8
  import { DEFAULT_COMMAND_TIMEOUT_MS } from "./constants.js";
9
+ import { rewriteCommandWithRtk } from "../shared/rtk.js";
9
10
  /** Maximum bytes of stdout/stderr to retain per command (10 KB). */
10
11
  const MAX_OUTPUT_BYTES = 10 * 1024;
11
12
  /** Truncate a string to maxBytes, appending a marker if truncated. */
@@ -210,10 +211,11 @@ export function runVerificationGate(options) {
210
211
  const checks = [];
211
212
  for (const command of commands) {
212
213
  const start = Date.now();
214
+ const rewrittenCommand = rewriteCommandWithRtk(command);
213
215
  // Pass the command string as an argument to the shell explicitly
214
216
  // to avoid Node.js DEP0190 (spawnSync with shell: true and no args).
215
217
  const shellBin = process.platform === "win32" ? "cmd" : "sh";
216
- const shellArgs = process.platform === "win32" ? ["/c", command] : ["-c", command];
218
+ const shellArgs = process.platform === "win32" ? ["/c", rewrittenCommand] : ["-c", rewrittenCommand];
217
219
  const result = spawnSync(shellBin, shellArgs, {
218
220
  cwd: options.cwd,
219
221
  stdio: "pipe",
@@ -0,0 +1,189 @@
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
+ }
@@ -0,0 +1,100 @@
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 ADDED
@@ -0,0 +1,52 @@
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>;