gsd-pi 2.50.0-dev.d210a87 → 2.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/README.md +0 -2
  2. package/dist/cli.js +0 -26
  3. package/dist/loader.js +0 -4
  4. package/dist/resource-loader.d.ts +1 -4
  5. package/dist/resource-loader.js +3 -138
  6. package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -3
  7. package/dist/resources/extensions/bg-shell/interaction.js +1 -3
  8. package/dist/resources/extensions/bg-shell/process-manager.js +1 -4
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +0 -5
  10. package/dist/resources/extensions/gsd/auto/phases.js +1 -16
  11. package/dist/resources/extensions/gsd/auto/session.js +0 -5
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -22
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +54 -81
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +76 -37
  15. package/dist/resources/extensions/gsd/auto-prompts.js +0 -57
  16. package/dist/resources/extensions/gsd/auto-recovery.js +25 -21
  17. package/dist/resources/extensions/gsd/auto.js +5 -15
  18. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -16
  19. package/dist/resources/extensions/gsd/crash-recovery.js +2 -6
  20. package/dist/resources/extensions/gsd/custom-execution-policy.js +2 -3
  21. package/dist/resources/extensions/gsd/custom-verification.js +1 -3
  22. package/dist/resources/extensions/gsd/custom-workflow-engine.js +2 -3
  23. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -4
  24. package/dist/resources/extensions/gsd/detection.js +3 -589
  25. package/dist/resources/extensions/gsd/dispatch-guard.js +1 -2
  26. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -15
  27. package/dist/resources/extensions/gsd/files.js +1 -5
  28. package/dist/resources/extensions/gsd/guided-flow.js +0 -10
  29. package/dist/resources/extensions/gsd/init-wizard.js +1 -9
  30. package/dist/resources/extensions/gsd/model-router.js +0 -25
  31. package/dist/resources/extensions/gsd/notifications.js +0 -23
  32. package/dist/resources/extensions/gsd/preferences-skills.js +5 -11
  33. package/dist/resources/extensions/gsd/preferences-types.js +0 -1
  34. package/dist/resources/extensions/gsd/preferences-validation.js +0 -25
  35. package/dist/resources/extensions/gsd/preferences.js +0 -3
  36. package/dist/resources/extensions/gsd/prompts/forensics.md +7 -11
  37. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
  38. package/dist/resources/extensions/gsd/provider-error-pause.js +0 -8
  39. package/dist/resources/extensions/gsd/rule-registry.js +11 -10
  40. package/dist/resources/extensions/gsd/session-forensics.js +3 -7
  41. package/dist/resources/extensions/gsd/skill-discovery.js +2 -3
  42. package/dist/resources/extensions/gsd/skill-health.js +2 -2
  43. package/dist/resources/extensions/gsd/skill-telemetry.js +5 -15
  44. package/dist/resources/extensions/gsd/state.js +5 -17
  45. package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -12
  46. package/dist/resources/extensions/gsd/templates/preferences.md +0 -2
  47. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
  48. package/dist/resources/extensions/gsd/undo.js +7 -8
  49. package/dist/resources/extensions/gsd/unit-runtime.js +1 -2
  50. package/dist/resources/extensions/gsd/verification-gate.js +1 -3
  51. package/dist/web/standalone/.next/BUILD_ID +1 -1
  52. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -17
  53. package/dist/web/standalone/.next/build-manifest.json +4 -4
  54. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  55. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  56. package/dist/web/standalone/.next/required-server-files.json +3 -3
  57. package/dist/web/standalone/.next/routes-manifest.json +0 -6
  58. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  59. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  62. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  70. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  80. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  82. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  90. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  91. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  97. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  100. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  106. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  112. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  115. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  118. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  121. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +26 -2
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/page.js +2 -2
  208. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -17
  211. package/dist/web/standalone/.next/server/chunks/229.js +12 -0
  212. package/dist/web/standalone/.next/server/chunks/441.js +2 -0
  213. package/dist/web/standalone/.next/server/chunks/471.js +13 -0
  214. package/dist/web/standalone/.next/server/chunks/{4741.js → 741.js} +1 -1
  215. package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -1
  216. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/middleware.js +3 -3
  219. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  221. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  222. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  223. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  224. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  225. package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +9 -0
  227. package/dist/web/standalone/.next/static/chunks/{2008.817d0885545aaea9.js → 485.243af25f0cdf50d6.js} +6 -6
  228. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  271. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +1 -0
  279. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  280. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  281. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  282. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  283. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  284. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  285. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  286. package/dist/web/standalone/server.js +1 -1
  287. package/package.json +1 -1
  288. package/packages/pi-ai/dist/types.d.ts +0 -1
  289. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/types.js.map +1 -1
  291. package/packages/pi-ai/pnpm-lock.yaml +2022 -0
  292. package/packages/pi-ai/src/types.ts +1 -1
  293. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -1
  294. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -1
  296. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +1 -3
  298. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/bash-executor.js +1 -10
  300. package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -1
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  307. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +1 -19
  309. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +0 -8
  313. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/package-manager.js +1 -8
  316. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/skills.d.ts +1 -11
  318. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/skills.js +8 -30
  320. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/slash-commands.js +0 -1
  323. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  325. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/index.js +1 -1
  327. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -3
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -6
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +0 -5
  335. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +0 -12
  337. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -2
  340. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  341. package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
  342. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -2
  343. package/packages/pi-coding-agent/src/core/bash-executor.ts +2 -10
  344. package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -2
  345. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -18
  346. package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -21
  347. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +0 -9
  348. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -10
  349. package/packages/pi-coding-agent/src/core/skills.ts +10 -35
  350. package/packages/pi-coding-agent/src/core/slash-commands.ts +0 -1
  351. package/packages/pi-coding-agent/src/index.ts +0 -4
  352. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -3
  353. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -6
  354. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +0 -15
  355. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -2
  356. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  357. package/pkg/dist/modes/interactive/theme/themes.js +1 -2
  358. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  359. package/scripts/postinstall.js +6 -163
  360. package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -3
  361. package/src/resources/extensions/bg-shell/interaction.ts +1 -3
  362. package/src/resources/extensions/bg-shell/process-manager.ts +1 -4
  363. package/src/resources/extensions/claude-code-cli/partial-builder.ts +0 -5
  364. package/src/resources/extensions/gsd/auto/phases.ts +1 -15
  365. package/src/resources/extensions/gsd/auto/session.ts +0 -6
  366. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -31
  367. package/src/resources/extensions/gsd/auto-dispatch.ts +51 -84
  368. package/src/resources/extensions/gsd/auto-post-unit.ts +83 -56
  369. package/src/resources/extensions/gsd/auto-prompts.ts +0 -48
  370. package/src/resources/extensions/gsd/auto-recovery.ts +26 -19
  371. package/src/resources/extensions/gsd/auto.ts +5 -15
  372. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -17
  373. package/src/resources/extensions/gsd/crash-recovery.ts +2 -6
  374. package/src/resources/extensions/gsd/custom-execution-policy.ts +2 -3
  375. package/src/resources/extensions/gsd/custom-verification.ts +1 -3
  376. package/src/resources/extensions/gsd/custom-workflow-engine.ts +2 -3
  377. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -7
  378. package/src/resources/extensions/gsd/detection.ts +3 -662
  379. package/src/resources/extensions/gsd/dispatch-guard.ts +1 -2
  380. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -15
  381. package/src/resources/extensions/gsd/files.ts +1 -6
  382. package/src/resources/extensions/gsd/guided-flow.ts +0 -11
  383. package/src/resources/extensions/gsd/init-wizard.ts +1 -9
  384. package/src/resources/extensions/gsd/model-router.ts +0 -25
  385. package/src/resources/extensions/gsd/notifications.ts +0 -23
  386. package/src/resources/extensions/gsd/preferences-skills.ts +5 -11
  387. package/src/resources/extensions/gsd/preferences-types.ts +0 -20
  388. package/src/resources/extensions/gsd/preferences-validation.ts +0 -26
  389. package/src/resources/extensions/gsd/preferences.ts +0 -3
  390. package/src/resources/extensions/gsd/prompts/forensics.md +7 -11
  391. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
  392. package/src/resources/extensions/gsd/provider-error-pause.ts +0 -9
  393. package/src/resources/extensions/gsd/rule-registry.ts +11 -10
  394. package/src/resources/extensions/gsd/session-forensics.ts +3 -7
  395. package/src/resources/extensions/gsd/skill-discovery.ts +2 -3
  396. package/src/resources/extensions/gsd/skill-health.ts +2 -2
  397. package/src/resources/extensions/gsd/skill-telemetry.ts +5 -15
  398. package/src/resources/extensions/gsd/state.ts +5 -16
  399. package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -12
  400. package/src/resources/extensions/gsd/templates/preferences.md +0 -2
  401. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -16
  402. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
  403. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -68
  404. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
  405. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +3 -5
  406. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -33
  407. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -4
  408. package/src/resources/extensions/gsd/tests/detection.test.ts +0 -838
  409. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
  410. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -63
  411. package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -40
  412. package/src/resources/extensions/gsd/tests/notifications.test.ts +6 -28
  413. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -50
  414. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -40
  415. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
  416. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +5 -4
  417. package/src/resources/extensions/gsd/tests/run-uat.test.ts +0 -146
  418. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
  419. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -24
  420. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
  421. package/src/resources/extensions/gsd/types.ts +0 -2
  422. package/src/resources/extensions/gsd/undo.ts +7 -8
  423. package/src/resources/extensions/gsd/unit-runtime.ts +1 -2
  424. package/src/resources/extensions/gsd/verification-gate.ts +1 -3
  425. package/dist/resources/extensions/gsd/auto-observability.js +0 -54
  426. package/dist/resources/extensions/gsd/auto-utils.js +0 -20
  427. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  428. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  429. package/dist/resources/extensions/gsd/rtk-status.js +0 -43
  430. package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
  431. package/dist/resources/extensions/shared/rtk-session-stats.js +0 -189
  432. package/dist/resources/extensions/shared/rtk.js +0 -100
  433. package/dist/rtk.d.ts +0 -52
  434. package/dist/rtk.js +0 -332
  435. package/dist/web/standalone/.next/server/app/api/experimental/route.js +0 -3
  436. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +0 -1
  437. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +0 -1
  438. package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
  439. package/dist/web/standalone/.next/server/chunks/2331.js +0 -25
  440. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  441. package/dist/web/standalone/.next/server/chunks/7471.js +0 -13
  442. package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +0 -9
  443. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
  444. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
  445. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
  446. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  447. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  448. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
  449. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
  450. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
  451. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
  452. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
  453. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
  454. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
  455. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
  456. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
  457. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
  459. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
  461. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
  462. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
  463. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
  464. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
  465. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
  466. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
  467. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
  468. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
  469. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
  470. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
  471. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
  472. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
  473. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
  474. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
  475. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
  476. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
  477. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
  478. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  479. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
  480. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
  483. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +0 -1
  486. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  487. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
  488. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
  489. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  490. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
  491. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
  492. package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +0 -1
  493. package/dist/web/standalone/.next/static/css/de141508b083f922.css +0 -1
  494. package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +0 -1
  495. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -105
  496. package/src/resources/extensions/gsd/auto-observability.ts +0 -72
  497. package/src/resources/extensions/gsd/auto-utils.ts +0 -25
  498. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  499. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  500. package/src/resources/extensions/gsd/rtk-status.ts +0 -53
  501. package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
  502. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
  503. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  504. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
  505. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
  506. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
  507. package/src/resources/extensions/shared/rtk-session-stats.ts +0 -249
  508. package/src/resources/extensions/shared/rtk.ts +0 -120
  509. /package/dist/web/standalone/.next/static/{yJIyd5cXPNpmXTv18ZlyC → MQOhBnkC_TLtNn_JvZWDj}/_ssgManifest.js +0 -0
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { resolveMilestoneFile } from "./paths.js";
4
4
  import { findMilestoneIds } from "./guided-flow.js";
5
- import { parseUnitId } from "./unit-id.js";
6
5
  import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
7
6
  import { parseRoadmap } from "./parsers-legacy.js";
8
7
  import { readFileSync } from "node:fs";
@@ -23,7 +22,7 @@ export function getPriorSliceCompletionBlocker(
23
22
  ): string | null {
24
23
  if (!SLICE_DISPATCH_TYPES.has(unitType)) return null;
25
24
 
26
- const { milestone: targetMid, slice: targetSid } = parseUnitId(unitId);
25
+ const [targetMid, targetSid] = unitId.split("/");
27
26
  if (!targetMid || !targetSid) return null;
28
27
 
29
28
  // Use findMilestoneIds to respect custom queue order.
@@ -241,9 +241,6 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
241
241
 
242
242
  **Known unit types for `before`/`after`:** `research-milestone`, `plan-milestone`, `research-slice`, `plan-slice`, `execute-task`, `complete-slice`, `replan-slice`, `reassess-roadmap`, `run-uat`.
243
243
 
244
- - `experimental`: opt-in experimental features. All features here are **off by default** — you must explicitly set each one to `true` to enable it. Features in this block may change or be removed without a deprecation cycle while in experimental status. Keys:
245
- - `rtk`: boolean — enable RTK (Real-Time Kompression) shell-command compression. When enabled, GSD wraps shell commands through the RTK binary to reduce token usage during command execution. RTK is downloaded automatically on first use if not already installed. **Default: `false`** (opt-in required). Set `GSD_RTK_DISABLED=1` in the environment to force-disable regardless of this preference.
246
-
247
244
  ---
248
245
 
249
246
  ## Best Practices
@@ -655,15 +652,3 @@ verification_max_retries: 2
655
652
  ```
656
653
 
657
654
  Runs test, lint, and typecheck after each task. On failure, auto-fix is attempted up to 2 times before reporting the issue.
658
-
659
- ## Experimental Features Example
660
-
661
- ```yaml
662
- ---
663
- version: 1
664
- experimental:
665
- rtk: true
666
- ---
667
- ```
668
-
669
- Opts in to RTK shell-command compression. RTK is downloaded automatically on first use. Set `GSD_RTK_DISABLED=1` to force-disable at the environment level regardless of this setting.
@@ -269,8 +269,6 @@ function _parseSummaryImpl(content: string): Summary {
269
269
  whatHappened: nativeResult.whatHappened,
270
270
  deviations: nativeResult.deviations,
271
271
  filesModified: nativeResult.filesModified,
272
- followUps: extractSection(content, 'Follow-ups') ?? '',
273
- knownLimitations: extractSection(content, 'Known Limitations') ?? '',
274
272
  };
275
273
  }
276
274
 
@@ -332,10 +330,7 @@ function _parseSummaryImpl(content: string): Summary {
332
330
  }
333
331
  }
334
332
 
335
- const followUps = extractSection(body, 'Follow-ups') ?? '';
336
- const knownLimitations = extractSection(body, 'Known Limitations') ?? '';
337
-
338
- return { frontmatter, title, oneLiner, whatHappened, deviations, filesModified, followUps, knownLimitations };
333
+ return { frontmatter, title, oneLiner, whatHappened, deviations, filesModified };
339
334
  }
340
335
 
341
336
  // ─── Continue Parser ───────────────────────────────────────────────────────
@@ -450,10 +450,7 @@ async function buildDiscussSlicePrompt(
450
450
  }
451
451
 
452
452
  // Completed slice summaries — what was already built that this slice builds on
453
- // Ensure DB is open so getMilestoneSlices returns real data (#2560).
454
453
  {
455
- const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
456
- await ensureDbOpen();
457
454
  type NormSlice = { id: string; done: boolean };
458
455
  let normSlices: NormSlice[] = [];
459
456
  if (isDbAvailable()) {
@@ -591,14 +588,6 @@ export async function showDiscuss(
591
588
  return;
592
589
  }
593
590
 
594
- // Ensure DB is open before querying slices (#2560).
595
- // showDiscuss() is a command handler — unlike tool handlers, it has no
596
- // automatic ensureDbOpen() call. Without this, isDbAvailable() returns
597
- // false on cold-start sessions and normSlices falls to [] → false
598
- // "All slices complete" exit.
599
- const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
600
- await ensureDbOpen();
601
-
602
591
  // Guard: no roadmap yet (unless DB has slices)
603
592
  const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
604
593
  const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
@@ -15,7 +15,6 @@ import { ensureGitignore, untrackRuntimeFiles } from "./gitignore.js";
15
15
  import { gsdRoot } from "./paths.js";
16
16
  import { assertSafeDirectory } from "./validate-directory.js";
17
17
  import type { ProjectDetection, ProjectSignals } from "./detection.js";
18
- import { runSkillInstallStep } from "./skill-catalog.js";
19
18
 
20
19
  // ─── Types ──────────────────────────────────────────────────────────────────────
21
20
 
@@ -224,14 +223,7 @@ export async function showProjectInit(
224
223
  await customizeAdvancedPrefs(ctx, prefs);
225
224
  }
226
225
 
227
- // ── Step 8: Skill Installation ─────────────────────────────────────────────
228
- try {
229
- await runSkillInstallStep(ctx, signals);
230
- } catch {
231
- // Non-fatal — skill installation failure should never block project init
232
- }
233
-
234
- // ── Step 9: Bootstrap .gsd/ ────────────────────────────────────────────────
226
+ // ── Step 8: Bootstrap .gsd/ ────────────────────────────────────────────────
235
227
  bootstrapGsdDirectory(basePath, prefs, signals);
236
228
 
237
229
  // Ensure .gitignore
@@ -114,21 +114,6 @@ export function resolveModelForComplexity(
114
114
  const configuredTier = getModelTier(configuredPrimary);
115
115
  const requestedTier = classification.tier;
116
116
 
117
- // If the configured model is unknown (not in MODEL_CAPABILITY_TIER),
118
- // honor the user's explicit choice — don't downgrade based on a guess.
119
- // Unknown models default to "heavy" in getModelTier, which makes every
120
- // standard/light unit get downgraded to tier_models, silently ignoring
121
- // the user's configuration. (#2192)
122
- if (!isKnownModel(configuredPrimary)) {
123
- return {
124
- modelId: configuredPrimary,
125
- fallbacks: phaseConfig.fallbacks,
126
- tier: requestedTier,
127
- wasDowngraded: false,
128
- reason: `configured model "${configuredPrimary}" is not in the known tier map — honoring explicit config`,
129
- };
130
- }
131
-
132
117
  // Downgrade-only: if requested tier >= configured tier, no change
133
118
  if (tierOrdinal(requestedTier) >= tierOrdinal(configuredTier)) {
134
119
  return {
@@ -217,16 +202,6 @@ function getModelTier(modelId: string): ComplexityTier {
217
202
  return "heavy";
218
203
  }
219
204
 
220
- /** Check if a model ID has a known capability tier mapping. (#2192) */
221
- function isKnownModel(modelId: string): boolean {
222
- const bareId = modelId.includes("/") ? modelId.split("/").pop()! : modelId;
223
- if (MODEL_CAPABILITY_TIER[bareId]) return true;
224
- for (const knownId of Object.keys(MODEL_CAPABILITY_TIER)) {
225
- if (bareId.includes(knownId) || knownId.includes(bareId)) return true;
226
- }
227
- return false;
228
- }
229
-
230
205
  function findModelForTier(
231
206
  tier: ComplexityTier,
232
207
  config: DynamicRoutingConfig,
@@ -74,17 +74,6 @@ export function buildDesktopNotificationCommand(
74
74
  const normalizedMessage = normalizeNotificationText(message);
75
75
 
76
76
  if (platform === "darwin") {
77
- // Prefer terminal-notifier: registers as its own Notification Center app,
78
- // so it gets a proper permission entry in System Settings → Notifications.
79
- // osascript notifications are silently swallowed when the calling terminal
80
- // (Ghostty, iTerm2, etc.) lacks notification permissions — exits 0, no error.
81
- // See: https://github.com/gsd-build/gsd-2/issues/2632
82
- const tnPath = findExecutable("terminal-notifier");
83
- if (tnPath) {
84
- const sound = level === "error" ? "Basso" : "Glass";
85
- return { file: tnPath, args: ["-title", normalizedTitle, "-message", normalizedMessage, "-sound", sound] };
86
- }
87
- // Fallback: osascript (works if terminal app has notification permissions)
88
77
  const sound = level === "error" ? 'sound name "Basso"' : 'sound name "Glass"';
89
78
  const script = `display notification "${escapeAppleScript(normalizedMessage)}" with title "${escapeAppleScript(normalizedTitle)}" ${sound}`;
90
79
  return { file: "osascript", args: ["-e", script] };
@@ -105,15 +94,3 @@ function normalizeNotificationText(s: string): string {
105
94
  function escapeAppleScript(s: string): string {
106
95
  return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
107
96
  }
108
-
109
- /**
110
- * Locate an executable on PATH. Returns absolute path or null.
111
- * Non-fatal — returns null on any error.
112
- */
113
- function findExecutable(name: string): string | null {
114
- try {
115
- return execFileSync("which", [name], { timeout: 2000, stdio: ["ignore", "pipe", "ignore"] }).toString().trim() || null;
116
- } catch {
117
- return null;
118
- }
119
- }
@@ -8,6 +8,7 @@
8
8
  import { existsSync, readdirSync } from "node:fs";
9
9
  import { homedir } from "node:os";
10
10
  import { isAbsolute, join } from "node:path";
11
+ import { getAgentDir } from "@gsd/pi-coding-agent";
11
12
  import { statSync } from "node:fs";
12
13
 
13
14
  import type {
@@ -24,20 +25,13 @@ export type { GSDSkillRule, SkillDiscoveryMode, SkillResolution, SkillResolution
24
25
 
25
26
  /**
26
27
  * Known skill directories, in priority order.
27
- * Global skills (~/.agents/skills/) take precedence over project skills.
28
- * Legacy ~/.gsd/agent/skills/ is included as a fallback for pre-migration installs.
28
+ * User skills (~/.gsd/agent/skills/) take precedence over project skills.
29
29
  */
30
30
  export function getSkillSearchDirs(cwd: string): Array<{ dir: string; method: SkillResolution["method"] }> {
31
- const dirs: Array<{ dir: string; method: SkillResolution["method"] }> = [
32
- { dir: join(homedir(), ".agents", "skills"), method: "user-skill" },
33
- { dir: join(cwd, ".agents", "skills"), method: "project-skill" },
31
+ return [
32
+ { dir: join(getAgentDir(), "skills"), method: "user-skill" },
33
+ { dir: join(cwd, ".pi", "agent", "skills"), method: "project-skill" },
34
34
  ];
35
- // Legacy fallback — read skills from old GSD directory only if migration hasn't completed
36
- const legacyDir = join(homedir(), ".gsd", "agent", "skills");
37
- if (existsSync(legacyDir) && !existsSync(join(legacyDir, ".migrated-to-agents"))) {
38
- dirs.push({ dir: legacyDir, method: "user-skill" });
39
- }
40
- return dirs;
41
35
  }
42
36
 
43
37
  /**
@@ -93,7 +93,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
93
93
  "service_tier",
94
94
  "forensics_dedup",
95
95
  "show_token_cost",
96
- "experimental",
97
96
  ]);
98
97
 
99
98
  /** Canonical list of all dispatch unit types. */
@@ -183,20 +182,6 @@ export interface CmuxPreferences {
183
182
  browser?: boolean;
184
183
  }
185
184
 
186
- /**
187
- * Opt-in experimental features. All features in this block are disabled by
188
- * default and must be explicitly enabled. They may change or be removed without
189
- * a deprecation cycle while in experimental status.
190
- */
191
- export interface ExperimentalPreferences {
192
- /**
193
- * Enable RTK (Real-Time Kompression) shell-command compression.
194
- * RTK wraps shell commands to reduce token usage during command execution.
195
- * Default: false (opt-in required).
196
- */
197
- rtk?: boolean;
198
- }
199
-
200
185
  export interface GSDPreferences {
201
186
  version?: number;
202
187
  mode?: WorkflowMode;
@@ -248,11 +233,6 @@ export interface GSDPreferences {
248
233
  forensics_dedup?: boolean;
249
234
  /** Opt-in: show per-prompt and cumulative session token cost in the footer. Default: false. */
250
235
  show_token_cost?: boolean;
251
- /**
252
- * Opt-in experimental features. All features here are disabled by default.
253
- * See the preferences reference for details on each feature.
254
- */
255
- experimental?: ExperimentalPreferences;
256
236
  }
257
237
 
258
238
  export interface LoadedGSDPreferences {
@@ -793,31 +793,5 @@ export function validatePreferences(preferences: GSDPreferences): {
793
793
  }
794
794
  }
795
795
 
796
- // ─── Experimental Features ────────────────────────────────────────
797
- if (preferences.experimental !== undefined) {
798
- if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
799
- const exp = preferences.experimental as unknown as Record<string, unknown>;
800
- const validExp: import("./preferences-types.js").ExperimentalPreferences = {};
801
-
802
- if (exp.rtk !== undefined) {
803
- if (typeof exp.rtk === "boolean") validExp.rtk = exp.rtk;
804
- else errors.push("experimental.rtk must be a boolean");
805
- }
806
-
807
- const knownExpKeys = new Set(["rtk"]);
808
- for (const key of Object.keys(exp)) {
809
- if (!knownExpKeys.has(key)) {
810
- warnings.push(`unknown experimental key "${key}" — ignored`);
811
- }
812
- }
813
-
814
- if (Object.keys(validExp).length > 0) {
815
- validated.experimental = validExp;
816
- }
817
- } else {
818
- errors.push("experimental must be an object");
819
- }
820
- }
821
-
822
796
  return { preferences: validated, errors, warnings };
823
797
  }
@@ -353,9 +353,6 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
353
353
  service_tier: override.service_tier ?? base.service_tier,
354
354
  forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
355
355
  show_token_cost: override.show_token_cost ?? base.show_token_cost,
356
- experimental: (base.experimental || override.experimental)
357
- ? { ...(base.experimental ?? {}), ...(override.experimental ?? {}) }
358
- : undefined,
359
356
  };
360
357
  }
361
358
 
@@ -142,10 +142,11 @@ Then **offer GitHub issue creation**: "Would you like me to create a GitHub issu
142
142
  If yes, create using the `bash` tool:
143
143
 
144
144
  ```bash
145
- # Step 1: Write issue body to a temp file to avoid escaping/truncation issues.
146
- # Using --body-file bypasses shell quoting entirely — backticks, quotes, and
147
- # content containing "EOF" all render correctly. (#2465)
148
- cat > /tmp/gsd-forensic-issue.md << 'GSD_ISSUE_BODY'
145
+ # Step 1: Create issue (use labels for metadata, NOT for classification type is set via GraphQL)
146
+ ISSUE_URL=$(gh issue create --repo gsd-build/gsd-2 \
147
+ --title "..." \
148
+ --label "auto-generated" \
149
+ --body "$(cat <<'EOF'
149
150
  ## Problem
150
151
  [1-2 sentence summary]
151
152
 
@@ -168,13 +169,8 @@ cat > /tmp/gsd-forensic-issue.md << 'GSD_ISSUE_BODY'
168
169
 
169
170
  ---
170
171
  *Auto-generated by `/gsd forensics`*
171
- GSD_ISSUE_BODY
172
-
173
- ISSUE_URL=$(gh issue create --repo gsd-build/gsd-2 \
174
- --title "..." \
175
- --label "auto-generated" \
176
- --body-file /tmp/gsd-forensic-issue.md)
177
- rm -f /tmp/gsd-forensic-issue.md
172
+ EOF
173
+ )")
178
174
 
179
175
  # Step 2: Set issue type via GraphQL (gh issue create has no --type flag)
180
176
  ISSUE_NUM=$(echo "$ISSUE_URL" | grep -oE '[0-9]+$')
@@ -24,12 +24,7 @@ All relevant context has been preloaded below — the roadmap, all slice summari
24
24
  2. For each **slice** in the roadmap, verify its demo/deliverable claim against its summary. Flag any slice whose summary does not substantiate its claimed output.
25
25
  3. Check **cross-slice integration points** — do boundary map entries (produces/consumes) align with what was actually built?
26
26
  4. Check **requirement coverage** — are all active requirements addressed by at least one slice?
27
- 5. If **Verification Classes** are provided in the inlined context above, check each non-empty class:
28
- - For each verification class (Contract, Integration, Operational, UAT), determine whether slice summaries, UAT results, or observable behavior provide evidence that this verification tier was addressed.
29
- - Document the compliance status of each class in your verdict rationale.
30
- - If `Operational` verification is non-empty and no evidence of operational verification exists, flag this explicitly — it means planned operational checks (migrations, deployments, runtime verification) were not proven.
31
- - A milestone with unaddressed verification classes may still pass if the gaps are minor, but the gaps MUST be documented in the Deferred Work Inventory.
32
- 6. Determine a verdict:
27
+ 5. Determine a verdict:
33
28
  - `pass` — all criteria met, all slices delivered, no gaps
34
29
  - `needs-attention` — minor gaps that do not block completion (document them)
35
30
  - `needs-remediation` — material gaps found; remediation slices must be added to the roadmap
@@ -46,15 +46,6 @@ export function classifyProviderError(errorMsg: string): {
46
46
  return { isTransient: true, isRateLimit: false, suggestedDelayMs: 15_000 }; // 15s for connection errors
47
47
  }
48
48
 
49
- // Stream-truncation JSON parse errors — transient (#2572).
50
- // When the API stream is cut mid-chunk, pi tries to reassemble the partial
51
- // tool-call JSON and gets a SyntaxError. This is the downstream symptom of
52
- // a connection drop — same root cause as ECONNRESET, one layer up.
53
- const isMalformedStream = /Unexpected end of JSON|Unexpected token.*JSON|Expected double-quoted property name|SyntaxError.*JSON/i.test(errorMsg);
54
- if (isMalformedStream) {
55
- return { isTransient: true, isRateLimit: false, suggestedDelayMs: 15_000 }; // 15s, same as connection errors
56
- }
57
-
58
49
  // Unknown error — treat as permanent (user reviews)
59
50
  return { isTransient: false, isRateLimit: false, suggestedDelayMs: 0 };
60
51
  }
@@ -20,19 +20,20 @@ import type {
20
20
  import { resolvePostUnitHooks, resolvePreDispatchHooks } from "./preferences.js";
21
21
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
22
22
  import { join } from "node:path";
23
- import { parseUnitId } from "./unit-id.js";
24
23
 
25
24
  // ─── Artifact Path Resolution ──────────────────────────────────────────────
26
25
 
27
26
  export function resolveHookArtifactPath(basePath: string, unitId: string, artifactName: string): string {
28
- const { milestone, slice, task } = parseUnitId(unitId);
29
- if (task !== undefined && slice !== undefined) {
30
- return join(basePath, ".gsd", "milestones", milestone, "slices", slice, "tasks", `${task}-${artifactName}`);
27
+ const parts = unitId.split("/");
28
+ if (parts.length === 3) {
29
+ const [mid, sid, tid] = parts;
30
+ return join(basePath, ".gsd", "milestones", mid, "slices", sid, "tasks", `${tid}-${artifactName}`);
31
31
  }
32
- if (slice !== undefined) {
33
- return join(basePath, ".gsd", "milestones", milestone, "slices", slice, artifactName);
32
+ if (parts.length === 2) {
33
+ const [mid, sid] = parts;
34
+ return join(basePath, ".gsd", "milestones", mid, "slices", sid, artifactName);
34
35
  }
35
- return join(basePath, ".gsd", "milestones", milestone, artifactName);
36
+ return join(basePath, ".gsd", "milestones", parts[0], artifactName);
36
37
  }
37
38
 
38
39
  // ─── Dispatch Rule Conversion ──────────────────────────────────────────────
@@ -211,7 +212,7 @@ export class RuleRegistry {
211
212
  };
212
213
 
213
214
  // Build prompt with variable substitution
214
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(triggerUnitId);
215
+ const [mid, sid, tid] = triggerUnitId.split("/");
215
216
  let prompt = config.prompt
216
217
  .replace(/\{milestoneId\}/g, mid ?? "")
217
218
  .replace(/\{sliceId\}/g, sid ?? "")
@@ -290,7 +291,7 @@ export class RuleRegistry {
290
291
  return { action: "proceed", prompt, firedHooks: [] };
291
292
  }
292
293
 
293
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
294
+ const [mid, sid, tid] = unitId.split("/");
294
295
  const substitute = (text: string): string =>
295
296
  text
296
297
  .replace(/\{milestoneId\}/g, mid ?? "")
@@ -505,7 +506,7 @@ export class RuleRegistry {
505
506
  this.cycleCounts.set(cycleKey, currentCycle);
506
507
  this.activeHook.cycle = currentCycle;
507
508
 
508
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
509
+ const [mid, sid, tid] = unitId.split("/");
509
510
  const prompt = hook.prompt
510
511
  .replace(/\{milestoneId\}/g, mid ?? "")
511
512
  .replace(/\{sliceId\}/g, sid ?? "")
@@ -472,13 +472,9 @@ function formatTraceSummary(trace: ExecutionTrace): string {
472
472
  if (trace.errors.length > 0) {
473
473
  parts.push(`Errors: ${trace.errors.slice(-3).join("; ")}`);
474
474
  }
475
- // NOTE: lastReasoning is intentionally excluded from the retry diagnostic.
476
- // This summary is injected into retry prompts via getDeepDiagnostic()
477
- // phases.ts. Including prior assistant free-text causes hallucination loops
478
- // when the previous turn was truncated or malformed. Crash recovery has its
479
- // own path (formatCrashRecoveryBriefing) that handles lastReasoning safely
480
- // with explicit "Last Agent Reasoning Before Interruption" framing.
481
- // See: https://github.com/gsd-build/gsd-2/issues/2195
475
+ if (trace.lastReasoning) {
476
+ parts.push(`Last reasoning: "${trace.lastReasoning}"`);
477
+ }
482
478
  return parts.join("\n");
483
479
  }
484
480
 
@@ -10,10 +10,9 @@
10
10
 
11
11
  import { existsSync, readdirSync, readFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
- import { homedir } from "node:os";
13
+ import { getAgentDir } from "@gsd/pi-coding-agent";
14
14
 
15
- /** Industry-standard skills.sh global skills directory */
16
- const SKILLS_DIR = join(homedir(), ".agents", "skills");
15
+ const SKILLS_DIR = join(getAgentDir(), "skills");
17
16
 
18
17
  export interface DiscoveredSkill {
19
18
  name: string;
@@ -15,7 +15,7 @@
15
15
 
16
16
  import { existsSync, readFileSync, readdirSync } from "node:fs";
17
17
  import { join } from "node:path";
18
- import { homedir } from "node:os";
18
+ import { getAgentDir } from "@gsd/pi-coding-agent";
19
19
  import type { UnitMetrics, MetricsLedger } from "./metrics.js";
20
20
  import { formatCost, formatTokenCount, loadLedgerFromDisk } from "./metrics.js";
21
21
  import { getSkillLastUsed, detectStaleSkills } from "./skill-telemetry.js";
@@ -208,7 +208,7 @@ export function formatSkillDetail(basePath: string, skillName: string): string {
208
208
  }
209
209
 
210
210
  // Check for SKILL.md existence
211
- const skillPath = join(homedir(), ".agents", "skills", skillName, "SKILL.md");
211
+ const skillPath = join(getAgentDir(), "skills", skillName, "SKILL.md");
212
212
  if (existsSync(skillPath)) {
213
213
  const stat = require("node:fs").statSync(skillPath);
214
214
  lines.push("");
@@ -13,7 +13,7 @@
13
13
 
14
14
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
15
15
  import { join } from "node:path";
16
- import { homedir } from "node:os";
16
+ import { getAgentDir } from "@gsd/pi-coding-agent";
17
17
 
18
18
  // ─── In-memory state ──────────────────────────────────────────────────────────
19
19
 
@@ -30,14 +30,8 @@ const activelyLoadedSkills = new Set<string>();
30
30
  * Called before each unit starts.
31
31
  */
32
32
  export function captureAvailableSkills(): void {
33
- const skillsDir = join(homedir(), ".agents", "skills");
34
- const legacyDir = join(homedir(), ".gsd", "agent", "skills");
35
- const names = listSkillNames(skillsDir);
36
- // Include skills still in the legacy directory only if migration hasn't completed
37
- const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
38
- const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
39
- const all = new Set([...names, ...legacyNames]);
40
- availableSkills = [...all];
33
+ const skillsDir = join(getAgentDir(), "skills");
34
+ availableSkills = listSkillNames(skillsDir);
41
35
  activelyLoadedSkills.clear();
42
36
  }
43
37
 
@@ -105,12 +99,8 @@ export function detectStaleSkills(
105
99
  const stale: string[] = [];
106
100
 
107
101
  // Check all installed skills, not just those with usage data
108
- const skillsDir = join(homedir(), ".agents", "skills");
109
- const legacyDir = join(homedir(), ".gsd", "agent", "skills");
110
- const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
111
- const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
112
- const installedSet = new Set([...listSkillNames(skillsDir), ...legacyNames]);
113
- const installed = [...installedSet];
102
+ const skillsDir = join(getAgentDir(), "skills");
103
+ const installed = listSkillNames(skillsDir);
114
104
 
115
105
  for (const skill of installed) {
116
106
  const lastTs = lastUsed.get(skill);
@@ -34,8 +34,7 @@ import {
34
34
  gsdRoot,
35
35
  } from './paths.js';
36
36
 
37
- import { findMilestoneIds } from './milestone-ids.js';
38
- import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
37
+ import { milestoneIdSort, findMilestoneIds } from './milestone-ids.js';
39
38
  import { nativeBatchParseGsdFiles, type BatchParsedFile } from './native-parser-bridge.js';
40
39
 
41
40
  import { join, resolve } from 'path';
@@ -150,14 +149,8 @@ export async function getActiveMilestoneId(basePath: string): Promise<string | n
150
149
  if (isDbAvailable()) {
151
150
  const allMilestones = getAllMilestones();
152
151
  if (allMilestones.length > 0) {
153
- // Respect queue-order.json so /gsd queue reordering is honored (#2556).
154
- // Without this, the DB path uses lexicographic sort while the dispatch
155
- // guard uses queue order — causing a deadlock.
156
- const customOrder = loadQueueOrder(basePath);
157
- const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
158
- const byId = new Map(allMilestones.map(m => [m.id, m]));
159
- for (const id of sortedIds) {
160
- const m = byId.get(id)!;
152
+ const sorted = [...allMilestones].sort((a, b) => a.id.localeCompare(b.id));
153
+ for (const m of sorted) {
161
154
  if (m.status === "complete" || m.status === "done" || m.status === "parked") continue;
162
155
  return m.id;
163
156
  }
@@ -311,12 +304,8 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
311
304
  } as MilestoneRow);
312
305
  }
313
306
  }
314
- // Re-sort so milestones follow queue order (same as dispatch guard) (#2556)
315
- const customOrder = loadQueueOrder(basePath);
316
- const sortedIds = sortByQueueOrder(allMilestones.map(m => m.id), customOrder);
317
- const byId = new Map(allMilestones.map(m => [m.id, m]));
318
- allMilestones.length = 0;
319
- for (const id of sortedIds) allMilestones.push(byId.get(id)!);
307
+ // Re-sort so milestones are in canonical order after injection
308
+ allMilestones.sort((a, b) => milestoneIdSort(a.id, b.id));
320
309
 
321
310
  // Parallel worker isolation: when locked, filter to just the locked milestone
322
311
  const milestoneLock = process.env.GSD_MILESTONE_LOCK;
@@ -35,18 +35,6 @@ 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
-
50
38
  ## Remediation Slices
51
39
 
52
40
  <!-- New slices appended to the roadmap to address auto-remediable gaps.
@@ -71,8 +71,6 @@ remote_questions:
71
71
  uat_dispatch:
72
72
  post_unit_hooks: []
73
73
  pre_dispatch_hooks: []
74
- # experimental:
75
- # rtk: false
76
74
  ---
77
75
 
78
76
  # GSD Skill Preferences
@@ -1,7 +1,5 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
3
 
6
4
  import {
7
5
  unitVerb,
@@ -13,9 +11,6 @@ import {
13
11
  extractUatSliceId,
14
12
  } from "../auto-dashboard.ts";
15
13
 
16
- const autoSource = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "auto.ts"), "utf-8");
17
- const dashboardSource = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "auto-dashboard.ts"), "utf-8");
18
-
19
14
  // ─── unitVerb ─────────────────────────────────────────────────────────────
20
15
 
21
16
  test("unitVerb maps known unit types to verbs", () => {
@@ -185,17 +180,6 @@ test("formatAutoElapsed returns empty string for negative autoStartTime", () =>
185
180
  assert.equal(formatAutoElapsed(NaN), "");
186
181
  });
187
182
 
188
- test("getAutoDashboardData returns RTK savings in the dashboard payload", () => {
189
- assert.match(autoSource, /const rtkSavings = sessionId && s\.basePath/);
190
- assert.match(autoSource, /rtkSavings,/);
191
- });
192
-
193
- test("auto progress widget renders RTK savings under the footer stats line", () => {
194
- assert.match(dashboardSource, /formatRtkSavingsLabel/);
195
- assert.match(dashboardSource, /getRtkSessionSavings\(accessors\.getBasePath\(\), sessionId\)/);
196
- assert.match(dashboardSource, /lines\.push\(rightAlign\("", theme\.fg\("dim", cachedRtkLabel\), width\)\);/);
197
- });
198
-
199
183
  // ─── extractUatSliceId ───────────────────────────────────────────────────
200
184
 
201
185
  test("extractUatSliceId extracts slice ID from M001/S01 format", () => {