gsd-pi 2.58.0 → 2.59.0-dev.023bd39

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 (843) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +60 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  26. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  28. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  29. package/dist/resources/extensions/gsd/auto-worktree.js +199 -12
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  36. package/dist/resources/extensions/gsd/captures.js +56 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  41. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  42. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  43. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  44. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  45. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  46. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  47. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  48. package/dist/resources/extensions/gsd/doctor.js +3 -1
  49. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  50. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  51. package/dist/resources/extensions/gsd/forensics.js +123 -20
  52. package/dist/resources/extensions/gsd/git-service.js +105 -2
  53. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  54. package/dist/resources/extensions/gsd/gsd-db.js +36 -9
  55. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  56. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  57. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  58. package/dist/resources/extensions/gsd/index.js +1 -1
  59. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  60. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  61. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  62. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  63. package/dist/resources/extensions/gsd/model-router.js +35 -1
  64. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  65. package/dist/resources/extensions/gsd/notifications.js +16 -1
  66. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  67. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  68. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  69. package/dist/resources/extensions/gsd/paths.js +45 -0
  70. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  71. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  72. package/dist/resources/extensions/gsd/preferences.js +13 -16
  73. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  76. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  79. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  85. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  86. package/dist/resources/extensions/gsd/rethink.js +5 -0
  87. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  88. package/dist/resources/extensions/gsd/state.js +85 -27
  89. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  91. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  92. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  93. package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
  94. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  95. package/dist/resources/extensions/gsd/undo.js +2 -2
  96. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  97. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  98. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  99. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  100. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  101. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  102. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  103. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  104. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  105. package/dist/resources/extensions/mcp-client/index.js +11 -7
  106. package/dist/resources/extensions/ollama/index.js +112 -0
  107. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  108. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  109. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  110. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  111. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  112. package/dist/resources/extensions/ollama/types.js +2 -0
  113. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  114. package/dist/resources/extensions/search-the-web/url-utils.js +17 -0
  115. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  116. package/dist/resources/skills/btw/SKILL.md +42 -0
  117. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  118. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  119. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  120. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  121. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  122. package/dist/security-overrides.d.ts +11 -0
  123. package/dist/security-overrides.js +41 -0
  124. package/dist/startup-model-validation.d.ts +39 -0
  125. package/dist/startup-model-validation.js +50 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  128. package/dist/web/standalone/.next/build-manifest.json +4 -4
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  131. package/dist/web/standalone/.next/required-server-files.json +4 -4
  132. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  133. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  135. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  152. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  221. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  223. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  225. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/index.html +1 -1
  235. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  236. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  237. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  238. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  239. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  240. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  241. package/dist/web/standalone/.next/server/app/page.js +2 -2
  242. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  244. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  245. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  246. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/middleware.js +2 -2
  249. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  251. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  252. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  253. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  254. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  255. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  256. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  257. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  261. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  262. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  263. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  264. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  265. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  266. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  267. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  268. package/dist/web/standalone/server.js +1 -1
  269. package/dist/web-mode.js +2 -1
  270. package/dist/welcome-screen.d.ts +1 -0
  271. package/dist/welcome-screen.js +32 -6
  272. package/package.json +2 -2
  273. package/packages/daemon/src/daemon.ts +1 -1
  274. package/packages/daemon/src/discord-bot.ts +11 -0
  275. package/packages/daemon/src/event-bridge.ts +15 -9
  276. package/packages/daemon/src/event-formatter.ts +30 -2
  277. package/packages/daemon/src/message-batcher.test.ts +2 -2
  278. package/packages/daemon/src/message-batcher.ts +9 -3
  279. package/packages/daemon/src/orchestrator.test.ts +1 -0
  280. package/packages/daemon/src/orchestrator.ts +106 -2
  281. package/packages/native/dist/ast/index.js +9 -5
  282. package/packages/native/dist/ast/types.js +2 -1
  283. package/packages/native/dist/clipboard/index.js +12 -7
  284. package/packages/native/dist/clipboard/types.js +2 -1
  285. package/packages/native/dist/diff/index.js +12 -7
  286. package/packages/native/dist/diff/types.js +2 -1
  287. package/packages/native/dist/fd/index.js +6 -3
  288. package/packages/native/dist/fd/types.js +2 -1
  289. package/packages/native/dist/glob/index.js +9 -5
  290. package/packages/native/dist/glob/types.js +2 -1
  291. package/packages/native/dist/grep/index.js +9 -5
  292. package/packages/native/dist/grep/types.js +2 -1
  293. package/packages/native/dist/gsd-parser/index.js +18 -11
  294. package/packages/native/dist/gsd-parser/types.js +2 -1
  295. package/packages/native/dist/highlight/index.js +12 -7
  296. package/packages/native/dist/highlight/types.js +2 -1
  297. package/packages/native/dist/html/index.js +6 -3
  298. package/packages/native/dist/html/types.js +2 -1
  299. package/packages/native/dist/image/index.js +10 -5
  300. package/packages/native/dist/image/types.js +7 -4
  301. package/packages/native/dist/index.js +70 -17
  302. package/packages/native/dist/json-parse/index.js +13 -8
  303. package/packages/native/dist/native.js +47 -10
  304. package/packages/native/dist/ps/index.js +15 -9
  305. package/packages/native/dist/ps/types.js +2 -1
  306. package/packages/native/dist/stream-process/index.js +12 -7
  307. package/packages/native/dist/text/index.js +24 -14
  308. package/packages/native/dist/text/types.js +5 -2
  309. package/packages/native/dist/truncate/index.js +12 -7
  310. package/packages/native/dist/ttsr/index.js +12 -7
  311. package/packages/native/dist/ttsr/types.js +2 -1
  312. package/packages/native/dist/xxhash/index.js +9 -5
  313. package/packages/native/package.json +19 -19
  314. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  315. package/packages/native/src/native.ts +9 -8
  316. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  317. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  318. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  319. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  320. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  321. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  322. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  323. package/packages/pi-agent-core/src/proxy.ts +1 -1
  324. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  325. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  326. package/packages/pi-ai/dist/index.d.ts +1 -0
  327. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/index.js +1 -0
  329. package/packages/pi-ai/dist/index.js.map +1 -1
  330. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  331. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  332. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  333. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  334. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  335. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  336. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  337. package/packages/pi-ai/dist/types.d.ts +3 -3
  338. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/types.js.map +1 -1
  340. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  341. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  342. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  343. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  344. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  345. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  346. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  347. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  348. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  349. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  350. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  351. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  352. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  353. package/packages/pi-ai/src/index.ts +1 -0
  354. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  355. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  356. package/packages/pi-ai/src/types.ts +3 -2
  357. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  358. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  359. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  360. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  361. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  363. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  365. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  367. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  369. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  370. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  371. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  372. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  374. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  376. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  377. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  378. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  379. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  380. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  381. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  382. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  383. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  384. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  385. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  386. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  388. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  390. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  392. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  394. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  396. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  398. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  400. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  402. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  403. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  404. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  405. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  406. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  407. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  408. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  410. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  413. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  416. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  419. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  421. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  422. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  423. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  424. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  425. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  426. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  427. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts +8 -0
  428. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  429. package/packages/pi-coding-agent/dist/core/resolve-config-value.js +23 -2
  430. package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +89 -2
  432. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  434. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  436. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  438. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  440. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  442. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  443. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  444. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts +2 -0
  446. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts.map +1 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js +83 -0
  448. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js.map +1 -0
  449. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -0
  450. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  451. package/packages/pi-coding-agent/dist/core/settings-manager.js +36 -3
  452. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  455. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  458. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  460. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  461. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  462. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  463. package/packages/pi-coding-agent/dist/index.d.ts +3 -2
  464. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  465. package/packages/pi-coding-agent/dist/index.js +2 -1
  466. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  482. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  486. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  488. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  489. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  490. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  493. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  495. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  496. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  497. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  498. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  499. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  500. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  501. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  502. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  503. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  504. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  505. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  506. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  522. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  523. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  525. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  526. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  528. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  529. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  531. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  533. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
  534. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +22 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  537. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
  538. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
  539. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
  540. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
  541. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  542. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  543. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +57 -4
  544. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  545. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -1
  546. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  547. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  548. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  549. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  550. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  551. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  552. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  553. package/packages/pi-coding-agent/package.json +1 -1
  554. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  555. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  556. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  557. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  558. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  559. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  560. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  561. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  562. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  563. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  564. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  565. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  566. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  567. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  568. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  569. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  570. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  571. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  572. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +111 -1
  573. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +26 -2
  574. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  575. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  576. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  577. package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
  578. package/packages/pi-coding-agent/src/core/settings-manager.ts +44 -3
  579. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  580. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  581. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  582. package/packages/pi-coding-agent/src/index.ts +11 -0
  583. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  584. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  585. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  586. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  587. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  588. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  589. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  590. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  591. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  592. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  593. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  594. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  595. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  596. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  597. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  598. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  599. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  600. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  601. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  602. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  603. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  604. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  605. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  606. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
  607. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +21 -1
  608. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -3
  609. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -1
  610. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  611. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  612. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  613. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  614. package/packages/pi-tui/dist/terminal.js +9 -0
  615. package/packages/pi-tui/dist/terminal.js.map +1 -1
  616. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  617. package/packages/pi-tui/dist/tui.js +9 -0
  618. package/packages/pi-tui/dist/tui.js.map +1 -1
  619. package/packages/pi-tui/src/terminal.ts +14 -0
  620. package/packages/pi-tui/src/tui.ts +8 -0
  621. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  622. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  623. package/pkg/package.json +1 -1
  624. package/scripts/ensure-workspace-builds.cjs +45 -14
  625. package/src/resources/agents/researcher.md +1 -1
  626. package/src/resources/extensions/ask-user-questions.ts +21 -3
  627. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  628. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  629. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  630. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  631. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  632. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  633. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  634. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  635. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  636. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  637. package/src/resources/extensions/google-search/index.ts +2 -1
  638. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  639. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  640. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  641. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  642. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  643. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  644. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  645. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  646. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  647. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  648. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  649. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  650. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  651. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  652. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  653. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  654. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  655. package/src/resources/extensions/gsd/captures.ts +63 -3
  656. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  657. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  658. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  659. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  660. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  661. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  662. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  663. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  664. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  665. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  666. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  667. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  668. package/src/resources/extensions/gsd/doctor.ts +3 -1
  669. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  670. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  671. package/src/resources/extensions/gsd/forensics.ts +144 -20
  672. package/src/resources/extensions/gsd/git-service.ts +119 -3
  673. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  674. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  675. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  676. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  677. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  678. package/src/resources/extensions/gsd/index.ts +1 -0
  679. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  680. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  681. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  682. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  683. package/src/resources/extensions/gsd/model-router.ts +35 -1
  684. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  685. package/src/resources/extensions/gsd/notifications.ts +16 -0
  686. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  687. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  688. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  689. package/src/resources/extensions/gsd/paths.ts +44 -0
  690. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  691. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  692. package/src/resources/extensions/gsd/preferences.ts +13 -15
  693. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  694. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  695. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  696. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  697. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  698. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  699. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  700. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  701. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  702. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  703. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  704. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  705. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  706. package/src/resources/extensions/gsd/rethink.ts +6 -0
  707. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  708. package/src/resources/extensions/gsd/state.ts +84 -32
  709. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +29 -0
  710. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  711. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  712. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  713. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  714. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  715. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  716. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  717. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  718. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  719. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  720. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  721. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  722. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  723. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  724. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  725. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  726. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  727. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  728. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  729. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  730. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  731. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  732. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  733. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  734. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  735. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  736. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  737. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  738. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  739. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  740. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  741. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  742. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  743. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  744. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  745. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  746. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  747. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  748. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  749. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  750. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  751. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  752. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  753. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  754. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  755. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  756. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  757. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  758. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  759. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  760. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  761. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  762. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  763. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  764. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  765. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  766. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  767. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  768. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  769. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  770. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  771. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  772. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  773. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  774. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  775. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  776. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  777. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  778. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  779. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  780. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  781. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  782. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  783. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  784. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  785. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  786. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  787. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  788. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  789. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  790. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  791. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  792. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  793. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  794. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  795. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  796. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  797. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  798. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  799. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  800. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  801. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  802. package/src/resources/extensions/gsd/types.ts +4 -2
  803. package/src/resources/extensions/gsd/undo.ts +2 -2
  804. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  805. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  806. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  807. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  808. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  809. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  810. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  811. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  812. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  813. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  814. package/src/resources/extensions/mcp-client/index.ts +13 -7
  815. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  816. package/src/resources/extensions/ollama/index.ts +130 -0
  817. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  818. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  819. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  820. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  821. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  822. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  823. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  824. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  825. package/src/resources/extensions/ollama/types.ts +130 -0
  826. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  827. package/src/resources/extensions/search-the-web/url-utils.ts +19 -0
  828. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  829. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  830. package/src/resources/skills/btw/SKILL.md +42 -0
  831. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  832. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  833. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  834. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  835. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  836. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  837. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  838. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  839. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  840. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  841. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  842. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → QlWL-8CXgQpzV3ehkNMzh}/_buildManifest.js +0 -0
  843. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → QlWL-8CXgQpzV3ehkNMzh}/_ssgManifest.js +0 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * GSD Codebase Map Generator
3
+ *
4
+ * Produces .gsd/CODEBASE.md — a structural table of contents for the project.
5
+ * Gives fresh agent contexts instant orientation without filesystem exploration.
6
+ *
7
+ * Generation: walk `git ls-files`, group by directory, output with descriptions.
8
+ * Maintenance: agent updates descriptions as it works; incremental update preserves them.
9
+ */
10
+
11
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
12
+ import { join, dirname, extname } from "node:path";
13
+
14
+ import { execSync } from "node:child_process";
15
+ import { gsdRoot } from "./paths.js";
16
+
17
+ // ─── Types ───────────────────────────────────────────────────────────────────
18
+
19
+ export interface CodebaseMapOptions {
20
+ excludePatterns?: string[];
21
+ maxFiles?: number;
22
+ collapseThreshold?: number;
23
+ }
24
+
25
+ interface FileEntry {
26
+ path: string;
27
+ description: string;
28
+ }
29
+
30
+ interface DirectoryGroup {
31
+ path: string;
32
+ files: FileEntry[];
33
+ collapsed: boolean;
34
+ }
35
+
36
+ // ─── Defaults ────────────────────────────────────────────────────────────────
37
+
38
+ const DEFAULT_EXCLUDES = [
39
+ ".gsd/",
40
+ ".planning/",
41
+ ".git/",
42
+ "node_modules/",
43
+ "dist/",
44
+ "build/",
45
+ ".next/",
46
+ "coverage/",
47
+ "__pycache__/",
48
+ ".venv/",
49
+ "vendor/",
50
+ ];
51
+
52
+ const DEFAULT_MAX_FILES = 500;
53
+ const DEFAULT_COLLAPSE_THRESHOLD = 20;
54
+
55
+ // ─── Parsing ─────────────────────────────────────────────────────────────────
56
+
57
+ /**
58
+ * Parse an existing CODEBASE.md to extract file → description mappings.
59
+ * Also scans <!-- gsd:collapsed-descriptions --> comment blocks to preserve
60
+ * descriptions for files in collapsed directories across incremental updates.
61
+ */
62
+ export function parseCodebaseMap(content: string): Map<string, string> {
63
+ const descriptions = new Map<string, string>();
64
+ let inCollapsedBlock = false;
65
+
66
+ for (const line of content.split("\n")) {
67
+ // Track collapsed-description comment blocks
68
+ if (line.trimStart().startsWith("<!-- gsd:collapsed-descriptions")) {
69
+ inCollapsedBlock = true;
70
+ continue;
71
+ }
72
+ if (inCollapsedBlock && line.trimStart().startsWith("-->")) {
73
+ inCollapsedBlock = false;
74
+ continue;
75
+ }
76
+
77
+ // Match: - `path/to/file.ts` — Description here
78
+ const match = line.match(/^- `(.+?)` — (.+)$/);
79
+ if (match) {
80
+ descriptions.set(match[1], match[2]);
81
+ continue;
82
+ }
83
+
84
+ // Match: - `path/to/file.ts` (no description) — only outside collapsed blocks
85
+ if (!inCollapsedBlock) {
86
+ const bareMatch = line.match(/^- `(.+?)`\s*$/);
87
+ if (bareMatch) {
88
+ descriptions.set(bareMatch[1], "");
89
+ }
90
+ }
91
+ }
92
+ return descriptions;
93
+ }
94
+
95
+ // ─── File Enumeration ────────────────────────────────────────────────────────
96
+
97
+ function shouldExclude(filePath: string, excludes: string[]): boolean {
98
+ for (const pattern of excludes) {
99
+ if (pattern.endsWith("/")) {
100
+ if (filePath.startsWith(pattern) || filePath.includes(`/${pattern}`)) return true;
101
+ } else if (filePath === pattern || filePath.endsWith(`/${pattern}`)) {
102
+ return true;
103
+ }
104
+ }
105
+ // Skip binary/lock files
106
+ const ext = extname(filePath).toLowerCase();
107
+ if ([".lock", ".png", ".jpg", ".jpeg", ".gif", ".ico", ".woff", ".woff2", ".ttf", ".eot", ".svg"].includes(ext)) {
108
+ return true;
109
+ }
110
+ return false;
111
+ }
112
+
113
+ function lsFiles(basePath: string): string[] {
114
+ try {
115
+ const result = execSync("git ls-files", { cwd: basePath, encoding: "utf-8", timeout: 10000 });
116
+ return result.split("\n").filter(Boolean);
117
+ } catch {
118
+ return [];
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Enumerate tracked files, applying exclusions and the maxFiles cap.
124
+ * Returns both the file list and whether truncation occurred.
125
+ */
126
+ function enumerateFiles(basePath: string, excludes: string[], maxFiles: number): { files: string[]; truncated: boolean } {
127
+ const allFiles = lsFiles(basePath);
128
+ const filtered = allFiles.filter((f) => !shouldExclude(f, excludes));
129
+ const truncated = filtered.length > maxFiles;
130
+ return { files: truncated ? filtered.slice(0, maxFiles) : filtered, truncated };
131
+ }
132
+
133
+ // ─── Grouping ────────────────────────────────────────────────────────────────
134
+
135
+ function groupByDirectory(
136
+ files: string[],
137
+ descriptions: Map<string, string>,
138
+ collapseThreshold: number,
139
+ ): DirectoryGroup[] {
140
+ const dirMap = new Map<string, FileEntry[]>();
141
+
142
+ for (const file of files) {
143
+ const dir = dirname(file);
144
+ const dirKey = dir === "." ? "" : dir;
145
+ if (!dirMap.has(dirKey)) {
146
+ dirMap.set(dirKey, []);
147
+ }
148
+ dirMap.get(dirKey)!.push({
149
+ path: file,
150
+ description: descriptions.get(file) ?? "",
151
+ });
152
+ }
153
+
154
+ const groups: DirectoryGroup[] = [];
155
+ const sortedDirs = [...dirMap.keys()].sort();
156
+
157
+ for (const dir of sortedDirs) {
158
+ const dirFiles = dirMap.get(dir)!;
159
+ dirFiles.sort((a, b) => a.path.localeCompare(b.path));
160
+
161
+ groups.push({
162
+ path: dir,
163
+ files: dirFiles,
164
+ collapsed: dirFiles.length > collapseThreshold,
165
+ });
166
+ }
167
+
168
+ return groups;
169
+ }
170
+
171
+ // ─── Rendering ───────────────────────────────────────────────────────────────
172
+
173
+ function renderCodebaseMap(groups: DirectoryGroup[], totalFiles: number, truncated: boolean): string {
174
+ const lines: string[] = [];
175
+ const now = new Date().toISOString().split(".")[0] + "Z";
176
+ const described = groups.reduce((sum, g) => sum + g.files.filter((f) => f.description).length, 0);
177
+
178
+ lines.push("# Codebase Map");
179
+ lines.push("");
180
+ lines.push(`Generated: ${now} | Files: ${totalFiles} | Described: ${described}/${totalFiles}`);
181
+ if (truncated) {
182
+ lines.push(`Note: Truncated to first ${totalFiles} files. Run with higher --max-files to include all.`);
183
+ }
184
+ lines.push("");
185
+
186
+ for (const group of groups) {
187
+ const heading = group.path || "(root)";
188
+ lines.push(`### ${heading}/`);
189
+
190
+ if (group.collapsed) {
191
+ // Summarize collapsed directories
192
+ const extensions = new Map<string, number>();
193
+ for (const f of group.files) {
194
+ const ext = extname(f.path) || "(no ext)";
195
+ extensions.set(ext, (extensions.get(ext) ?? 0) + 1);
196
+ }
197
+ const extSummary = [...extensions.entries()]
198
+ .sort((a, b) => b[1] - a[1])
199
+ .map(([ext, count]) => `${count} ${ext}`)
200
+ .join(", ");
201
+ lines.push(`- *(${group.files.length} files: ${extSummary})*`);
202
+
203
+ // Preserve any existing descriptions in a hidden comment block so
204
+ // incremental updates can recover them via parseCodebaseMap.
205
+ const descLines = group.files
206
+ .filter((f) => f.description)
207
+ .map((f) => `- \`${f.path}\` — ${f.description}`);
208
+ if (descLines.length > 0) {
209
+ lines.push("<!-- gsd:collapsed-descriptions");
210
+ lines.push(...descLines);
211
+ lines.push("-->");
212
+ }
213
+ } else {
214
+ for (const file of group.files) {
215
+ if (file.description) {
216
+ lines.push(`- \`${file.path}\` — ${file.description}`);
217
+ } else {
218
+ lines.push(`- \`${file.path}\``);
219
+ }
220
+ }
221
+ }
222
+ lines.push("");
223
+ }
224
+
225
+ return lines.join("\n");
226
+ }
227
+
228
+ // ─── Public API ──────────────────────────────────────────────────────────────
229
+
230
+ /**
231
+ * Generate a fresh CODEBASE.md from scratch.
232
+ * Preserves existing descriptions if `existingDescriptions` is provided.
233
+ */
234
+ export function generateCodebaseMap(
235
+ basePath: string,
236
+ options?: CodebaseMapOptions,
237
+ existingDescriptions?: Map<string, string>,
238
+ ): { content: string; fileCount: number; truncated: boolean; files: string[] } {
239
+ const excludes = [...DEFAULT_EXCLUDES, ...(options?.excludePatterns ?? [])];
240
+ const maxFiles = options?.maxFiles ?? DEFAULT_MAX_FILES;
241
+ const collapseThreshold = options?.collapseThreshold ?? DEFAULT_COLLAPSE_THRESHOLD;
242
+
243
+ const { files, truncated } = enumerateFiles(basePath, excludes, maxFiles);
244
+ const descriptions = existingDescriptions ?? new Map<string, string>();
245
+ const groups = groupByDirectory(files, descriptions, collapseThreshold);
246
+ const content = renderCodebaseMap(groups, files.length, truncated);
247
+
248
+ return { content, fileCount: files.length, truncated, files };
249
+ }
250
+
251
+ /**
252
+ * Incremental update: re-scan files, preserve existing descriptions,
253
+ * add new files, remove deleted files.
254
+ */
255
+ export function updateCodebaseMap(
256
+ basePath: string,
257
+ options?: CodebaseMapOptions,
258
+ ): { content: string; added: number; removed: number; unchanged: number; fileCount: number; truncated: boolean } {
259
+ const codebasePath = join(gsdRoot(basePath), "CODEBASE.md");
260
+
261
+ // Load existing descriptions
262
+ let existingDescriptions = new Map<string, string>();
263
+ if (existsSync(codebasePath)) {
264
+ const existing = readFileSync(codebasePath, "utf-8");
265
+ existingDescriptions = parseCodebaseMap(existing);
266
+ }
267
+
268
+ const existingFiles = new Set(existingDescriptions.keys());
269
+
270
+ // Generate new map preserving descriptions — reuse the returned file list
271
+ // to avoid a second enumeration (prevents race between content and stats).
272
+ const result = generateCodebaseMap(basePath, options, existingDescriptions);
273
+ const currentSet = new Set(result.files);
274
+
275
+ // Count changes
276
+ let added = 0;
277
+ let removed = 0;
278
+
279
+ for (const f of result.files) {
280
+ if (!existingFiles.has(f)) added++;
281
+ }
282
+ for (const f of existingFiles) {
283
+ if (!currentSet.has(f)) removed++;
284
+ }
285
+
286
+ return {
287
+ content: result.content,
288
+ added,
289
+ removed,
290
+ unchanged: result.files.length - added,
291
+ fileCount: result.fileCount,
292
+ truncated: result.truncated,
293
+ };
294
+ }
295
+
296
+ /**
297
+ * Write CODEBASE.md to .gsd/ directory.
298
+ */
299
+ export function writeCodebaseMap(basePath: string, content: string): string {
300
+ const root = gsdRoot(basePath);
301
+ mkdirSync(root, { recursive: true });
302
+ const outPath = join(root, "CODEBASE.md");
303
+ writeFileSync(outPath, content, "utf-8");
304
+ return outPath;
305
+ }
306
+
307
+ /**
308
+ * Read existing CODEBASE.md, or return null if it doesn't exist.
309
+ */
310
+ export function readCodebaseMap(basePath: string): string | null {
311
+ const codebasePath = join(gsdRoot(basePath), "CODEBASE.md");
312
+ if (!existsSync(codebasePath)) return null;
313
+ try {
314
+ return readFileSync(codebasePath, "utf-8");
315
+ } catch {
316
+ return null;
317
+ }
318
+ }
319
+
320
+ /**
321
+ * Get stats about the codebase map.
322
+ */
323
+ export function getCodebaseMapStats(basePath: string): {
324
+ exists: boolean;
325
+ fileCount: number;
326
+ describedCount: number;
327
+ undescribedCount: number;
328
+ generatedAt: string | null;
329
+ } {
330
+ const content = readCodebaseMap(basePath);
331
+ if (!content) {
332
+ return { exists: false, fileCount: 0, describedCount: 0, undescribedCount: 0, generatedAt: null };
333
+ }
334
+
335
+ // Parse total file count from the header line (accurate even for collapsed dirs)
336
+ const fileCountMatch = content.match(/Files:\s*(\d+)/);
337
+ const totalFiles = fileCountMatch ? parseInt(fileCountMatch[1], 10) : 0;
338
+
339
+ // Use parseCodebaseMap to count described files (includes collapsed-description blocks)
340
+ const descriptions = parseCodebaseMap(content);
341
+ const described = [...descriptions.values()].filter((d) => d.length > 0).length;
342
+ const dateMatch = content.match(/Generated: (\S+)/);
343
+
344
+ return {
345
+ exists: true,
346
+ fileCount: totalFiles,
347
+ describedCount: described,
348
+ undescribedCount: totalFiles - described,
349
+ generatedAt: dateMatch?.[1] ?? null,
350
+ };
351
+ }
@@ -15,7 +15,7 @@ export interface GsdCommandDefinition {
15
15
  type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
16
16
 
17
17
  export const GSD_COMMAND_DESCRIPTION =
18
- "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";
18
+ "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";
19
19
 
20
20
  export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
21
21
  { cmd: "help", desc: "Categorized command reference with descriptions" },
@@ -71,6 +71,7 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
71
71
  { cmd: "mcp", desc: "MCP server status and connectivity check (status, check <server>)" },
72
72
  { cmd: "rethink", desc: "Conversational project reorganization — reorder, park, discard, add milestones" },
73
73
  { cmd: "workflow", desc: "Custom workflow lifecycle (new, run, list, validate, pause, resume)" },
74
+ { cmd: "codebase", desc: "Generate and manage codebase map (.gsd/CODEBASE.md)" },
74
75
  ];
75
76
 
76
77
  const NESTED_COMPLETIONS: CompletionMap = {
@@ -225,6 +226,14 @@ const NESTED_COMPLETIONS: CompletionMap = {
225
226
  { cmd: "pause", desc: "Pause custom workflow auto-mode" },
226
227
  { cmd: "resume", desc: "Resume paused custom workflow auto-mode" },
227
228
  ],
229
+ codebase: [
230
+ { cmd: "generate", desc: "Generate or regenerate CODEBASE.md" },
231
+ { cmd: "generate --max-files", desc: "Generate with custom file limit (default: 500)" },
232
+ { cmd: "update", desc: "Incremental update (preserves descriptions)" },
233
+ { cmd: "update --max-files", desc: "Update with custom file limit" },
234
+ { cmd: "stats", desc: "Show file count, description coverage, and generation time" },
235
+ { cmd: "help", desc: "Show usage and available subcommands" },
236
+ ],
228
237
  };
229
238
 
230
239
  function filterOptions(
@@ -206,5 +206,10 @@ Examples:
206
206
  await handleRethink(trimmed, ctx, pi);
207
207
  return true;
208
208
  }
209
+ if (trimmed === "codebase" || trimmed.startsWith("codebase ")) {
210
+ const { handleCodebase } = await import("../../commands-codebase.js");
211
+ await handleCodebase(trimmed.replace(/^codebase\s*/, "").trim(), ctx, pi);
212
+ return true;
213
+ }
209
214
  return false;
210
215
  }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * GSD Command — /gsd codebase
3
+ *
4
+ * Generate and manage the codebase map (.gsd/CODEBASE.md).
5
+ * Subcommands: generate, update, stats, help
6
+ */
7
+
8
+ import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
9
+
10
+ import {
11
+ generateCodebaseMap,
12
+ updateCodebaseMap,
13
+ writeCodebaseMap,
14
+ getCodebaseMapStats,
15
+ readCodebaseMap,
16
+ } from "./codebase-generator.js";
17
+
18
+ const USAGE =
19
+ "Usage: /gsd codebase [generate|update|stats]\n\n" +
20
+ " generate [--max-files N] — Generate or regenerate CODEBASE.md\n" +
21
+ " update — Incremental update (preserves descriptions)\n" +
22
+ " stats — Show file count, coverage, and generation time\n" +
23
+ " help — Show this help\n\n" +
24
+ "With no subcommand, shows stats if a map exists or help if not.";
25
+
26
+ export async function handleCodebase(
27
+ args: string,
28
+ ctx: ExtensionCommandContext,
29
+ _pi: ExtensionAPI,
30
+ ): Promise<void> {
31
+ const basePath = process.cwd();
32
+ const parts = args.trim().split(/\s+/);
33
+ const sub = parts[0] ?? "";
34
+
35
+ switch (sub) {
36
+ case "generate": {
37
+ const maxFiles = parseMaxFiles(args, ctx);
38
+ if (maxFiles === false) return; // validation failed, message already shown
39
+
40
+ const existing = readCodebaseMap(basePath);
41
+ const existingDescriptions = existing
42
+ ? (await import("./codebase-generator.js")).parseCodebaseMap(existing)
43
+ : undefined;
44
+
45
+ const result = generateCodebaseMap(basePath, { maxFiles: maxFiles ?? undefined }, existingDescriptions);
46
+
47
+ if (result.fileCount === 0) {
48
+ ctx.ui.notify(
49
+ "Codebase map generated with 0 files.\n" +
50
+ "Is this a git repository? Run 'git ls-files' to verify.",
51
+ "warning",
52
+ );
53
+ return;
54
+ }
55
+
56
+ const outPath = writeCodebaseMap(basePath, result.content);
57
+ ctx.ui.notify(
58
+ `Codebase map generated: ${result.fileCount} files\n` +
59
+ `Written to: ${outPath}` +
60
+ (result.truncated ? `\n⚠ Truncated — increase --max-files to include all files` : ""),
61
+ "success",
62
+ );
63
+ return;
64
+ }
65
+
66
+ case "update": {
67
+ const existing = readCodebaseMap(basePath);
68
+ if (!existing) {
69
+ ctx.ui.notify(
70
+ "No codebase map found. Run /gsd codebase generate to create one.",
71
+ "warning",
72
+ );
73
+ return;
74
+ }
75
+
76
+ const maxFiles = parseMaxFiles(args, ctx);
77
+ if (maxFiles === false) return;
78
+
79
+ const result = updateCodebaseMap(basePath, { maxFiles: maxFiles ?? undefined });
80
+ writeCodebaseMap(basePath, result.content);
81
+
82
+ ctx.ui.notify(
83
+ `Codebase map updated: ${result.fileCount} files\n` +
84
+ ` Added: ${result.added} | Removed: ${result.removed} | Unchanged: ${result.unchanged}` +
85
+ (result.truncated ? `\n⚠ Truncated — increase --max-files to include all files` : ""),
86
+ "success",
87
+ );
88
+ return;
89
+ }
90
+
91
+ case "stats": {
92
+ showStats(basePath, ctx);
93
+ return;
94
+ }
95
+
96
+ case "help":
97
+ ctx.ui.notify(USAGE, "info");
98
+ return;
99
+
100
+ case "": {
101
+ // Safe default: show stats if map exists, help if not
102
+ const existing = readCodebaseMap(basePath);
103
+ if (existing) {
104
+ showStats(basePath, ctx);
105
+ } else {
106
+ ctx.ui.notify(USAGE, "info");
107
+ }
108
+ return;
109
+ }
110
+
111
+ default:
112
+ ctx.ui.notify(
113
+ `Unknown subcommand "${sub}".\n\n${USAGE}`,
114
+ "warning",
115
+ );
116
+ }
117
+ }
118
+
119
+ function showStats(basePath: string, ctx: ExtensionCommandContext): void {
120
+ const stats = getCodebaseMapStats(basePath);
121
+ if (!stats.exists) {
122
+ ctx.ui.notify("No codebase map found. Run /gsd codebase generate to create one.", "info");
123
+ return;
124
+ }
125
+
126
+ const coverage = stats.fileCount > 0
127
+ ? Math.round((stats.describedCount / stats.fileCount) * 100)
128
+ : 0;
129
+
130
+ ctx.ui.notify(
131
+ `Codebase Map Stats:\n` +
132
+ ` Files: ${stats.fileCount}\n` +
133
+ ` Described: ${stats.describedCount} (${coverage}%)\n` +
134
+ ` Undescribed: ${stats.undescribedCount}\n` +
135
+ ` Generated: ${stats.generatedAt ?? "unknown"}\n\n` +
136
+ (stats.undescribedCount > 0
137
+ ? `Tip: Run /gsd codebase update to refresh after file changes.`
138
+ : `Coverage is complete.`),
139
+ "info",
140
+ );
141
+ }
142
+
143
+ /**
144
+ * Parse and validate --max-files flag.
145
+ * Returns the parsed number, undefined if flag not present, or false if invalid.
146
+ */
147
+ function parseMaxFiles(args: string, ctx: ExtensionCommandContext): number | undefined | false {
148
+ const maxFilesStr = extractFlag(args, "--max-files");
149
+ if (!maxFilesStr) return undefined;
150
+
151
+ const maxFiles = parseInt(maxFilesStr, 10);
152
+ if (isNaN(maxFiles) || maxFiles < 1) {
153
+ ctx.ui.notify("--max-files must be a positive integer (e.g. --max-files 200).", "warning");
154
+ return false;
155
+ }
156
+ return maxFiles;
157
+ }
158
+
159
+ function extractFlag(args: string, flag: string): string | undefined {
160
+ const escaped = flag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
161
+ const regex = new RegExp(`${escaped}[=\\s]+(\\S+)`);
162
+ const match = args.match(regex);
163
+ return match?.[1];
164
+ }
@@ -184,11 +184,23 @@ export function buildCategorySummaries(prefs: Record<string, unknown>): Record<s
184
184
 
185
185
  // Git
186
186
  const git = prefs.git as Record<string, unknown> | undefined;
187
+ const staleThreshold = prefs.stale_commit_threshold_minutes;
188
+ const absorbSnapshots = git?.absorb_snapshot_commits;
187
189
  let gitSummary = "(defaults)";
188
- if (git && Object.keys(git).length > 0) {
189
- const branch = git.main_branch ?? "main";
190
- const push = git.auto_push ? "on" : "off";
191
- gitSummary = `main: ${branch}, push: ${push}`;
190
+ {
191
+ const parts: string[] = [];
192
+ if (git && Object.keys(git).length > 0) {
193
+ const branch = git.main_branch ?? "main";
194
+ const push = git.auto_push ? "on" : "off";
195
+ parts.push(`main: ${branch}, push: ${push}`);
196
+ }
197
+ if (staleThreshold !== undefined) {
198
+ parts.push(`stale: ${staleThreshold === 0 ? "off" : `${staleThreshold}m`}`);
199
+ }
200
+ if (absorbSnapshots !== undefined) {
201
+ parts.push(`absorb: ${absorbSnapshots ? "on" : "off"}`);
202
+ }
203
+ if (parts.length > 0) gitSummary = parts.join(", ");
192
204
  }
193
205
 
194
206
  // Skills
@@ -469,9 +481,39 @@ async function configureGit(ctx: ExtensionCommandContext, prefs: Record<string,
469
481
  git.isolation = isolationChoice;
470
482
  }
471
483
 
484
+ // absorb_snapshot_commits (git sub-key)
485
+ const currentAbsorb = git.absorb_snapshot_commits;
486
+ const absorbStr = currentAbsorb !== undefined ? String(currentAbsorb) : "";
487
+ const absorbChoice = await ctx.ui.select(
488
+ `Absorb snapshot commits into real commits${absorbStr ? ` (current: ${absorbStr})` : " (default: true)"}:`,
489
+ ["true", "false", "(keep current)"],
490
+ );
491
+ if (absorbChoice && absorbChoice !== "(keep current)") {
492
+ git.absorb_snapshot_commits = absorbChoice === "true";
493
+ }
494
+
472
495
  if (Object.keys(git).length > 0) {
473
496
  prefs.git = git;
474
497
  }
498
+
499
+ // stale_commit_threshold_minutes (top-level pref, shown in Git section)
500
+ const currentThreshold = prefs.stale_commit_threshold_minutes;
501
+ const thresholdStr = currentThreshold !== undefined ? String(currentThreshold) : "";
502
+ const thresholdInput = await ctx.ui.input(
503
+ `Stale commit threshold (minutes, 0 to disable)${thresholdStr ? ` (current: ${thresholdStr})` : " (default: 30)"}:`,
504
+ thresholdStr || "30",
505
+ );
506
+ if (thresholdInput !== null && thresholdInput !== undefined) {
507
+ const val = thresholdInput.trim();
508
+ const parsed = tryParseInteger(val);
509
+ if (val && parsed !== null && parsed >= 0) {
510
+ prefs.stale_commit_threshold_minutes = parsed;
511
+ } else if (val && parsed === null) {
512
+ ctx.ui.notify(`Invalid value "${val}" — must be a whole number. Keeping previous value.`, "warning");
513
+ } else if (!val && currentThreshold !== undefined) {
514
+ delete prefs.stale_commit_threshold_minutes;
515
+ }
516
+ }
475
517
  }
476
518
 
477
519
  async function configureSkills(ctx: ExtensionCommandContext, prefs: Record<string, unknown>): Promise<void> {
@@ -35,15 +35,17 @@ const UNIT_TYPE_TIERS: Record<string, ComplexityTier> = {
35
35
  "complete-slice": "light",
36
36
  "run-uat": "light",
37
37
 
38
- // Tier 2 — Standard: research, routine planning, discussion
38
+ // Tier 2 — Standard: research, routine discussion
39
39
  "discuss-milestone": "standard",
40
40
  "discuss-slice": "standard",
41
41
  "research-milestone": "standard",
42
42
  "research-slice": "standard",
43
- "plan-milestone": "standard",
44
- "plan-slice": "standard",
45
43
 
46
- // Tier 3 — Heavy: execution, replanning (requires deep reasoning)
44
+ // Tier 3 — Heavy: planning, execution, replanning (requires deep reasoning)
45
+ // Planning is heavy so it uses the best configured model (e.g. Opus) and is
46
+ // not downgraded by dynamic routing when a capable model is configured.
47
+ "plan-milestone": "heavy",
48
+ "plan-slice": "heavy",
47
49
  "execute-task": "standard", // default standard, upgraded by metadata
48
50
  "replan-slice": "heavy",
49
51
  "reassess-roadmap": "heavy",
@@ -185,8 +187,8 @@ function analyzePlanComplexity(
185
187
  // Check if this is a milestone-level plan (more complex) vs single slice
186
188
  const { milestone: mid, slice: sid } = parseUnitId(unitId);
187
189
  if (!sid) {
188
- // Milestone-level planning is always at least standard
189
- return { tier: "standard", reason: "milestone-level planning" };
190
+ // Milestone-level planning is always heavy requires full context and best model
191
+ return { tier: "heavy", reason: "milestone-level planning" };
190
192
  }
191
193
 
192
194
  // For slice planning, try to read the context/research to gauge complexity