gsd-pi 2.67.0-dev.46f9884 → 2.67.0-dev.509bd95

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 (604) hide show
  1. package/README.md +42 -32
  2. package/dist/resource-loader.d.ts +1 -1
  3. package/dist/resource-loader.js +20 -5
  4. package/dist/resources/GSD-WORKFLOW.md +3 -1
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +73 -42
  6. package/dist/resources/extensions/get-secrets-from-user.js +18 -2
  7. package/dist/resources/extensions/gsd/auto/phases.js +17 -0
  8. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +12 -0
  9. package/dist/resources/extensions/gsd/auto-post-unit.js +26 -0
  10. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -435
  11. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -4
  12. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +7 -64
  13. package/dist/resources/extensions/gsd/bootstrap/system-context.js +18 -3
  14. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -8
  15. package/dist/resources/extensions/gsd/codebase-generator.js +173 -12
  16. package/dist/resources/extensions/gsd/commands/catalog.js +4 -3
  17. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  18. package/dist/resources/extensions/gsd/commands/handlers/core.js +106 -1
  19. package/dist/resources/extensions/gsd/commands/index.js +8 -1
  20. package/dist/resources/extensions/gsd/commands-bootstrap.js +9 -0
  21. package/dist/resources/extensions/gsd/commands-codebase.js +4 -3
  22. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +39 -5
  23. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -4
  24. package/dist/resources/extensions/gsd/doctor-proactive.js +3 -3
  25. package/dist/resources/extensions/gsd/guided-flow.js +16 -0
  26. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  27. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  28. package/dist/resources/extensions/gsd/prompts/system.md +3 -0
  29. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -5
  30. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +508 -0
  31. package/dist/resources/extensions/gsd/workflow-logger.js +18 -3
  32. package/dist/resources/extensions/gsd/workflow-mcp.js +190 -0
  33. package/dist/resources/extensions/gsd/workflow-reconcile.js +0 -4
  34. package/dist/resources/extensions/gsd/worktree-manager.js +6 -2
  35. package/dist/web/standalone/.next/BUILD_ID +1 -1
  36. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  37. package/dist/web/standalone/.next/build-manifest.json +5 -5
  38. package/dist/web/standalone/.next/prerender-manifest.json +13 -13
  39. package/dist/web/standalone/.next/react-loadable-manifest.json +7 -7
  40. package/dist/web/standalone/.next/required-server-files.json +18 -6
  41. package/dist/web/standalone/.next/routes-manifest.json +1 -0
  42. package/dist/web/standalone/.next/server/app/_global-error/page.js +32 -3
  43. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  44. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/_global-error.html +1 -2
  46. package/dist/web/standalone/.next/server/app/_global-error.rsc +8 -6
  47. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +8 -6
  48. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +2 -1
  50. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +2 -1
  52. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  54. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  55. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  56. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found.rsc +9 -7
  58. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +9 -7
  59. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +2 -1
  63. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  66. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  69. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  72. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  74. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  75. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  78. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  81. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  84. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  87. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  90. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  92. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -1
  93. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  96. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  99. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  102. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  105. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  108. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  111. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  114. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  117. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  120. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  122. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  123. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  126. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
  129. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  132. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  137. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +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.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  176. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/index.html +1 -1
  191. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  192. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  194. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/page.js +2 -2
  198. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  201. package/dist/web/standalone/.next/server/chunks/2331.js +7 -7
  202. package/dist/web/standalone/.next/server/chunks/4741.js +5 -9
  203. package/dist/web/standalone/.next/server/chunks/63.js +45 -0
  204. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/middleware.js +11 -8
  208. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  209. package/dist/web/standalone/.next/server/pages/500.html +1 -2
  210. package/dist/web/standalone/.next/server/prefetch-hints.json +1 -0
  211. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  212. package/dist/web/standalone/.next/static/chunks/2008.71ee9230ad78df21.js +20 -0
  213. package/dist/web/standalone/.next/static/chunks/{363642f4.f9053a63f1b97508.js → 363642f4.cf8b455e0d94b478.js} +1 -1
  214. package/dist/web/standalone/.next/static/chunks/3794-42fdce068d44fa4f.js +32 -0
  215. package/dist/web/standalone/.next/static/chunks/{4447.f86b52aea068b189.js → 4447.5bad7871be61ca73.js} +1 -1
  216. package/dist/web/standalone/.next/static/chunks/4bd1b696-e356ca5ba0218e27.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/{6502.8874bcae249c02e1.js → 6502.b804e48b7919f55e.js} +3 -3
  218. package/dist/web/standalone/.next/static/chunks/{e868780c.f7831045ac345aaa.js → e868780c.abc48b70a10fc2d6.js} +3 -3
  219. package/dist/web/standalone/.next/static/chunks/framework-711ef29bc66f648c.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-6919d9dd919bd15f.js +5 -0
  221. package/dist/web/standalone/.next/static/chunks/{webpack-9fed74684e1c5bb1.js → webpack-b49b09f97429b5d0.js} +1 -1
  222. package/dist/web/standalone/.next/static/mHJZ3Z8yGRzZ32BmQs-I7/_buildManifest.js +1 -0
  223. package/dist/web/standalone/node_modules/@next/env/package.json +1 -1
  224. package/dist/web/standalone/node_modules/next/dist/build/adapter/setup-node-env.external.js +15 -0
  225. package/dist/web/standalone/node_modules/next/dist/build/analysis/extract-const-value.js +78 -63
  226. package/dist/web/standalone/node_modules/next/dist/build/analysis/get-page-static-info.js +64 -40
  227. package/dist/web/standalone/node_modules/next/dist/build/create-compiler-aliases.js +2 -0
  228. package/dist/web/standalone/node_modules/next/dist/build/define-env.js +29 -11
  229. package/dist/web/standalone/node_modules/next/dist/build/duration-to-string.js +1 -1
  230. package/dist/web/standalone/node_modules/next/dist/build/entries.js +55 -295
  231. package/dist/web/standalone/node_modules/next/dist/build/file-classifier.js +76 -0
  232. package/dist/web/standalone/node_modules/next/dist/build/get-supported-browsers.js +38 -0
  233. package/dist/web/standalone/node_modules/next/dist/build/load-jsconfig.js +7 -7
  234. package/dist/web/standalone/node_modules/next/dist/build/lockfile.js +90 -9
  235. package/dist/web/standalone/node_modules/next/dist/build/next-config-ts/transpile-config.js +128 -49
  236. package/dist/web/standalone/node_modules/next/dist/build/print-build-errors.js +72 -0
  237. package/dist/web/standalone/node_modules/next/dist/build/route-discovery.js +353 -0
  238. package/dist/web/standalone/node_modules/next/dist/build/segment-config/app/app-segment-config.js +34 -17
  239. package/dist/web/standalone/node_modules/next/dist/build/static-paths/app.js +68 -15
  240. package/dist/web/standalone/node_modules/next/dist/build/static-paths/pages.js +3 -3
  241. package/dist/web/standalone/node_modules/next/dist/build/swc/index.js +125 -48
  242. package/dist/web/standalone/node_modules/next/dist/build/swc/loaderWorkerPool.js +40 -0
  243. package/dist/web/standalone/node_modules/next/dist/build/swc/options.js +23 -6
  244. package/dist/web/standalone/node_modules/next/dist/build/utils.js +48 -94
  245. package/dist/web/standalone/node_modules/next/dist/build/webpack/config/blocks/css/index.js +14 -3
  246. package/dist/web/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/global.js +4 -2
  247. package/dist/web/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/modules.js +4 -2
  248. package/dist/web/standalone/node_modules/next/dist/build/webpack/config/blocks/css/loaders/next-font.js +1 -0
  249. package/dist/web/standalone/node_modules/next/dist/build/webpack/config/blocks/css/plugins.js +5 -5
  250. package/dist/web/standalone/node_modules/next/dist/build/webpack/config/index.js +3 -2
  251. package/dist/web/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js +2 -1
  252. package/dist/web/standalone/node_modules/next/dist/build/webpack/loaders/css-loader/src/plugins/postcss-url-parser.js +8 -1
  253. package/dist/web/standalone/node_modules/next/dist/build/webpack/loaders/lightningcss-loader/src/loader.js +13 -4
  254. package/dist/web/standalone/node_modules/next/dist/build/webpack/loaders/next-middleware-loader.js +3 -1
  255. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/build-manifest-plugin-utils.js +2 -16
  256. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/build-manifest-plugin.js +2 -2
  257. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/deferred-entries-plugin.js +106 -0
  258. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/flight-client-entry-plugin.js +16 -8
  259. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.js +24 -11
  260. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/middleware-plugin.js +21 -2
  261. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/next-types-plugin/index.js +6 -5
  262. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/nextjs-require-cache-hot-reloader.js +10 -14
  263. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseNotFoundError.js +18 -4
  264. package/dist/web/standalone/node_modules/next/dist/build/webpack/plugins/wellknown-errors-plugin/parseScss.js +5 -4
  265. package/dist/web/standalone/node_modules/next/dist/build/webpack-config.js +18 -8
  266. package/dist/web/standalone/node_modules/next/dist/cli/next-test.js +4 -3
  267. package/dist/web/standalone/node_modules/next/dist/client/app-find-source-map-url.js +2 -1
  268. package/dist/web/standalone/node_modules/next/dist/client/components/app-router-headers.js +10 -0
  269. package/dist/web/standalone/node_modules/next/dist/client/components/app-router-instance.js +82 -4
  270. package/dist/web/standalone/node_modules/next/dist/client/components/app-router.js +39 -20
  271. package/dist/web/standalone/node_modules/next/dist/client/components/builtin/app-error.js +29 -65
  272. package/dist/web/standalone/node_modules/next/dist/client/components/builtin/error-styles.js +165 -0
  273. package/dist/web/standalone/node_modules/next/dist/client/components/builtin/global-error.js +56 -38
  274. package/dist/web/standalone/node_modules/next/dist/client/components/error-boundary.js +16 -6
  275. package/dist/web/standalone/node_modules/next/dist/client/components/forbidden.js +1 -1
  276. package/dist/web/standalone/node_modules/next/dist/client/components/handle-isr-error.js +3 -4
  277. package/dist/web/standalone/node_modules/next/dist/client/components/links.js +7 -0
  278. package/dist/web/standalone/node_modules/next/dist/client/components/navigation-untracked.js +2 -0
  279. package/dist/web/standalone/node_modules/next/dist/client/components/navigation.js +27 -0
  280. package/dist/web/standalone/node_modules/next/dist/client/components/navigation.react-server.js +5 -2
  281. package/dist/web/standalone/node_modules/next/dist/client/components/not-found.js +1 -1
  282. package/dist/web/standalone/node_modules/next/dist/client/components/redirect-boundary.js +1 -1
  283. package/dist/web/standalone/node_modules/next/dist/client/components/redirect-error.js +0 -9
  284. package/dist/web/standalone/node_modules/next/dist/client/components/redirect.js +2 -2
  285. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/compute-changed-path.js +73 -0
  286. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/create-initial-router-state.js +102 -8
  287. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +165 -48
  288. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/is-navigating-to-new-root-layout.js +19 -11
  289. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/ppr-navigations.js +669 -457
  290. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/committed-state.js +49 -0
  291. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/find-head-in-cache.js +19 -20
  292. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/navigate-reducer.js +5 -117
  293. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/refresh-reducer.js +34 -19
  294. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/restore-reducer.js +16 -32
  295. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/server-action-reducer.js +85 -57
  296. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/reducers/server-patch-reducer.js +12 -10
  297. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/router-reducer-types.js +10 -1
  298. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/router-reducer.js +1 -1
  299. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/bfcache.js +128 -0
  300. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/cache.js +732 -231
  301. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/lru.js +13 -6
  302. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/navigation-testing-lock.js +194 -0
  303. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/navigation.js +388 -250
  304. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/optimistic-routes.js +543 -0
  305. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/scheduler.js +154 -55
  306. package/dist/web/standalone/node_modules/next/dist/client/components/segment-cache/vary-path.js +63 -1
  307. package/dist/web/standalone/node_modules/next/dist/client/components/unauthorized.js +1 -1
  308. package/dist/web/standalone/node_modules/next/dist/client/components/use-action-queue.js +49 -3
  309. package/dist/web/standalone/node_modules/next/dist/client/dev/hot-reloader/app/hot-reloader-app.js +9 -1
  310. package/dist/web/standalone/node_modules/next/dist/client/flight-data-helpers.js +42 -29
  311. package/dist/web/standalone/node_modules/next/dist/client/lib/javascript-url.js +32 -0
  312. package/dist/web/standalone/node_modules/next/dist/client/lib/promise.js +53 -0
  313. package/dist/web/standalone/node_modules/next/dist/client/{app-build-id.js → navigation-build-id.js} +17 -13
  314. package/dist/web/standalone/node_modules/next/dist/client/react-client-callbacks/on-recoverable-error.js +14 -0
  315. package/dist/web/standalone/node_modules/next/dist/client/route-loader.js +9 -46
  316. package/dist/web/standalone/node_modules/next/dist/client/router.js +1 -1
  317. package/dist/web/standalone/node_modules/next/dist/compiled/@next/font/dist/google/font-data.json +74 -3
  318. package/dist/web/standalone/node_modules/next/dist/compiled/babel/bundle.js +1 -1
  319. package/dist/web/standalone/node_modules/next/dist/compiled/babel-packages/packages-bundle.js +5 -5
  320. package/dist/web/standalone/node_modules/next/dist/compiled/browserslist/index.js +1 -1
  321. package/dist/web/standalone/node_modules/next/dist/compiled/http-proxy/index.js +5 -5
  322. package/dist/web/standalone/node_modules/next/dist/compiled/jsonwebtoken/index.js +2 -2
  323. package/dist/web/standalone/node_modules/next/dist/compiled/next-devtools/index.js +2209 -23
  324. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/app-page-experimental.runtime.prod.js +42 -12
  325. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +42 -12
  326. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +42 -12
  327. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js +42 -12
  328. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js +2 -2
  329. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +10 -10
  330. package/dist/web/standalone/node_modules/next/dist/compiled/next-server/pages.runtime.prod.js +10 -10
  331. package/dist/web/standalone/node_modules/next/dist/compiled/react-is/package.json +1 -1
  332. package/dist/web/standalone/node_modules/next/dist/compiled/tar/index.min.js +1 -0
  333. package/dist/web/standalone/node_modules/next/dist/compiled/tar/package.json +1 -1
  334. package/dist/web/standalone/node_modules/next/dist/compiled/unistore/unistore.js +1 -1
  335. package/dist/web/standalone/node_modules/next/dist/lib/bundler.js +97 -0
  336. package/dist/web/standalone/node_modules/next/dist/lib/constants.js +19 -4
  337. package/dist/web/standalone/node_modules/next/dist/lib/download-swc.js +2 -2
  338. package/dist/web/standalone/node_modules/next/dist/lib/find-root.js +11 -7
  339. package/dist/web/standalone/node_modules/next/dist/lib/format-server-error.js +1 -0
  340. package/dist/web/standalone/node_modules/next/dist/lib/generate-interception-routes-rewrites.js +3 -20
  341. package/dist/web/standalone/node_modules/next/dist/lib/interop-default.js +1 -0
  342. package/dist/web/standalone/node_modules/next/dist/lib/is-interception-route-rewrite.js +18 -0
  343. package/dist/web/standalone/node_modules/next/dist/lib/load-custom-routes.js +49 -5
  344. package/dist/web/standalone/node_modules/next/dist/lib/memory/trace.js +109 -0
  345. package/dist/web/standalone/node_modules/next/dist/lib/metadata/get-metadata-route.js +11 -2
  346. package/dist/web/standalone/node_modules/next/dist/lib/needs-experimental-react.js +2 -2
  347. package/dist/web/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +5 -5
  348. package/dist/web/standalone/node_modules/next/dist/lib/try-to-parse-path.js +1 -2
  349. package/dist/web/standalone/node_modules/next/dist/lib/turbopack-warning.js +0 -1
  350. package/dist/web/standalone/node_modules/next/dist/lib/typescript/diagnosticFormatter.js +6 -3
  351. package/dist/web/standalone/node_modules/next/dist/lib/typescript/getTypeScriptConfiguration.js +81 -1
  352. package/dist/web/standalone/node_modules/next/dist/lib/typescript/missingDependencyError.js +1 -1
  353. package/dist/web/standalone/node_modules/next/dist/lib/typescript/runTypeCheck.js +6 -8
  354. package/dist/web/standalone/node_modules/next/dist/lib/typescript/type-paths.js +7 -12
  355. package/dist/web/standalone/node_modules/next/dist/lib/typescript/writeAppTypeDeclarations.js +17 -7
  356. package/dist/web/standalone/node_modules/next/dist/lib/typescript/writeConfigurationDefaults.js +33 -32
  357. package/dist/web/standalone/node_modules/next/dist/lib/verify-typescript-setup.js +66 -16
  358. package/dist/web/standalone/node_modules/next/dist/next-devtools/server/shared.js +6 -10
  359. package/dist/web/standalone/node_modules/next/dist/next-devtools/shared/webpack-module-path.js +4 -4
  360. package/dist/web/standalone/node_modules/next/dist/next-devtools/userspace/app/app-dev-overlay-error-boundary.js +22 -4
  361. package/dist/web/standalone/node_modules/next/dist/next-devtools/userspace/app/errors/stitched-error.js +7 -1
  362. package/dist/web/standalone/node_modules/next/dist/next-devtools/userspace/app/forward-logs.js +18 -13
  363. package/dist/web/standalone/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.js +7 -4
  364. package/dist/web/standalone/node_modules/next/dist/server/app-render/action-handler.js +83 -15
  365. package/dist/web/standalone/node_modules/next/dist/server/app-render/app-render-prerender-utils.js +0 -82
  366. package/dist/web/standalone/node_modules/next/dist/server/app-render/app-render-render-utils.js +45 -81
  367. package/dist/web/standalone/node_modules/next/dist/server/app-render/app-render.js +1746 -803
  368. package/dist/web/standalone/node_modules/next/dist/server/app-render/create-component-tree.js +136 -50
  369. package/dist/web/standalone/node_modules/next/dist/server/app-render/create-error-handler.js +6 -4
  370. package/dist/web/standalone/node_modules/next/dist/server/app-render/create-flight-router-state-from-loader-tree.js +52 -26
  371. package/dist/web/standalone/node_modules/next/dist/server/app-render/csrf-protection.js +14 -3
  372. package/dist/web/standalone/node_modules/next/dist/server/app-render/debug-channel-server.js +30 -0
  373. package/dist/web/standalone/node_modules/next/dist/server/app-render/debug-channel-server.web.js +71 -0
  374. package/dist/web/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +353 -37
  375. package/dist/web/standalone/node_modules/next/dist/server/app-render/get-asset-query-string.js +2 -2
  376. package/dist/web/standalone/node_modules/next/dist/server/app-render/get-layer-assets.js +1 -1
  377. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js +13 -0
  378. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.js +18 -0
  379. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-config.js +181 -0
  380. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-samples-client.js +128 -0
  381. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-samples.js +432 -0
  382. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.js +33 -0
  383. package/dist/web/standalone/node_modules/next/dist/server/app-render/instant-validation/stream-utils.js +96 -0
  384. package/dist/web/standalone/node_modules/next/dist/server/app-render/manifests-singleton.js +8 -1
  385. package/dist/web/standalone/node_modules/next/dist/server/app-render/postponed-state.js +2 -1
  386. package/dist/web/standalone/node_modules/next/dist/server/app-render/prospective-render-utils.js +1 -0
  387. package/dist/web/standalone/node_modules/next/dist/server/app-render/segment-explorer-path.js +35 -10
  388. package/dist/web/standalone/node_modules/next/dist/server/app-render/staged-rendering.js +142 -72
  389. package/dist/web/standalone/node_modules/next/dist/server/app-render/stale-time.js +111 -0
  390. package/dist/web/standalone/node_modules/next/dist/server/app-render/stream-ops.js +106 -0
  391. package/dist/web/standalone/node_modules/next/dist/server/app-render/stream-ops.web.js +163 -0
  392. package/dist/web/standalone/node_modules/next/dist/server/app-render/types.js +10 -4
  393. package/dist/web/standalone/node_modules/next/dist/server/app-render/use-flight-response.js +3 -1
  394. package/dist/web/standalone/node_modules/next/dist/server/app-render/vary-params.js +336 -0
  395. package/dist/web/standalone/node_modules/next/dist/server/app-render/walk-tree-with-flight-router-state.js +59 -12
  396. package/dist/web/standalone/node_modules/next/dist/server/app-render/work-unit-async-storage.external.js +54 -26
  397. package/dist/web/standalone/node_modules/next/dist/server/async-storage/request-store.js +4 -4
  398. package/dist/web/standalone/node_modules/next/dist/server/async-storage/work-store.js +2 -5
  399. package/dist/web/standalone/node_modules/next/dist/server/base-server.js +65 -53
  400. package/dist/web/standalone/node_modules/next/dist/server/config-schema.js +94 -8
  401. package/dist/web/standalone/node_modules/next/dist/server/config-shared.js +57 -7
  402. package/dist/web/standalone/node_modules/next/dist/server/config.js +96 -25
  403. package/dist/web/standalone/node_modules/next/dist/server/dev/browser-logs/file-logger.js +9 -6
  404. package/dist/web/standalone/node_modules/next/dist/server/dev/browser-logs/receive-logs.js +46 -0
  405. package/dist/web/standalone/node_modules/next/dist/server/dev/browser-logs/source-map.js +1 -4
  406. package/dist/web/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +266 -33
  407. package/dist/web/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +8 -4
  408. package/dist/web/standalone/node_modules/next/dist/server/dev/log-requests.js +10 -2
  409. package/dist/web/standalone/node_modules/next/dist/server/dev/middleware-turbopack.js +20 -10
  410. package/dist/web/standalone/node_modules/next/dist/server/dev/middleware-webpack.js +13 -3
  411. package/dist/web/standalone/node_modules/next/dist/server/dev/next-dev-server.js +19 -6
  412. package/dist/web/standalone/node_modules/next/dist/server/dev/on-demand-entry-handler.js +69 -0
  413. package/dist/web/standalone/node_modules/next/dist/server/dev/require-cache.js +51 -21
  414. package/dist/web/standalone/node_modules/next/dist/server/dev/server-action-logger.js +37 -0
  415. package/dist/web/standalone/node_modules/next/dist/server/dev/static-paths-worker.js +1 -0
  416. package/dist/web/standalone/node_modules/next/dist/server/dev/turbopack-utils.js +6 -15
  417. package/dist/web/standalone/node_modules/next/dist/server/dynamic-rendering-utils.js +22 -0
  418. package/dist/web/standalone/node_modules/next/dist/server/image-optimizer.js +157 -27
  419. package/dist/web/standalone/node_modules/next/dist/server/lib/app-info-log.js +16 -38
  420. package/dist/web/standalone/node_modules/next/dist/server/lib/cache-control.js +1 -1
  421. package/dist/web/standalone/node_modules/next/dist/server/lib/clone-response.js +16 -16
  422. package/dist/web/standalone/node_modules/next/dist/server/lib/cpu-profile.js +47 -16
  423. package/dist/web/standalone/node_modules/next/dist/server/lib/dev-bundler-service.js +2 -2
  424. package/dist/web/standalone/node_modules/next/dist/server/lib/disk-lru-cache.external.js +57 -0
  425. package/dist/web/standalone/node_modules/next/dist/server/lib/find-page-file.js +27 -7
  426. package/dist/web/standalone/node_modules/next/dist/server/lib/implicit-tags.js +3 -3
  427. package/dist/web/standalone/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +5 -3
  428. package/dist/web/standalone/node_modules/next/dist/server/lib/incremental-cache/index.js +32 -10
  429. package/dist/web/standalone/node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js +18 -1
  430. package/dist/web/standalone/node_modules/next/dist/server/lib/install-code-frame.js +22 -0
  431. package/dist/web/standalone/node_modules/next/dist/server/lib/lru-cache.js +9 -1
  432. package/dist/web/standalone/node_modules/next/dist/server/lib/patch-fetch.js +40 -7
  433. package/dist/web/standalone/node_modules/next/dist/server/lib/postponed-request-body.js +64 -0
  434. package/dist/web/standalone/node_modules/next/dist/server/lib/render-server.js +4 -1
  435. package/dist/web/standalone/node_modules/next/dist/server/lib/router-server.js +37 -13
  436. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/block-cross-site-dev.js +110 -0
  437. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/filesystem.js +16 -15
  438. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +32 -11
  439. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/route-types-utils.js +3 -3
  440. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.js +71 -71
  441. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/typegen.js +247 -2
  442. package/dist/web/standalone/node_modules/next/dist/server/lib/server-ipc/utils.js +2 -1
  443. package/dist/web/standalone/node_modules/next/dist/server/lib/start-server.js +73 -39
  444. package/dist/web/standalone/node_modules/next/dist/server/lib/trace/tracer.js +11 -1
  445. package/dist/web/standalone/node_modules/next/dist/server/lib/utils.js +40 -11
  446. package/dist/web/standalone/node_modules/next/dist/server/load-components.js +2 -0
  447. package/dist/web/standalone/node_modules/next/dist/server/load-manifest.external.js +37 -17
  448. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/get-errors.js +11 -4
  449. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/get-logs.js +9 -3
  450. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/get-page-metadata.js +52 -44
  451. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/get-project-metadata.js +6 -2
  452. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/get-routes.js +44 -79
  453. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/get-server-action-by-id.js +12 -4
  454. package/dist/web/standalone/node_modules/next/dist/server/mcp/tools/utils/format-errors.js +62 -72
  455. package/dist/web/standalone/node_modules/next/dist/server/next-server.js +69 -99
  456. package/dist/web/standalone/node_modules/next/dist/server/next.js +3 -0
  457. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/console-dim.external.js +61 -6
  458. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/date.js +4 -4
  459. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js +13 -6
  460. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/{utils.js → io-utils.js} +14 -5
  461. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/node-crypto.js +8 -8
  462. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/process-error-handlers.js +91 -0
  463. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/random.js +2 -2
  464. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/{unhandled-rejection.js → unhandled-rejection.external.js} +23 -4
  465. package/dist/web/standalone/node_modules/next/dist/server/node-environment-extensions/web-crypto.js +3 -3
  466. package/dist/web/standalone/node_modules/next/dist/server/node-environment.js +1 -1
  467. package/dist/web/standalone/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.js +2 -1
  468. package/dist/web/standalone/node_modules/next/dist/server/patch-error-inspect.js +37 -20
  469. package/dist/web/standalone/node_modules/next/dist/server/render-result.js +9 -0
  470. package/dist/web/standalone/node_modules/next/dist/server/render.js +47 -44
  471. package/dist/web/standalone/node_modules/next/dist/server/require-hook.js +19 -8
  472. package/dist/web/standalone/node_modules/next/dist/server/response-cache/utils.js +1 -0
  473. package/dist/web/standalone/node_modules/next/dist/server/resume-data-cache/cache-store.js +35 -23
  474. package/dist/web/standalone/node_modules/next/dist/server/resume-data-cache/resume-data-cache.js +16 -7
  475. package/dist/web/standalone/node_modules/next/dist/server/revalidation-utils.js +12 -7
  476. package/dist/web/standalone/node_modules/next/dist/server/route-matcher-providers/dev/dev-app-page-route-matcher-provider.js +2 -1
  477. package/dist/web/standalone/node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.js +4 -1
  478. package/dist/web/standalone/node_modules/next/dist/server/route-modules/app-page/module.js +31 -1
  479. package/dist/web/standalone/node_modules/next/dist/server/route-modules/app-page/normalize-request-url.js +25 -0
  480. package/dist/web/standalone/node_modules/next/dist/server/route-modules/pages/pages-handler.js +31 -8
  481. package/dist/web/standalone/node_modules/next/dist/server/route-modules/route-module.js +71 -18
  482. package/dist/web/standalone/node_modules/next/dist/server/stream-utils/encoded-tags.js +8 -0
  483. package/dist/web/standalone/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +239 -58
  484. package/dist/web/standalone/node_modules/next/dist/server/stream-utils/uint8array-helpers.js +7 -2
  485. package/dist/web/standalone/node_modules/next/dist/server/typescript/constant.js +1 -0
  486. package/dist/web/standalone/node_modules/next/dist/server/typescript/rules/config.js +14 -3
  487. package/dist/web/standalone/node_modules/next/dist/server/web/adapter.js +7 -3
  488. package/dist/web/standalone/node_modules/next/dist/server/web/next-url.js +6 -2
  489. package/dist/web/standalone/node_modules/next/dist/server/web/sandbox/sandbox.js +3 -0
  490. package/dist/web/standalone/node_modules/next/dist/shared/lib/app-router-types.js +30 -11
  491. package/dist/web/standalone/node_modules/next/dist/shared/lib/constants.js +7 -7
  492. package/dist/web/standalone/node_modules/next/dist/shared/lib/deployment-id.js +37 -10
  493. package/dist/web/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  494. package/dist/web/standalone/node_modules/next/dist/shared/lib/errors/code-frame.js +20 -0
  495. package/dist/web/standalone/node_modules/next/dist/shared/lib/format-webpack-messages.js +22 -2
  496. package/dist/web/standalone/node_modules/next/dist/shared/lib/image-config.js +3 -1
  497. package/dist/web/standalone/node_modules/next/dist/shared/lib/is-internal.js +2 -0
  498. package/dist/web/standalone/node_modules/next/dist/shared/lib/magic-identifier.js +6 -6
  499. package/dist/web/standalone/node_modules/next/dist/shared/lib/router/router.js +32 -0
  500. package/dist/web/standalone/node_modules/next/dist/shared/lib/router/utils/app-paths.js +11 -0
  501. package/dist/web/standalone/node_modules/next/dist/shared/lib/router/utils/get-dynamic-param.js +11 -4
  502. package/dist/web/standalone/node_modules/next/dist/shared/lib/router/utils/parse-loader-tree.js +3 -2
  503. package/dist/web/standalone/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.js +9 -2
  504. package/dist/web/standalone/node_modules/next/dist/shared/lib/router/utils/parse-url.js +8 -2
  505. package/dist/web/standalone/node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.js +32 -0
  506. package/dist/web/standalone/node_modules/next/dist/shared/lib/server-reference-info.js +4 -0
  507. package/dist/web/standalone/node_modules/next/dist/shared/lib/size-limit.js +6 -1
  508. package/dist/web/standalone/node_modules/next/dist/shared/lib/turbopack/compilation-events.js +47 -10
  509. package/dist/web/standalone/node_modules/next/dist/shared/lib/turbopack/manifest-loader.js +90 -116
  510. package/dist/web/standalone/node_modules/next/dist/shared/lib/turbopack/utils.js +14 -26
  511. package/dist/web/standalone/node_modules/next/dist/shared/lib/utils/reflect-utils.js +69 -0
  512. package/dist/web/standalone/node_modules/next/dist/shared/lib/utils.js +2 -2
  513. package/dist/web/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  514. package/dist/web/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  515. package/dist/web/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  516. package/dist/web/standalone/node_modules/next/dist/trace/index.js +4 -0
  517. package/dist/web/standalone/node_modules/next/dist/trace/report/to-json-build.js +11 -108
  518. package/dist/web/standalone/node_modules/next/dist/trace/report/to-json.js +52 -38
  519. package/dist/web/standalone/node_modules/next/dist/trace/trace.js +15 -1
  520. package/dist/web/standalone/node_modules/next/package.json +21 -23
  521. package/dist/web/standalone/node_modules/react/cjs/react.development.js +1284 -0
  522. package/dist/web/standalone/package.json +2 -2
  523. package/dist/web/standalone/server.js +1 -1
  524. package/package.json +1 -1
  525. package/packages/mcp-server/README.md +38 -0
  526. package/packages/mcp-server/src/server.ts +6 -2
  527. package/packages/mcp-server/src/workflow-tools.test.ts +976 -0
  528. package/packages/mcp-server/src/workflow-tools.ts +986 -0
  529. package/packages/pi-ai/dist/utils/event-stream.d.ts +2 -0
  530. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  531. package/packages/pi-ai/dist/utils/event-stream.js +4 -0
  532. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  533. package/packages/pi-ai/src/utils/event-stream.ts +5 -0
  534. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +12 -2
  536. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  537. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts +13 -0
  538. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts.map +1 -0
  539. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js +27 -0
  540. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js.map +1 -0
  541. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +15 -2
  542. package/packages/pi-coding-agent/src/modes/interactive/provider-auth-setup.ts +40 -0
  543. package/src/resources/GSD-WORKFLOW.md +3 -1
  544. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +96 -44
  545. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +211 -2
  546. package/src/resources/extensions/get-secrets-from-user.ts +20 -2
  547. package/src/resources/extensions/gsd/auto/phases.ts +25 -0
  548. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +20 -0
  549. package/src/resources/extensions/gsd/auto-post-unit.ts +30 -1
  550. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -435
  551. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -5
  552. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +7 -72
  553. package/src/resources/extensions/gsd/bootstrap/system-context.ts +18 -4
  554. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +122 -6
  555. package/src/resources/extensions/gsd/codebase-generator.ts +261 -16
  556. package/src/resources/extensions/gsd/commands/catalog.ts +4 -3
  557. package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -2
  558. package/src/resources/extensions/gsd/commands/handlers/core.ts +135 -2
  559. package/src/resources/extensions/gsd/commands/index.ts +7 -1
  560. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  561. package/src/resources/extensions/gsd/commands-codebase.ts +4 -3
  562. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +38 -7
  563. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -4
  564. package/src/resources/extensions/gsd/doctor-proactive.ts +3 -3
  565. package/src/resources/extensions/gsd/guided-flow.ts +24 -0
  566. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  567. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  568. package/src/resources/extensions/gsd/prompts/system.md +3 -0
  569. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -5
  570. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +68 -0
  571. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +12 -0
  572. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +133 -0
  573. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +66 -0
  574. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +9 -2
  575. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -0
  576. package/src/resources/extensions/gsd/tests/preferences.test.ts +17 -0
  577. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +25 -3
  578. package/src/resources/extensions/gsd/tests/update-command.test.ts +19 -0
  579. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +16 -0
  580. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +301 -0
  581. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +625 -0
  582. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +629 -0
  583. package/src/resources/extensions/gsd/workflow-logger.ts +19 -3
  584. package/src/resources/extensions/gsd/workflow-mcp.ts +233 -0
  585. package/src/resources/extensions/gsd/workflow-reconcile.ts +0 -5
  586. package/src/resources/extensions/gsd/worktree-manager.ts +6 -2
  587. package/dist/web/standalone/.next/server/chunks/7471.js +0 -13
  588. package/dist/web/standalone/.next/static/FRT6f5ou3wPxpZ7ojoB7E/_buildManifest.js +0 -1
  589. package/dist/web/standalone/.next/static/chunks/2008.817d0885545aaea9.js +0 -20
  590. package/dist/web/standalone/.next/static/chunks/3794-337d1ca25ad99a89.js +0 -2
  591. package/dist/web/standalone/.next/static/chunks/4bd1b696-e5d7c65570c947b7.js +0 -1
  592. package/dist/web/standalone/.next/static/chunks/framework-0675a4b5b92df616.js +0 -1
  593. package/dist/web/standalone/.next/static/chunks/main-cb72b7c5b8014fa5.js +0 -5
  594. package/dist/web/standalone/node_modules/next/dist/client/components/router-reducer/handle-mutable.js +0 -66
  595. package/dist/web/standalone/node_modules/next/dist/compiled/babel/code-frame.js +0 -1
  596. package/dist/web/standalone/node_modules/next/dist/compiled/babel-code-frame/index.js +0 -1
  597. package/dist/web/standalone/node_modules/next/dist/compiled/babel-code-frame/package.json +0 -1
  598. package/dist/web/standalone/node_modules/next/dist/compiled/tar/index.js +0 -1
  599. package/dist/web/standalone/node_modules/next/dist/server/app-render/staged-validation.js +0 -32
  600. package/dist/web/standalone/node_modules/next/dist/server/lib/router-utils/block-cross-site.js +0 -76
  601. package/dist/web/standalone/node_modules/next/dist/shared/lib/segment-cache/output-export-prefetch-encoding.js +0 -52
  602. package/dist/web/standalone/node_modules/typescript/lib/typescript.js +0 -198668
  603. package/dist/web/standalone/node_modules/typescript/package.json +0 -120
  604. /package/dist/web/standalone/.next/static/{FRT6f5ou3wPxpZ7ojoB7E → mHJZ3Z8yGRzZ32BmQs-I7}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
1
3
  const MILESTONE_CONTEXT_RE = /M\d+(?:-[a-z0-9]{6})?-CONTEXT\.md$/;
2
4
  const CONTEXT_MILESTONE_RE = /(?:^|[/\\])(M\d+(?:-[a-z0-9]{6})?)-CONTEXT\.md$/i;
3
5
  const DEPTH_VERIFICATION_MILESTONE_RE = /depth_verification[_-](M\d+(?:-[a-z0-9]{6})?)/i;
@@ -57,6 +59,61 @@ const GATE_SAFE_TOOLS = new Set([
57
59
  "search-the-web", "resolve_library", "get_library_docs", "fetch_page",
58
60
  "search_and_read",
59
61
  ]);
62
+ function shouldPersistWriteGateSnapshot(env = process.env) {
63
+ return env.GSD_PERSIST_WRITE_GATE_STATE === "1";
64
+ }
65
+ function writeGateSnapshotPath(basePath = process.cwd()) {
66
+ return join(basePath, ".gsd", "runtime", "write-gate-state.json");
67
+ }
68
+ function currentWriteGateSnapshot() {
69
+ return {
70
+ verifiedDepthMilestones: [...verifiedDepthMilestones].sort(),
71
+ activeQueuePhase,
72
+ pendingGateId,
73
+ };
74
+ }
75
+ function persistWriteGateSnapshot(basePath = process.cwd()) {
76
+ if (!shouldPersistWriteGateSnapshot())
77
+ return;
78
+ const path = writeGateSnapshotPath(basePath);
79
+ mkdirSync(join(basePath, ".gsd", "runtime"), { recursive: true });
80
+ const tempPath = `${path}.tmp`;
81
+ writeFileSync(tempPath, JSON.stringify(currentWriteGateSnapshot(), null, 2), "utf-8");
82
+ renameSync(tempPath, path);
83
+ }
84
+ function clearPersistedWriteGateSnapshot(basePath = process.cwd()) {
85
+ if (!shouldPersistWriteGateSnapshot())
86
+ return;
87
+ const path = writeGateSnapshotPath(basePath);
88
+ try {
89
+ unlinkSync(path);
90
+ }
91
+ catch {
92
+ // swallow
93
+ }
94
+ }
95
+ function normalizeWriteGateSnapshot(value) {
96
+ const record = value && typeof value === "object" ? value : {};
97
+ const verified = Array.isArray(record.verifiedDepthMilestones)
98
+ ? record.verifiedDepthMilestones.filter((item) => typeof item === "string")
99
+ : [];
100
+ return {
101
+ verifiedDepthMilestones: [...new Set(verified)].sort(),
102
+ activeQueuePhase: record.activeQueuePhase === true,
103
+ pendingGateId: typeof record.pendingGateId === "string" ? record.pendingGateId : null,
104
+ };
105
+ }
106
+ export function loadWriteGateSnapshot(basePath = process.cwd()) {
107
+ const path = writeGateSnapshotPath(basePath);
108
+ if (!existsSync(path))
109
+ return currentWriteGateSnapshot();
110
+ try {
111
+ return normalizeWriteGateSnapshot(JSON.parse(readFileSync(path, "utf-8")));
112
+ }
113
+ catch {
114
+ return currentWriteGateSnapshot();
115
+ }
116
+ }
60
117
  export function isDepthVerified() {
61
118
  return verifiedDepthMilestones.size > 0;
62
119
  }
@@ -68,25 +125,34 @@ export function isMilestoneDepthVerified(milestoneId) {
68
125
  return false;
69
126
  return verifiedDepthMilestones.has(milestoneId);
70
127
  }
128
+ export function isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId) {
129
+ if (!milestoneId)
130
+ return false;
131
+ return snapshot.verifiedDepthMilestones.includes(milestoneId);
132
+ }
71
133
  export function isQueuePhaseActive() {
72
134
  return activeQueuePhase;
73
135
  }
74
136
  export function setQueuePhaseActive(active) {
75
137
  activeQueuePhase = active;
138
+ persistWriteGateSnapshot();
76
139
  }
77
140
  export function resetWriteGateState() {
78
141
  verifiedDepthMilestones.clear();
79
142
  pendingGateId = null;
143
+ persistWriteGateSnapshot();
80
144
  }
81
145
  export function clearDiscussionFlowState() {
82
146
  verifiedDepthMilestones.clear();
83
147
  activeQueuePhase = false;
84
148
  pendingGateId = null;
149
+ clearPersistedWriteGateSnapshot();
85
150
  }
86
- export function markDepthVerified(milestoneId) {
151
+ export function markDepthVerified(milestoneId, basePath = process.cwd()) {
87
152
  if (!milestoneId)
88
153
  return;
89
154
  verifiedDepthMilestones.add(milestoneId);
155
+ persistWriteGateSnapshot(basePath);
90
156
  }
91
157
  /**
92
158
  * Check whether a question ID matches a recognized gate pattern.
@@ -114,12 +180,14 @@ function extractContextMilestoneId(inputPath) {
114
180
  */
115
181
  export function setPendingGate(gateId) {
116
182
  pendingGateId = gateId;
183
+ persistWriteGateSnapshot();
117
184
  }
118
185
  /**
119
186
  * Clear the pending gate (called when the user confirms).
120
187
  */
121
188
  export function clearPendingGate() {
122
189
  pendingGateId = null;
190
+ persistWriteGateSnapshot();
123
191
  }
124
192
  /**
125
193
  * Get the currently pending gate, if any.
@@ -134,8 +202,11 @@ export function getPendingGate() {
134
202
  * Returns { block: true, reason } if the tool should be blocked.
135
203
  * Read-only tools and ask_user_questions itself are always allowed.
136
204
  */
137
- export function shouldBlockPendingGate(toolName, _milestoneId, _queuePhaseActive) {
138
- if (!pendingGateId)
205
+ export function shouldBlockPendingGate(toolName, milestoneId, queuePhaseActive) {
206
+ return shouldBlockPendingGateInSnapshot(currentWriteGateSnapshot(), toolName, milestoneId, queuePhaseActive);
207
+ }
208
+ export function shouldBlockPendingGateInSnapshot(snapshot, toolName, _milestoneId, _queuePhaseActive) {
209
+ if (!snapshot.pendingGateId)
139
210
  return { block: false };
140
211
  if (GATE_SAFE_TOOLS.has(toolName))
141
212
  return { block: false };
@@ -145,7 +216,7 @@ export function shouldBlockPendingGate(toolName, _milestoneId, _queuePhaseActive
145
216
  return {
146
217
  block: true,
147
218
  reason: [
148
- `HARD BLOCK: Discussion gate "${pendingGateId}" has not been confirmed by the user.`,
219
+ `HARD BLOCK: Discussion gate "${snapshot.pendingGateId}" has not been confirmed by the user.`,
149
220
  `You MUST re-call ask_user_questions with the gate question before making any other tool calls.`,
150
221
  `If the previous ask_user_questions call failed, errored, was cancelled, or the user's response`,
151
222
  `did not match a provided option, you MUST re-ask — never rationalize past the block.`,
@@ -157,8 +228,11 @@ export function shouldBlockPendingGate(toolName, _milestoneId, _queuePhaseActive
157
228
  * Check whether a bash command should be blocked because a discussion gate is pending.
158
229
  * Read-only bash commands are allowed; mutating commands are blocked.
159
230
  */
160
- export function shouldBlockPendingGateBash(command, _milestoneId, _queuePhaseActive) {
161
- if (!pendingGateId)
231
+ export function shouldBlockPendingGateBash(command, milestoneId, queuePhaseActive) {
232
+ return shouldBlockPendingGateBashInSnapshot(currentWriteGateSnapshot(), command, milestoneId, queuePhaseActive);
233
+ }
234
+ export function shouldBlockPendingGateBashInSnapshot(snapshot, command, _milestoneId, _queuePhaseActive) {
235
+ if (!snapshot.pendingGateId)
162
236
  return { block: false };
163
237
  // Allow read-only bash commands
164
238
  if (BASH_READ_ONLY_RE.test(command))
@@ -166,7 +240,7 @@ export function shouldBlockPendingGateBash(command, _milestoneId, _queuePhaseAct
166
240
  return {
167
241
  block: true,
168
242
  reason: [
169
- `HARD BLOCK: Discussion gate "${pendingGateId}" has not been confirmed by the user.`,
243
+ `HARD BLOCK: Discussion gate "${snapshot.pendingGateId}" has not been confirmed by the user.`,
170
244
  `You MUST re-call ask_user_questions with the gate question before running mutating commands.`,
171
245
  `If the previous ask_user_questions call failed, errored, was cancelled, or the user's response`,
172
246
  `did not match a provided option, you MUST re-ask — never rationalize past the block.`,
@@ -232,6 +306,9 @@ export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queue
232
306
  * require the milestone to be depth-verified first.
233
307
  */
234
308
  export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceId) {
309
+ return shouldBlockContextArtifactSaveInSnapshot(currentWriteGateSnapshot(), artifactType, milestoneId, sliceId);
310
+ }
311
+ export function shouldBlockContextArtifactSaveInSnapshot(snapshot, artifactType, milestoneId, sliceId) {
235
312
  if (artifactType !== "CONTEXT")
236
313
  return { block: false };
237
314
  if (sliceId)
@@ -245,7 +322,7 @@ export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceI
245
322
  ].join(" "),
246
323
  };
247
324
  }
248
- if (isMilestoneDepthVerified(milestoneId))
325
+ if (isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId))
249
326
  return { block: false };
250
327
  return {
251
328
  block: true,
@@ -271,6 +348,9 @@ export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceI
271
348
  * @returns { block, reason } — block=true if the call should be rejected.
272
349
  */
273
350
  export function shouldBlockQueueExecution(toolName, input, queuePhaseActive) {
351
+ return shouldBlockQueueExecutionInSnapshot(currentWriteGateSnapshot(), toolName, input, queuePhaseActive);
352
+ }
353
+ export function shouldBlockQueueExecutionInSnapshot(snapshot, toolName, input, queuePhaseActive = snapshot.activeQueuePhase) {
274
354
  if (!queuePhaseActive)
275
355
  return { block: false };
276
356
  // Always-safe tools (read-only, discussion, planning)
@@ -7,6 +7,7 @@
7
7
  * Generation: walk `git ls-files`, group by directory, output with descriptions.
8
8
  * Maintenance: agent updates descriptions as it works; incremental update preserves them.
9
9
  */
10
+ import { createHash } from "node:crypto";
10
11
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
11
12
  import { join, dirname, extname } from "node:path";
12
13
  import { execSync } from "node:child_process";
@@ -31,6 +32,10 @@ const DEFAULT_EXCLUDES = [
31
32
  ];
32
33
  const DEFAULT_MAX_FILES = 500;
33
34
  const DEFAULT_COLLAPSE_THRESHOLD = 20;
35
+ const DEFAULT_REFRESH_TTL_MS = 30_000;
36
+ const DEFAULT_MAX_AGE_MS = 15 * 60_000;
37
+ const CODEBASE_METADATA_PREFIX = "<!-- gsd:codebase-meta ";
38
+ const freshnessCache = new Map();
34
39
  // ─── Parsing ─────────────────────────────────────────────────────────────────
35
40
  /**
36
41
  * Parse an existing CODEBASE.md to extract file → description mappings.
@@ -66,6 +71,31 @@ export function parseCodebaseMap(content) {
66
71
  }
67
72
  return descriptions;
68
73
  }
74
+ export function parseCodebaseMapMetadata(content) {
75
+ const metaLine = content
76
+ .split("\n")
77
+ .find((line) => line.trimStart().startsWith(CODEBASE_METADATA_PREFIX));
78
+ if (!metaLine)
79
+ return null;
80
+ const trimmed = metaLine.trim();
81
+ const jsonStart = CODEBASE_METADATA_PREFIX.length;
82
+ const jsonEnd = trimmed.lastIndexOf(" -->");
83
+ if (jsonEnd <= jsonStart)
84
+ return null;
85
+ try {
86
+ const parsed = JSON.parse(trimmed.slice(jsonStart, jsonEnd));
87
+ if (typeof parsed?.generatedAt === "string"
88
+ && typeof parsed?.fingerprint === "string"
89
+ && typeof parsed?.fileCount === "number"
90
+ && typeof parsed?.truncated === "boolean") {
91
+ return parsed;
92
+ }
93
+ }
94
+ catch {
95
+ // Ignore malformed metadata and treat the map as stale.
96
+ }
97
+ return null;
98
+ }
69
99
  // ─── File Enumeration ────────────────────────────────────────────────────────
70
100
  function shouldExclude(filePath, excludes) {
71
101
  for (const pattern of excludes) {
@@ -103,6 +133,30 @@ function enumerateFiles(basePath, excludes, maxFiles) {
103
133
  const truncated = filtered.length > maxFiles;
104
134
  return { files: truncated ? filtered.slice(0, maxFiles) : filtered, truncated };
105
135
  }
136
+ function resolveGeneratorOptions(options) {
137
+ const excludes = [...DEFAULT_EXCLUDES, ...(options?.excludePatterns ?? [])];
138
+ const maxFiles = options?.maxFiles ?? DEFAULT_MAX_FILES;
139
+ const collapseThreshold = options?.collapseThreshold ?? DEFAULT_COLLAPSE_THRESHOLD;
140
+ return {
141
+ excludes,
142
+ maxFiles,
143
+ collapseThreshold,
144
+ optionSignature: JSON.stringify({
145
+ excludes,
146
+ maxFiles,
147
+ collapseThreshold,
148
+ }),
149
+ };
150
+ }
151
+ function computeCodebaseFingerprint(files, resolved, truncated) {
152
+ return createHash("sha1")
153
+ .update(JSON.stringify({
154
+ files,
155
+ truncated,
156
+ optionSignature: resolved.optionSignature,
157
+ }))
158
+ .digest("hex");
159
+ }
106
160
  // ─── Grouping ────────────────────────────────────────────────────────────────
107
161
  function groupByDirectory(files, descriptions, collapseThreshold) {
108
162
  const dirMap = new Map();
@@ -131,13 +185,13 @@ function groupByDirectory(files, descriptions, collapseThreshold) {
131
185
  return groups;
132
186
  }
133
187
  // ─── Rendering ───────────────────────────────────────────────────────────────
134
- function renderCodebaseMap(groups, totalFiles, truncated) {
188
+ function renderCodebaseMap(groups, totalFiles, truncated, metadata) {
135
189
  const lines = [];
136
- const now = new Date().toISOString().split(".")[0] + "Z";
137
190
  const described = groups.reduce((sum, g) => sum + g.files.filter((f) => f.description).length, 0);
138
191
  lines.push("# Codebase Map");
139
192
  lines.push("");
140
- lines.push(`Generated: ${now} | Files: ${totalFiles} | Described: ${described}/${totalFiles}`);
193
+ lines.push(`Generated: ${metadata.generatedAt} | Files: ${totalFiles} | Described: ${described}/${totalFiles}`);
194
+ lines.push(`${CODEBASE_METADATA_PREFIX}${JSON.stringify(metadata)} -->`);
141
195
  if (truncated) {
142
196
  lines.push(`Note: Truncated to first ${totalFiles} files. Run with higher --max-files to include all.`);
143
197
  }
@@ -182,20 +236,35 @@ function renderCodebaseMap(groups, totalFiles, truncated) {
182
236
  }
183
237
  return lines.join("\n");
184
238
  }
239
+ function buildCodebaseMap(basePath, resolved, existingDescriptions, enumerated) {
240
+ const listed = enumerated ?? enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
241
+ const descriptions = existingDescriptions ?? new Map();
242
+ const groups = groupByDirectory(listed.files, descriptions, resolved.collapseThreshold);
243
+ const generatedAt = new Date().toISOString().split(".")[0] + "Z";
244
+ const metadata = {
245
+ generatedAt,
246
+ fingerprint: computeCodebaseFingerprint(listed.files, resolved, listed.truncated),
247
+ fileCount: listed.files.length,
248
+ truncated: listed.truncated,
249
+ };
250
+ const content = renderCodebaseMap(groups, listed.files.length, listed.truncated, metadata);
251
+ return {
252
+ content,
253
+ fileCount: listed.files.length,
254
+ truncated: listed.truncated,
255
+ files: listed.files,
256
+ fingerprint: metadata.fingerprint,
257
+ generatedAt,
258
+ };
259
+ }
185
260
  // ─── Public API ──────────────────────────────────────────────────────────────
186
261
  /**
187
262
  * Generate a fresh CODEBASE.md from scratch.
188
263
  * Preserves existing descriptions if `existingDescriptions` is provided.
189
264
  */
190
265
  export function generateCodebaseMap(basePath, options, existingDescriptions) {
191
- const excludes = [...DEFAULT_EXCLUDES, ...(options?.excludePatterns ?? [])];
192
- const maxFiles = options?.maxFiles ?? DEFAULT_MAX_FILES;
193
- const collapseThreshold = options?.collapseThreshold ?? DEFAULT_COLLAPSE_THRESHOLD;
194
- const { files, truncated } = enumerateFiles(basePath, excludes, maxFiles);
195
- const descriptions = existingDescriptions ?? new Map();
196
- const groups = groupByDirectory(files, descriptions, collapseThreshold);
197
- const content = renderCodebaseMap(groups, files.length, truncated);
198
- return { content, fileCount: files.length, truncated, files };
266
+ const resolved = resolveGeneratorOptions(options);
267
+ return buildCodebaseMap(basePath, resolved, existingDescriptions);
199
268
  }
200
269
  /**
201
270
  * Incremental update: re-scan files, preserve existing descriptions,
@@ -203,6 +272,7 @@ export function generateCodebaseMap(basePath, options, existingDescriptions) {
203
272
  */
204
273
  export function updateCodebaseMap(basePath, options) {
205
274
  const codebasePath = join(gsdRoot(basePath), "CODEBASE.md");
275
+ const resolved = resolveGeneratorOptions(options);
206
276
  // Load existing descriptions
207
277
  let existingDescriptions = new Map();
208
278
  if (existsSync(codebasePath)) {
@@ -212,7 +282,7 @@ export function updateCodebaseMap(basePath, options) {
212
282
  const existingFiles = new Set(existingDescriptions.keys());
213
283
  // Generate new map preserving descriptions — reuse the returned file list
214
284
  // to avoid a second enumeration (prevents race between content and stats).
215
- const result = generateCodebaseMap(basePath, options, existingDescriptions);
285
+ const result = buildCodebaseMap(basePath, resolved, existingDescriptions);
216
286
  const currentSet = new Set(result.files);
217
287
  // Count changes
218
288
  let added = 0;
@@ -232,8 +302,98 @@ export function updateCodebaseMap(basePath, options) {
232
302
  unchanged: result.files.length - added,
233
303
  fileCount: result.fileCount,
234
304
  truncated: result.truncated,
305
+ fingerprint: result.fingerprint,
306
+ generatedAt: result.generatedAt,
235
307
  };
236
308
  }
309
+ function clearFreshnessCache(basePath) {
310
+ for (const key of freshnessCache.keys()) {
311
+ if (key === basePath || key.startsWith(`${basePath}::`)) {
312
+ freshnessCache.delete(key);
313
+ }
314
+ }
315
+ }
316
+ export function ensureCodebaseMapFresh(basePath, options, ensureOptions) {
317
+ const resolved = resolveGeneratorOptions(options);
318
+ const cacheKey = `${basePath}::${resolved.optionSignature}`;
319
+ const ttlMs = ensureOptions?.ttlMs ?? DEFAULT_REFRESH_TTL_MS;
320
+ const maxAgeMs = ensureOptions?.maxAgeMs ?? DEFAULT_MAX_AGE_MS;
321
+ const force = ensureOptions?.force === true;
322
+ const now = Date.now();
323
+ if (!force && ttlMs > 0) {
324
+ const cached = freshnessCache.get(cacheKey);
325
+ if (cached && now - cached.checkedAt < ttlMs) {
326
+ return cached.result;
327
+ }
328
+ }
329
+ const existing = readCodebaseMap(basePath);
330
+ const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
331
+ const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
332
+ const cacheAndReturn = (result) => {
333
+ freshnessCache.set(cacheKey, { checkedAt: now, result });
334
+ return result;
335
+ };
336
+ if (!existing) {
337
+ const generated = buildCodebaseMap(basePath, resolved, undefined, listed);
338
+ if (generated.fileCount > 0) {
339
+ writeCodebaseMap(basePath, generated.content);
340
+ return cacheAndReturn({
341
+ status: "generated",
342
+ fileCount: generated.fileCount,
343
+ truncated: generated.truncated,
344
+ generatedAt: generated.generatedAt,
345
+ fingerprint: generated.fingerprint,
346
+ reason: "missing",
347
+ });
348
+ }
349
+ return cacheAndReturn({
350
+ status: "empty",
351
+ fileCount: 0,
352
+ truncated: false,
353
+ generatedAt: null,
354
+ fingerprint,
355
+ reason: "no-tracked-files",
356
+ });
357
+ }
358
+ const metadata = parseCodebaseMapMetadata(existing);
359
+ const existingDescriptions = parseCodebaseMap(existing);
360
+ const ageMs = metadata ? now - Date.parse(metadata.generatedAt) : Number.POSITIVE_INFINITY;
361
+ const staleReason = !metadata ? "missing-metadata"
362
+ : metadata.fingerprint !== fingerprint ? "files-changed"
363
+ : metadata.fileCount !== listed.files.length ? "file-count-changed"
364
+ : metadata.truncated !== listed.truncated ? "truncation-changed"
365
+ : maxAgeMs > 0 && Number.isFinite(ageMs) && ageMs > maxAgeMs ? "expired"
366
+ : undefined;
367
+ if (!staleReason) {
368
+ return cacheAndReturn({
369
+ status: "fresh",
370
+ fileCount: metadata?.fileCount ?? listed.files.length,
371
+ truncated: metadata?.truncated ?? listed.truncated,
372
+ generatedAt: metadata?.generatedAt ?? null,
373
+ fingerprint: metadata?.fingerprint ?? fingerprint,
374
+ });
375
+ }
376
+ const updated = buildCodebaseMap(basePath, resolved, existingDescriptions, listed);
377
+ if (updated.fileCount > 0) {
378
+ writeCodebaseMap(basePath, updated.content);
379
+ return cacheAndReturn({
380
+ status: "updated",
381
+ fileCount: updated.fileCount,
382
+ truncated: updated.truncated,
383
+ generatedAt: updated.generatedAt,
384
+ fingerprint: updated.fingerprint,
385
+ reason: staleReason,
386
+ });
387
+ }
388
+ return cacheAndReturn({
389
+ status: "empty",
390
+ fileCount: 0,
391
+ truncated: false,
392
+ generatedAt: null,
393
+ fingerprint,
394
+ reason: staleReason,
395
+ });
396
+ }
237
397
  /**
238
398
  * Write CODEBASE.md to .gsd/ directory.
239
399
  */
@@ -242,6 +402,7 @@ export function writeCodebaseMap(basePath, content) {
242
402
  mkdirSync(root, { recursive: true });
243
403
  const outPath = join(root, "CODEBASE.md");
244
404
  writeFileSync(outPath, content, "utf-8");
405
+ clearFreshnessCache(basePath);
245
406
  return outPath;
246
407
  }
247
408
  /**
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { loadRegistry } from "../workflow-templates.js";
5
5
  import { resolveProjectRoot } from "../worktree.js";
6
6
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
7
- export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
7
+ export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
8
8
  export const TOP_LEVEL_SUBCOMMANDS = [
9
9
  { cmd: "help", desc: "Categorized command reference with descriptions" },
10
10
  { cmd: "next", desc: "Explicit step mode (same as /gsd)" },
@@ -29,6 +29,7 @@ export const TOP_LEVEL_SUBCOMMANDS = [
29
29
  { cmd: "skip", desc: "Prevent a unit from auto-mode dispatch" },
30
30
  { cmd: "export", desc: "Export milestone/slice results" },
31
31
  { cmd: "cleanup", desc: "Remove merged branches or snapshots" },
32
+ { cmd: "model", desc: "Switch the active session model or open a picker" },
32
33
  { cmd: "mode", desc: "Switch workflow mode (solo/team)" },
33
34
  { cmd: "prefs", desc: "Manage preferences (model selection, timeouts, etc.)" },
34
35
  { cmd: "config", desc: "Set API keys for external tools" },
@@ -60,7 +61,7 @@ export const TOP_LEVEL_SUBCOMMANDS = [
60
61
  { cmd: "mcp", desc: "MCP server status and connectivity check (status, check <server>)" },
61
62
  { cmd: "rethink", desc: "Conversational project reorganization — reorder, park, discard, add milestones" },
62
63
  { cmd: "workflow", desc: "Custom workflow lifecycle (new, run, list, validate, pause, resume)" },
63
- { cmd: "codebase", desc: "Generate and manage codebase map (.gsd/CODEBASE.md)" },
64
+ { cmd: "codebase", desc: "Generate, refresh, and inspect the codebase map cache (.gsd/CODEBASE.md)" },
64
65
  ];
65
66
  const NESTED_COMPLETIONS = {
66
67
  auto: [
@@ -223,7 +224,7 @@ const NESTED_COMPLETIONS = {
223
224
  { cmd: "generate", desc: "Generate or regenerate CODEBASE.md" },
224
225
  { cmd: "generate --max-files", desc: "Generate with custom file limit (default: 500)" },
225
226
  { cmd: "generate --collapse-threshold", desc: "Generate with custom collapse threshold (default: 20)" },
226
- { cmd: "update", desc: "Incremental update (preserves descriptions)" },
227
+ { cmd: "update", desc: "Refresh the CODEBASE.md cache immediately (preserves descriptions)" },
227
228
  { cmd: "update --max-files", desc: "Update with custom file limit" },
228
229
  { cmd: "update --collapse-threshold", desc: "Update with custom collapse threshold" },
229
230
  { cmd: "stats", desc: "Show file count, description coverage, and generation time" },
@@ -6,7 +6,7 @@ import { handleWorkflowCommand } from "./handlers/workflow.js";
6
6
  export async function handleGSDCommand(args, ctx, pi) {
7
7
  const trimmed = (typeof args === "string" ? args : "").trim();
8
8
  const handlers = [
9
- () => handleCoreCommand(trimmed, ctx),
9
+ () => handleCoreCommand(trimmed, ctx, pi),
10
10
  () => handleAutoCommand(trimmed, ctx, pi),
11
11
  () => handleParallelCommand(trimmed, ctx, pi),
12
12
  () => handleWorkflowCommand(trimmed, ctx, pi),
@@ -40,10 +40,12 @@ export function showHelp(ctx) {
40
40
  "",
41
41
  "PROJECT KNOWLEDGE",
42
42
  " /gsd knowledge <type> <text> Add rule, pattern, or lesson to KNOWLEDGE.md",
43
+ " /gsd codebase [generate|update|stats] Manage the CODEBASE.md cache used in prompt context",
43
44
  "",
44
45
  "SETUP & CONFIGURATION",
45
46
  " /gsd init Project init wizard — detect, configure, bootstrap .gsd/",
46
47
  " /gsd setup Global setup status [llm|search|remote|keys|prefs]",
48
+ " /gsd model Switch active session model [provider/model|model-id]",
47
49
  " /gsd mode Set workflow mode (solo/team) [global|project]",
48
50
  " /gsd prefs Manage preferences [global|project|status|wizard|setup|import-claude]",
49
51
  " /gsd cmux Manage cmux integration [status|on|off|notifications|sidebar|splits|browser]",
@@ -152,7 +154,106 @@ export async function handleSetup(args, ctx) {
152
154
  " /gsd setup keys — Tool API keys\n" +
153
155
  " /gsd setup prefs — Global preferences wizard", "info");
154
156
  }
155
- export async function handleCoreCommand(trimmed, ctx) {
157
+ function sortModelsForSelection(models, currentModel) {
158
+ return [...models].sort((a, b) => {
159
+ const aCurrent = currentModel && a.provider === currentModel.provider && a.id === currentModel.id;
160
+ const bCurrent = currentModel && b.provider === currentModel.provider && b.id === currentModel.id;
161
+ if (aCurrent && !bCurrent)
162
+ return -1;
163
+ if (!aCurrent && bCurrent)
164
+ return 1;
165
+ const providerCmp = a.provider.localeCompare(b.provider);
166
+ if (providerCmp !== 0)
167
+ return providerCmp;
168
+ return a.id.localeCompare(b.id);
169
+ });
170
+ }
171
+ function buildProviderModelGroups(models, currentModel) {
172
+ const byProvider = new Map();
173
+ for (const model of sortModelsForSelection(models, currentModel)) {
174
+ let group = byProvider.get(model.provider);
175
+ if (!group) {
176
+ group = [];
177
+ byProvider.set(model.provider, group);
178
+ }
179
+ group.push(model);
180
+ }
181
+ return byProvider;
182
+ }
183
+ async function selectModelByProvider(title, models, ctx, currentModel) {
184
+ const byProvider = buildProviderModelGroups(models, currentModel);
185
+ const providerOptions = Array.from(byProvider.entries()).map(([provider, group]) => `${provider} (${group.length} model${group.length === 1 ? "" : "s"})`);
186
+ providerOptions.push("(cancel)");
187
+ const providerChoice = await ctx.ui.select(`${title} — choose provider:`, providerOptions);
188
+ if (!providerChoice || typeof providerChoice !== "string" || providerChoice === "(cancel)")
189
+ return undefined;
190
+ const providerName = providerChoice.replace(/ \(\d+ models?\)$/, "");
191
+ const providerModels = byProvider.get(providerName);
192
+ if (!providerModels || providerModels.length === 0)
193
+ return undefined;
194
+ const optionToModel = new Map();
195
+ const modelOptions = providerModels.map((model) => {
196
+ const isCurrent = currentModel && model.provider === currentModel.provider && model.id === currentModel.id;
197
+ const label = `${isCurrent ? "* " : ""}${model.id}`;
198
+ optionToModel.set(label, model);
199
+ return label;
200
+ });
201
+ modelOptions.push("(cancel)");
202
+ const modelChoice = await ctx.ui.select(`${title} — ${providerName}:`, modelOptions);
203
+ if (!modelChoice || typeof modelChoice !== "string" || modelChoice === "(cancel)")
204
+ return undefined;
205
+ return optionToModel.get(modelChoice);
206
+ }
207
+ async function resolveRequestedModel(query, ctx) {
208
+ const { resolveModelId } = await import("../../auto-model-selection.js");
209
+ const models = ctx.modelRegistry.getAvailable();
210
+ const exact = resolveModelId(query, models, ctx.model?.provider);
211
+ if (exact)
212
+ return exact;
213
+ const lowerQuery = query.toLowerCase();
214
+ const partialMatches = models.filter((model) => model.id.toLowerCase().includes(lowerQuery)
215
+ || `${model.provider}/${model.id}`.toLowerCase().includes(lowerQuery));
216
+ if (partialMatches.length === 1)
217
+ return partialMatches[0];
218
+ if (partialMatches.length === 0 || !ctx.hasUI)
219
+ return undefined;
220
+ return selectModelByProvider(`Multiple models match "${query}"`, partialMatches, ctx, ctx.model);
221
+ }
222
+ async function handleModel(trimmedArgs, ctx, pi) {
223
+ const availableModels = ctx.modelRegistry.getAvailable();
224
+ if (availableModels.length === 0) {
225
+ ctx.ui.notify("No available models found. Check provider auth and model discovery.", "warning");
226
+ return;
227
+ }
228
+ if (!pi) {
229
+ ctx.ui.notify("Model switching is unavailable in this context.", "warning");
230
+ return;
231
+ }
232
+ const trimmed = trimmedArgs.trim();
233
+ let targetModel;
234
+ if (!trimmed) {
235
+ if (!ctx.hasUI) {
236
+ const current = ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "(none)";
237
+ ctx.ui.notify(`Current model: ${current}\nUsage: /gsd model <provider/model|model-id>`, "info");
238
+ return;
239
+ }
240
+ targetModel = await selectModelByProvider("Select session model:", availableModels, ctx, ctx.model);
241
+ }
242
+ else {
243
+ targetModel = await resolveRequestedModel(trimmed, ctx);
244
+ }
245
+ if (!targetModel) {
246
+ ctx.ui.notify(`Model "${trimmed}" not found. Use /gsd model with an exact provider/model or a unique model ID.`, "warning");
247
+ return;
248
+ }
249
+ const ok = await pi.setModel(targetModel);
250
+ if (!ok) {
251
+ ctx.ui.notify(`No API key for ${targetModel.provider}/${targetModel.id}`, "warning");
252
+ return;
253
+ }
254
+ ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}`, "info");
255
+ }
256
+ export async function handleCoreCommand(trimmed, ctx, pi) {
156
257
  if (trimmed === "help" || trimmed === "h" || trimmed === "?") {
157
258
  showHelp(ctx);
158
259
  return true;
@@ -177,6 +278,10 @@ export async function handleCoreCommand(trimmed, ctx) {
177
278
  ctx.ui.notify(`Widget: ${getWidgetMode()}`, "info");
178
279
  return true;
179
280
  }
281
+ if (trimmed === "model" || trimmed.startsWith("model ")) {
282
+ await handleModel(trimmed.replace(/^model\s*/, "").trim(), ctx, pi);
283
+ return true;
284
+ }
180
285
  if (trimmed === "mode" || trimmed.startsWith("mode ")) {
181
286
  const modeArgs = trimmed.replace(/^mode\s*/, "").trim();
182
287
  const scope = modeArgs === "project" ? "project" : "global";
@@ -5,7 +5,14 @@ export function registerGSDCommand(pi) {
5
5
  getArgumentCompletions: getGsdArgumentCompletions,
6
6
  handler: async (args, ctx) => {
7
7
  const { handleGSDCommand } = await import("./dispatcher.js");
8
- await handleGSDCommand(args, ctx, pi);
8
+ const { setStderrLoggingEnabled } = await import("../workflow-logger.js");
9
+ const previousStderrSetting = setStderrLoggingEnabled(false);
10
+ try {
11
+ await handleGSDCommand(args, ctx, pi);
12
+ }
13
+ finally {
14
+ setStderrLoggingEnabled(previousStderrSetting);
15
+ }
9
16
  },
10
17
  });
11
18
  }
@@ -44,6 +44,7 @@ const TOP_LEVEL_SUBCOMMANDS = [
44
44
  { cmd: "start", desc: "Start a workflow template" },
45
45
  { cmd: "templates", desc: "List available workflow templates" },
46
46
  { cmd: "extensions", desc: "Manage extensions" },
47
+ { cmd: "codebase", desc: "Generate, refresh, and inspect the codebase map cache" },
47
48
  ];
48
49
  function filterStartsWith(partial, options, prefix = "") {
49
50
  const normalizedPrefix = prefix.length > 0 ? `${prefix} ` : "";
@@ -192,6 +193,14 @@ function getGsdArgumentCompletions(prefix) {
192
193
  { cmd: "info", desc: "Show extension details" },
193
194
  ], "extensions");
194
195
  }
196
+ if (parts[0] === "codebase" && parts.length <= 2) {
197
+ return filterStartsWith(partial, [
198
+ { cmd: "generate", desc: "Generate or regenerate CODEBASE.md" },
199
+ { cmd: "update", desc: "Refresh the CODEBASE.md cache immediately" },
200
+ { cmd: "stats", desc: "Show codebase-map coverage and generation time" },
201
+ { cmd: "help", desc: "Show usage and subcommands" },
202
+ ], "codebase");
203
+ }
195
204
  if (parts[0] === "doctor" && parts.length <= 2) {
196
205
  return filterStartsWith(partial, [
197
206
  { cmd: "fix", desc: "Auto-fix detected issues" },