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
@@ -6,7 +6,7 @@
6
6
  * flow to show when entering a project directory.
7
7
  */
8
8
 
9
- import { existsSync, openSync, readSync, closeSync, readdirSync, readFileSync, statSync } from "node:fs";
9
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
10
10
  import { join } from "node:path";
11
11
  import { homedir } from "node:os";
12
12
  import { gsdRoot } from "./paths.js";
@@ -48,9 +48,6 @@ export interface V2Detection {
48
48
  hasContext: boolean;
49
49
  }
50
50
 
51
- /** Apple platform SDKROOTs found in Xcode project.pbxproj files. */
52
- export type XcodePlatform = "iphoneos" | "macosx" | "watchos" | "appletvos" | "xros";
53
-
54
51
  export interface ProjectSignals {
55
52
  /** Detected project/package files */
56
53
  detectedFiles: string[];
@@ -60,8 +57,6 @@ export interface ProjectSignals {
60
57
  isMonorepo: boolean;
61
58
  /** Primary language hint */
62
59
  primaryLanguage?: string;
63
- /** Apple platform SDKROOTs detected from *.xcodeproj/project.pbxproj */
64
- xcodePlatforms: XcodePlatform[];
65
60
  /** Has existing CI configuration? */
66
61
  hasCI: boolean;
67
62
  /** Has existing test setup? */
@@ -102,81 +97,10 @@ export const PROJECT_FILES = [
102
97
  "project.yml",
103
98
  ".xcodeproj",
104
99
  ".xcworkspace",
105
- // Cloud platform config files
106
- "firebase.json",
107
- "cdk.json",
108
- "samconfig.toml",
109
- "serverless.yml",
110
- "serverless.yaml",
111
- "azure-pipelines.yml",
112
- // Database / ORM config files
113
- "prisma/schema.prisma",
114
- "supabase/config.toml",
115
- "drizzle.config.ts",
116
- "drizzle.config.js",
117
- "redis.conf",
118
- // React Native markers
119
- "metro.config.js",
120
- "metro.config.ts",
121
- "react-native.config.js",
122
- // Frontend framework config files
123
- "angular.json",
124
- "next.config.js",
125
- "next.config.ts",
126
- "next.config.mjs",
127
- "nuxt.config.ts",
128
- "nuxt.config.js",
129
- "svelte.config.js",
130
- "svelte.config.ts",
131
- // Vue CLI config files
132
- "vue.config.js",
133
- "vue.config.ts",
134
- // Frontend tooling
135
- "tailwind.config.js",
136
- "tailwind.config.ts",
137
- "tailwind.config.mjs",
138
- "tailwind.config.cjs",
139
- // Android project markers
140
- "app/build.gradle",
141
- "app/build.gradle.kts",
142
- // Container / DevOps config files
100
+ // Docker
143
101
  "Dockerfile",
144
- "docker-compose.yml",
145
- "docker-compose.yaml",
146
- // Infrastructure as Code
147
- "main.tf",
148
- // Kubernetes / Helm markers
149
- "Chart.yaml",
150
- "kustomization.yaml",
151
- // CI/CD markers
152
- ".github/workflows",
153
- // Blockchain / Web3 markers
154
- "hardhat.config.js",
155
- "hardhat.config.ts",
156
- "foundry.toml",
157
- // Data engineering markers
158
- "dbt_project.yml",
159
- "airflow.cfg",
160
- // Game engine markers
161
- "ProjectSettings/ProjectVersion.txt",
162
- "project.godot",
163
- // Python framework markers
164
- "manage.py",
165
- "requirements.txt",
166
102
  ] as const;
167
103
 
168
- /** File extensions that indicate SQLite databases in the project. */
169
- const SQLITE_EXTENSIONS = [".sqlite", ".sqlite3", ".db"] as const;
170
-
171
- /** File extensions that indicate SQL usage (migrations, schemas, seeds). */
172
- const SQL_EXTENSIONS = [".sql"] as const;
173
-
174
- /** File extensions that indicate .NET / C# projects. */
175
- const DOTNET_EXTENSIONS = [".csproj", ".sln", ".fsproj"] as const;
176
-
177
- /** File extensions that indicate Vue.js single-file components. */
178
- const VUE_EXTENSIONS = [".vue"] as const;
179
-
180
104
  const LANGUAGE_MAP: Record<string, string> = {
181
105
  "package.json": "javascript/typescript",
182
106
  "Cargo.toml": "rust",
@@ -187,8 +111,6 @@ const LANGUAGE_MAP: Record<string, string> = {
187
111
  "pom.xml": "java",
188
112
  "build.gradle": "java/kotlin",
189
113
  "build.gradle.kts": "kotlin",
190
- "app/build.gradle": "java/kotlin",
191
- "app/build.gradle.kts": "kotlin",
192
114
  "CMakeLists.txt": "c/c++",
193
115
  "composer.json": "php",
194
116
  "pubspec.yaml": "dart/flutter",
@@ -203,8 +125,6 @@ const LANGUAGE_MAP: Record<string, string> = {
203
125
  ".xcodeproj": "swift/xcode",
204
126
  ".xcworkspace": "swift/xcode",
205
127
  "Dockerfile": "docker",
206
- "manage.py": "python",
207
- "requirements.txt": "python",
208
128
  };
209
129
 
210
130
  const MONOREPO_MARKERS = [
@@ -239,44 +159,6 @@ const TEST_MARKERS = [
239
159
  "phpunit.xml",
240
160
  ] as const;
241
161
 
242
- /** Directories skipped during bounded recursive project scans. */
243
- const RECURSIVE_SCAN_IGNORED_DIRS = new Set([
244
- ".git",
245
- "node_modules",
246
- ".venv",
247
- "venv",
248
- "dist",
249
- "build",
250
- "coverage",
251
- ".next",
252
- ".nuxt",
253
- "target",
254
- "vendor",
255
- ".turbo",
256
- "Pods",
257
- "bin",
258
- "obj",
259
- ".gradle",
260
- "DerivedData",
261
- "out",
262
- ]) as ReadonlySet<string>;
263
-
264
- /** Project file markers safe to detect recursively via suffix matching. */
265
- const ROOT_ONLY_PROJECT_FILES = new Set<string>([
266
- ".github/workflows",
267
- "package.json",
268
- "Gemfile",
269
- "Makefile",
270
- "CMakeLists.txt",
271
- "build.gradle",
272
- "build.gradle.kts",
273
- "deno.json",
274
- "deno.jsonc",
275
- ]);
276
-
277
- const MAX_RECURSIVE_SCAN_FILES = 2000;
278
- const MAX_RECURSIVE_SCAN_DEPTH = 6;
279
-
280
162
  // ─── Core Detection ─────────────────────────────────────────────────────────────
281
163
 
282
164
  /**
@@ -398,88 +280,9 @@ export function detectProjectSignals(basePath: string): ProjectSignals {
398
280
  }
399
281
  }
400
282
 
401
- // Bounded recursive scan for nested markers and dependency files.
402
- // This covers common brownfield layouts like src/App/App.csproj,
403
- // db/migrations/*.sql, src/components/*.vue, and services/api/pyproject.toml
404
- // without walking the entire repo or diving into heavyweight folders.
405
- const scannedFiles = scanProjectFiles(basePath);
406
-
407
- for (const file of PROJECT_FILES) {
408
- if (detectedFiles.includes(file) || ROOT_ONLY_PROJECT_FILES.has(file)) continue;
409
- const hasMatch = file === "requirements.txt"
410
- ? scannedFiles.some(isPythonRequirementsFile)
411
- : scannedFiles.some((scannedFile) => matchesProjectFileMarker(scannedFile, file));
412
- if (hasMatch) {
413
- pushUnique(detectedFiles, file);
414
- if (!primaryLanguage && LANGUAGE_MAP[file]) {
415
- primaryLanguage = LANGUAGE_MAP[file];
416
- }
417
- }
418
- }
419
-
420
- if (scannedFiles.some((file) => SQLITE_EXTENSIONS.some((ext) => file.endsWith(ext)))) {
421
- pushUnique(detectedFiles, "*.sqlite");
422
- }
423
- if (scannedFiles.some((file) => SQL_EXTENSIONS.some((ext) => file.endsWith(ext)))) {
424
- pushUnique(detectedFiles, "*.sql");
425
- }
426
-
427
- const hasCsproj = scannedFiles.some((file) => file.endsWith(".csproj"));
428
- const hasFsproj = scannedFiles.some((file) => file.endsWith(".fsproj"));
429
- const hasSln = scannedFiles.some((file) => file.endsWith(".sln"));
430
-
431
- if (hasCsproj) {
432
- pushUnique(detectedFiles, "*.csproj");
433
- if (!primaryLanguage) primaryLanguage = "csharp";
434
- }
435
- if (hasFsproj) {
436
- pushUnique(detectedFiles, "*.fsproj");
437
- if (!primaryLanguage) primaryLanguage = "fsharp";
438
- }
439
- if (hasSln) {
440
- pushUnique(detectedFiles, "*.sln");
441
- if (!primaryLanguage) primaryLanguage = "dotnet";
442
- }
443
-
444
- if (scannedFiles.some((file) => VUE_EXTENSIONS.some((ext) => file.endsWith(ext)))) {
445
- pushUnique(detectedFiles, "*.vue");
446
- }
447
-
448
- // Python framework detection — scan dependency files for framework-specific packages.
449
- // Adds synthetic markers (e.g. "dep:fastapi") so skill catalog matchFiles can reference them.
450
- const dependencyFiles = scannedFiles.filter((file) =>
451
- isPythonRequirementsFile(file) || file.endsWith("pyproject.toml"),
452
- );
453
- if (containsFastapiDependency(basePath, dependencyFiles)) {
454
- pushUnique(detectedFiles, "dep:fastapi");
455
- }
456
-
457
- const springBootBuildFiles = scannedFiles.filter((file) =>
458
- file.endsWith("pom.xml") || file.endsWith("build.gradle") || file.endsWith("build.gradle.kts"),
459
- );
460
- const springBootVersionCatalogs = scannedFiles.filter((file) => file.endsWith(".versions.toml"));
461
- const springBootSettingsFiles = scannedFiles.filter((file) =>
462
- file.endsWith("settings.gradle") || file.endsWith("settings.gradle.kts"),
463
- );
464
- if (containsSpringBootMarker(basePath, springBootBuildFiles, springBootVersionCatalogs, springBootSettingsFiles)) {
465
- pushUnique(detectedFiles, "dep:spring-boot");
466
- if (!primaryLanguage) {
467
- primaryLanguage = "java/kotlin";
468
- }
469
- }
470
-
471
283
  // Git repo detection
472
284
  const isGitRepo = existsSync(join(basePath, ".git"));
473
285
 
474
- // Xcode platform detection — parse SDKROOT from project.pbxproj
475
- const xcodePlatforms = detectXcodePlatforms(basePath);
476
-
477
- // Set primaryLanguage to swift when an Xcode project is found but no
478
- // Package.swift was detected (CocoaPods or SPM-less projects).
479
- if (!primaryLanguage && xcodePlatforms.length > 0) {
480
- primaryLanguage = "swift";
481
- }
482
-
483
286
  // Monorepo detection
484
287
  let isMonorepo = false;
485
288
  for (const marker of MONOREPO_MARKERS) {
@@ -522,7 +325,6 @@ export function detectProjectSignals(basePath: string): ProjectSignals {
522
325
  isGitRepo,
523
326
  isMonorepo,
524
327
  primaryLanguage,
525
- xcodePlatforms,
526
328
  hasCI,
527
329
  hasTests,
528
330
  packageManager,
@@ -530,100 +332,6 @@ export function detectProjectSignals(basePath: string): ProjectSignals {
530
332
  };
531
333
  }
532
334
 
533
- // ─── Xcode Platform Detection ───────────────────────────────────────────────────
534
-
535
- /** Known SDKROOT values → canonical platform names. */
536
- const SDKROOT_MAP: Record<string, XcodePlatform> = {
537
- iphoneos: "iphoneos",
538
- iphonesimulator: "iphoneos", // simulator builds still target iOS
539
- macosx: "macosx",
540
- watchos: "watchos",
541
- watchsimulator: "watchos",
542
- appletvos: "appletvos",
543
- appletvsimulator: "appletvos",
544
- xros: "xros",
545
- xrsimulator: "xros",
546
- };
547
-
548
- /** Regex for SUPPORTED_PLATFORMS — fallback when SDKROOT = auto (Xcode 15+). */
549
- const SUPPORTED_PLATFORMS_RE = /SUPPORTED_PLATFORMS\s*=\s*"([^"]+)"/gi;
550
-
551
- /** Read at most `maxBytes` from a file without loading the full file into memory. */
552
- function readBounded(filePath: string, maxBytes: number): string {
553
- const buf = Buffer.alloc(maxBytes);
554
- const fd = openSync(filePath, "r");
555
- try {
556
- const bytesRead = readSync(fd, buf, 0, maxBytes, 0);
557
- return buf.toString("utf-8", 0, bytesRead);
558
- } finally {
559
- closeSync(fd);
560
- }
561
- }
562
-
563
- /** Common subdirectories where .xcodeproj may live in monorepos / standard layouts. */
564
- const XCODE_SUBDIRS = ["ios", "macos", "app", "apps"] as const;
565
-
566
- /**
567
- * Scan *.xcodeproj directories for project.pbxproj and extract SDKROOT values.
568
- * Returns deduplicated, canonical platform list (e.g. ["iphoneos"]).
569
- *
570
- * Reading the pbxproj is a lightweight regex scan — no full plist parsing needed.
571
- * We read at most 1 MB per file to keep detection fast.
572
- * Searches both the project root and common subdirectories (ios/, macos/, app/).
573
- */
574
- function detectXcodePlatforms(basePath: string): XcodePlatform[] {
575
- const platforms = new Set<XcodePlatform>();
576
-
577
- // Directories to scan: project root + common subdirs
578
- const dirsToScan = [basePath];
579
- for (const sub of XCODE_SUBDIRS) {
580
- const subPath = join(basePath, sub);
581
- if (existsSync(subPath)) dirsToScan.push(subPath);
582
- }
583
-
584
- for (const dir of dirsToScan) {
585
- try {
586
- const entries = readdirSync(dir, { withFileTypes: true });
587
- for (const entry of entries) {
588
- if (!entry.isDirectory() || !entry.name.endsWith(".xcodeproj")) continue;
589
- const pbxprojPath = join(dir, entry.name, "project.pbxproj");
590
- try {
591
- const content = readBounded(pbxprojPath, 1024 * 1024);
592
- // Match SDKROOT = <value>; — both quoted and unquoted forms
593
- const sdkRe = /SDKROOT\s*=\s*"?([a-z]+)"?\s*;/gi;
594
- let m: RegExpExecArray | null;
595
- let foundExplicit = false;
596
- while ((m = sdkRe.exec(content)) !== null) {
597
- const val = m[1].toLowerCase();
598
- if (val === "auto") continue; // handled below via SUPPORTED_PLATFORMS
599
- const canonical = SDKROOT_MAP[val];
600
- if (canonical) {
601
- platforms.add(canonical);
602
- foundExplicit = true;
603
- }
604
- }
605
- // Xcode 15+ defaults SDKROOT to "auto"; fall back to SUPPORTED_PLATFORMS
606
- if (!foundExplicit) {
607
- let sp: RegExpExecArray | null;
608
- while ((sp = SUPPORTED_PLATFORMS_RE.exec(content)) !== null) {
609
- for (const tok of sp[1].split(/\s+/)) {
610
- const canonical = SDKROOT_MAP[tok.toLowerCase()];
611
- if (canonical) platforms.add(canonical);
612
- }
613
- }
614
- SUPPORTED_PLATFORMS_RE.lastIndex = 0;
615
- }
616
- } catch {
617
- // unreadable pbxproj — skip
618
- }
619
- }
620
- } catch {
621
- // unreadable directory
622
- }
623
- }
624
- return [...platforms];
625
- }
626
-
627
335
  // ─── Package Manager Detection ──────────────────────────────────────────────────
628
336
 
629
337
  function detectPackageManager(basePath: string): string | undefined {
@@ -684,7 +392,7 @@ function detectVerificationCommands(
684
392
  commands.push("go vet ./...");
685
393
  }
686
394
 
687
- if (detectedFiles.includes("pyproject.toml") || detectedFiles.includes("setup.py") || detectedFiles.includes("requirements.txt")) {
395
+ if (detectedFiles.includes("pyproject.toml") || detectedFiles.includes("setup.py")) {
688
396
  commands.push("pytest");
689
397
  }
690
398
 
@@ -779,370 +487,3 @@ function readMakefileTargets(basePath: string): string[] {
779
487
  return [];
780
488
  }
781
489
  }
782
-
783
- function pushUnique(arr: string[], value: string): void {
784
- if (!arr.includes(value)) arr.push(value);
785
- }
786
-
787
- function matchesProjectFileMarker(scannedFile: string, marker: string): boolean {
788
- const normalized = scannedFile.replaceAll("\\", "/");
789
- return (
790
- normalized === marker ||
791
- normalized.endsWith(`/${marker}`)
792
- );
793
- }
794
-
795
- function isPythonRequirementsFile(relativePath: string): boolean {
796
- const normalized = relativePath.replaceAll("\\", "/");
797
- const basename = normalized.slice(normalized.lastIndexOf("/") + 1);
798
- return (
799
- basename === "requirements.txt" ||
800
- basename === "requirements.in" ||
801
- /^requirements([-.].+)?\.(txt|in)$/i.test(basename) ||
802
- /(^|\/)requirements\/.+\.(txt|in)$/i.test(normalized)
803
- );
804
- }
805
-
806
- function containsFastapiDependency(basePath: string, relativePaths: string[]): boolean {
807
- for (const relativePath of relativePaths) {
808
- try {
809
- const raw = readBounded(join(basePath, relativePath), 64 * 1024);
810
- const content = extractDependencyContent(relativePath, raw);
811
- if (isPythonRequirementsFile(relativePath)) {
812
- for (const line of content.split("\n")) {
813
- if (extractRequirementName(line) === "fastapi") return true;
814
- }
815
- continue;
816
- }
817
-
818
- if (relativePath.endsWith("pyproject.toml")) {
819
- if (containsFastapiInPyproject(content)) return true;
820
- }
821
- } catch {
822
- // unreadable file — continue scanning other candidate files
823
- }
824
- }
825
-
826
- return false;
827
- }
828
-
829
- function containsSpringBootMarker(
830
- basePath: string,
831
- buildFiles: string[],
832
- versionCatalogFiles: string[],
833
- settingsFiles: string[],
834
- ): boolean {
835
- const usedPluginAliases = new Set<string>();
836
- const usedLibraryAliases = new Set<string>();
837
- const catalogAccessors = resolveVersionCatalogAccessors(basePath, versionCatalogFiles, settingsFiles);
838
-
839
- for (const relativePath of buildFiles) {
840
- try {
841
- const raw = readBounded(join(basePath, relativePath), 64 * 1024);
842
- const content = stripDependencyComments(relativePath, raw);
843
- if (containsDirectSpringBootReference(relativePath, content)) {
844
- return true;
845
- }
846
-
847
- const normalized = content.toLowerCase();
848
- let match: RegExpExecArray | null;
849
- for (const accessor of catalogAccessors) {
850
- const aliasRe = new RegExp(`alias\\(\\s*${accessor}\\.plugins\\.([a-z0-9_.-]+)\\s*\\)`, "gi");
851
- while ((match = aliasRe.exec(normalized)) !== null) {
852
- usedPluginAliases.add(normalizePluginAlias(match[1]));
853
- }
854
-
855
- const libraryAliasRe = new RegExp(`\\b${accessor}\\.((?!plugins\\b)[a-z0-9_.-]+)`, "gi");
856
- while ((match = libraryAliasRe.exec(normalized)) !== null) {
857
- usedLibraryAliases.add(normalizePluginAlias(match[1]));
858
- }
859
- }
860
- } catch {
861
- // unreadable build file — continue scanning others
862
- }
863
- }
864
-
865
- if (usedPluginAliases.size === 0 && usedLibraryAliases.size === 0) {
866
- return false;
867
- }
868
- if (versionCatalogFiles.length === 0) {
869
- return false;
870
- }
871
-
872
- const springBootAliases = new Set<string>();
873
- const springBootLibraries = new Set<string>();
874
- const pendingSpringBootBundles: Array<{ bundleAlias: string; referencedAliases: string[] }> = [];
875
- for (const relativePath of versionCatalogFiles) {
876
- try {
877
- const raw = readBounded(join(basePath, relativePath), 64 * 1024);
878
- const content = stripDependencyComments(relativePath, raw);
879
- const aliasRe = /^\s*([A-Za-z0-9_.-]+)\s*=\s*\{[^\n}]*\bid\s*=\s*["']org\.springframework\.boot["'][^\n}]*\}/gm;
880
- let match: RegExpExecArray | null;
881
- while ((match = aliasRe.exec(content)) !== null) {
882
- springBootAliases.add(normalizePluginAlias(match[1]));
883
- }
884
-
885
- 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;
886
- while ((match = libraryRe.exec(content)) !== null) {
887
- springBootLibraries.add(normalizePluginAlias(match[1]));
888
- }
889
-
890
- const bundleRe = /^\s*([A-Za-z0-9_.-]+)\s*=\s*\[([\s\S]*?)\]/gm;
891
- while ((match = bundleRe.exec(content)) !== null) {
892
- pendingSpringBootBundles.push({
893
- bundleAlias: normalizePluginAlias(`bundles.${match[1]}`),
894
- referencedAliases: match[2]
895
- .split(",")
896
- .map((part) => normalizePluginAlias(part.replace(/["'\s]/g, "")))
897
- .filter(Boolean),
898
- });
899
- }
900
- } catch {
901
- // unreadable version catalog — continue scanning others
902
- }
903
- }
904
-
905
- const springBootBundles = new Set<string>();
906
- for (const pendingBundle of pendingSpringBootBundles) {
907
- if (pendingBundle.referencedAliases.some((alias) => springBootLibraries.has(alias))) {
908
- springBootBundles.add(pendingBundle.bundleAlias);
909
- }
910
- }
911
-
912
- for (const alias of usedPluginAliases) {
913
- if (springBootAliases.has(alias)) return true;
914
- }
915
- for (const alias of usedLibraryAliases) {
916
- if (springBootLibraries.has(alias) || springBootBundles.has(alias)) return true;
917
- }
918
-
919
- return false;
920
- }
921
-
922
- function stripDependencyComments(relativePath: string, content: string): string {
923
- if (relativePath.endsWith("requirements.txt")) {
924
- return content.replace(/(^|\s)#.*$/gm, "");
925
- }
926
- if (relativePath.endsWith("pyproject.toml")) {
927
- return content.replace(/(^|\s)#.*$/gm, "");
928
- }
929
- if (relativePath.endsWith(".versions.toml")) {
930
- return content.replace(/(^|\s)#.*$/gm, "");
931
- }
932
- if (relativePath.endsWith("settings.gradle") || relativePath.endsWith("settings.gradle.kts")) {
933
- return content
934
- .replace(/\/\*[\s\S]*?\*\//g, "")
935
- .replace(/\/\/.*$/gm, "");
936
- }
937
- if (relativePath.endsWith("pom.xml")) {
938
- return content.replace(/<!--[\s\S]*?-->/g, "");
939
- }
940
- if (relativePath.endsWith("build.gradle") || relativePath.endsWith("build.gradle.kts")) {
941
- return content
942
- .replace(/\/\*[\s\S]*?\*\//g, "")
943
- .replace(/\/\/.*$/gm, "");
944
- }
945
- return content;
946
- }
947
-
948
- function extractDependencyContent(relativePath: string, content: string): string {
949
- const stripped = stripDependencyComments(relativePath, content);
950
- if (relativePath.endsWith("pyproject.toml")) {
951
- return extractPyprojectDependencySections(stripped);
952
- }
953
- return stripped;
954
- }
955
-
956
- function extractRequirementName(spec: string): string | null {
957
- const trimmed = spec.trim().replace(/^["']|["']$/g, "");
958
- if (!trimmed) return null;
959
-
960
- const match = trimmed.match(/^([A-Za-z0-9_.-]+)(?:\[[^\]]+\])?(?=\s*(?:@|[<>=!~;]|$))/);
961
- if (!match) return null;
962
- return normalizePackageName(match[1]);
963
- }
964
-
965
- function containsFastapiInPyproject(content: string): boolean {
966
- for (const line of content.split("\n")) {
967
- const keyMatch = line.match(/^\s*([A-Za-z0-9_.-]+)\s*=/);
968
- if (keyMatch) {
969
- const key = normalizePackageName(keyMatch[1]);
970
- if (key === "fastapi") {
971
- return true;
972
- }
973
- if (key !== "dependencies") {
974
- continue;
975
- }
976
- }
977
-
978
- const quotedSpecRe = /["']([^"']+)["']/g;
979
- let match: RegExpExecArray | null;
980
- while ((match = quotedSpecRe.exec(line)) !== null) {
981
- if (extractRequirementName(match[1]) === "fastapi") {
982
- return true;
983
- }
984
- }
985
- }
986
-
987
- return false;
988
- }
989
-
990
- function containsDirectSpringBootReference(relativePath: string, content: string): boolean {
991
- if (relativePath.endsWith("pom.xml")) {
992
- return /<groupId>\s*org\.springframework\.boot\s*<\/groupId>/i.test(content);
993
- }
994
-
995
- if (relativePath.endsWith("build.gradle") || relativePath.endsWith("build.gradle.kts")) {
996
- 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);
997
- }
998
-
999
- return false;
1000
- }
1001
-
1002
- function extractPyprojectDependencySections(content: string): string {
1003
- const lines = content.split("\n");
1004
- const collected: string[] = [];
1005
- let section = "";
1006
- let collectingProjectDeps = false;
1007
- let collectingOptionalDeps = false;
1008
- let bracketDepth = 0;
1009
-
1010
- for (const line of lines) {
1011
- const trimmed = line.trim();
1012
-
1013
- if (collectingProjectDeps) {
1014
- collected.push(line);
1015
- bracketDepth += countChar(line, "[") - countChar(line, "]");
1016
- if (bracketDepth <= 0) {
1017
- collectingProjectDeps = false;
1018
- }
1019
- continue;
1020
- }
1021
-
1022
- if (collectingOptionalDeps) {
1023
- collected.push(line);
1024
- bracketDepth += countChar(line, "[") - countChar(line, "]");
1025
- if (bracketDepth <= 0) {
1026
- collectingOptionalDeps = false;
1027
- }
1028
- continue;
1029
- }
1030
-
1031
- const sectionMatch = trimmed.match(/^\[([^\]]+)\]$/);
1032
- if (sectionMatch) {
1033
- section = sectionMatch[1].trim();
1034
- continue;
1035
- }
1036
-
1037
- if (section === "project" && /^dependencies\s*=\s*\[/.test(trimmed)) {
1038
- collected.push(line);
1039
- bracketDepth = countChar(line, "[") - countChar(line, "]");
1040
- collectingProjectDeps = bracketDepth > 0;
1041
- continue;
1042
- }
1043
-
1044
- if (
1045
- section === "project.optional-dependencies" ||
1046
- section === "tool.poetry.dependencies"
1047
- ) {
1048
- if (section === "project.optional-dependencies") {
1049
- const equalsIndex = line.indexOf("=");
1050
- if (equalsIndex !== -1) {
1051
- const value = line.slice(equalsIndex + 1);
1052
- collected.push(value);
1053
- bracketDepth = countChar(value, "[") - countChar(value, "]");
1054
- collectingOptionalDeps = bracketDepth > 0;
1055
- }
1056
- } else {
1057
- collected.push(line);
1058
- }
1059
- }
1060
- }
1061
-
1062
- return collected.join("\n");
1063
- }
1064
-
1065
- function countChar(text: string, char: string): number {
1066
- return [...text].filter((c) => c === char).length;
1067
- }
1068
-
1069
- function normalizePackageName(name: string): string {
1070
- return name.toLowerCase().replace(/[_.]/g, "-");
1071
- }
1072
-
1073
- function normalizePluginAlias(alias: string): string {
1074
- return alias.toLowerCase().replace(/[-_]/g, ".");
1075
- }
1076
-
1077
- function versionCatalogAccessorName(relativePath: string): string {
1078
- const normalized = relativePath.replaceAll("\\", "/");
1079
- const basename = normalized.slice(normalized.lastIndexOf("/") + 1);
1080
- return basename.replace(/\.versions\.toml$/i, "").toLowerCase();
1081
- }
1082
-
1083
- function resolveVersionCatalogAccessors(
1084
- basePath: string,
1085
- versionCatalogFiles: string[],
1086
- settingsFiles: string[],
1087
- ): Set<string> {
1088
- const accessors = new Set(versionCatalogFiles.map(versionCatalogAccessorName).filter(Boolean));
1089
- if (versionCatalogFiles.length === 0 || settingsFiles.length === 0) {
1090
- return accessors;
1091
- }
1092
-
1093
- for (const settingsFile of settingsFiles) {
1094
- try {
1095
- const raw = readBounded(join(basePath, settingsFile), 64 * 1024);
1096
- const content = stripDependencyComments(settingsFile, raw);
1097
- const createRe = /create\(\s*["']([A-Za-z0-9_]+)["']\s*\)\s*\{[\s\S]*?([A-Za-z0-9_.-]+\.versions\.toml)["']?\s*\)\s*\)/g;
1098
- let match: RegExpExecArray | null;
1099
- while ((match = createRe.exec(content)) !== null) {
1100
- const accessor = match[1].toLowerCase();
1101
- const catalogBasename = match[2].replaceAll("\\", "/").split("/").pop()!;
1102
- if (versionCatalogFiles.some((file) => {
1103
- const normalized = file.replaceAll("\\", "/");
1104
- return normalized === catalogBasename || normalized.endsWith(`/${catalogBasename}`);
1105
- })) {
1106
- accessors.add(accessor);
1107
- }
1108
- }
1109
- } catch {
1110
- // unreadable settings file — ignore
1111
- }
1112
- }
1113
-
1114
- return accessors;
1115
- }
1116
-
1117
- function scanProjectFiles(basePath: string): string[] {
1118
- const files: string[] = [];
1119
- const queue: Array<{ path: string; depth: number }> = [{ path: basePath, depth: 0 }];
1120
-
1121
- while (queue.length > 0 && files.length < MAX_RECURSIVE_SCAN_FILES) {
1122
- const current = queue.shift()!;
1123
- let entries: Array<{ name: string; isDirectory(): boolean; isFile(): boolean }>;
1124
- try {
1125
- entries = readdirSync(current.path, { withFileTypes: true, encoding: "utf8" });
1126
- } catch {
1127
- continue;
1128
- }
1129
-
1130
- for (const entry of entries) {
1131
- const entryPath = join(current.path, entry.name);
1132
- const relativePath = entryPath.slice(basePath.length + 1);
1133
-
1134
- if (entry.isDirectory()) {
1135
- if (current.depth < MAX_RECURSIVE_SCAN_DEPTH && !RECURSIVE_SCAN_IGNORED_DIRS.has(entry.name)) {
1136
- queue.push({ path: entryPath, depth: current.depth + 1 });
1137
- }
1138
- continue;
1139
- }
1140
-
1141
- if (!entry.isFile()) continue;
1142
- files.push(relativePath);
1143
- if (files.length >= MAX_RECURSIVE_SCAN_FILES) break;
1144
- }
1145
- }
1146
-
1147
- return files;
1148
- }