gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c

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 (568) hide show
  1. package/dist/cli.js +13 -1
  2. package/dist/help-text.js +24 -0
  3. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  4. package/dist/resources/extensions/github-sync/sync.js +2 -1
  5. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  7. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  8. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  11. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  12. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  13. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  14. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  15. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  16. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  17. package/dist/resources/extensions/gsd/auto.js +1 -4
  18. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  19. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  21. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  22. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  23. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  26. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  28. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  29. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  30. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  31. package/dist/resources/extensions/gsd/doctor.js +46 -282
  32. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  33. package/dist/resources/extensions/gsd/files.js +14 -198
  34. package/dist/resources/extensions/gsd/git-service.js +4 -0
  35. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  37. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  38. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  39. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  40. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  41. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  42. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  43. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  44. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  45. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  46. package/dist/resources/extensions/gsd/preferences.js +1 -0
  47. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  48. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  49. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  50. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  54. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  55. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  57. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  58. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  59. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  60. package/dist/resources/extensions/gsd/state.js +484 -30
  61. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  62. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  63. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  64. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  65. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  66. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  67. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  68. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  69. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  70. package/dist/resources/extensions/gsd/undo.js +197 -3
  71. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  72. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  73. package/dist/web/standalone/.next/BUILD_ID +1 -1
  74. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -16
  75. package/dist/web/standalone/.next/build-manifest.json +4 -4
  76. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  77. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  78. package/dist/web/standalone/.next/required-server-files.json +4 -4
  79. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  80. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  81. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  91. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  100. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js +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_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  145. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  151. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  172. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/index.html +1 -1
  182. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  183. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/page.js +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -16
  191. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  192. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  193. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  194. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/middleware.js +2 -2
  197. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  199. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  200. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  201. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  202. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  203. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  207. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  210. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  211. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  212. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  254. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  255. package/dist/web/standalone/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +1 -0
  256. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  257. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  258. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  259. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  260. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  261. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  262. package/dist/web/standalone/server.js +1 -1
  263. package/package.json +4 -4
  264. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  265. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  266. package/packages/pi-ai/dist/models.custom.js +170 -0
  267. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  268. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models.js +16 -1
  270. package/packages/pi-ai/dist/models.js.map +1 -1
  271. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  272. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/models.test.js +67 -0
  274. package/packages/pi-ai/dist/models.test.js.map +1 -0
  275. package/packages/pi-ai/src/models.custom.ts +172 -0
  276. package/packages/pi-ai/src/models.test.ts +85 -0
  277. package/packages/pi-ai/src/models.ts +17 -1
  278. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  279. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  281. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  289. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  291. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  294. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  296. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  300. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  304. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  306. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  308. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  310. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  312. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  314. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  318. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  322. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  324. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  326. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  328. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  330. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  333. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/index.js +1 -0
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/main.js +11 -199
  340. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  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 +21 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  348. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  351. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  353. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  355. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/package.json +1 -1
  360. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  361. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  362. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  363. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  364. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  365. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  366. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  367. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  368. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  369. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  370. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  371. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  372. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  373. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  374. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  375. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  376. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  377. package/packages/pi-coding-agent/src/index.ts +7 -0
  378. package/packages/pi-coding-agent/src/main.ts +11 -232
  379. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  383. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/package.json +1 -1
  389. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  390. package/src/resources/extensions/github-sync/sync.ts +2 -1
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  392. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  393. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  394. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  395. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  396. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  397. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  398. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  399. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  400. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  401. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  402. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  403. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  404. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  405. package/src/resources/extensions/gsd/auto.ts +0 -9
  406. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  407. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  409. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  410. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  411. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  412. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  413. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  414. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  415. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  416. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  417. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  418. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  419. package/src/resources/extensions/gsd/doctor.ts +45 -295
  420. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  421. package/src/resources/extensions/gsd/files.ts +16 -220
  422. package/src/resources/extensions/gsd/git-service.ts +4 -0
  423. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  424. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  425. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  426. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  427. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  428. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  429. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  430. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  431. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  432. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  433. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  434. package/src/resources/extensions/gsd/preferences.ts +1 -0
  435. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  436. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  437. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  438. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  442. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  443. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  445. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  446. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  447. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  448. package/src/resources/extensions/gsd/state.ts +547 -29
  449. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  450. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  451. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
  453. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
  457. package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
  458. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  459. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
  460. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
  461. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
  462. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
  463. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
  464. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
  465. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
  466. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
  467. package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
  468. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
  469. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
  470. package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
  471. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
  473. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
  474. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  475. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  476. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1205 -0
  477. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  479. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
  480. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
  481. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  487. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  488. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  489. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  490. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  491. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  492. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  493. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  494. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
  495. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  496. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
  497. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  498. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  499. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  500. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  501. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  502. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  503. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  504. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  505. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  506. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  507. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  508. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  509. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  510. package/src/resources/extensions/gsd/types.ts +50 -0
  511. package/src/resources/extensions/gsd/undo.ts +247 -3
  512. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  513. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  514. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  515. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  516. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  517. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  519. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  520. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  521. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  522. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  523. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  526. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  528. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  529. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  530. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  531. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  532. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  533. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  562. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  563. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  564. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  565. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  566. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  567. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  568. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
@@ -4,6 +4,7 @@ import * as fs from "node:fs";
4
4
  import * as os from "node:os";
5
5
  import * as path from "node:path";
6
6
  import { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from "./project-trust.js";
7
+ import { containsTypeScriptSyntax, loadExtensions } from "./loader.js";
7
8
 
8
9
  // ─── helpers ──────────────────────────────────────────────────────────────────
9
10
 
@@ -139,3 +140,98 @@ describe("getUntrustedExtensionPaths", () => {
139
140
  assert.deepEqual(result, paths);
140
141
  });
141
142
  });
143
+
144
+ // ─── containsTypeScriptSyntax ─────────────────────────────────────────────────
145
+
146
+ describe("containsTypeScriptSyntax", () => {
147
+ it("detects parameter type annotations", () => {
148
+ assert.ok(containsTypeScriptSyntax(`export default function activate(api: ExtensionAPI) {}`));
149
+ });
150
+
151
+ it("detects interface declarations", () => {
152
+ assert.ok(containsTypeScriptSyntax(`interface Config { name: string; }`));
153
+ });
154
+
155
+ it("detects type alias declarations", () => {
156
+ assert.ok(containsTypeScriptSyntax(`type Handler = (event: string) => void;`));
157
+ });
158
+
159
+ it("detects enum declarations", () => {
160
+ assert.ok(containsTypeScriptSyntax(`enum Direction { Up, Down, Left, Right }`));
161
+ });
162
+
163
+ it("detects return type annotations", () => {
164
+ assert.ok(containsTypeScriptSyntax(`function foo(): Promise<void> {}`));
165
+ });
166
+
167
+ it("detects generic type parameters on functions", () => {
168
+ assert.ok(containsTypeScriptSyntax(`function identity<T>(arg) { return arg; }`));
169
+ });
170
+
171
+ it("detects variable type annotations", () => {
172
+ assert.ok(containsTypeScriptSyntax(`const name: string = "hello";`));
173
+ });
174
+
175
+ it("returns false for plain JavaScript", () => {
176
+ assert.equal(containsTypeScriptSyntax(`export default function activate(api) { api.on("init", () => {}); }`), false);
177
+ });
178
+
179
+ it("returns false for empty string", () => {
180
+ assert.equal(containsTypeScriptSyntax(""), false);
181
+ });
182
+
183
+ it("returns false for JSDoc comments with type-like syntax", () => {
184
+ // JSDoc uses different syntax: @param {string} name
185
+ assert.equal(containsTypeScriptSyntax(`/** @param {string} name */\nexport default function activate(api) {}`), false);
186
+ });
187
+ });
188
+
189
+ // ─── loadExtensions: TypeScript syntax in .js files ───────────────────────────
190
+
191
+ describe("loadExtensions", () => {
192
+ let tmpDir: string;
193
+
194
+ beforeEach(() => {
195
+ tmpDir = makeTempDir();
196
+ });
197
+
198
+ afterEach(() => {
199
+ cleanDir(tmpDir);
200
+ });
201
+
202
+ it("reports helpful error when .js file contains TypeScript syntax", async () => {
203
+ // Create a .js file that uses TypeScript type annotations
204
+ const extPath = path.join(tmpDir, "my-extension.js");
205
+ fs.writeFileSync(
206
+ extPath,
207
+ `export default function activate(api: ExtensionAPI) {\n api.on("init", async () => {});\n}\n`,
208
+ );
209
+
210
+ const result = await loadExtensions([extPath], tmpDir);
211
+
212
+ assert.equal(result.errors.length, 1);
213
+ const errorMsg = result.errors[0].error;
214
+ // The error should mention TypeScript syntax and suggest .ts extension
215
+ assert.ok(
216
+ /TypeScript/.test(errorMsg) && /\.ts\b/.test(errorMsg),
217
+ `Expected error to mention TypeScript syntax and .ts extension, got: ${errorMsg}`,
218
+ );
219
+ });
220
+
221
+ it("reports helpful error when .js file contains TS interface declaration", async () => {
222
+ const extPath = path.join(tmpDir, "typed-ext.js");
223
+ fs.writeFileSync(
224
+ extPath,
225
+ `interface Config { name: string; }\nexport default function activate(api) { return; }\n`,
226
+ );
227
+
228
+ const result = await loadExtensions([extPath], tmpDir);
229
+
230
+ assert.equal(result.errors.length, 1);
231
+ const errorMsg = result.errors[0].error;
232
+ assert.ok(
233
+ /TypeScript/.test(errorMsg) && /\.ts\b/.test(errorMsg),
234
+ `Expected error to mention TypeScript syntax and .ts extension, got: ${errorMsg}`,
235
+ );
236
+ });
237
+ });
@@ -42,6 +42,7 @@ import type {
42
42
  Extension,
43
43
  ExtensionAPI,
44
44
  ExtensionFactory,
45
+ LifecycleHookHandler,
45
46
  ExtensionRuntime,
46
47
  LoadExtensionsResult,
47
48
  MessageRenderer,
@@ -463,6 +464,22 @@ function createExtensionAPI(
463
464
  extension.commands.set(name, { name, ...options });
464
465
  },
465
466
 
467
+ registerBeforeInstall(handler: LifecycleHookHandler): void {
468
+ extension.lifecycleHooks.beforeInstall.push(handler);
469
+ },
470
+
471
+ registerAfterInstall(handler: LifecycleHookHandler): void {
472
+ extension.lifecycleHooks.afterInstall.push(handler);
473
+ },
474
+
475
+ registerBeforeRemove(handler: LifecycleHookHandler): void {
476
+ extension.lifecycleHooks.beforeRemove.push(handler);
477
+ },
478
+
479
+ registerAfterRemove(handler: LifecycleHookHandler): void {
480
+ extension.lifecycleHooks.afterRemove.push(handler);
481
+ },
482
+
466
483
  registerShortcut(
467
484
  shortcut: KeyId,
468
485
  options: {
@@ -568,6 +585,39 @@ function createExtensionAPI(
568
585
  return api;
569
586
  }
570
587
 
588
+ /**
589
+ * Heuristic patterns that indicate TypeScript syntax in a source file.
590
+ * Used to detect when a .js file accidentally contains TypeScript code
591
+ * and provide a helpful error message instead of a cryptic parse failure.
592
+ */
593
+ const TS_SYNTAX_PATTERNS: RegExp[] = [
594
+ // Variable type annotations: const name: string, let count: number
595
+ /\b(?:const|let|var)\s+\w+\s*:\s*(?:string|number|boolean|any|void|never|unknown|object|bigint|symbol|undefined|null)\b/,
596
+ // Parameter type annotations: (api: ExtensionAPI)
597
+ /\(\s*\w+\s*:\s*[A-Z]\w*/,
598
+ // Return type annotations: ): Promise<void> { or ): string =>
599
+ /\)\s*:\s*(?:Promise|string|number|boolean|void|any|never|unknown)\b/,
600
+ // Interface declarations
601
+ /\binterface\s+[A-Z]\w*\s*(?:<[^>]*>)?\s*\{/,
602
+ // Type alias declarations
603
+ /\btype\s+[A-Z]\w*\s*(?:<[^>]*>)?\s*=/,
604
+ // Angle-bracket type assertions: <Type>value
605
+ /(?:as\s+\w+(?:<[^>]*>)?)\s*[;,)\]}]/,
606
+ // Generic type parameters on functions: function foo<T>
607
+ /\bfunction\s+\w+\s*<[^>]+>/,
608
+ // Enum declarations
609
+ /\benum\s+[A-Z]\w*\s*\{/,
610
+ ];
611
+
612
+ /**
613
+ * Check whether a source string likely contains TypeScript syntax.
614
+ * This is a heuristic — it may produce false positives for unusual JS,
615
+ * but is tuned to catch the most common TS-in-JS mistakes.
616
+ */
617
+ export function containsTypeScriptSyntax(source: string): boolean {
618
+ return TS_SYNTAX_PATTERNS.some((pattern) => pattern.test(source));
619
+ }
620
+
571
621
  async function loadExtensionModule(extensionPath: string) {
572
622
  // Pre-compiled extension loading: if the source is .ts and a sibling .js
573
623
  // file exists with matching or newer mtime, use native import() to skip
@@ -650,6 +700,12 @@ function createExtension(extensionPath: string, resolvedPath: string): Extension
650
700
  commands: new Map(),
651
701
  flags: new Map(),
652
702
  shortcuts: new Map(),
703
+ lifecycleHooks: {
704
+ beforeInstall: [],
705
+ afterInstall: [],
706
+ beforeRemove: [],
707
+ afterRemove: [],
708
+ },
653
709
  };
654
710
  }
655
711
 
@@ -672,6 +728,22 @@ async function loadExtension(
672
728
  return { extension: null, error: null };
673
729
  }
674
730
  logExtensionTiming(extensionPath, Date.now() - start, "failed");
731
+
732
+ // Check if a .js file contains TypeScript syntax
733
+ if (resolvedPath.endsWith(".js")) {
734
+ try {
735
+ const source = fs.readFileSync(resolvedPath, "utf-8");
736
+ if (containsTypeScriptSyntax(source)) {
737
+ return {
738
+ extension: null,
739
+ error: `Extension file "${extensionPath}" appears to contain TypeScript syntax but has a .js extension. Rename it to .ts so the loader can compile it.`,
740
+ };
741
+ }
742
+ } catch {
743
+ // Could not read file — fall through to generic error
744
+ }
745
+ }
746
+
675
747
  return { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };
676
748
  }
677
749
 
@@ -684,6 +756,23 @@ async function loadExtension(
684
756
  } catch (err) {
685
757
  const message = err instanceof Error ? err.message : String(err);
686
758
  logExtensionTiming(extensionPath, Date.now() - start, "failed");
759
+
760
+ // Check if a .js file contains TypeScript syntax — the parse error from
761
+ // jiti/Node is often cryptic, so surface a clearer diagnostic.
762
+ if (resolvedPath.endsWith(".js")) {
763
+ try {
764
+ const source = fs.readFileSync(resolvedPath, "utf-8");
765
+ if (containsTypeScriptSyntax(source)) {
766
+ return {
767
+ extension: null,
768
+ error: `Extension file "${extensionPath}" appears to contain TypeScript syntax but has a .js extension. Rename it to .ts so the loader can compile it.`,
769
+ };
770
+ }
771
+ } catch {
772
+ // Could not read file — fall through to generic error
773
+ }
774
+ }
775
+
687
776
  return { extension: null, error: `Failed to load extension: ${message}` };
688
777
  }
689
778
  }
@@ -949,6 +949,33 @@ export interface RegisteredCommand {
949
949
  handler: (args: string, ctx: ExtensionCommandContext) => Promise<void>;
950
950
  }
951
951
 
952
+ export type LifecycleHookScope = "user" | "project";
953
+ export type LifecycleHookPhase = "beforeInstall" | "afterInstall" | "beforeRemove" | "afterRemove";
954
+
955
+ export interface LifecycleHookContext {
956
+ /** Lifecycle phase currently being executed. */
957
+ phase: LifecycleHookPhase;
958
+ /** Package source string passed to install (npm:, git:, https://, local path). */
959
+ source: string;
960
+ /** Resolved installed package path (or resolved local path), when available for this phase. */
961
+ installedPath?: string;
962
+ /** Where the package was installed. */
963
+ scope: LifecycleHookScope;
964
+ /** Current working directory for the install invocation. */
965
+ cwd: string;
966
+ /** Whether install is running in an interactive TTY. */
967
+ interactive: boolean;
968
+ /** Info-level logging sink for install output. */
969
+ log(message: string): void;
970
+ /** Warning-level logging sink for install output. */
971
+ warn(message: string): void;
972
+ /** Error-level logging sink for install output. */
973
+ error(message: string): void;
974
+ }
975
+
976
+ export type LifecycleHookHandler = (ctx: LifecycleHookContext) => Promise<void> | void;
977
+ export type LifecycleHookMap = Record<LifecycleHookPhase, LifecycleHookHandler[]>;
978
+
952
979
  // ============================================================================
953
980
  // Extension API
954
981
  // ============================================================================
@@ -1019,6 +1046,18 @@ export interface ExtensionAPI {
1019
1046
  /** Register a custom command. */
1020
1047
  registerCommand(name: string, options: Omit<RegisteredCommand, "name">): void;
1021
1048
 
1049
+ /** Register a lifecycle hook run before package installation starts. */
1050
+ registerBeforeInstall(handler: LifecycleHookHandler): void;
1051
+
1052
+ /** Register a lifecycle hook run after package installation completes. */
1053
+ registerAfterInstall(handler: LifecycleHookHandler): void;
1054
+
1055
+ /** Register a lifecycle hook run before package removal starts. */
1056
+ registerBeforeRemove(handler: LifecycleHookHandler): void;
1057
+
1058
+ /** Register a lifecycle hook run after package removal completes. */
1059
+ registerAfterRemove(handler: LifecycleHookHandler): void;
1060
+
1022
1061
  /** Register a keyboard shortcut. */
1023
1062
  registerShortcut(
1024
1063
  shortcut: KeyId,
@@ -1201,6 +1240,10 @@ export interface ExtensionAPI {
1201
1240
 
1202
1241
  /** Configuration for registering a provider via pi.registerProvider(). */
1203
1242
  export interface ProviderConfig {
1243
+ /** Auth behavior for provider availability and request key handling. Defaults to "apiKey". */
1244
+ authMode?: "apiKey" | "oauth" | "externalCli" | "none";
1245
+ /** Optional readiness check. Return false if the provider cannot accept requests (e.g., CLI not authenticated, API key invalid). Called before default auth checks. */
1246
+ isReady?: () => boolean;
1204
1247
  /** Base URL for the API endpoint. Required when defining models. */
1205
1248
  baseUrl?: string;
1206
1249
  /** API key or environment variable name. Required when defining models (unless oauth provided). */
@@ -1382,6 +1425,7 @@ export interface Extension {
1382
1425
  commands: Map<string, RegisteredCommand>;
1383
1426
  flags: Map<string, ExtensionFlag>;
1384
1427
  shortcuts: Map<KeyId, ExtensionShortcut>;
1428
+ lifecycleHooks: LifecycleHookMap;
1385
1429
  }
1386
1430
 
1387
1431
  /** Result of loading extensions. */
@@ -38,6 +38,7 @@ function createResolver(overrides?: {
38
38
  enabled?: boolean;
39
39
  isProviderAvailable?: (provider: string) => boolean;
40
40
  hasAuth?: (provider: string) => boolean;
41
+ isProviderRequestReady?: (provider: string) => boolean;
41
42
  find?: (provider: string, modelId: string) => Model<Api> | undefined;
42
43
  }) {
43
44
  const settingsManager = {
@@ -60,6 +61,7 @@ function createResolver(overrides?: {
60
61
  if (provider === "openai" && modelId === "gpt-4.1") return openaiModel;
61
62
  return undefined;
62
63
  }),
64
+ isProviderRequestReady: overrides?.isProviderRequestReady ?? overrides?.hasAuth ?? (() => true),
63
65
  } as unknown as ModelRegistry;
64
66
 
65
67
  return { resolver: new FallbackResolver(settingsManager, authStorage, modelRegistry), authStorage };
@@ -122,9 +124,9 @@ describe("FallbackResolver — findFallback", () => {
122
124
  assert.equal(result, null);
123
125
  });
124
126
 
125
- it("skips providers without auth", async () => {
127
+ it("skips providers that are not request-ready", async () => {
126
128
  const { resolver } = createResolver({
127
- hasAuth: (provider: string) => provider !== "alibaba",
129
+ isProviderRequestReady: (provider: string) => provider !== "alibaba",
128
130
  });
129
131
 
130
132
  const result = await resolver.findFallback(zaiModel, "quota_exhausted");
@@ -133,6 +135,17 @@ describe("FallbackResolver — findFallback", () => {
133
135
  assert.equal(result!.model.provider, "openai");
134
136
  });
135
137
 
138
+ it("allows fallback to external-cli style providers without stored auth", async () => {
139
+ const { resolver } = createResolver({
140
+ hasAuth: () => false,
141
+ isProviderRequestReady: (provider: string) => provider === "alibaba",
142
+ });
143
+
144
+ const result = await resolver.findFallback(zaiModel, "quota_exhausted");
145
+ assert.notEqual(result, null);
146
+ assert.equal(result!.model.provider, "alibaba");
147
+ });
148
+
136
149
  it("skips providers with no model in registry", async () => {
137
150
  const { resolver } = createResolver({
138
151
  find: (provider: string, modelId: string) => {
@@ -149,9 +149,8 @@ export class FallbackResolver {
149
149
  const model = this.modelRegistry.find(entry.provider, entry.model);
150
150
  if (!model) continue;
151
151
 
152
- // Check if API key is available
153
- const hasAuth = this.authStorage.hasAuth(entry.provider);
154
- if (!hasAuth) continue;
152
+ // Check if provider is request-ready for fallback (authMode-aware)
153
+ if (!this.modelRegistry.isProviderRequestReady(entry.provider)) continue;
155
154
 
156
155
  return {
157
156
  model,
@@ -0,0 +1,274 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import { parseGitUrl } from "../utils/git.js";
7
+ import {
8
+ importExtensionModule,
9
+ loadExtensions,
10
+ type LifecycleHookContext,
11
+ type LifecycleHookMap,
12
+ type LifecycleHookHandler,
13
+ type LifecycleHookPhase,
14
+ type LifecycleHookScope,
15
+ } from "./extensions/index.js";
16
+ import type { DefaultPackageManager } from "./package-manager.js";
17
+
18
+ interface ExtensionManifest {
19
+ dependencies?: {
20
+ runtime?: string[];
21
+ };
22
+ }
23
+
24
+ export interface PackageLifecycleHooksOptions {
25
+ source: string;
26
+ local: boolean;
27
+ cwd: string;
28
+ agentDir: string;
29
+ appName: string;
30
+ packageManager: DefaultPackageManager;
31
+ stdout: NodeJS.WriteStream;
32
+ stderr: NodeJS.WriteStream;
33
+ }
34
+
35
+ export type LifecycleHooksTarget = "source" | "installed";
36
+
37
+ export interface PrepareLifecycleHooksOptions {
38
+ verifyRuntimeDependencies?: boolean;
39
+ }
40
+
41
+ export interface LifecycleHooksRunResult {
42
+ phase: LifecycleHookPhase;
43
+ hooksRun: number;
44
+ hookErrors: number;
45
+ legacyHooksRun: number;
46
+ entryPathCount: number;
47
+ skipped: boolean;
48
+ }
49
+
50
+ interface LoadedLifecycleHooks {
51
+ source: string;
52
+ scope: LifecycleHookScope;
53
+ installedPath?: string;
54
+ cwd: string;
55
+ stdout: NodeJS.WriteStream;
56
+ stderr: NodeJS.WriteStream;
57
+ entryPaths: string[];
58
+ hooksByPath: Map<string, LifecycleHookMap>;
59
+ }
60
+
61
+ function toScope(local: boolean): LifecycleHookScope {
62
+ return local ? "project" : "user";
63
+ }
64
+
65
+ function readManifestRuntimeDeps(dir: string): string[] {
66
+ const manifestPath = join(dir, "extension-manifest.json");
67
+ if (!existsSync(manifestPath)) return [];
68
+ try {
69
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf-8")) as ExtensionManifest;
70
+ return manifest.dependencies?.runtime?.filter((dep): dep is string => typeof dep === "string") ?? [];
71
+ } catch {
72
+ return [];
73
+ }
74
+ }
75
+
76
+ function collectRuntimeDependencies(installedPath: string, entryPaths: string[]): string[] {
77
+ const deps = new Set<string>();
78
+ const candidateDirs = new Set<string>([installedPath, ...entryPaths.map((entryPath) => dirname(entryPath))]);
79
+ for (const dir of candidateDirs) {
80
+ for (const dep of readManifestRuntimeDeps(dir)) {
81
+ deps.add(dep);
82
+ }
83
+ }
84
+ return Array.from(deps);
85
+ }
86
+
87
+ function verifyRuntimeDependencies(runtimeDeps: string[], source: string, appName: string): void {
88
+ const missing: string[] = [];
89
+ for (const dep of runtimeDeps) {
90
+ const result = spawnSync(dep, ["--version"], { encoding: "utf-8", timeout: 5000 });
91
+ if (result.error || result.status !== 0) {
92
+ missing.push(dep);
93
+ }
94
+ }
95
+ if (missing.length === 0) return;
96
+ throw new Error(
97
+ `Missing runtime dependencies: ${missing.join(", ")}.\n` +
98
+ `Install them and retry: ${appName} install ${source}`,
99
+ );
100
+ }
101
+
102
+ function resolveLocalSourcePath(source: string, cwd: string): string | undefined {
103
+ const trimmed = source.trim();
104
+ if (!trimmed) return undefined;
105
+ if (trimmed.startsWith("npm:")) return undefined;
106
+ if (parseGitUrl(trimmed)) return undefined;
107
+
108
+ let normalized = trimmed;
109
+ if (normalized === "~") {
110
+ normalized = homedir();
111
+ } else if (normalized.startsWith("~/")) {
112
+ normalized = join(homedir(), normalized.slice(2));
113
+ }
114
+
115
+ const absolutePath = resolve(cwd, normalized);
116
+ return existsSync(absolutePath) ? absolutePath : undefined;
117
+ }
118
+
119
+ async function resolveEntryPathsFromTarget(
120
+ options: PackageLifecycleHooksOptions,
121
+ target: LifecycleHooksTarget,
122
+ scope: LifecycleHookScope,
123
+ ): Promise<{ entryPaths: string[]; installedPath?: string }> {
124
+ if (target === "source") {
125
+ const localSourcePath = resolveLocalSourcePath(options.source, options.cwd);
126
+ if (!localSourcePath) return { entryPaths: [] };
127
+ const resolved = await options.packageManager.resolveExtensionSources([localSourcePath], { local: true });
128
+ const entryPaths = resolved.extensions.filter((resource) => resource.enabled).map((resource) => resource.path);
129
+ return { entryPaths, installedPath: localSourcePath };
130
+ }
131
+
132
+ const installedPath = options.packageManager.getInstalledPath(options.source, scope);
133
+ if (!installedPath) return { entryPaths: [] };
134
+ const resolved = await options.packageManager.resolveExtensionSources([installedPath], { local: true });
135
+ const entryPaths = resolved.extensions.filter((resource) => resource.enabled).map((resource) => resource.path);
136
+ return { entryPaths, installedPath };
137
+ }
138
+
139
+ export async function prepareLifecycleHooks(
140
+ options: PackageLifecycleHooksOptions,
141
+ target: LifecycleHooksTarget,
142
+ prepareOptions?: PrepareLifecycleHooksOptions,
143
+ ): Promise<LoadedLifecycleHooks | null> {
144
+ const scope = toScope(options.local);
145
+ const { entryPaths, installedPath } = await resolveEntryPathsFromTarget(options, target, scope);
146
+ if (entryPaths.length === 0) {
147
+ return null;
148
+ }
149
+
150
+ if (prepareOptions?.verifyRuntimeDependencies && installedPath) {
151
+ const runtimeDeps = collectRuntimeDependencies(installedPath, entryPaths);
152
+ verifyRuntimeDependencies(runtimeDeps, options.source, options.appName);
153
+ }
154
+
155
+ const loaded = await loadExtensions(entryPaths, options.cwd);
156
+ for (const { path, error } of loaded.errors) {
157
+ options.stderr.write(`[lifecycle-hooks] Failed to load extension "${path}": ${error}\n`);
158
+ }
159
+
160
+ const hooksByPath = new Map<string, LifecycleHookMap>();
161
+ for (const extension of loaded.extensions) {
162
+ hooksByPath.set(extension.path, extension.lifecycleHooks);
163
+ }
164
+
165
+ return {
166
+ source: options.source,
167
+ scope,
168
+ installedPath,
169
+ cwd: options.cwd,
170
+ stdout: options.stdout,
171
+ stderr: options.stderr,
172
+ entryPaths,
173
+ hooksByPath,
174
+ };
175
+ }
176
+
177
+ async function runHookSafe(
178
+ hook: LifecycleHookHandler,
179
+ context: LifecycleHookContext,
180
+ stderr: NodeJS.WriteStream,
181
+ ): Promise<boolean> {
182
+ try {
183
+ await hook(context);
184
+ return true;
185
+ } catch (error) {
186
+ const message = error instanceof Error ? error.message : String(error);
187
+ stderr.write(`[lifecycle-hooks:${context.phase}] Hook failed: ${message}\n`);
188
+ return false;
189
+ }
190
+ }
191
+
192
+ function getLegacyExportCandidates(phase: LifecycleHookPhase): string[] {
193
+ return [phase];
194
+ }
195
+
196
+ async function runLegacyExportHook(
197
+ entryPath: string,
198
+ phase: LifecycleHookPhase,
199
+ context: LifecycleHookContext,
200
+ ): Promise<LifecycleHookHandler | null> {
201
+ try {
202
+ const module = await importExtensionModule<Record<string, unknown>>(import.meta.url, pathToFileURL(entryPath).href);
203
+ for (const exportName of getLegacyExportCandidates(phase)) {
204
+ const candidate = module[exportName];
205
+ if (typeof candidate === "function") {
206
+ return candidate as LifecycleHookHandler;
207
+ }
208
+ }
209
+ return null;
210
+ } catch {
211
+ return null;
212
+ }
213
+ }
214
+
215
+ export async function runLifecycleHooks(
216
+ loaded: LoadedLifecycleHooks | null,
217
+ phase: LifecycleHookPhase,
218
+ ): Promise<LifecycleHooksRunResult> {
219
+ if (!loaded) {
220
+ return {
221
+ phase,
222
+ hooksRun: 0,
223
+ hookErrors: 0,
224
+ legacyHooksRun: 0,
225
+ entryPathCount: 0,
226
+ skipped: true,
227
+ };
228
+ }
229
+
230
+ const context: LifecycleHookContext = {
231
+ phase,
232
+ source: loaded.source,
233
+ installedPath: loaded.installedPath,
234
+ scope: loaded.scope,
235
+ cwd: loaded.cwd,
236
+ interactive: Boolean(process.stdin.isTTY && process.stdout.isTTY),
237
+ log: (message) => loaded.stdout.write(`${message}\n`),
238
+ warn: (message) => loaded.stderr.write(`${message}\n`),
239
+ error: (message) => loaded.stderr.write(`${message}\n`),
240
+ };
241
+
242
+ let hooksRun = 0;
243
+ let hookErrors = 0;
244
+ let legacyHooksRun = 0;
245
+
246
+ for (const entryPath of loaded.entryPaths) {
247
+ const hookMap = loaded.hooksByPath.get(entryPath);
248
+ const registeredHooks = hookMap?.[phase] ?? [];
249
+ if (registeredHooks.length > 0) {
250
+ for (const hook of registeredHooks) {
251
+ hooksRun += 1;
252
+ const ok = await runHookSafe(hook, context, loaded.stderr);
253
+ if (!ok) hookErrors += 1;
254
+ }
255
+ continue;
256
+ }
257
+
258
+ const legacyHook = await runLegacyExportHook(entryPath, phase, context);
259
+ if (!legacyHook) continue;
260
+
261
+ legacyHooksRun += 1;
262
+ const ok = await runHookSafe(legacyHook, context, loaded.stderr);
263
+ if (!ok) hookErrors += 1;
264
+ }
265
+
266
+ return {
267
+ phase,
268
+ hooksRun,
269
+ hookErrors,
270
+ legacyHooksRun,
271
+ entryPathCount: loaded.entryPaths.length,
272
+ skipped: false,
273
+ };
274
+ }