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
package/README.md CHANGED
@@ -19,6 +19,8 @@ One command. Walk away. Come back to a built project with clean git history.
19
19
 
20
20
  <pre><code>npm install -g gsd-pi@latest</code></pre>
21
21
 
22
+ > GSD now provisions a managed [RTK](https://github.com/rtk-ai/rtk) binary on supported macOS, Linux, and Windows installs to compress shell-command output in `bash`, `async_bash`, `bg_shell`, and verification flows. GSD forces `RTK_TELEMETRY_DISABLED=1` for all managed invocations. Set `GSD_RTK_DISABLED=1` to disable the integration.
23
+
22
24
  > **📋 NOTICE: New to Node on Mac?** If you installed Node.js via Homebrew, you may be running a development release instead of LTS. **[Read this guide](./docs/node-lts-macos.md)** to pin Node 24 LTS and avoid compatibility issues.
23
25
 
24
26
  </div>
package/dist/cli.js CHANGED
@@ -14,6 +14,8 @@ import { parseCliArgs as parseWebCliArgs, runWebCliBranch, migrateLegacyFlatSess
14
14
  import { stopWebMode } from './web-mode.js';
15
15
  import { getProjectSessionsDir } from './project-sessions.js';
16
16
  import { markStartup, printStartupTimings } from './startup-timings.js';
17
+ import { bootstrapRtk, GSD_RTK_DISABLED_ENV } from './rtk.js';
18
+ import { loadEffectiveGSDPreferences } from './resources/extensions/gsd/preferences.js';
17
19
  // ---------------------------------------------------------------------------
18
20
  // V8 compile cache — Node 22+ can cache compiled bytecode across runs,
19
21
  // eliminating repeated parse/compile overhead for unchanged modules.
@@ -114,6 +116,26 @@ if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listMode
114
116
  process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
115
117
  process.exit(1);
116
118
  }
119
+ async function ensureRtkBootstrap() {
120
+ if (ensureRtkBootstrap._done)
121
+ return;
122
+ // RTK is opt-in via experimental.rtk preference. Default: disabled.
123
+ // Honor GSD_RTK_DISABLED if already explicitly set in the environment
124
+ // (env var takes precedence over preferences for manual override).
125
+ if (!process.env[GSD_RTK_DISABLED_ENV]) {
126
+ const prefs = loadEffectiveGSDPreferences();
127
+ const rtkEnabled = prefs?.preferences.experimental?.rtk === true;
128
+ if (!rtkEnabled) {
129
+ process.env[GSD_RTK_DISABLED_ENV] = "1";
130
+ }
131
+ }
132
+ const rtkStatus = await bootstrapRtk();
133
+ ensureRtkBootstrap._done = true;
134
+ markStartup('bootstrapRtk');
135
+ if (!rtkStatus.available && rtkStatus.supported && rtkStatus.enabled && rtkStatus.reason) {
136
+ process.stderr.write(`[gsd] Warning: RTK unavailable — continuing without shell-command compression (${rtkStatus.reason}).\n`);
137
+ }
138
+ }
117
139
  // `gsd <subcommand> --help` — show subcommand-specific help
118
140
  const subcommand = cliFlags.messages[0];
119
141
  if (subcommand && process.argv.includes('--help')) {
@@ -161,6 +183,7 @@ if (cliFlags.messages[0] === 'web' && cliFlags.messages[1] === 'stop') {
161
183
  }
162
184
  // `gsd --web [path]` or `gsd web [start] [path]` — launch browser-only web mode
163
185
  if (cliFlags.web || (cliFlags.messages[0] === 'web' && cliFlags.messages[1] !== 'stop')) {
186
+ await ensureRtkBootstrap();
164
187
  const webFlags = parseWebCliArgs(process.argv);
165
188
  const webBranch = await runWebCliBranch(webFlags, {
166
189
  stderr: process.stderr,
@@ -220,6 +243,7 @@ if (cliFlags.messages[0] === 'sessions') {
220
243
  }
221
244
  // `gsd headless` — run auto-mode without TUI
222
245
  if (cliFlags.messages[0] === 'headless') {
246
+ await ensureRtkBootstrap();
223
247
  const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
224
248
  await runHeadless(parseHeadlessArgs(process.argv));
225
249
  process.exit(0);
@@ -348,6 +372,7 @@ if (!settingsManager.getCollapseChangelog()) {
348
372
  // Print / subagent mode — single-shot execution, no TTY required
349
373
  // ---------------------------------------------------------------------------
350
374
  if (isPrintMode) {
375
+ await ensureRtkBootstrap();
351
376
  const sessionManager = cliFlags.noSession
352
377
  ? SessionManager.inMemory()
353
378
  : SessionManager.create(process.cwd());
@@ -465,6 +490,7 @@ if (!cliFlags.worktree && !isPrintMode) {
465
490
  // ---------------------------------------------------------------------------
466
491
  // Interactive mode — normal TTY session
467
492
  // ---------------------------------------------------------------------------
493
+ await ensureRtkBootstrap();
468
494
  // Per-directory session storage — same encoding as the upstream SDK so that
469
495
  // /resume only shows sessions from the current working directory.
470
496
  const cwd = process.cwd();
package/dist/loader.js CHANGED
@@ -61,6 +61,7 @@ if (firstArg === '--help' || firstArg === '-h') {
61
61
  }
62
62
  }
63
63
  import { agentDir, appRoot } from './app-paths.js';
64
+ import { applyRtkProcessEnv } from './rtk.js';
64
65
  import { serializeBundledExtensionPaths } from './bundled-extension-paths.js';
65
66
  import { discoverExtensionEntryPaths } from './extension-discovery.js';
66
67
  import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled } from './extension-registry.js';
@@ -92,6 +93,9 @@ if (!existsSync(appRoot)) {
92
93
  }
93
94
  // GSD_CODING_AGENT_DIR — tells pi's getAgentDir() to return ~/.gsd/agent/ instead of ~/.gsd/agent/
94
95
  process.env.GSD_CODING_AGENT_DIR = agentDir;
96
+ // RTK environment — make ~/.gsd/agent/bin visible to all child-process paths,
97
+ // not just the bash tool, and force-disable RTK telemetry for GSD-managed use.
98
+ applyRtkProcessEnv(process.env);
95
99
  // NODE_PATH — make gsd's own node_modules available to extensions loaded via jiti.
96
100
  // Without this, extensions (e.g. browser-tools) can't resolve dependencies like
97
101
  // `playwright` because jiti resolves modules from pi-coding-agent's location, not gsd's.
@@ -8,9 +8,12 @@ export declare function getNewerManagedResourceVersion(agentDir: string, current
8
8
  *
9
9
  * - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
10
10
  * - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
11
- * - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
12
11
  * - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
13
12
  *
13
+ * Skills are NOT synced here. They are installed by the user via the
14
+ * skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ — the
15
+ * industry-standard Agent Skills ecosystem directory.
16
+ *
14
17
  * Skips the copy when the managed-resources.json version matches the current
15
18
  * GSD version, avoiding ~128ms of synchronous cpSync on every startup.
16
19
  * After `npm update -g @glittercowboy/gsd`, versions will differ and the
@@ -1,7 +1,7 @@
1
1
  import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
2
2
  import { createHash } from 'node:crypto';
3
3
  import { homedir } from 'node:os';
4
- import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
4
+ import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
5
5
  import { dirname, join, relative, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import { compareSemver } from './update-check.js';
@@ -352,9 +352,12 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
352
352
  *
353
353
  * - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
354
354
  * - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
355
- * - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
356
355
  * - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
357
356
  *
357
+ * Skills are NOT synced here. They are installed by the user via the
358
+ * skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ — the
359
+ * industry-standard Agent Skills ecosystem directory.
360
+ *
358
361
  * Skips the copy when the managed-resources.json version matches the current
359
362
  * GSD version, avoiding ~128ms of synchronous cpSync on every startup.
360
363
  * After `npm update -g @glittercowboy/gsd`, versions will differ and the
@@ -375,6 +378,9 @@ export function initResources(agentDir) {
375
378
  // launch, not just during resource syncs. A stale/broken symlink makes ALL
376
379
  // extensions fail to resolve @gsd/* packages, rendering GSD non-functional.
377
380
  ensureNodeModulesSymlink(agentDir);
381
+ // Migrate legacy skills on every launch (not gated by manifest) so that
382
+ // partial-failure retries don't wait for a version bump.
383
+ migrateSkillsToEcosystemDir(agentDir);
378
384
  // Skip the full copy when both version AND content fingerprint match.
379
385
  // Version-only checks miss same-version content changes (npm link dev workflow,
380
386
  // hotfixes within a release). The content hash catches those at ~1ms cost.
@@ -389,7 +395,13 @@ export function initResources(agentDir) {
389
395
  // Sync bundled resources — overwrite so updates land on next launch.
390
396
  syncResourceDir(bundledExtensionsDir, join(agentDir, 'extensions'));
391
397
  syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
392
- syncResourceDir(join(resourcesDir, 'skills'), join(agentDir, 'skills'));
398
+ // Skills are no longer force-synced here. Users install skills via the
399
+ // skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ which
400
+ // is the industry-standard Agent Skills ecosystem directory.
401
+ //
402
+ // Migration from the legacy ~/.gsd/agent/skills/ directory is handled
403
+ // above the manifest check so it runs on every launch (including retries
404
+ // after partial copy failures).
393
405
  // Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
394
406
  // env var is not set (e.g. fork/dev builds, alternative entry points).
395
407
  const workflowSrc = join(resourcesDir, 'GSD-WORKFLOW.md');
@@ -405,6 +417,129 @@ export function initResources(agentDir) {
405
417
  writeManagedResourceManifest(agentDir);
406
418
  ensureRegistryEntries(join(agentDir, 'extensions'));
407
419
  }
420
+ // ─── Legacy Skill Migration ──────────────────────────────────────────────────────
421
+ /**
422
+ * One-time migration: copy user-customized skills from the old
423
+ * ~/.gsd/agent/skills/ directory into ~/.agents/skills/.
424
+ *
425
+ * The migration is conservative:
426
+ * - Only skill directories containing a SKILL.md are considered.
427
+ * - Copies, does not move — the old directory stays intact so downgrading
428
+ * to a pre-migration GSD version still works.
429
+ * - Collision-safe — if a skill name already exists in the target, the
430
+ * existing ecosystem skill wins (user may have already installed a newer
431
+ * version via skills.sh).
432
+ * - Writes a `.migrated-to-agents` marker inside the legacy directory so
433
+ * the migration runs at most once.
434
+ */
435
+ function migrateSkillsToEcosystemDir(agentDir) {
436
+ const legacyDir = join(agentDir, 'skills');
437
+ const markerPath = join(legacyDir, '.migrated-to-agents');
438
+ // Already migrated or no legacy dir — nothing to do
439
+ if (!existsSync(legacyDir))
440
+ return;
441
+ // Atomic marker check — 'wx' fails if file already exists, preventing races
442
+ // when two GSD processes start simultaneously.
443
+ let markerFd;
444
+ try {
445
+ markerFd = openSync(markerPath, 'wx');
446
+ }
447
+ catch {
448
+ return; // marker already exists (another process won the race, or already migrated)
449
+ }
450
+ try {
451
+ const ecosystemDir = join(homedir(), '.agents', 'skills');
452
+ mkdirSync(ecosystemDir, { recursive: true });
453
+ const entries = readdirSync(legacyDir, { withFileTypes: true });
454
+ let migrated = 0;
455
+ let candidates = 0;
456
+ for (const entry of entries) {
457
+ // Handle both real directories and symlinks pointing to directories
458
+ const isDir = entry.isDirectory();
459
+ const isSymlink = entry.isSymbolicLink();
460
+ if (!isDir && !isSymlink)
461
+ continue;
462
+ const sourcePath = join(legacyDir, entry.name);
463
+ // For symlinks, verify the target is a directory
464
+ if (isSymlink) {
465
+ try {
466
+ const stat = statSync(sourcePath);
467
+ if (!stat.isDirectory())
468
+ continue;
469
+ }
470
+ catch {
471
+ continue; // broken symlink — skip
472
+ }
473
+ }
474
+ const skillMd = join(sourcePath, 'SKILL.md');
475
+ if (!existsSync(skillMd))
476
+ continue;
477
+ const target = join(ecosystemDir, entry.name);
478
+ if (existsSync(target))
479
+ continue; // ecosystem version wins
480
+ candidates++;
481
+ try {
482
+ if (isSymlink) {
483
+ // Recreate the symlink in the ecosystem directory using an absolute
484
+ // target. Relative symlinks would resolve from the new parent dir
485
+ // (~/.agents/skills/) instead of the original (~/.gsd/agent/skills/),
486
+ // pointing to the wrong location.
487
+ const rawTarget = readlinkSync(sourcePath);
488
+ const absTarget = resolve(dirname(sourcePath), rawTarget);
489
+ symlinkSync(absTarget, target);
490
+ }
491
+ else {
492
+ cpSync(sourcePath, target, { recursive: true });
493
+ }
494
+ migrated++;
495
+ }
496
+ catch {
497
+ // non-fatal — skip this skill
498
+ }
499
+ }
500
+ // If any skills failed to copy, remove the marker so migration retries
501
+ // on the next launch. This keeps the legacy dir as fallback until every
502
+ // skill has been successfully migrated.
503
+ if (migrated < candidates) {
504
+ try {
505
+ closeSync(markerFd);
506
+ markerFd = -1;
507
+ }
508
+ catch { /* non-fatal */ }
509
+ try {
510
+ unlinkSync(markerPath);
511
+ }
512
+ catch { /* non-fatal */ }
513
+ return;
514
+ }
515
+ // Write migration info to the marker
516
+ try {
517
+ writeFileSync(markerFd, `Migrated ${migrated} skill(s) to ${ecosystemDir} on ${new Date().toISOString()}\n`);
518
+ }
519
+ catch { /* non-fatal */ }
520
+ }
521
+ catch {
522
+ // can't create ecosystem dir or read legacy dir — close fd first (required on Windows
523
+ // where unlinkSync fails on open handles), then remove marker so we retry next launch
524
+ try {
525
+ closeSync(markerFd);
526
+ markerFd = -1;
527
+ }
528
+ catch { /* non-fatal */ }
529
+ try {
530
+ unlinkSync(markerPath);
531
+ }
532
+ catch { /* non-fatal */ }
533
+ }
534
+ finally {
535
+ if (markerFd !== -1) {
536
+ try {
537
+ closeSync(markerFd);
538
+ }
539
+ catch { /* non-fatal */ }
540
+ }
541
+ }
542
+ }
408
543
  export function hasStaleCompiledExtensionSiblings(extensionsDir) {
409
544
  if (!existsSync(extensionsDir))
410
545
  return false;
@@ -12,6 +12,7 @@ import { createWriteStream } from "node:fs";
12
12
  import { tmpdir } from "node:os";
13
13
  import { join } from "node:path";
14
14
  import { randomBytes } from "node:crypto";
15
+ import { rewriteCommandWithRtk } from "../shared/rtk.js";
15
16
  const schema = Type.Object({
16
17
  command: Type.String({ description: "Bash command to execute in the background" }),
17
18
  timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (optional)" })),
@@ -93,7 +94,8 @@ function executeBashInBackground(command, cwd, signal, timeout) {
93
94
  reject(err);
94
95
  } };
95
96
  const { shell, args } = getShellConfig();
96
- const resolvedCommand = sanitizeCommand(command);
97
+ const rewrittenCommand = rewriteCommandWithRtk(command);
98
+ const resolvedCommand = sanitizeCommand(rewrittenCommand);
97
99
  const child = spawn(shell, [...args, resolvedCommand], {
98
100
  cwd,
99
101
  detached: true,
@@ -2,6 +2,7 @@
2
2
  * Expect-style interactions: send_and_wait, run on session, query shell environment.
3
3
  */
4
4
  import { randomUUID } from "node:crypto";
5
+ import { rewriteCommandWithRtk } from "../shared/rtk.js";
5
6
  // ── Query Shell Environment ────────────────────────────────────────────────
6
7
  export async function queryShellEnv(bg, timeout, signal) {
7
8
  const sentinel = `__GSD_ENV_${randomUUID().slice(0, 8)}__`;
@@ -97,9 +98,10 @@ export async function runOnSession(bg, command, timeout, signal) {
97
98
  // Snapshot current output buffer position
98
99
  const startIndex = bg.output.length;
99
100
  // Write the sentinel-wrapped command to stdin
101
+ const rewrittenCommand = rewriteCommandWithRtk(command);
100
102
  const wrappedCommand = [
101
103
  `echo ${startMarker}`,
102
- command,
104
+ rewrittenCommand,
103
105
  `${exitVar}=$?`,
104
106
  `echo ${endMarker} $${exitVar}`,
105
107
  ].join("\n");
@@ -7,6 +7,7 @@ import { randomUUID } from "node:crypto";
7
7
  import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { getShellConfig, sanitizeCommand } from "@gsd/pi-coding-agent";
10
+ import { rewriteCommandWithRtk } from "../shared/rtk.js";
10
11
  import { MAX_BUFFER_LINES, MAX_EVENTS, DEAD_PROCESS_TTL, } from "./types.js";
11
12
  import { restoreWindowsVTInput, formatUptime } from "./utilities.js";
12
13
  import { analyzeLine } from "./output-formatter.js";
@@ -101,7 +102,9 @@ export function startProcess(opts) {
101
102
  const env = { ...process.env, ...(opts.env || {}) };
102
103
  const { shell, args: shellArgs } = getShellConfig();
103
104
  // Shell sessions default to the user's shell if no command specified
104
- const command = processType === "shell" && !opts.command ? shell : opts.command;
105
+ const command = processType === "shell" && !opts.command
106
+ ? shell
107
+ : rewriteCommandWithRtk(opts.command);
105
108
  const proc = spawn(shell, [...shellArgs, sanitizeCommand(command)], {
106
109
  cwd: opts.cwd,
107
110
  stdio: ["pipe", "pipe", "pipe"],
@@ -210,7 +210,12 @@ export class PartialMessageBuilder {
210
210
  block.arguments = JSON.parse(jsonStr);
211
211
  }
212
212
  catch {
213
+ // Stream was truncated mid-tool-call — JSON is garbage.
214
+ // Preserve the raw string for diagnostics but signal the
215
+ // malformation explicitly so downstream consumers can
216
+ // distinguish this from a healthy tool completion (#2574).
213
217
  block.arguments = { _raw: jsonStr };
218
+ return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
214
219
  }
215
220
  return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial };
216
221
  }
@@ -219,6 +219,8 @@ export async function runPreDispatch(ic, loopState) {
219
219
  if (s.currentMilestoneId) {
220
220
  try {
221
221
  deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
222
+ // Prevent stopAuto from attempting the same merge (#2645)
223
+ s.milestoneMergedInPhases = true;
222
224
  }
223
225
  catch (mergeErr) {
224
226
  if (mergeErr instanceof MergeConflictError) {
@@ -284,6 +286,8 @@ export async function runPreDispatch(ic, loopState) {
284
286
  if (s.currentMilestoneId) {
285
287
  try {
286
288
  deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
289
+ // Prevent stopAuto from attempting the same merge (#2645)
290
+ s.milestoneMergedInPhases = true;
287
291
  }
288
292
  catch (mergeErr) {
289
293
  if (mergeErr instanceof MergeConflictError) {
@@ -334,7 +338,18 @@ export async function runDispatch(ic, preData, loopState) {
334
338
  });
335
339
  if (dispatchResult.action === "stop") {
336
340
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-stop", rule: dispatchResult.matchedRule, data: { reason: dispatchResult.reason } });
337
- await closeoutAndStop(ctx, pi, s, deps, dispatchResult.reason);
341
+ // Warning-level stops are recoverable human checkpoints (e.g. UAT verdict
342
+ // gate) — pause instead of hard-stopping so the session is resumable with
343
+ // `/gsd auto`. Error/info-level stops remain hard stops for infrastructure
344
+ // failures and terminal conditions respectively.
345
+ // See: https://github.com/gsd-build/gsd-2/issues/2474
346
+ if (dispatchResult.level === "warning") {
347
+ ctx.ui.notify(dispatchResult.reason, "warning");
348
+ await deps.pauseAuto(ctx, pi);
349
+ }
350
+ else {
351
+ await closeoutAndStop(ctx, pi, s, deps, dispatchResult.reason);
352
+ }
338
353
  debugLog("autoLoop", { phase: "exit", reason: "dispatch-stop" });
339
354
  return { action: "break", reason: "dispatch-stop" };
340
355
  }
@@ -64,6 +64,10 @@ export class AutoSession {
64
64
  // ── Isolation degradation ────────────────────────────────────────────
65
65
  /** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
66
66
  isolationDegraded = false;
67
+ // ── Merge guard ──────────────────────────────────────────────────────
68
+ /** Set to true after phases.ts successfully calls mergeAndExit, so that
69
+ * stopAuto does not attempt the same merge a second time (#2645). */
70
+ milestoneMergedInPhases = false;
67
71
  // ── Dispatch circuit breakers ──────────────────────────────────────
68
72
  rewriteAttemptCount = 0;
69
73
  // ── Metrics ──────────────────────────────────────────────────────────────
@@ -144,6 +148,7 @@ export class AutoSession {
144
148
  this.sidecarQueue = [];
145
149
  this.rewriteAttemptCount = 0;
146
150
  this.isolationDegraded = false;
151
+ this.milestoneMergedInPhases = false;
147
152
  // Signal handler
148
153
  this.sigtermHandler = null;
149
154
  // Loop promise state lives in auto-loop.ts module scope
@@ -19,6 +19,7 @@ import { getActiveWorktreeName } from "./worktree-command.js";
19
19
  import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
20
20
  import { resolveServiceTierIcon, getEffectiveServiceTier } from "./service-tier.js";
21
21
  import { parseUnitId } from "./unit-id.js";
22
+ import { formatRtkSavingsLabel, getRtkSessionSavings, } from "../shared/rtk-session-stats.js";
22
23
  // ─── UAT Slice Extraction ─────────────────────────────────────────────────────
23
24
  /**
24
25
  * Extract the target slice ID from a run-uat unit ID (e.g. "M001/S01" → "S01").
@@ -383,6 +384,18 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
383
384
  let pulseBright = true;
384
385
  let cachedLines;
385
386
  let cachedWidth;
387
+ let cachedRtkLabel;
388
+ const refreshRtkLabel = () => {
389
+ try {
390
+ const sessionId = ctx.sessionManager.getSessionId();
391
+ const savings = sessionId ? getRtkSessionSavings(accessors.getBasePath(), sessionId) : null;
392
+ cachedRtkLabel = formatRtkSavingsLabel(savings);
393
+ }
394
+ catch {
395
+ cachedRtkLabel = null;
396
+ }
397
+ };
398
+ refreshRtkLabel();
386
399
  const pulseTimer = setInterval(() => {
387
400
  pulseBright = !pulseBright;
388
401
  cachedLines = undefined;
@@ -392,13 +405,16 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
392
405
  // task/slice completion mid-unit. Without this, the progress bar only
393
406
  // updates at dispatch time, appearing frozen during long-running units.
394
407
  // 15s (vs 5s) reduces synchronous file I/O on the hot path.
395
- const progressRefreshTimer = mid ? setInterval(() => {
408
+ const progressRefreshTimer = setInterval(() => {
396
409
  try {
397
- updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
410
+ if (mid) {
411
+ updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
412
+ }
413
+ refreshRtkLabel();
398
414
  cachedLines = undefined;
399
415
  }
400
416
  catch { /* non-fatal */ }
401
- }, 15_000) : null;
417
+ }, 15_000);
402
418
  return {
403
419
  render(width) {
404
420
  if (cachedLines && cachedWidth === width)
@@ -659,6 +675,9 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
659
675
  if (statsLine) {
660
676
  lines.push(rightAlign("", statsLine, width));
661
677
  }
678
+ if (cachedRtkLabel) {
679
+ lines.push(rightAlign("", theme.fg("dim", cachedRtkLabel), width));
680
+ }
662
681
  }
663
682
  // PWD line with last commit info right-aligned
664
683
  const lastCommit = getLastCommit(accessors.getBasePath());