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
@@ -5,7 +5,7 @@
5
5
  * Used by init-wizard.ts and guided-flow.ts to determine what onboarding
6
6
  * flow to show when entering a project directory.
7
7
  */
8
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
8
+ import { existsSync, openSync, readSync, closeSync, readdirSync, readFileSync, statSync } from "node:fs";
9
9
  import { join } from "node:path";
10
10
  import { homedir } from "node:os";
11
11
  import { gsdRoot } from "./paths.js";
@@ -39,9 +39,76 @@ export const PROJECT_FILES = [
39
39
  "project.yml",
40
40
  ".xcodeproj",
41
41
  ".xcworkspace",
42
- // Docker
42
+ // Cloud platform config files
43
+ "firebase.json",
44
+ "cdk.json",
45
+ "samconfig.toml",
46
+ "serverless.yml",
47
+ "serverless.yaml",
48
+ "azure-pipelines.yml",
49
+ // Database / ORM config files
50
+ "prisma/schema.prisma",
51
+ "supabase/config.toml",
52
+ "drizzle.config.ts",
53
+ "drizzle.config.js",
54
+ "redis.conf",
55
+ // React Native markers
56
+ "metro.config.js",
57
+ "metro.config.ts",
58
+ "react-native.config.js",
59
+ // Frontend framework config files
60
+ "angular.json",
61
+ "next.config.js",
62
+ "next.config.ts",
63
+ "next.config.mjs",
64
+ "nuxt.config.ts",
65
+ "nuxt.config.js",
66
+ "svelte.config.js",
67
+ "svelte.config.ts",
68
+ // Vue CLI config files
69
+ "vue.config.js",
70
+ "vue.config.ts",
71
+ // Frontend tooling
72
+ "tailwind.config.js",
73
+ "tailwind.config.ts",
74
+ "tailwind.config.mjs",
75
+ "tailwind.config.cjs",
76
+ // Android project markers
77
+ "app/build.gradle",
78
+ "app/build.gradle.kts",
79
+ // Container / DevOps config files
43
80
  "Dockerfile",
81
+ "docker-compose.yml",
82
+ "docker-compose.yaml",
83
+ // Infrastructure as Code
84
+ "main.tf",
85
+ // Kubernetes / Helm markers
86
+ "Chart.yaml",
87
+ "kustomization.yaml",
88
+ // CI/CD markers
89
+ ".github/workflows",
90
+ // Blockchain / Web3 markers
91
+ "hardhat.config.js",
92
+ "hardhat.config.ts",
93
+ "foundry.toml",
94
+ // Data engineering markers
95
+ "dbt_project.yml",
96
+ "airflow.cfg",
97
+ // Game engine markers
98
+ "ProjectSettings/ProjectVersion.txt",
99
+ "project.godot",
100
+ // Python framework markers
101
+ "manage.py",
102
+ "requirements.txt",
44
103
  ];
104
+ /** File extensions that indicate SQLite databases in the project. */
105
+ const SQLITE_EXTENSIONS = [".sqlite", ".sqlite3", ".db"];
106
+ /** File extensions that indicate SQL usage (migrations, schemas, seeds). */
107
+ const SQL_EXTENSIONS = [".sql"];
108
+ /** File extensions that indicate .NET / C# projects. */
109
+ const DOTNET_EXTENSIONS = [".csproj", ".sln", ".fsproj"];
110
+ /** File extensions that indicate Vue.js single-file components. */
111
+ const VUE_EXTENSIONS = [".vue"];
45
112
  const LANGUAGE_MAP = {
46
113
  "package.json": "javascript/typescript",
47
114
  "Cargo.toml": "rust",
@@ -52,6 +119,8 @@ const LANGUAGE_MAP = {
52
119
  "pom.xml": "java",
53
120
  "build.gradle": "java/kotlin",
54
121
  "build.gradle.kts": "kotlin",
122
+ "app/build.gradle": "java/kotlin",
123
+ "app/build.gradle.kts": "kotlin",
55
124
  "CMakeLists.txt": "c/c++",
56
125
  "composer.json": "php",
57
126
  "pubspec.yaml": "dart/flutter",
@@ -66,6 +135,8 @@ const LANGUAGE_MAP = {
66
135
  ".xcodeproj": "swift/xcode",
67
136
  ".xcworkspace": "swift/xcode",
68
137
  "Dockerfile": "docker",
138
+ "manage.py": "python",
139
+ "requirements.txt": "python",
69
140
  };
70
141
  const MONOREPO_MARKERS = [
71
142
  "lerna.json",
@@ -96,6 +167,41 @@ const TEST_MARKERS = [
96
167
  "conftest.py",
97
168
  "phpunit.xml",
98
169
  ];
170
+ /** Directories skipped during bounded recursive project scans. */
171
+ const RECURSIVE_SCAN_IGNORED_DIRS = new Set([
172
+ ".git",
173
+ "node_modules",
174
+ ".venv",
175
+ "venv",
176
+ "dist",
177
+ "build",
178
+ "coverage",
179
+ ".next",
180
+ ".nuxt",
181
+ "target",
182
+ "vendor",
183
+ ".turbo",
184
+ "Pods",
185
+ "bin",
186
+ "obj",
187
+ ".gradle",
188
+ "DerivedData",
189
+ "out",
190
+ ]);
191
+ /** Project file markers safe to detect recursively via suffix matching. */
192
+ const ROOT_ONLY_PROJECT_FILES = new Set([
193
+ ".github/workflows",
194
+ "package.json",
195
+ "Gemfile",
196
+ "Makefile",
197
+ "CMakeLists.txt",
198
+ "build.gradle",
199
+ "build.gradle.kts",
200
+ "deno.json",
201
+ "deno.jsonc",
202
+ ]);
203
+ const MAX_RECURSIVE_SCAN_FILES = 2000;
204
+ const MAX_RECURSIVE_SCAN_DEPTH = 6;
99
205
  // ─── Core Detection ─────────────────────────────────────────────────────────────
100
206
  /**
101
207
  * Detect the full project state for a given directory.
@@ -204,8 +310,75 @@ export function detectProjectSignals(basePath) {
204
310
  }
205
311
  }
206
312
  }
313
+ // Bounded recursive scan for nested markers and dependency files.
314
+ // This covers common brownfield layouts like src/App/App.csproj,
315
+ // db/migrations/*.sql, src/components/*.vue, and services/api/pyproject.toml
316
+ // without walking the entire repo or diving into heavyweight folders.
317
+ const scannedFiles = scanProjectFiles(basePath);
318
+ for (const file of PROJECT_FILES) {
319
+ if (detectedFiles.includes(file) || ROOT_ONLY_PROJECT_FILES.has(file))
320
+ continue;
321
+ const hasMatch = file === "requirements.txt"
322
+ ? scannedFiles.some(isPythonRequirementsFile)
323
+ : scannedFiles.some((scannedFile) => matchesProjectFileMarker(scannedFile, file));
324
+ if (hasMatch) {
325
+ pushUnique(detectedFiles, file);
326
+ if (!primaryLanguage && LANGUAGE_MAP[file]) {
327
+ primaryLanguage = LANGUAGE_MAP[file];
328
+ }
329
+ }
330
+ }
331
+ if (scannedFiles.some((file) => SQLITE_EXTENSIONS.some((ext) => file.endsWith(ext)))) {
332
+ pushUnique(detectedFiles, "*.sqlite");
333
+ }
334
+ if (scannedFiles.some((file) => SQL_EXTENSIONS.some((ext) => file.endsWith(ext)))) {
335
+ pushUnique(detectedFiles, "*.sql");
336
+ }
337
+ const hasCsproj = scannedFiles.some((file) => file.endsWith(".csproj"));
338
+ const hasFsproj = scannedFiles.some((file) => file.endsWith(".fsproj"));
339
+ const hasSln = scannedFiles.some((file) => file.endsWith(".sln"));
340
+ if (hasCsproj) {
341
+ pushUnique(detectedFiles, "*.csproj");
342
+ if (!primaryLanguage)
343
+ primaryLanguage = "csharp";
344
+ }
345
+ if (hasFsproj) {
346
+ pushUnique(detectedFiles, "*.fsproj");
347
+ if (!primaryLanguage)
348
+ primaryLanguage = "fsharp";
349
+ }
350
+ if (hasSln) {
351
+ pushUnique(detectedFiles, "*.sln");
352
+ if (!primaryLanguage)
353
+ primaryLanguage = "dotnet";
354
+ }
355
+ if (scannedFiles.some((file) => VUE_EXTENSIONS.some((ext) => file.endsWith(ext)))) {
356
+ pushUnique(detectedFiles, "*.vue");
357
+ }
358
+ // Python framework detection — scan dependency files for framework-specific packages.
359
+ // Adds synthetic markers (e.g. "dep:fastapi") so skill catalog matchFiles can reference them.
360
+ const dependencyFiles = scannedFiles.filter((file) => isPythonRequirementsFile(file) || file.endsWith("pyproject.toml"));
361
+ if (containsFastapiDependency(basePath, dependencyFiles)) {
362
+ pushUnique(detectedFiles, "dep:fastapi");
363
+ }
364
+ const springBootBuildFiles = scannedFiles.filter((file) => file.endsWith("pom.xml") || file.endsWith("build.gradle") || file.endsWith("build.gradle.kts"));
365
+ const springBootVersionCatalogs = scannedFiles.filter((file) => file.endsWith(".versions.toml"));
366
+ const springBootSettingsFiles = scannedFiles.filter((file) => file.endsWith("settings.gradle") || file.endsWith("settings.gradle.kts"));
367
+ if (containsSpringBootMarker(basePath, springBootBuildFiles, springBootVersionCatalogs, springBootSettingsFiles)) {
368
+ pushUnique(detectedFiles, "dep:spring-boot");
369
+ if (!primaryLanguage) {
370
+ primaryLanguage = "java/kotlin";
371
+ }
372
+ }
207
373
  // Git repo detection
208
374
  const isGitRepo = existsSync(join(basePath, ".git"));
375
+ // Xcode platform detection — parse SDKROOT from project.pbxproj
376
+ const xcodePlatforms = detectXcodePlatforms(basePath);
377
+ // Set primaryLanguage to swift when an Xcode project is found but no
378
+ // Package.swift was detected (CocoaPods or SPM-less projects).
379
+ if (!primaryLanguage && xcodePlatforms.length > 0) {
380
+ primaryLanguage = "swift";
381
+ }
209
382
  // Monorepo detection
210
383
  let isMonorepo = false;
211
384
  for (const marker of MONOREPO_MARKERS) {
@@ -243,12 +416,106 @@ export function detectProjectSignals(basePath) {
243
416
  isGitRepo,
244
417
  isMonorepo,
245
418
  primaryLanguage,
419
+ xcodePlatforms,
246
420
  hasCI,
247
421
  hasTests,
248
422
  packageManager,
249
423
  verificationCommands,
250
424
  };
251
425
  }
426
+ // ─── Xcode Platform Detection ───────────────────────────────────────────────────
427
+ /** Known SDKROOT values → canonical platform names. */
428
+ const SDKROOT_MAP = {
429
+ iphoneos: "iphoneos",
430
+ iphonesimulator: "iphoneos", // simulator builds still target iOS
431
+ macosx: "macosx",
432
+ watchos: "watchos",
433
+ watchsimulator: "watchos",
434
+ appletvos: "appletvos",
435
+ appletvsimulator: "appletvos",
436
+ xros: "xros",
437
+ xrsimulator: "xros",
438
+ };
439
+ /** Regex for SUPPORTED_PLATFORMS — fallback when SDKROOT = auto (Xcode 15+). */
440
+ const SUPPORTED_PLATFORMS_RE = /SUPPORTED_PLATFORMS\s*=\s*"([^"]+)"/gi;
441
+ /** Read at most `maxBytes` from a file without loading the full file into memory. */
442
+ function readBounded(filePath, maxBytes) {
443
+ const buf = Buffer.alloc(maxBytes);
444
+ const fd = openSync(filePath, "r");
445
+ try {
446
+ const bytesRead = readSync(fd, buf, 0, maxBytes, 0);
447
+ return buf.toString("utf-8", 0, bytesRead);
448
+ }
449
+ finally {
450
+ closeSync(fd);
451
+ }
452
+ }
453
+ /** Common subdirectories where .xcodeproj may live in monorepos / standard layouts. */
454
+ const XCODE_SUBDIRS = ["ios", "macos", "app", "apps"];
455
+ /**
456
+ * Scan *.xcodeproj directories for project.pbxproj and extract SDKROOT values.
457
+ * Returns deduplicated, canonical platform list (e.g. ["iphoneos"]).
458
+ *
459
+ * Reading the pbxproj is a lightweight regex scan — no full plist parsing needed.
460
+ * We read at most 1 MB per file to keep detection fast.
461
+ * Searches both the project root and common subdirectories (ios/, macos/, app/).
462
+ */
463
+ function detectXcodePlatforms(basePath) {
464
+ const platforms = new Set();
465
+ // Directories to scan: project root + common subdirs
466
+ const dirsToScan = [basePath];
467
+ for (const sub of XCODE_SUBDIRS) {
468
+ const subPath = join(basePath, sub);
469
+ if (existsSync(subPath))
470
+ dirsToScan.push(subPath);
471
+ }
472
+ for (const dir of dirsToScan) {
473
+ try {
474
+ const entries = readdirSync(dir, { withFileTypes: true });
475
+ for (const entry of entries) {
476
+ if (!entry.isDirectory() || !entry.name.endsWith(".xcodeproj"))
477
+ continue;
478
+ const pbxprojPath = join(dir, entry.name, "project.pbxproj");
479
+ try {
480
+ const content = readBounded(pbxprojPath, 1024 * 1024);
481
+ // Match SDKROOT = <value>; — both quoted and unquoted forms
482
+ const sdkRe = /SDKROOT\s*=\s*"?([a-z]+)"?\s*;/gi;
483
+ let m;
484
+ let foundExplicit = false;
485
+ while ((m = sdkRe.exec(content)) !== null) {
486
+ const val = m[1].toLowerCase();
487
+ if (val === "auto")
488
+ continue; // handled below via SUPPORTED_PLATFORMS
489
+ const canonical = SDKROOT_MAP[val];
490
+ if (canonical) {
491
+ platforms.add(canonical);
492
+ foundExplicit = true;
493
+ }
494
+ }
495
+ // Xcode 15+ defaults SDKROOT to "auto"; fall back to SUPPORTED_PLATFORMS
496
+ if (!foundExplicit) {
497
+ let sp;
498
+ while ((sp = SUPPORTED_PLATFORMS_RE.exec(content)) !== null) {
499
+ for (const tok of sp[1].split(/\s+/)) {
500
+ const canonical = SDKROOT_MAP[tok.toLowerCase()];
501
+ if (canonical)
502
+ platforms.add(canonical);
503
+ }
504
+ }
505
+ SUPPORTED_PLATFORMS_RE.lastIndex = 0;
506
+ }
507
+ }
508
+ catch {
509
+ // unreadable pbxproj — skip
510
+ }
511
+ }
512
+ }
513
+ catch {
514
+ // unreadable directory
515
+ }
516
+ }
517
+ return [...platforms];
518
+ }
252
519
  // ─── Package Manager Detection ──────────────────────────────────────────────────
253
520
  function detectPackageManager(basePath) {
254
521
  if (existsSync(join(basePath, "pnpm-lock.yaml")))
@@ -304,7 +571,7 @@ function detectVerificationCommands(basePath, detectedFiles, packageManager) {
304
571
  commands.push("go test ./...");
305
572
  commands.push("go vet ./...");
306
573
  }
307
- if (detectedFiles.includes("pyproject.toml") || detectedFiles.includes("setup.py")) {
574
+ if (detectedFiles.includes("pyproject.toml") || detectedFiles.includes("setup.py") || detectedFiles.includes("requirements.txt")) {
308
575
  commands.push("pytest");
309
576
  }
310
577
  if (detectedFiles.includes("Gemfile")) {
@@ -389,3 +656,322 @@ function readMakefileTargets(basePath) {
389
656
  return [];
390
657
  }
391
658
  }
659
+ function pushUnique(arr, value) {
660
+ if (!arr.includes(value))
661
+ arr.push(value);
662
+ }
663
+ function matchesProjectFileMarker(scannedFile, marker) {
664
+ const normalized = scannedFile.replaceAll("\\", "/");
665
+ return (normalized === marker ||
666
+ normalized.endsWith(`/${marker}`));
667
+ }
668
+ function isPythonRequirementsFile(relativePath) {
669
+ const normalized = relativePath.replaceAll("\\", "/");
670
+ const basename = normalized.slice(normalized.lastIndexOf("/") + 1);
671
+ return (basename === "requirements.txt" ||
672
+ basename === "requirements.in" ||
673
+ /^requirements([-.].+)?\.(txt|in)$/i.test(basename) ||
674
+ /(^|\/)requirements\/.+\.(txt|in)$/i.test(normalized));
675
+ }
676
+ function containsFastapiDependency(basePath, relativePaths) {
677
+ for (const relativePath of relativePaths) {
678
+ try {
679
+ const raw = readBounded(join(basePath, relativePath), 64 * 1024);
680
+ const content = extractDependencyContent(relativePath, raw);
681
+ if (isPythonRequirementsFile(relativePath)) {
682
+ for (const line of content.split("\n")) {
683
+ if (extractRequirementName(line) === "fastapi")
684
+ return true;
685
+ }
686
+ continue;
687
+ }
688
+ if (relativePath.endsWith("pyproject.toml")) {
689
+ if (containsFastapiInPyproject(content))
690
+ return true;
691
+ }
692
+ }
693
+ catch {
694
+ // unreadable file — continue scanning other candidate files
695
+ }
696
+ }
697
+ return false;
698
+ }
699
+ function containsSpringBootMarker(basePath, buildFiles, versionCatalogFiles, settingsFiles) {
700
+ const usedPluginAliases = new Set();
701
+ const usedLibraryAliases = new Set();
702
+ const catalogAccessors = resolveVersionCatalogAccessors(basePath, versionCatalogFiles, settingsFiles);
703
+ for (const relativePath of buildFiles) {
704
+ try {
705
+ const raw = readBounded(join(basePath, relativePath), 64 * 1024);
706
+ const content = stripDependencyComments(relativePath, raw);
707
+ if (containsDirectSpringBootReference(relativePath, content)) {
708
+ return true;
709
+ }
710
+ const normalized = content.toLowerCase();
711
+ let match;
712
+ for (const accessor of catalogAccessors) {
713
+ const aliasRe = new RegExp(`alias\\(\\s*${accessor}\\.plugins\\.([a-z0-9_.-]+)\\s*\\)`, "gi");
714
+ while ((match = aliasRe.exec(normalized)) !== null) {
715
+ usedPluginAliases.add(normalizePluginAlias(match[1]));
716
+ }
717
+ const libraryAliasRe = new RegExp(`\\b${accessor}\\.((?!plugins\\b)[a-z0-9_.-]+)`, "gi");
718
+ while ((match = libraryAliasRe.exec(normalized)) !== null) {
719
+ usedLibraryAliases.add(normalizePluginAlias(match[1]));
720
+ }
721
+ }
722
+ }
723
+ catch {
724
+ // unreadable build file — continue scanning others
725
+ }
726
+ }
727
+ if (usedPluginAliases.size === 0 && usedLibraryAliases.size === 0) {
728
+ return false;
729
+ }
730
+ if (versionCatalogFiles.length === 0) {
731
+ return false;
732
+ }
733
+ const springBootAliases = new Set();
734
+ const springBootLibraries = new Set();
735
+ const pendingSpringBootBundles = [];
736
+ for (const relativePath of versionCatalogFiles) {
737
+ try {
738
+ const raw = readBounded(join(basePath, relativePath), 64 * 1024);
739
+ const content = stripDependencyComments(relativePath, raw);
740
+ const aliasRe = /^\s*([A-Za-z0-9_.-]+)\s*=\s*\{[^\n}]*\bid\s*=\s*["']org\.springframework\.boot["'][^\n}]*\}/gm;
741
+ let match;
742
+ while ((match = aliasRe.exec(content)) !== null) {
743
+ springBootAliases.add(normalizePluginAlias(match[1]));
744
+ }
745
+ const libraryRe = /^\s*([A-Za-z0-9_.-]+)\s*=\s*\{[^\n}]*\b(module\s*=\s*["']org\.springframework\.boot:[^"']+["']|group\s*=\s*["']org\.springframework\.boot["'][^\n}]*\bname\s*=\s*["']spring-boot[^"']*["'])[^\n}]*\}/gm;
746
+ while ((match = libraryRe.exec(content)) !== null) {
747
+ springBootLibraries.add(normalizePluginAlias(match[1]));
748
+ }
749
+ const bundleRe = /^\s*([A-Za-z0-9_.-]+)\s*=\s*\[([\s\S]*?)\]/gm;
750
+ while ((match = bundleRe.exec(content)) !== null) {
751
+ pendingSpringBootBundles.push({
752
+ bundleAlias: normalizePluginAlias(`bundles.${match[1]}`),
753
+ referencedAliases: match[2]
754
+ .split(",")
755
+ .map((part) => normalizePluginAlias(part.replace(/["'\s]/g, "")))
756
+ .filter(Boolean),
757
+ });
758
+ }
759
+ }
760
+ catch {
761
+ // unreadable version catalog — continue scanning others
762
+ }
763
+ }
764
+ const springBootBundles = new Set();
765
+ for (const pendingBundle of pendingSpringBootBundles) {
766
+ if (pendingBundle.referencedAliases.some((alias) => springBootLibraries.has(alias))) {
767
+ springBootBundles.add(pendingBundle.bundleAlias);
768
+ }
769
+ }
770
+ for (const alias of usedPluginAliases) {
771
+ if (springBootAliases.has(alias))
772
+ return true;
773
+ }
774
+ for (const alias of usedLibraryAliases) {
775
+ if (springBootLibraries.has(alias) || springBootBundles.has(alias))
776
+ return true;
777
+ }
778
+ return false;
779
+ }
780
+ function stripDependencyComments(relativePath, content) {
781
+ if (relativePath.endsWith("requirements.txt")) {
782
+ return content.replace(/(^|\s)#.*$/gm, "");
783
+ }
784
+ if (relativePath.endsWith("pyproject.toml")) {
785
+ return content.replace(/(^|\s)#.*$/gm, "");
786
+ }
787
+ if (relativePath.endsWith(".versions.toml")) {
788
+ return content.replace(/(^|\s)#.*$/gm, "");
789
+ }
790
+ if (relativePath.endsWith("settings.gradle") || relativePath.endsWith("settings.gradle.kts")) {
791
+ return content
792
+ .replace(/\/\*[\s\S]*?\*\//g, "")
793
+ .replace(/\/\/.*$/gm, "");
794
+ }
795
+ if (relativePath.endsWith("pom.xml")) {
796
+ return content.replace(/<!--[\s\S]*?-->/g, "");
797
+ }
798
+ if (relativePath.endsWith("build.gradle") || relativePath.endsWith("build.gradle.kts")) {
799
+ return content
800
+ .replace(/\/\*[\s\S]*?\*\//g, "")
801
+ .replace(/\/\/.*$/gm, "");
802
+ }
803
+ return content;
804
+ }
805
+ function extractDependencyContent(relativePath, content) {
806
+ const stripped = stripDependencyComments(relativePath, content);
807
+ if (relativePath.endsWith("pyproject.toml")) {
808
+ return extractPyprojectDependencySections(stripped);
809
+ }
810
+ return stripped;
811
+ }
812
+ function extractRequirementName(spec) {
813
+ const trimmed = spec.trim().replace(/^["']|["']$/g, "");
814
+ if (!trimmed)
815
+ return null;
816
+ const match = trimmed.match(/^([A-Za-z0-9_.-]+)(?:\[[^\]]+\])?(?=\s*(?:@|[<>=!~;]|$))/);
817
+ if (!match)
818
+ return null;
819
+ return normalizePackageName(match[1]);
820
+ }
821
+ function containsFastapiInPyproject(content) {
822
+ for (const line of content.split("\n")) {
823
+ const keyMatch = line.match(/^\s*([A-Za-z0-9_.-]+)\s*=/);
824
+ if (keyMatch) {
825
+ const key = normalizePackageName(keyMatch[1]);
826
+ if (key === "fastapi") {
827
+ return true;
828
+ }
829
+ if (key !== "dependencies") {
830
+ continue;
831
+ }
832
+ }
833
+ const quotedSpecRe = /["']([^"']+)["']/g;
834
+ let match;
835
+ while ((match = quotedSpecRe.exec(line)) !== null) {
836
+ if (extractRequirementName(match[1]) === "fastapi") {
837
+ return true;
838
+ }
839
+ }
840
+ }
841
+ return false;
842
+ }
843
+ function containsDirectSpringBootReference(relativePath, content) {
844
+ if (relativePath.endsWith("pom.xml")) {
845
+ return /<groupId>\s*org\.springframework\.boot\s*<\/groupId>/i.test(content);
846
+ }
847
+ if (relativePath.endsWith("build.gradle") || relativePath.endsWith("build.gradle.kts")) {
848
+ return /(id\s*\(?\s*["']org\.springframework\.boot["']|apply\s*\(?\s*plugin\s*[:=]\s*["']org\.springframework\.boot["']|(?:implementation|api|compileOnly|runtimeOnly|testImplementation|annotationProcessor|kapt)\s*\(?\s*["'][^"']*org\.springframework\.boot:[^"']*spring-boot[^"']*["'])/i.test(content);
849
+ }
850
+ return false;
851
+ }
852
+ function extractPyprojectDependencySections(content) {
853
+ const lines = content.split("\n");
854
+ const collected = [];
855
+ let section = "";
856
+ let collectingProjectDeps = false;
857
+ let collectingOptionalDeps = false;
858
+ let bracketDepth = 0;
859
+ for (const line of lines) {
860
+ const trimmed = line.trim();
861
+ if (collectingProjectDeps) {
862
+ collected.push(line);
863
+ bracketDepth += countChar(line, "[") - countChar(line, "]");
864
+ if (bracketDepth <= 0) {
865
+ collectingProjectDeps = false;
866
+ }
867
+ continue;
868
+ }
869
+ if (collectingOptionalDeps) {
870
+ collected.push(line);
871
+ bracketDepth += countChar(line, "[") - countChar(line, "]");
872
+ if (bracketDepth <= 0) {
873
+ collectingOptionalDeps = false;
874
+ }
875
+ continue;
876
+ }
877
+ const sectionMatch = trimmed.match(/^\[([^\]]+)\]$/);
878
+ if (sectionMatch) {
879
+ section = sectionMatch[1].trim();
880
+ continue;
881
+ }
882
+ if (section === "project" && /^dependencies\s*=\s*\[/.test(trimmed)) {
883
+ collected.push(line);
884
+ bracketDepth = countChar(line, "[") - countChar(line, "]");
885
+ collectingProjectDeps = bracketDepth > 0;
886
+ continue;
887
+ }
888
+ if (section === "project.optional-dependencies" ||
889
+ section === "tool.poetry.dependencies") {
890
+ if (section === "project.optional-dependencies") {
891
+ const equalsIndex = line.indexOf("=");
892
+ if (equalsIndex !== -1) {
893
+ const value = line.slice(equalsIndex + 1);
894
+ collected.push(value);
895
+ bracketDepth = countChar(value, "[") - countChar(value, "]");
896
+ collectingOptionalDeps = bracketDepth > 0;
897
+ }
898
+ }
899
+ else {
900
+ collected.push(line);
901
+ }
902
+ }
903
+ }
904
+ return collected.join("\n");
905
+ }
906
+ function countChar(text, char) {
907
+ return [...text].filter((c) => c === char).length;
908
+ }
909
+ function normalizePackageName(name) {
910
+ return name.toLowerCase().replace(/[_.]/g, "-");
911
+ }
912
+ function normalizePluginAlias(alias) {
913
+ return alias.toLowerCase().replace(/[-_]/g, ".");
914
+ }
915
+ function versionCatalogAccessorName(relativePath) {
916
+ const normalized = relativePath.replaceAll("\\", "/");
917
+ const basename = normalized.slice(normalized.lastIndexOf("/") + 1);
918
+ return basename.replace(/\.versions\.toml$/i, "").toLowerCase();
919
+ }
920
+ function resolveVersionCatalogAccessors(basePath, versionCatalogFiles, settingsFiles) {
921
+ const accessors = new Set(versionCatalogFiles.map(versionCatalogAccessorName).filter(Boolean));
922
+ if (versionCatalogFiles.length === 0 || settingsFiles.length === 0) {
923
+ return accessors;
924
+ }
925
+ for (const settingsFile of settingsFiles) {
926
+ try {
927
+ const raw = readBounded(join(basePath, settingsFile), 64 * 1024);
928
+ const content = stripDependencyComments(settingsFile, raw);
929
+ const createRe = /create\(\s*["']([A-Za-z0-9_]+)["']\s*\)\s*\{[\s\S]*?([A-Za-z0-9_.-]+\.versions\.toml)["']?\s*\)\s*\)/g;
930
+ let match;
931
+ while ((match = createRe.exec(content)) !== null) {
932
+ const accessor = match[1].toLowerCase();
933
+ const catalogBasename = match[2].replaceAll("\\", "/").split("/").pop();
934
+ if (versionCatalogFiles.some((file) => {
935
+ const normalized = file.replaceAll("\\", "/");
936
+ return normalized === catalogBasename || normalized.endsWith(`/${catalogBasename}`);
937
+ })) {
938
+ accessors.add(accessor);
939
+ }
940
+ }
941
+ }
942
+ catch {
943
+ // unreadable settings file — ignore
944
+ }
945
+ }
946
+ return accessors;
947
+ }
948
+ function scanProjectFiles(basePath) {
949
+ const files = [];
950
+ const queue = [{ path: basePath, depth: 0 }];
951
+ while (queue.length > 0 && files.length < MAX_RECURSIVE_SCAN_FILES) {
952
+ const current = queue.shift();
953
+ let entries;
954
+ try {
955
+ entries = readdirSync(current.path, { withFileTypes: true, encoding: "utf8" });
956
+ }
957
+ catch {
958
+ continue;
959
+ }
960
+ for (const entry of entries) {
961
+ const entryPath = join(current.path, entry.name);
962
+ const relativePath = entryPath.slice(basePath.length + 1);
963
+ if (entry.isDirectory()) {
964
+ if (current.depth < MAX_RECURSIVE_SCAN_DEPTH && !RECURSIVE_SCAN_IGNORED_DIRS.has(entry.name)) {
965
+ queue.push({ path: entryPath, depth: current.depth + 1 });
966
+ }
967
+ continue;
968
+ }
969
+ if (!entry.isFile())
970
+ continue;
971
+ files.push(relativePath);
972
+ if (files.length >= MAX_RECURSIVE_SCAN_FILES)
973
+ break;
974
+ }
975
+ }
976
+ return files;
977
+ }
@@ -1,6 +1,7 @@
1
1
  // GSD Dispatch Guard — prevents out-of-order slice dispatch
2
2
  import { resolveMilestoneFile } from "./paths.js";
3
3
  import { findMilestoneIds } from "./guided-flow.js";
4
+ import { parseUnitId } from "./unit-id.js";
4
5
  import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
5
6
  import { parseRoadmap } from "./parsers-legacy.js";
6
7
  import { readFileSync } from "node:fs";
@@ -14,7 +15,7 @@ const SLICE_DISPATCH_TYPES = new Set([
14
15
  export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unitId) {
15
16
  if (!SLICE_DISPATCH_TYPES.has(unitType))
16
17
  return null;
17
- const [targetMid, targetSid] = unitId.split("/");
18
+ const { milestone: targetMid, slice: targetSid } = parseUnitId(unitId);
18
19
  if (!targetMid || !targetSid)
19
20
  return null;
20
21
  // Use findMilestoneIds to respect custom queue order.