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
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { resolveMilestoneFile } from "./paths.js";
4
4
  import { findMilestoneIds } from "./guided-flow.js";
5
+ import { parseUnitId } from "./unit-id.js";
5
6
  import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
6
7
  import { parseRoadmap } from "./parsers-legacy.js";
7
8
  import { readFileSync } from "node:fs";
@@ -22,7 +23,7 @@ export function getPriorSliceCompletionBlocker(
22
23
  ): string | null {
23
24
  if (!SLICE_DISPATCH_TYPES.has(unitType)) return null;
24
25
 
25
- const [targetMid, targetSid] = unitId.split("/");
26
+ const { milestone: targetMid, slice: targetSid } = parseUnitId(unitId);
26
27
  if (!targetMid || !targetSid) return null;
27
28
 
28
29
  // Use findMilestoneIds to respect custom queue order.
@@ -241,6 +241,9 @@ 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
+
244
247
  ---
245
248
 
246
249
  ## Best Practices
@@ -652,3 +655,15 @@ verification_max_retries: 2
652
655
  ```
653
656
 
654
657
  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,6 +269,8 @@ 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') ?? '',
272
274
  };
273
275
  }
274
276
 
@@ -330,7 +332,10 @@ function _parseSummaryImpl(content: string): Summary {
330
332
  }
331
333
  }
332
334
 
333
- return { frontmatter, title, oneLiner, whatHappened, deviations, filesModified };
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 };
334
339
  }
335
340
 
336
341
  // ─── Continue Parser ───────────────────────────────────────────────────────
@@ -450,7 +450,10 @@ 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).
453
454
  {
455
+ const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
456
+ await ensureDbOpen();
454
457
  type NormSlice = { id: string; done: boolean };
455
458
  let normSlices: NormSlice[] = [];
456
459
  if (isDbAvailable()) {
@@ -588,6 +591,14 @@ export async function showDiscuss(
588
591
  return;
589
592
  }
590
593
 
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
+
591
602
  // Guard: no roadmap yet (unless DB has slices)
592
603
  const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
593
604
  const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
@@ -15,6 +15,7 @@ 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";
18
19
 
19
20
  // ─── Types ──────────────────────────────────────────────────────────────────────
20
21
 
@@ -223,7 +224,14 @@ export async function showProjectInit(
223
224
  await customizeAdvancedPrefs(ctx, prefs);
224
225
  }
225
226
 
226
- // ── Step 8: Bootstrap .gsd/ ────────────────────────────────────────────────
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/ ────────────────────────────────────────────────
227
235
  bootstrapGsdDirectory(basePath, prefs, signals);
228
236
 
229
237
  // Ensure .gitignore
@@ -114,6 +114,21 @@ 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
+
117
132
  // Downgrade-only: if requested tier >= configured tier, no change
118
133
  if (tierOrdinal(requestedTier) >= tierOrdinal(configuredTier)) {
119
134
  return {
@@ -202,6 +217,16 @@ function getModelTier(modelId: string): ComplexityTier {
202
217
  return "heavy";
203
218
  }
204
219
 
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
+
205
230
  function findModelForTier(
206
231
  tier: ComplexityTier,
207
232
  config: DynamicRoutingConfig,
@@ -74,6 +74,17 @@ 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)
77
88
  const sound = level === "error" ? 'sound name "Basso"' : 'sound name "Glass"';
78
89
  const script = `display notification "${escapeAppleScript(normalizedMessage)}" with title "${escapeAppleScript(normalizedTitle)}" ${sound}`;
79
90
  return { file: "osascript", args: ["-e", script] };
@@ -94,3 +105,15 @@ function normalizeNotificationText(s: string): string {
94
105
  function escapeAppleScript(s: string): string {
95
106
  return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
96
107
  }
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
+ }
@@ -0,0 +1,456 @@
1
+ import { loadFile } from "./files.js";
2
+ import { resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveTaskFiles } from "./paths.js";
3
+
4
+ export interface ValidationIssue {
5
+ severity: "info" | "warning" | "error";
6
+ scope: "slice-plan" | "task-plan" | "task-summary" | "slice-summary";
7
+ file: string;
8
+ ruleId: string;
9
+ message: string;
10
+ suggestion?: string;
11
+ }
12
+
13
+ function getSection(content: string, heading: string, level: number = 2): string | null {
14
+ const prefix = "#".repeat(level) + " ";
15
+ const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
16
+ const regex = new RegExp(`^${prefix}${escaped}\\s*$`, "m");
17
+ const match = regex.exec(content);
18
+ if (!match) return null;
19
+
20
+ const start = match.index + match[0].length;
21
+ const rest = content.slice(start);
22
+ const nextHeading = rest.match(new RegExp(`^#{1,${level}} `, "m"));
23
+ const end = nextHeading ? nextHeading.index! : rest.length;
24
+ return rest.slice(0, end).trim();
25
+ }
26
+
27
+ function getFrontmatter(content: string): string | null {
28
+ const trimmed = content.trimStart();
29
+ if (!trimmed.startsWith("---")) return null;
30
+ const afterFirst = trimmed.indexOf("\n");
31
+ if (afterFirst === -1) return null;
32
+ const rest = trimmed.slice(afterFirst + 1);
33
+ const endIdx = rest.indexOf("\n---");
34
+ if (endIdx === -1) return null;
35
+ return rest.slice(0, endIdx);
36
+ }
37
+
38
+ function hasFrontmatterKey(content: string, key: string): boolean {
39
+ const fm = getFrontmatter(content);
40
+ if (!fm) return false;
41
+ return new RegExp(`^${key}:`, "m").test(fm);
42
+ }
43
+
44
+ function normalizeMeaningfulLines(text: string): string[] {
45
+ return text
46
+ .split("\n")
47
+ .map(line => line.trim())
48
+ .filter(line => line.length > 0)
49
+ .filter(line => !line.startsWith("<!--"))
50
+ .filter(line => !line.endsWith("-->"))
51
+ .filter(line => !/^[-*]\s*\{\{.+\}\}$/.test(line))
52
+ .filter(line => !/^\{\{.+\}\}$/.test(line));
53
+ }
54
+
55
+ function sectionLooksPlaceholderOnly(text: string | null): boolean {
56
+ if (!text) return true;
57
+ const lines = normalizeMeaningfulLines(text)
58
+ .map(line => line.replace(/^[-*]\s+/, "").trim())
59
+ .filter(line => line.length > 0);
60
+
61
+ if (lines.length === 0) return true;
62
+
63
+ return lines.every(line => {
64
+ const lower = line.toLowerCase();
65
+ return lower === "none" ||
66
+ lower.endsWith(": none") ||
67
+ lower.includes("{{") ||
68
+ lower.includes("}}") ||
69
+ lower.startsWith("required for non-trivial") ||
70
+ lower.startsWith("describe how a future agent") ||
71
+ lower.startsWith("prefer:") ||
72
+ lower.startsWith("keep this section concise");
73
+ });
74
+ }
75
+
76
+ function textSuggestsObservabilityRelevant(content: string): boolean {
77
+ const lower = content.toLowerCase();
78
+ const needles = [
79
+ " api", "route", "server", "worker", "queue", "job", "sync", "import",
80
+ "webhook", "auth", "db", "database", "migration", "cache", "background",
81
+ "polling", "realtime", "socket", "stateful", "integration", "ui", "form",
82
+ "submit", "status", "service", "pipeline", "health endpoint", "error path"
83
+ ];
84
+ return needles.some(needle => lower.includes(needle));
85
+ }
86
+
87
+ function verificationMentionsDiagnostics(section: string | null): boolean {
88
+ if (!section) return false;
89
+ const lower = section.toLowerCase();
90
+ const needles = [
91
+ "error", "failure", "diagnostic", "status", "health", "inspect", "log",
92
+ "network", "console", "retry", "last error", "correlation", "readiness"
93
+ ];
94
+ return needles.some(needle => lower.includes(needle));
95
+ }
96
+
97
+ export function validateSlicePlanContent(file: string, content: string): ValidationIssue[] {
98
+ const issues: ValidationIssue[] = [];
99
+
100
+ // ── Plan quality rules (always run, not gated by runtime relevance) ──
101
+
102
+ const tasksSection = getSection(content, "Tasks", 2);
103
+ if (tasksSection) {
104
+ const lines = tasksSection.split("\n");
105
+ const taskLinePattern = /^- \[[ x]\] \*\*T\d+:/;
106
+ const taskLineIndices: number[] = [];
107
+ for (let i = 0; i < lines.length; i++) {
108
+ if (taskLinePattern.test(lines[i])) taskLineIndices.push(i);
109
+ }
110
+
111
+ for (let t = 0; t < taskLineIndices.length; t++) {
112
+ const start = taskLineIndices[t];
113
+ const end = t + 1 < taskLineIndices.length ? taskLineIndices[t + 1] : lines.length;
114
+ // Check lines between this task header and the next (or section end)
115
+ const bodyLines = lines.slice(start + 1, end);
116
+ const meaningful = bodyLines.filter(l => l.trim().length > 0);
117
+ if (meaningful.length === 0) {
118
+ issues.push({
119
+ severity: "warning",
120
+ scope: "slice-plan",
121
+ file,
122
+ ruleId: "empty_task_entry",
123
+ message: "Inline task entry has no description content beneath the checkbox line.",
124
+ suggestion: "Add at least a Why/Files/Do/Verify summary so the task is self-describing.",
125
+ });
126
+ }
127
+ }
128
+ }
129
+
130
+ // ── Observability rules (gated by runtime relevance) ──
131
+
132
+ const relevant = textSuggestsObservabilityRelevant(content);
133
+ if (!relevant) return issues;
134
+
135
+ const obs = getSection(content, "Observability / Diagnostics", 2);
136
+ const verification = getSection(content, "Verification", 2);
137
+
138
+ if (!obs) {
139
+ issues.push({
140
+ severity: "warning",
141
+ scope: "slice-plan",
142
+ file,
143
+ ruleId: "missing_observability_section",
144
+ message: "Slice plan appears non-trivial but is missing `## Observability / Diagnostics`.",
145
+ suggestion: "Add runtime signals, inspection surfaces, failure visibility, and redaction constraints.",
146
+ });
147
+ } else if (sectionLooksPlaceholderOnly(obs)) {
148
+ issues.push({
149
+ severity: "warning",
150
+ scope: "slice-plan",
151
+ file,
152
+ ruleId: "observability_section_placeholder_only",
153
+ message: "Slice plan has `## Observability / Diagnostics` but it still looks like placeholder text.",
154
+ suggestion: "Replace placeholders with concrete signals and inspection surfaces a future agent should trust.",
155
+ });
156
+ }
157
+
158
+ if (!verificationMentionsDiagnostics(verification)) {
159
+ issues.push({
160
+ severity: "warning",
161
+ scope: "slice-plan",
162
+ file,
163
+ ruleId: "verification_missing_diagnostic_check",
164
+ message: "Slice verification does not appear to include any diagnostic or failure-path check.",
165
+ suggestion: "Add at least one verification step for inspectable failure state, structured error output, status surface, or equivalent.",
166
+ });
167
+ }
168
+
169
+ return issues;
170
+ }
171
+
172
+ export function validateTaskPlanContent(file: string, content: string): ValidationIssue[] {
173
+ const issues: ValidationIssue[] = [];
174
+
175
+ // ── Plan quality rules (always run, not gated by runtime relevance) ──
176
+
177
+ // Rule: empty or missing Steps section
178
+ const stepsSection = getSection(content, "Steps", 2);
179
+ if (stepsSection === null || sectionLooksPlaceholderOnly(stepsSection)) {
180
+ issues.push({
181
+ severity: "warning",
182
+ scope: "task-plan",
183
+ file,
184
+ ruleId: "empty_steps_section",
185
+ message: "Task plan has an empty or missing `## Steps` section.",
186
+ suggestion: "Add concrete numbered implementation steps so execution has a clear sequence.",
187
+ });
188
+ }
189
+
190
+ // Rule: placeholder-only Verification section
191
+ const verificationSection = getSection(content, "Verification", 2);
192
+ if (verificationSection !== null && sectionLooksPlaceholderOnly(verificationSection)) {
193
+ issues.push({
194
+ severity: "warning",
195
+ scope: "task-plan",
196
+ file,
197
+ ruleId: "placeholder_verification",
198
+ message: "Task plan has `## Verification` but it still looks like placeholder text.",
199
+ suggestion: "Replace placeholders with concrete verification commands, test runs, or observable checks.",
200
+ });
201
+ }
202
+
203
+ // Rule: scope estimate thresholds
204
+ const fm = getFrontmatter(content);
205
+ if (fm) {
206
+ const stepsMatch = fm.match(/^estimated_steps:\s*(\d+)/m);
207
+ const filesMatch = fm.match(/^estimated_files:\s*(\d+)/m);
208
+
209
+ if (stepsMatch) {
210
+ const estimatedSteps = parseInt(stepsMatch[1], 10);
211
+ if (estimatedSteps >= 10) {
212
+ issues.push({
213
+ severity: "warning",
214
+ scope: "task-plan",
215
+ file,
216
+ ruleId: "scope_estimate_steps_high",
217
+ message: `Task plan estimates ${estimatedSteps} steps (threshold: 10). Consider splitting into smaller tasks.`,
218
+ suggestion: "Break the task into sub-tasks or reduce scope so each task stays focused and completable in one pass.",
219
+ });
220
+ }
221
+ }
222
+
223
+ if (filesMatch) {
224
+ const estimatedFiles = parseInt(filesMatch[1], 10);
225
+ if (estimatedFiles >= 12) {
226
+ issues.push({
227
+ severity: "warning",
228
+ scope: "task-plan",
229
+ file,
230
+ ruleId: "scope_estimate_files_high",
231
+ message: `Task plan estimates ${estimatedFiles} files (threshold: 12). Consider splitting into smaller tasks.`,
232
+ suggestion: "Break the task into sub-tasks or reduce scope to keep the change footprint manageable.",
233
+ });
234
+ }
235
+ }
236
+ }
237
+
238
+ // Rule: Inputs and Expected Output should contain backtick-wrapped file paths
239
+ const inputsSection = getSection(content, "Inputs", 2);
240
+ const outputSection = getSection(content, "Expected Output", 2);
241
+ const backtickPathPattern = /`[^`]*[./][^`]*`/;
242
+
243
+ if (outputSection === null || !backtickPathPattern.test(outputSection)) {
244
+ issues.push({
245
+ severity: "warning",
246
+ scope: "task-plan",
247
+ file,
248
+ ruleId: "missing_output_file_paths",
249
+ message: "Task plan `## Expected Output` is missing or has no backtick-wrapped file paths.",
250
+ suggestion: "List concrete output file paths in backticks (e.g. `src/types.ts`). These are machine-parsed to derive task dependencies.",
251
+ });
252
+ }
253
+
254
+ if (inputsSection !== null && inputsSection.trim().length > 0 && !backtickPathPattern.test(inputsSection)) {
255
+ issues.push({
256
+ severity: "info",
257
+ scope: "task-plan",
258
+ file,
259
+ ruleId: "missing_input_file_paths",
260
+ message: "Task plan `## Inputs` has content but no backtick-wrapped file paths.",
261
+ suggestion: "List input file paths in backticks (e.g. `src/config.json`). These are machine-parsed to derive task dependencies.",
262
+ });
263
+ }
264
+
265
+ // ── Observability rules (gated by runtime relevance) ──
266
+
267
+ const relevant = textSuggestsObservabilityRelevant(content);
268
+ if (!relevant) return issues;
269
+
270
+ const obs = getSection(content, "Observability Impact", 2);
271
+ if (!obs) {
272
+ issues.push({
273
+ severity: "warning",
274
+ scope: "task-plan",
275
+ file,
276
+ ruleId: "missing_observability_impact",
277
+ message: "Task plan appears runtime-relevant but is missing `## Observability Impact`.",
278
+ suggestion: "Explain what signals change, how a future agent inspects this task, and what failure state becomes visible.",
279
+ });
280
+ } else if (sectionLooksPlaceholderOnly(obs)) {
281
+ issues.push({
282
+ severity: "warning",
283
+ scope: "task-plan",
284
+ file,
285
+ ruleId: "observability_impact_placeholder_only",
286
+ message: "Task plan has `## Observability Impact` but it still looks empty or placeholder-only.",
287
+ suggestion: "Fill in concrete inspection surfaces or explicitly justify why observability is not applicable.",
288
+ });
289
+ }
290
+
291
+ return issues;
292
+ }
293
+
294
+ export function validateTaskSummaryContent(file: string, content: string): ValidationIssue[] {
295
+ const issues: ValidationIssue[] = [];
296
+ if (!hasFrontmatterKey(content, "observability_surfaces")) {
297
+ issues.push({
298
+ severity: "warning",
299
+ scope: "task-summary",
300
+ file,
301
+ ruleId: "missing_observability_frontmatter",
302
+ message: "Task summary is missing `observability_surfaces` in frontmatter.",
303
+ suggestion: "List the durable status/log/error surfaces a future agent should use.",
304
+ });
305
+ }
306
+
307
+ const diagnostics = getSection(content, "Diagnostics", 2);
308
+ if (!diagnostics) {
309
+ issues.push({
310
+ severity: "warning",
311
+ scope: "task-summary",
312
+ file,
313
+ ruleId: "missing_diagnostics_section",
314
+ message: "Task summary is missing `## Diagnostics`.",
315
+ suggestion: "Document how to inspect what this task built later.",
316
+ });
317
+ } else if (sectionLooksPlaceholderOnly(diagnostics)) {
318
+ issues.push({
319
+ severity: "warning",
320
+ scope: "task-summary",
321
+ file,
322
+ ruleId: "diagnostics_placeholder_only",
323
+ message: "Task summary diagnostics section still looks like placeholder text.",
324
+ suggestion: "Replace placeholders with concrete commands, endpoints, logs, error shapes, or failure artifacts.",
325
+ });
326
+ }
327
+
328
+ const evidence = getSection(content, "Verification Evidence", 2);
329
+ if (!evidence) {
330
+ issues.push({
331
+ severity: "warning",
332
+ scope: "task-summary",
333
+ file,
334
+ ruleId: "evidence_block_missing",
335
+ message: "Task summary is missing `## Verification Evidence`.",
336
+ suggestion: "Add a verification evidence table showing gate check results (command, exit code, verdict, duration).",
337
+ });
338
+ } else if (sectionLooksPlaceholderOnly(evidence)) {
339
+ issues.push({
340
+ severity: "warning",
341
+ scope: "task-summary",
342
+ file,
343
+ ruleId: "evidence_block_placeholder",
344
+ message: "Task summary verification evidence section still looks like placeholder text.",
345
+ suggestion: "Replace placeholders with actual gate results or note that no verification commands were discovered.",
346
+ });
347
+ }
348
+
349
+ return issues;
350
+ }
351
+
352
+ export function validateSliceSummaryContent(file: string, content: string): ValidationIssue[] {
353
+ const issues: ValidationIssue[] = [];
354
+ if (!hasFrontmatterKey(content, "observability_surfaces")) {
355
+ issues.push({
356
+ severity: "warning",
357
+ scope: "slice-summary",
358
+ file,
359
+ ruleId: "missing_observability_frontmatter",
360
+ message: "Slice summary is missing `observability_surfaces` in frontmatter.",
361
+ suggestion: "List the authoritative diagnostics and durable inspection surfaces for this slice.",
362
+ });
363
+ }
364
+
365
+ const diagnostics = getSection(content, "Authoritative diagnostics", 3);
366
+ if (!diagnostics) {
367
+ issues.push({
368
+ severity: "warning",
369
+ scope: "slice-summary",
370
+ file,
371
+ ruleId: "missing_authoritative_diagnostics",
372
+ message: "Slice summary is missing `### Authoritative diagnostics` in Forward Intelligence.",
373
+ suggestion: "Tell future agents where to look first and why that signal is trustworthy.",
374
+ });
375
+ } else if (sectionLooksPlaceholderOnly(diagnostics)) {
376
+ issues.push({
377
+ severity: "warning",
378
+ scope: "slice-summary",
379
+ file,
380
+ ruleId: "authoritative_diagnostics_placeholder_only",
381
+ message: "Slice summary includes authoritative diagnostics but it still looks like placeholder text.",
382
+ suggestion: "Replace placeholders with the real first-stop diagnostic surface for this slice.",
383
+ });
384
+ }
385
+
386
+ return issues;
387
+ }
388
+
389
+ export async function validatePlanBoundary(basePath: string, milestoneId: string, sliceId: string): Promise<ValidationIssue[]> {
390
+ const issues: ValidationIssue[] = [];
391
+ const slicePlan = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
392
+ if (slicePlan) {
393
+ const content = await loadFile(slicePlan);
394
+ if (content) issues.push(...validateSlicePlanContent(slicePlan, content));
395
+ }
396
+
397
+ const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId);
398
+ const taskPlans = tasksDir ? resolveTaskFiles(tasksDir, "PLAN") : [];
399
+ for (const file of taskPlans) {
400
+ const taskId = file.split("-")[0];
401
+ const taskPlan = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
402
+ if (!taskPlan) continue;
403
+ const content = await loadFile(taskPlan);
404
+ if (content) issues.push(...validateTaskPlanContent(taskPlan, content));
405
+ }
406
+
407
+ return issues;
408
+ }
409
+
410
+ export async function validateExecuteBoundary(basePath: string, milestoneId: string, sliceId: string, taskId: string): Promise<ValidationIssue[]> {
411
+ const issues: ValidationIssue[] = [];
412
+ const slicePlan = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
413
+ if (slicePlan) {
414
+ const content = await loadFile(slicePlan);
415
+ if (content) issues.push(...validateSlicePlanContent(slicePlan, content));
416
+ }
417
+
418
+ const taskPlan = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
419
+ if (taskPlan) {
420
+ const content = await loadFile(taskPlan);
421
+ if (content) issues.push(...validateTaskPlanContent(taskPlan, content));
422
+ }
423
+
424
+ return issues;
425
+ }
426
+
427
+ export async function validateCompleteBoundary(basePath: string, milestoneId: string, sliceId: string): Promise<ValidationIssue[]> {
428
+ const issues: ValidationIssue[] = [];
429
+ const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId);
430
+ const taskSummaries = tasksDir ? resolveTaskFiles(tasksDir, "SUMMARY") : [];
431
+ for (const file of taskSummaries) {
432
+ const taskId = file.split("-")[0];
433
+ const taskSummary = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY");
434
+ if (!taskSummary) continue;
435
+ const content = await loadFile(taskSummary);
436
+ if (content) issues.push(...validateTaskSummaryContent(taskSummary, content));
437
+ }
438
+
439
+ const sliceSummary = resolveSliceFile(basePath, milestoneId, sliceId, "SUMMARY");
440
+ if (sliceSummary) {
441
+ const content = await loadFile(sliceSummary);
442
+ if (content) issues.push(...validateSliceSummaryContent(sliceSummary, content));
443
+ }
444
+
445
+ return issues;
446
+ }
447
+
448
+ export function formatValidationIssues(issues: ValidationIssue[], limit: number = 4): string {
449
+ if (issues.length === 0) return "";
450
+ const lines = issues.slice(0, limit).map(issue => {
451
+ const fileName = issue.file.split("/").pop() || issue.file;
452
+ return `- ${fileName}: ${issue.message}`;
453
+ });
454
+ if (issues.length > limit) lines.push(`- ...and ${issues.length - limit} more`);
455
+ return lines.join("\n");
456
+ }
@@ -8,7 +8,6 @@
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";
12
11
  import { statSync } from "node:fs";
13
12
 
14
13
  import type {
@@ -25,13 +24,20 @@ export type { GSDSkillRule, SkillDiscoveryMode, SkillResolution, SkillResolution
25
24
 
26
25
  /**
27
26
  * Known skill directories, in priority order.
28
- * User skills (~/.gsd/agent/skills/) take precedence over project skills.
27
+ * Global skills (~/.agents/skills/) take precedence over project skills.
28
+ * Legacy ~/.gsd/agent/skills/ is included as a fallback for pre-migration installs.
29
29
  */
30
30
  export function getSkillSearchDirs(cwd: string): Array<{ dir: string; method: SkillResolution["method"] }> {
31
- return [
32
- { dir: join(getAgentDir(), "skills"), method: "user-skill" },
33
- { dir: join(cwd, ".pi", "agent", "skills"), method: "project-skill" },
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" },
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;
35
41
  }
36
42
 
37
43
  /**