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
@@ -7,7 +7,6 @@ import type { ExtensionCommandContext, ExtensionAPI } from "@gsd/pi-coding-agent
7
7
  import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
10
- import { parseUnitId } from "./unit-id.js";
11
10
  import { deriveState } from "./state.js";
12
11
  import { invalidateAllCaches } from "./cache.js";
13
12
  import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
@@ -66,11 +65,11 @@ export async function handleUndo(args: string, ctx: ExtensionCommandContext, _pi
66
65
  }
67
66
 
68
67
  // 1. Delete summary artifact
69
- const { milestone, slice, task } = parseUnitId(unitId);
68
+ const parts = unitId.split("/");
70
69
  let summaryRemoved = false;
71
- if (task !== undefined && slice !== undefined) {
70
+ if (parts.length === 3) {
72
71
  // Task-level: M001/S01/T01
73
- const [mid, sid, tid] = [milestone, slice, task];
72
+ const [mid, sid, tid] = parts;
74
73
  const tasksDir = resolveTasksDir(basePath, mid, sid);
75
74
  if (tasksDir) {
76
75
  const summaryFile = join(tasksDir, buildTaskFileName(tid, "SUMMARY"));
@@ -79,9 +78,9 @@ export async function handleUndo(args: string, ctx: ExtensionCommandContext, _pi
79
78
  summaryRemoved = true;
80
79
  }
81
80
  }
82
- } else if (slice !== undefined) {
81
+ } else if (parts.length === 2) {
83
82
  // Slice-level: M001/S01
84
- const [mid, sid] = [milestone, slice];
83
+ const [mid, sid] = parts;
85
84
  const slicePath = resolveSlicePath(basePath, mid, sid);
86
85
  if (slicePath) {
87
86
  for (const suffix of ["SUMMARY", "COMPLETE"]) {
@@ -96,8 +95,8 @@ export async function handleUndo(args: string, ctx: ExtensionCommandContext, _pi
96
95
 
97
96
  // 2. Uncheck task in PLAN if execute-task
98
97
  let planUpdated = false;
99
- if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
100
- const [mid, sid, tid] = [milestone, slice, task];
98
+ if (unitType === "execute-task" && parts.length === 3) {
99
+ const [mid, sid, tid] = parts;
101
100
  planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
102
101
  }
103
102
 
@@ -8,7 +8,6 @@ import {
8
8
  resolveTaskFile,
9
9
  } from "./paths.js";
10
10
  import { loadFile, parseTaskPlanMustHaves, countMustHavesMentionedInSummary } from "./files.js";
11
- import { parseUnitId } from "./unit-id.js";
12
11
 
13
12
  export type UnitRuntimePhase =
14
13
  | "dispatched"
@@ -129,7 +128,7 @@ export async function inspectExecuteTaskDurability(
129
128
  basePath: string,
130
129
  unitId: string,
131
130
  ): Promise<ExecuteTaskRecoveryStatus | null> {
132
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
131
+ const [mid, sid, tid] = unitId.split("/");
133
132
  if (!mid || !sid || !tid) return null;
134
133
 
135
134
  const planAbs = resolveSliceFile(basePath, mid, sid, "PLAN");
@@ -8,7 +8,6 @@ import { existsSync, readFileSync } from "node:fs";
8
8
  import { join, basename } from "node:path";
9
9
  import type { AuditWarning, RuntimeError, VerificationCheck, VerificationResult } from "./types.js";
10
10
  import { DEFAULT_COMMAND_TIMEOUT_MS } from "./constants.js";
11
- import { rewriteCommandWithRtk } from "../shared/rtk.js";
12
11
 
13
12
  /** Maximum bytes of stdout/stderr to retain per command (10 KB). */
14
13
  const MAX_OUTPUT_BYTES = 10 * 1024;
@@ -258,11 +257,10 @@ export function runVerificationGate(options: RunVerificationGateOptions): Verifi
258
257
 
259
258
  for (const command of commands) {
260
259
  const start = Date.now();
261
- const rewrittenCommand = rewriteCommandWithRtk(command);
262
260
  // Pass the command string as an argument to the shell explicitly
263
261
  // to avoid Node.js DEP0190 (spawnSync with shell: true and no args).
264
262
  const shellBin = process.platform === "win32" ? "cmd" : "sh";
265
- const shellArgs = process.platform === "win32" ? ["/c", rewrittenCommand] : ["-c", rewrittenCommand];
263
+ const shellArgs = process.platform === "win32" ? ["/c", command] : ["-c", command];
266
264
  const result: SpawnSyncReturns<string> = spawnSync(shellBin, shellArgs, {
267
265
  cwd: options.cwd,
268
266
  stdio: "pipe",
@@ -1,54 +0,0 @@
1
- /**
2
- * Pre-dispatch observability checks for auto-mode units.
3
- * Validates plan/summary file quality and builds repair instructions
4
- * for the agent to fix gaps before proceeding with the unit.
5
- */
6
- import { validatePlanBoundary, validateExecuteBoundary, validateCompleteBoundary, formatValidationIssues, } from "./observability-validator.js";
7
- import { parseUnitId } from "./unit-id.js";
8
- export async function collectObservabilityWarnings(ctx, basePath, unitType, unitId) {
9
- // Hook units have custom artifacts — skip standard observability checks
10
- if (unitType.startsWith("hook/"))
11
- return [];
12
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
13
- if (!mid || !sid)
14
- return [];
15
- let issues = [];
16
- if (unitType === "plan-slice") {
17
- issues = await validatePlanBoundary(basePath, mid, sid);
18
- }
19
- else if (unitType === "execute-task" && tid) {
20
- issues = await validateExecuteBoundary(basePath, mid, sid, tid);
21
- }
22
- else if (unitType === "complete-slice") {
23
- issues = await validateCompleteBoundary(basePath, mid, sid);
24
- }
25
- if (issues.length > 0) {
26
- ctx.ui.notify(`Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`, "warning");
27
- }
28
- return issues;
29
- }
30
- export function buildObservabilityRepairBlock(issues) {
31
- if (issues.length === 0)
32
- return "";
33
- const items = issues.map(issue => {
34
- const fileName = issue.file.split("/").pop() || issue.file;
35
- let line = `- **${fileName}**: ${issue.message}`;
36
- if (issue.suggestion)
37
- line += ` → ${issue.suggestion}`;
38
- return line;
39
- });
40
- return [
41
- "",
42
- "---",
43
- "",
44
- "## Pre-flight: Observability gaps to fix FIRST",
45
- "",
46
- "The following issues were detected in plan/summary files for this unit.",
47
- "**Read each flagged file, apply the fix described, then proceed with the unit.**",
48
- "",
49
- ...items,
50
- "",
51
- "---",
52
- "",
53
- ].join("\n");
54
- }
@@ -1,20 +0,0 @@
1
- // Shared utilities for the auto-loop modules (auto-post-unit, auto, etc.).
2
- import { debugLog } from "./debug-logger.js";
3
- /**
4
- * Run a non-fatal operation, logging any error via `debugLog` and continuing.
5
- *
6
- * Replaces the repeated try-catch-debugLog-continue boilerplate that wraps
7
- * operations whose failure should not abort the post-unit pipeline.
8
- *
9
- * @param context - The debugLog event name (e.g. "postUnit")
10
- * @param phase - The phase label attached to the debug entry
11
- * @param fn - The operation to execute (may be sync or async)
12
- */
13
- export async function runSafely(context, phase, fn) {
14
- try {
15
- await fn();
16
- }
17
- catch (e) {
18
- debugLog(context, { phase, error: String(e) });
19
- }
20
- }
@@ -1,422 +0,0 @@
1
- import { loadFile } from "./files.js";
2
- import { resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveTaskFiles } from "./paths.js";
3
- function getSection(content, heading, level = 2) {
4
- const prefix = "#".repeat(level) + " ";
5
- const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6
- const regex = new RegExp(`^${prefix}${escaped}\\s*$`, "m");
7
- const match = regex.exec(content);
8
- if (!match)
9
- return null;
10
- const start = match.index + match[0].length;
11
- const rest = content.slice(start);
12
- const nextHeading = rest.match(new RegExp(`^#{1,${level}} `, "m"));
13
- const end = nextHeading ? nextHeading.index : rest.length;
14
- return rest.slice(0, end).trim();
15
- }
16
- function getFrontmatter(content) {
17
- const trimmed = content.trimStart();
18
- if (!trimmed.startsWith("---"))
19
- return null;
20
- const afterFirst = trimmed.indexOf("\n");
21
- if (afterFirst === -1)
22
- return null;
23
- const rest = trimmed.slice(afterFirst + 1);
24
- const endIdx = rest.indexOf("\n---");
25
- if (endIdx === -1)
26
- return null;
27
- return rest.slice(0, endIdx);
28
- }
29
- function hasFrontmatterKey(content, key) {
30
- const fm = getFrontmatter(content);
31
- if (!fm)
32
- return false;
33
- return new RegExp(`^${key}:`, "m").test(fm);
34
- }
35
- function normalizeMeaningfulLines(text) {
36
- return text
37
- .split("\n")
38
- .map(line => line.trim())
39
- .filter(line => line.length > 0)
40
- .filter(line => !line.startsWith("<!--"))
41
- .filter(line => !line.endsWith("-->"))
42
- .filter(line => !/^[-*]\s*\{\{.+\}\}$/.test(line))
43
- .filter(line => !/^\{\{.+\}\}$/.test(line));
44
- }
45
- function sectionLooksPlaceholderOnly(text) {
46
- if (!text)
47
- return true;
48
- const lines = normalizeMeaningfulLines(text)
49
- .map(line => line.replace(/^[-*]\s+/, "").trim())
50
- .filter(line => line.length > 0);
51
- if (lines.length === 0)
52
- return true;
53
- return lines.every(line => {
54
- const lower = line.toLowerCase();
55
- return lower === "none" ||
56
- lower.endsWith(": none") ||
57
- lower.includes("{{") ||
58
- lower.includes("}}") ||
59
- lower.startsWith("required for non-trivial") ||
60
- lower.startsWith("describe how a future agent") ||
61
- lower.startsWith("prefer:") ||
62
- lower.startsWith("keep this section concise");
63
- });
64
- }
65
- function textSuggestsObservabilityRelevant(content) {
66
- const lower = content.toLowerCase();
67
- const needles = [
68
- " api", "route", "server", "worker", "queue", "job", "sync", "import",
69
- "webhook", "auth", "db", "database", "migration", "cache", "background",
70
- "polling", "realtime", "socket", "stateful", "integration", "ui", "form",
71
- "submit", "status", "service", "pipeline", "health endpoint", "error path"
72
- ];
73
- return needles.some(needle => lower.includes(needle));
74
- }
75
- function verificationMentionsDiagnostics(section) {
76
- if (!section)
77
- return false;
78
- const lower = section.toLowerCase();
79
- const needles = [
80
- "error", "failure", "diagnostic", "status", "health", "inspect", "log",
81
- "network", "console", "retry", "last error", "correlation", "readiness"
82
- ];
83
- return needles.some(needle => lower.includes(needle));
84
- }
85
- export function validateSlicePlanContent(file, content) {
86
- const issues = [];
87
- // ── Plan quality rules (always run, not gated by runtime relevance) ──
88
- const tasksSection = getSection(content, "Tasks", 2);
89
- if (tasksSection) {
90
- const lines = tasksSection.split("\n");
91
- const taskLinePattern = /^- \[[ x]\] \*\*T\d+:/;
92
- const taskLineIndices = [];
93
- for (let i = 0; i < lines.length; i++) {
94
- if (taskLinePattern.test(lines[i]))
95
- taskLineIndices.push(i);
96
- }
97
- for (let t = 0; t < taskLineIndices.length; t++) {
98
- const start = taskLineIndices[t];
99
- const end = t + 1 < taskLineIndices.length ? taskLineIndices[t + 1] : lines.length;
100
- // Check lines between this task header and the next (or section end)
101
- const bodyLines = lines.slice(start + 1, end);
102
- const meaningful = bodyLines.filter(l => l.trim().length > 0);
103
- if (meaningful.length === 0) {
104
- issues.push({
105
- severity: "warning",
106
- scope: "slice-plan",
107
- file,
108
- ruleId: "empty_task_entry",
109
- message: "Inline task entry has no description content beneath the checkbox line.",
110
- suggestion: "Add at least a Why/Files/Do/Verify summary so the task is self-describing.",
111
- });
112
- }
113
- }
114
- }
115
- // ── Observability rules (gated by runtime relevance) ──
116
- const relevant = textSuggestsObservabilityRelevant(content);
117
- if (!relevant)
118
- return issues;
119
- const obs = getSection(content, "Observability / Diagnostics", 2);
120
- const verification = getSection(content, "Verification", 2);
121
- if (!obs) {
122
- issues.push({
123
- severity: "warning",
124
- scope: "slice-plan",
125
- file,
126
- ruleId: "missing_observability_section",
127
- message: "Slice plan appears non-trivial but is missing `## Observability / Diagnostics`.",
128
- suggestion: "Add runtime signals, inspection surfaces, failure visibility, and redaction constraints.",
129
- });
130
- }
131
- else if (sectionLooksPlaceholderOnly(obs)) {
132
- issues.push({
133
- severity: "warning",
134
- scope: "slice-plan",
135
- file,
136
- ruleId: "observability_section_placeholder_only",
137
- message: "Slice plan has `## Observability / Diagnostics` but it still looks like placeholder text.",
138
- suggestion: "Replace placeholders with concrete signals and inspection surfaces a future agent should trust.",
139
- });
140
- }
141
- if (!verificationMentionsDiagnostics(verification)) {
142
- issues.push({
143
- severity: "warning",
144
- scope: "slice-plan",
145
- file,
146
- ruleId: "verification_missing_diagnostic_check",
147
- message: "Slice verification does not appear to include any diagnostic or failure-path check.",
148
- suggestion: "Add at least one verification step for inspectable failure state, structured error output, status surface, or equivalent.",
149
- });
150
- }
151
- return issues;
152
- }
153
- export function validateTaskPlanContent(file, content) {
154
- const issues = [];
155
- // ── Plan quality rules (always run, not gated by runtime relevance) ──
156
- // Rule: empty or missing Steps section
157
- const stepsSection = getSection(content, "Steps", 2);
158
- if (stepsSection === null || sectionLooksPlaceholderOnly(stepsSection)) {
159
- issues.push({
160
- severity: "warning",
161
- scope: "task-plan",
162
- file,
163
- ruleId: "empty_steps_section",
164
- message: "Task plan has an empty or missing `## Steps` section.",
165
- suggestion: "Add concrete numbered implementation steps so execution has a clear sequence.",
166
- });
167
- }
168
- // Rule: placeholder-only Verification section
169
- const verificationSection = getSection(content, "Verification", 2);
170
- if (verificationSection !== null && sectionLooksPlaceholderOnly(verificationSection)) {
171
- issues.push({
172
- severity: "warning",
173
- scope: "task-plan",
174
- file,
175
- ruleId: "placeholder_verification",
176
- message: "Task plan has `## Verification` but it still looks like placeholder text.",
177
- suggestion: "Replace placeholders with concrete verification commands, test runs, or observable checks.",
178
- });
179
- }
180
- // Rule: scope estimate thresholds
181
- const fm = getFrontmatter(content);
182
- if (fm) {
183
- const stepsMatch = fm.match(/^estimated_steps:\s*(\d+)/m);
184
- const filesMatch = fm.match(/^estimated_files:\s*(\d+)/m);
185
- if (stepsMatch) {
186
- const estimatedSteps = parseInt(stepsMatch[1], 10);
187
- if (estimatedSteps >= 10) {
188
- issues.push({
189
- severity: "warning",
190
- scope: "task-plan",
191
- file,
192
- ruleId: "scope_estimate_steps_high",
193
- message: `Task plan estimates ${estimatedSteps} steps (threshold: 10). Consider splitting into smaller tasks.`,
194
- suggestion: "Break the task into sub-tasks or reduce scope so each task stays focused and completable in one pass.",
195
- });
196
- }
197
- }
198
- if (filesMatch) {
199
- const estimatedFiles = parseInt(filesMatch[1], 10);
200
- if (estimatedFiles >= 12) {
201
- issues.push({
202
- severity: "warning",
203
- scope: "task-plan",
204
- file,
205
- ruleId: "scope_estimate_files_high",
206
- message: `Task plan estimates ${estimatedFiles} files (threshold: 12). Consider splitting into smaller tasks.`,
207
- suggestion: "Break the task into sub-tasks or reduce scope to keep the change footprint manageable.",
208
- });
209
- }
210
- }
211
- }
212
- // Rule: Inputs and Expected Output should contain backtick-wrapped file paths
213
- const inputsSection = getSection(content, "Inputs", 2);
214
- const outputSection = getSection(content, "Expected Output", 2);
215
- const backtickPathPattern = /`[^`]*[./][^`]*`/;
216
- if (outputSection === null || !backtickPathPattern.test(outputSection)) {
217
- issues.push({
218
- severity: "warning",
219
- scope: "task-plan",
220
- file,
221
- ruleId: "missing_output_file_paths",
222
- message: "Task plan `## Expected Output` is missing or has no backtick-wrapped file paths.",
223
- suggestion: "List concrete output file paths in backticks (e.g. `src/types.ts`). These are machine-parsed to derive task dependencies.",
224
- });
225
- }
226
- if (inputsSection !== null && inputsSection.trim().length > 0 && !backtickPathPattern.test(inputsSection)) {
227
- issues.push({
228
- severity: "info",
229
- scope: "task-plan",
230
- file,
231
- ruleId: "missing_input_file_paths",
232
- message: "Task plan `## Inputs` has content but no backtick-wrapped file paths.",
233
- suggestion: "List input file paths in backticks (e.g. `src/config.json`). These are machine-parsed to derive task dependencies.",
234
- });
235
- }
236
- // ── Observability rules (gated by runtime relevance) ──
237
- const relevant = textSuggestsObservabilityRelevant(content);
238
- if (!relevant)
239
- return issues;
240
- const obs = getSection(content, "Observability Impact", 2);
241
- if (!obs) {
242
- issues.push({
243
- severity: "warning",
244
- scope: "task-plan",
245
- file,
246
- ruleId: "missing_observability_impact",
247
- message: "Task plan appears runtime-relevant but is missing `## Observability Impact`.",
248
- suggestion: "Explain what signals change, how a future agent inspects this task, and what failure state becomes visible.",
249
- });
250
- }
251
- else if (sectionLooksPlaceholderOnly(obs)) {
252
- issues.push({
253
- severity: "warning",
254
- scope: "task-plan",
255
- file,
256
- ruleId: "observability_impact_placeholder_only",
257
- message: "Task plan has `## Observability Impact` but it still looks empty or placeholder-only.",
258
- suggestion: "Fill in concrete inspection surfaces or explicitly justify why observability is not applicable.",
259
- });
260
- }
261
- return issues;
262
- }
263
- export function validateTaskSummaryContent(file, content) {
264
- const issues = [];
265
- if (!hasFrontmatterKey(content, "observability_surfaces")) {
266
- issues.push({
267
- severity: "warning",
268
- scope: "task-summary",
269
- file,
270
- ruleId: "missing_observability_frontmatter",
271
- message: "Task summary is missing `observability_surfaces` in frontmatter.",
272
- suggestion: "List the durable status/log/error surfaces a future agent should use.",
273
- });
274
- }
275
- const diagnostics = getSection(content, "Diagnostics", 2);
276
- if (!diagnostics) {
277
- issues.push({
278
- severity: "warning",
279
- scope: "task-summary",
280
- file,
281
- ruleId: "missing_diagnostics_section",
282
- message: "Task summary is missing `## Diagnostics`.",
283
- suggestion: "Document how to inspect what this task built later.",
284
- });
285
- }
286
- else if (sectionLooksPlaceholderOnly(diagnostics)) {
287
- issues.push({
288
- severity: "warning",
289
- scope: "task-summary",
290
- file,
291
- ruleId: "diagnostics_placeholder_only",
292
- message: "Task summary diagnostics section still looks like placeholder text.",
293
- suggestion: "Replace placeholders with concrete commands, endpoints, logs, error shapes, or failure artifacts.",
294
- });
295
- }
296
- const evidence = getSection(content, "Verification Evidence", 2);
297
- if (!evidence) {
298
- issues.push({
299
- severity: "warning",
300
- scope: "task-summary",
301
- file,
302
- ruleId: "evidence_block_missing",
303
- message: "Task summary is missing `## Verification Evidence`.",
304
- suggestion: "Add a verification evidence table showing gate check results (command, exit code, verdict, duration).",
305
- });
306
- }
307
- else if (sectionLooksPlaceholderOnly(evidence)) {
308
- issues.push({
309
- severity: "warning",
310
- scope: "task-summary",
311
- file,
312
- ruleId: "evidence_block_placeholder",
313
- message: "Task summary verification evidence section still looks like placeholder text.",
314
- suggestion: "Replace placeholders with actual gate results or note that no verification commands were discovered.",
315
- });
316
- }
317
- return issues;
318
- }
319
- export function validateSliceSummaryContent(file, content) {
320
- const issues = [];
321
- if (!hasFrontmatterKey(content, "observability_surfaces")) {
322
- issues.push({
323
- severity: "warning",
324
- scope: "slice-summary",
325
- file,
326
- ruleId: "missing_observability_frontmatter",
327
- message: "Slice summary is missing `observability_surfaces` in frontmatter.",
328
- suggestion: "List the authoritative diagnostics and durable inspection surfaces for this slice.",
329
- });
330
- }
331
- const diagnostics = getSection(content, "Authoritative diagnostics", 3);
332
- if (!diagnostics) {
333
- issues.push({
334
- severity: "warning",
335
- scope: "slice-summary",
336
- file,
337
- ruleId: "missing_authoritative_diagnostics",
338
- message: "Slice summary is missing `### Authoritative diagnostics` in Forward Intelligence.",
339
- suggestion: "Tell future agents where to look first and why that signal is trustworthy.",
340
- });
341
- }
342
- else if (sectionLooksPlaceholderOnly(diagnostics)) {
343
- issues.push({
344
- severity: "warning",
345
- scope: "slice-summary",
346
- file,
347
- ruleId: "authoritative_diagnostics_placeholder_only",
348
- message: "Slice summary includes authoritative diagnostics but it still looks like placeholder text.",
349
- suggestion: "Replace placeholders with the real first-stop diagnostic surface for this slice.",
350
- });
351
- }
352
- return issues;
353
- }
354
- export async function validatePlanBoundary(basePath, milestoneId, sliceId) {
355
- const issues = [];
356
- const slicePlan = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
357
- if (slicePlan) {
358
- const content = await loadFile(slicePlan);
359
- if (content)
360
- issues.push(...validateSlicePlanContent(slicePlan, content));
361
- }
362
- const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId);
363
- const taskPlans = tasksDir ? resolveTaskFiles(tasksDir, "PLAN") : [];
364
- for (const file of taskPlans) {
365
- const taskId = file.split("-")[0];
366
- const taskPlan = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
367
- if (!taskPlan)
368
- continue;
369
- const content = await loadFile(taskPlan);
370
- if (content)
371
- issues.push(...validateTaskPlanContent(taskPlan, content));
372
- }
373
- return issues;
374
- }
375
- export async function validateExecuteBoundary(basePath, milestoneId, sliceId, taskId) {
376
- const issues = [];
377
- const slicePlan = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
378
- if (slicePlan) {
379
- const content = await loadFile(slicePlan);
380
- if (content)
381
- issues.push(...validateSlicePlanContent(slicePlan, content));
382
- }
383
- const taskPlan = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
384
- if (taskPlan) {
385
- const content = await loadFile(taskPlan);
386
- if (content)
387
- issues.push(...validateTaskPlanContent(taskPlan, content));
388
- }
389
- return issues;
390
- }
391
- export async function validateCompleteBoundary(basePath, milestoneId, sliceId) {
392
- const issues = [];
393
- const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId);
394
- const taskSummaries = tasksDir ? resolveTaskFiles(tasksDir, "SUMMARY") : [];
395
- for (const file of taskSummaries) {
396
- const taskId = file.split("-")[0];
397
- const taskSummary = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY");
398
- if (!taskSummary)
399
- continue;
400
- const content = await loadFile(taskSummary);
401
- if (content)
402
- issues.push(...validateTaskSummaryContent(taskSummary, content));
403
- }
404
- const sliceSummary = resolveSliceFile(basePath, milestoneId, sliceId, "SUMMARY");
405
- if (sliceSummary) {
406
- const content = await loadFile(sliceSummary);
407
- if (content)
408
- issues.push(...validateSliceSummaryContent(sliceSummary, content));
409
- }
410
- return issues;
411
- }
412
- export function formatValidationIssues(issues, limit = 4) {
413
- if (issues.length === 0)
414
- return "";
415
- const lines = issues.slice(0, limit).map(issue => {
416
- const fileName = issue.file.split("/").pop() || issue.file;
417
- return `- ${fileName}: ${issue.message}`;
418
- });
419
- if (issues.length > limit)
420
- lines.push(`- ...and ${issues.length - limit} more`);
421
- return lines.join("\n");
422
- }