gsd-pi 2.78.0 → 2.78.1-dev.8a893322c

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 (559) hide show
  1. package/README.md +60 -23
  2. package/dist/bundled-resource-path.d.ts +7 -0
  3. package/dist/bundled-resource-path.js +34 -2
  4. package/dist/claude-cli-check.js +104 -33
  5. package/dist/cli-policy.d.ts +13 -0
  6. package/dist/cli-policy.js +17 -0
  7. package/dist/cli.js +95 -55
  8. package/dist/headless-query.d.ts +22 -0
  9. package/dist/headless-query.js +43 -8
  10. package/dist/headless.d.ts +10 -0
  11. package/dist/headless.js +16 -1
  12. package/dist/loader.js +9 -13
  13. package/dist/onboarding.d.ts +10 -0
  14. package/dist/onboarding.js +2 -2
  15. package/dist/provider-migrations.d.ts +2 -2
  16. package/dist/provider-migrations.js +5 -2
  17. package/dist/resource-loader.d.ts +5 -2
  18. package/dist/resource-loader.js +30 -13
  19. package/dist/resources/.managed-resources-content-hash +1 -0
  20. package/dist/resources/extensions/claude-code-cli/readiness.js +128 -32
  21. package/dist/resources/extensions/google-search/index.js +2 -6
  22. package/dist/resources/extensions/gsd/auto/loop.js +23 -0
  23. package/dist/resources/extensions/gsd/auto/phases.js +5 -13
  24. package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
  25. package/dist/resources/extensions/gsd/auto/session.js +5 -6
  26. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -2
  27. package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
  28. package/dist/resources/extensions/gsd/auto-prompts.js +63 -2
  29. package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
  30. package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
  31. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  32. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  33. package/dist/resources/extensions/gsd/auto-worktree.js +60 -13
  34. package/dist/resources/extensions/gsd/auto.js +14 -5
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
  36. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
  37. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  38. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
  39. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +112 -31
  40. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
  41. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
  42. package/dist/resources/extensions/gsd/bootstrap/system-context.js +45 -8
  43. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
  44. package/dist/resources/extensions/gsd/commands/catalog.js +76 -5
  45. package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -1
  46. package/dist/resources/extensions/gsd/commands/handlers/ops.js +8 -0
  47. package/dist/resources/extensions/gsd/commands-config.js +3 -2
  48. package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
  49. package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
  50. package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
  51. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
  52. package/dist/resources/extensions/gsd/commands-worktree.js +309 -0
  53. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
  57. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  58. package/dist/resources/extensions/gsd/forensics.js +10 -8
  59. package/dist/resources/extensions/gsd/git-service.js +12 -5
  60. package/dist/resources/extensions/gsd/gsd-db.js +11 -2
  61. package/dist/resources/extensions/gsd/guided-flow.js +25 -24
  62. package/dist/resources/extensions/gsd/home-dir.js +16 -0
  63. package/dist/resources/extensions/gsd/key-manager.js +2 -1
  64. package/dist/resources/extensions/gsd/memory-store.js +66 -31
  65. package/dist/resources/extensions/gsd/migrate/command.js +3 -2
  66. package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
  67. package/dist/resources/extensions/gsd/model-router.js +114 -9
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
  69. package/dist/resources/extensions/gsd/preferences-models.js +91 -15
  70. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  71. package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
  72. package/dist/resources/extensions/gsd/preferences.js +5 -3
  73. package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  76. package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  77. package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  78. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
  79. package/dist/resources/extensions/gsd/state.js +42 -0
  80. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  81. package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
  82. package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
  83. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  84. package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
  85. package/dist/resources/extensions/gsd/worktree-command.js +26 -46
  86. package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
  87. package/dist/resources/extensions/gsd/worktree-resolver.js +4 -13
  88. package/dist/resources/extensions/gsd/worktree-root.js +124 -0
  89. package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
  90. package/dist/resources/extensions/gsd/worktree.js +4 -115
  91. package/dist/resources/extensions/mcp-client/index.js +6 -9
  92. package/dist/resources/extensions/ollama/index.js +15 -2
  93. package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
  94. package/dist/resources/extensions/ollama/ollama-client.js +40 -4
  95. package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
  96. package/dist/resources/extensions/subagent/index.js +324 -178
  97. package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
  98. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  99. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  100. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  101. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  102. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  103. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  104. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  105. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  106. package/dist/rtk-shared.d.ts +3 -0
  107. package/dist/rtk-shared.js +17 -0
  108. package/dist/rtk.d.ts +2 -5
  109. package/dist/rtk.js +3 -20
  110. package/dist/runtime-checks.d.ts +27 -0
  111. package/dist/runtime-checks.js +38 -0
  112. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  113. package/dist/web/standalone/.next/BUILD_ID +1 -1
  114. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  115. package/dist/web/standalone/.next/build-manifest.json +4 -4
  116. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  117. package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
  118. package/dist/web/standalone/.next/required-server-files.json +3 -3
  119. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  120. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  130. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
  194. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  208. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  210. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  212. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  214. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/index.html +1 -1
  224. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  225. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  226. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  227. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  228. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  229. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/page.js +2 -2
  231. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  233. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  234. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  235. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  237. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/middleware.js +2 -2
  239. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  241. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  242. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  243. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  244. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  245. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
  252. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
  253. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
  254. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -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-9bf2e0c50fb2ca05.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-f9f0dc45e4f3ac10.js +1 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  262. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  263. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  265. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  266. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  267. package/dist/web/standalone/package.json +2 -1
  268. package/dist/web/standalone/server.js +1 -1
  269. package/dist/welcome-screen.js +27 -1
  270. package/dist/worktree-cli.d.ts +1 -0
  271. package/dist/worktree-cli.js +9 -3
  272. package/dist/worktree-status-banner.d.ts +1 -0
  273. package/dist/worktree-status-banner.js +132 -0
  274. package/package.json +1 -3
  275. package/packages/daemon/package.json +2 -2
  276. package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
  277. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/alias-telemetry.js +30 -0
  279. package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
  280. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/workflow-tools.js +74 -46
  282. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  283. package/packages/mcp-server/package.json +2 -2
  284. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  285. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  286. package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
  287. package/packages/mcp-server/src/workflow-tools.ts +93 -58
  288. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  289. package/packages/native/package.json +1 -1
  290. package/packages/native/tsconfig.tsbuildinfo +1 -1
  291. package/packages/pi-agent-core/package.json +1 -1
  292. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
  294. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
  295. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
  296. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
  297. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  298. package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
  299. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  300. package/packages/pi-ai/dist/types.d.ts +13 -0
  301. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/types.js.map +1 -1
  303. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  304. package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
  305. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  306. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
  307. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  308. package/packages/pi-ai/package.json +1 -1
  309. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  310. package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
  311. package/packages/pi-ai/src/types.ts +13 -0
  312. package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
  313. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
  314. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  315. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
  317. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/messages.js +4 -0
  320. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  322. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
  324. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
  326. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
  328. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
  330. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
  332. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
  334. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
  344. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
  345. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
  346. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
  347. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
  348. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
  349. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
  350. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
  351. package/packages/pi-coding-agent/package.json +1 -1
  352. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
  353. package/packages/pi-coding-agent/src/core/messages.ts +4 -0
  354. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
  355. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
  356. package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
  357. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  358. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
  359. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
  360. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  361. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  362. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  363. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  364. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
  365. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  366. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  367. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  368. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  369. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  370. package/packages/pi-tui/package.json +1 -1
  371. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
  372. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  373. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  374. package/packages/rpc-client/package.json +1 -1
  375. package/pkg/package.json +1 -1
  376. package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
  377. package/src/resources/extensions/google-search/index.ts +2 -9
  378. package/src/resources/extensions/gsd/auto/loop.ts +24 -2
  379. package/src/resources/extensions/gsd/auto/phases.ts +6 -14
  380. package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
  381. package/src/resources/extensions/gsd/auto/session.ts +5 -6
  382. package/src/resources/extensions/gsd/auto/types.ts +1 -0
  383. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
  385. package/src/resources/extensions/gsd/auto-prompts.ts +60 -2
  386. package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
  387. package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
  388. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  389. package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
  390. package/src/resources/extensions/gsd/auto-worktree.ts +82 -12
  391. package/src/resources/extensions/gsd/auto.ts +14 -4
  392. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
  393. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
  394. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  395. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
  396. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +121 -31
  397. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
  398. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
  399. package/src/resources/extensions/gsd/bootstrap/system-context.ts +50 -8
  400. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
  401. package/src/resources/extensions/gsd/commands/catalog.ts +82 -5
  402. package/src/resources/extensions/gsd/commands/handlers/core.ts +23 -1
  403. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  404. package/src/resources/extensions/gsd/commands-config.ts +3 -2
  405. package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
  406. package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
  407. package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
  408. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
  409. package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
  410. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  411. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  412. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  413. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
  414. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  415. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  416. package/src/resources/extensions/gsd/forensics.ts +12 -7
  417. package/src/resources/extensions/gsd/git-service.ts +13 -5
  418. package/src/resources/extensions/gsd/gsd-db.ts +12 -2
  419. package/src/resources/extensions/gsd/guided-flow.ts +27 -26
  420. package/src/resources/extensions/gsd/home-dir.ts +19 -0
  421. package/src/resources/extensions/gsd/journal.ts +4 -1
  422. package/src/resources/extensions/gsd/key-manager.ts +2 -1
  423. package/src/resources/extensions/gsd/memory-store.ts +81 -28
  424. package/src/resources/extensions/gsd/migrate/command.ts +3 -2
  425. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  426. package/src/resources/extensions/gsd/model-router.ts +172 -9
  427. package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
  428. package/src/resources/extensions/gsd/preferences-models.ts +101 -15
  429. package/src/resources/extensions/gsd/preferences-types.ts +6 -0
  430. package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
  431. package/src/resources/extensions/gsd/preferences.ts +16 -2
  432. package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
  433. package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  435. package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  436. package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  437. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
  438. package/src/resources/extensions/gsd/state.ts +42 -0
  439. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  440. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
  441. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
  442. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
  443. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
  444. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  445. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
  446. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +50 -27
  447. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
  448. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
  449. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
  450. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
  451. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
  452. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
  453. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
  454. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
  455. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
  456. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
  457. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
  458. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
  459. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  460. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
  461. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  462. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
  463. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
  464. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  465. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
  466. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
  467. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +25 -65
  468. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
  469. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
  470. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
  471. package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
  472. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  473. package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
  474. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  475. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
  476. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
  477. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
  479. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
  480. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
  481. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  482. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
  483. package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
  484. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  485. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
  486. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
  487. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
  488. package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
  489. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
  490. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
  491. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  492. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
  493. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +34 -0
  494. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
  495. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
  496. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
  497. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
  498. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
  499. package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
  500. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
  501. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
  502. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
  503. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
  504. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  505. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
  506. package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
  507. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
  508. package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
  509. package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
  510. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  511. package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
  512. package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
  513. package/src/resources/extensions/gsd/worktree-command.ts +31 -44
  514. package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
  515. package/src/resources/extensions/gsd/worktree-resolver.ts +4 -14
  516. package/src/resources/extensions/gsd/worktree-root.ts +144 -0
  517. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  518. package/src/resources/extensions/gsd/worktree.ts +8 -119
  519. package/src/resources/extensions/mcp-client/index.ts +6 -10
  520. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  521. package/src/resources/extensions/ollama/index.ts +16 -2
  522. package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
  523. package/src/resources/extensions/ollama/ollama-client.ts +41 -4
  524. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
  525. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  526. package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
  527. package/src/resources/extensions/subagent/index.ts +165 -7
  528. package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
  529. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  530. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  531. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  532. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  533. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  534. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  535. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  536. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  537. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  538. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
  539. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  540. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
  541. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
  542. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
  543. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  544. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  545. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  546. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  547. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  548. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
  549. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
  550. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
  551. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
  555. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
  556. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
  557. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
  558. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → QK8fABiGPmonfTgboN0Y9}/_buildManifest.js +0 -0
  559. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → QK8fABiGPmonfTgboN0Y9}/_ssgManifest.js +0 -0
@@ -0,0 +1,20 @@
1
+ export function extractSubagentAgentClasses(input: unknown): string[] {
2
+ if (!input || typeof input !== "object") return [];
3
+
4
+ const record = input as Record<string, unknown>;
5
+ const agentClasses: string[] = [];
6
+ const addAgentClass = (value: unknown): void => {
7
+ if (typeof value === "string" && value.trim().length > 0) agentClasses.push(value.trim());
8
+ };
9
+ const addFromItems = (value: unknown): void => {
10
+ if (!Array.isArray(value)) return;
11
+ for (const item of value) {
12
+ if (item && typeof item === "object") addAgentClass((item as Record<string, unknown>).agent);
13
+ }
14
+ };
15
+
16
+ addAgentClass(record.agent);
17
+ addFromItems(record.tasks);
18
+ addFromItems(record.chain);
19
+ return agentClasses;
20
+ }
@@ -15,7 +15,7 @@ import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile
15
15
  import { ensureCodebaseMapFresh, readCodebaseMap } from "../codebase-generator.js";
16
16
  import { hasSkillSnapshot, detectNewSkills, formatSkillsXml } from "../skill-discovery.js";
17
17
  import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
18
- import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-command.js";
18
+ import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-session-state.js";
19
19
  import { deriveState } from "../state.js";
20
20
  import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile, parseContinue, parseSummary } from "../files.js";
21
21
  import { toPosixPath } from "../../shared/mod.js";
@@ -52,6 +52,17 @@ export const BUNDLED_SKILL_TRIGGERS: Array<{ trigger: string; skill: string }> =
52
52
  { trigger: "HTTP/REST/GraphQL API design — verbs, status codes, pagination, errors, idempotency, versioning", skill: "api-design" },
53
53
  { trigger: "Dependency upgrades — risk-batched, verified between batches, one major per commit", skill: "dependency-upgrade" },
54
54
  { trigger: "Agent-first observability — structured logs, persisted failure state, health surfaces, explicit failure modes", skill: "observability" },
55
+ { trigger: "React/Next.js performance — components, data fetching, bundle optimization, rendering patterns from Vercel Engineering", skill: "react-best-practices" },
56
+ { trigger: "Core Web Vitals — fix LCP, CLS, INP; layout shifts; page experience optimization", skill: "core-web-vitals" },
57
+ { trigger: "GitHub Actions CI/CD — write, run, and debug workflow files; live syntax and run monitoring", skill: "github-workflows" },
58
+ { trigger: "Comprehensive web quality audit — performance, accessibility, SEO, and best-practices (Lighthouse-style)", skill: "web-quality-audit" },
59
+ { trigger: "Browser automation — open sites, fill forms, click, screenshot, scrape, or test web apps programmatically", skill: "agent-browser" },
60
+ { trigger: "Review UI code for Web Interface Guidelines compliance — UX, design, and accessibility patterns", skill: "web-design-guidelines" },
61
+ { trigger: "UI/UX patterns reference — animations, CSS, typography, prefetching, icons (file:line findings)", skill: "userinterface-wiki" },
62
+ { trigger: "Author or refine a GSD skill — SKILL.md structure, frontmatter, and best practices", skill: "create-skill" },
63
+ { trigger: "Create or debug a GSD extension — tools, commands, event hooks, custom TUI, providers", skill: "create-gsd-extension" },
64
+ { trigger: "Author a YAML workflow definition — steps, triggers, and templates", skill: "create-workflow" },
65
+ { trigger: "Deep code optimization audit — perf anti-patterns, memory leaks, algorithmic complexity, bundle size, I/O, caching, dead code (parallel pattern-based hunt)", skill: "code-optimizer" },
55
66
  ];
56
67
 
57
68
  function buildBundledSkillsTable(): string {
@@ -207,7 +218,14 @@ export async function buildBeforeAgentStartResult(
207
218
  ? `\n\n## Subagent Model\n\nWhen spawning subagents via the \`subagent\` tool, always pass \`model: "${subagentModelConfig.primary}"\` in the tool call parameters. Never omit this — always specify it explicitly.`
208
219
  : "";
209
220
 
210
- const fullSystem = `${event.systemPrompt}\n\n[SYSTEM CONTEXT GSD]\n\n${systemContent}${preferenceBlock}${knowledgeBlock}${codebaseBlock}${memoryBlock}${newSkillsBlock}${worktreeBlock}${subagentModelBlock}`;
221
+ // memoryBlock is FTS-queried against the user prompt and changes per call.
222
+ // Removing it from `fullSystem` keeps the system-prompt cache breakpoint
223
+ // stable across calls — the only scoped goal of this fix. The pi-ai
224
+ // Anthropic adapter additionally cache-marks the last user turn, so the
225
+ // memoryBlock injected via the context message may itself be cached up to
226
+ // that boundary; that's orthogonal and unchanged from prior behavior. The
227
+ // load-bearing win here is preserving the system+tools cache hit. (#5019)
228
+ const fullSystem = `${event.systemPrompt}\n\n[SYSTEM CONTEXT — GSD]\n\n${systemContent}${preferenceBlock}${knowledgeBlock}${codebaseBlock}${newSkillsBlock}${worktreeBlock}${subagentModelBlock}`;
211
229
 
212
230
  stopContextTimer({
213
231
  systemPromptSize: fullSystem.length,
@@ -216,12 +234,7 @@ export async function buildBeforeAgentStartResult(
216
234
  hasNewSkills: newSkillsBlock.length > 0,
217
235
  });
218
236
 
219
- // Determine which context message to inject (guided execute takes priority)
220
- const contextMessage = injection
221
- ? { customType: "gsd-guided-context", content: injection, display: false as const }
222
- : forensicsInjection
223
- ? { customType: "gsd-forensics", content: forensicsInjection, display: false as const }
224
- : null;
237
+ const contextMessage = buildContextMessage({ memoryBlock, injection, forensicsInjection });
225
238
 
226
239
  return {
227
240
  systemPrompt: fullSystem,
@@ -229,6 +242,35 @@ export async function buildBeforeAgentStartResult(
229
242
  };
230
243
  }
231
244
 
245
+ /**
246
+ * Route the per-call dynamic blocks (memory, guided-execute, forensics) into a
247
+ * single user-message context payload so they ride the volatile suffix instead
248
+ * of the cached system prefix. Priority when both memory and an injection are
249
+ * present: guided > forensics > memory-only. (#5019)
250
+ *
251
+ * Exported for direct unit testing — the surrounding bootstrap has too many
252
+ * filesystem and DB dependencies to exercise this routing logic in-place.
253
+ */
254
+ export function buildContextMessage(opts: {
255
+ memoryBlock: string;
256
+ injection: string | null;
257
+ forensicsInjection: string | null;
258
+ }): { customType: string; content: string; display: false } | null {
259
+ const memoryContent = opts.memoryBlock.trim();
260
+ if (opts.injection) {
261
+ const content = memoryContent ? `${memoryContent}\n\n${opts.injection}` : opts.injection;
262
+ return { customType: "gsd-guided-context", content, display: false as const };
263
+ }
264
+ if (opts.forensicsInjection) {
265
+ const content = memoryContent ? `${memoryContent}\n\n${opts.forensicsInjection}` : opts.forensicsInjection;
266
+ return { customType: "gsd-forensics", content, display: false as const };
267
+ }
268
+ if (memoryContent) {
269
+ return { customType: "gsd-memory", content: memoryContent, display: false as const };
270
+ }
271
+ return null;
272
+ }
273
+
232
274
  /**
233
275
  * ADR-013 step 4 — auto-injection parity for the memories table.
234
276
  *
@@ -3,15 +3,8 @@ import { isAbsolute, join, relative, resolve, sep } from "node:path";
3
3
 
4
4
  import { minimatch } from "minimatch";
5
5
 
6
- /**
7
- * Declarative tools-policy for a unit. Inlined here because the worktree
8
- * branch predates the full unit-context-manifest export (#4934).
9
- */
10
- export type ToolsPolicy =
11
- | { mode: "all" }
12
- | { mode: "read-only" }
13
- | { mode: "planning" }
14
- | { mode: "docs"; allowedPathGlobs: readonly string[] };
6
+ import type { ToolsPolicy } from "../unit-context-manifest.js";
7
+ import { logWarning } from "../workflow-logger.js";
15
8
 
16
9
  /**
17
10
  * Regex matching milestone CONTEXT.md file names in both legacy M001
@@ -535,10 +528,76 @@ export function shouldBlockQueueExecutionInSnapshot(
535
528
  }
536
529
 
537
530
  // ─── Planning-unit tools-policy enforcement (#4934) ───────────────────────
531
+ //
532
+ // Runtime half of the declarative ToolsPolicy on UnitContextManifest. The
533
+ // manifest assigns each unit type a tools mode; this predicate is what
534
+ // actually rejects a tool call that violates it.
535
+ //
536
+ // Forensics: a discuss-milestone LLM turn used the host Edit tool to modify
537
+ // index.html in test app b23 (~/Github/test-apps/b23). With this predicate
538
+ // wired into the tool_call hook, the same call returns block=true with a
539
+ // HARD BLOCK reason that the model cannot rationalize past.
540
+ //
541
+ // Activation: the hook supplies the policy resolved from the active unit's
542
+ // manifest. When no unit is active (interactive sessions, unknown unit
543
+ // types), the hook passes null and this predicate is a no-op — falling
544
+ // through to the existing pendingGate / queue-execution / context-write
545
+ // guards.
538
546
 
539
547
  const PLANNING_WRITE_TOOLS = new Set(["write", "edit", "multi_edit", "notebook_edit"]);
540
548
  const PLANNING_SUBAGENT_TOOLS = new Set(["subagent", "task"]);
541
549
 
550
+ /**
551
+ * Canonical registry for agents that planning-dispatch may consider. Unit
552
+ * manifests still declare per-unit subsets via ToolsPolicy.allowedSubagents.
553
+ */
554
+ const PLANNING_DISPATCH_AGENT_REGISTRY = {
555
+ scout: { readOnlySpecialist: true },
556
+ planner: { readOnlySpecialist: true },
557
+ reviewer: { readOnlySpecialist: true },
558
+ security: { readOnlySpecialist: true },
559
+ tester: { readOnlySpecialist: true },
560
+ } as const satisfies Record<string, { readonly readOnlySpecialist: boolean }>;
561
+
562
+ export const ALLOWED_PLANNING_DISPATCH_AGENTS = new Set<string>(
563
+ Object.entries(PLANNING_DISPATCH_AGENT_REGISTRY)
564
+ .filter(([, metadata]) => metadata.readOnlySpecialist)
565
+ .map(([agentId]) => agentId),
566
+ );
567
+
568
+ let warnedMissingPlanningDispatchAgentClasses = false;
569
+
570
+ function isReadOnlySpecialist(agentId: string): boolean {
571
+ const metadata = PLANNING_DISPATCH_AGENT_REGISTRY[agentId as keyof typeof PLANNING_DISPATCH_AGENT_REGISTRY];
572
+ return metadata?.readOnlySpecialist === true;
573
+ }
574
+
575
+ function allowedPlanningDispatchAgentsList(): string {
576
+ return [...ALLOWED_PLANNING_DISPATCH_AGENTS].join(", ");
577
+ }
578
+
579
+ function warnMissingPlanningDispatchAgentClasses(unitType: string, mode: string, toolName: string): void {
580
+ if (warnedMissingPlanningDispatchAgentClasses) return;
581
+ warnedMissingPlanningDispatchAgentClasses = true;
582
+ // TODO(#5060): Remove this migration shim once all subagent/task callers are verified to forward agent identities.
583
+ const message = `[write-gate] planning-dispatch: shouldBlockPlanningUnit called for tool "${toolName}" ` +
584
+ `on unit "${unitType}" without agentClasses - stale caller; blocking dispatch.`;
585
+ console.warn(message);
586
+ logWarning("intercept", message, {
587
+ unitType,
588
+ mode,
589
+ toolName,
590
+ });
591
+ }
592
+
593
+ /**
594
+ * Read-only / planning-safe tools that any non-"all" mode allows. Mirrors
595
+ * QUEUE_SAFE_TOOLS / GATE_SAFE_TOOLS but is the inclusive default for
596
+ * planning units (which need their full discussion + research surface).
597
+ *
598
+ * gsd_* MCP tools are passed through unconditionally — they have their own
599
+ * domain validation (e.g. depth-verification gate, single-writer DB).
600
+ */
542
601
  const PLANNING_SAFE_TOOLS = new Set([
543
602
  "read", "grep", "find", "ls", "glob",
544
603
  "ask_user_questions",
@@ -555,6 +614,7 @@ function isPathUnderGsd(absPath: string, basePath: string): boolean {
555
614
  function matchesAllowedGlob(absPath: string, basePath: string, globs: readonly string[]): boolean {
556
615
  const rel = relative(basePath, absPath);
557
616
  if (rel.startsWith("..") || isAbsolute(rel)) return false;
617
+ // Normalize Windows separators for minimatch.
558
618
  const posix = rel.split(sep).join("/");
559
619
  return globs.some(g => minimatch(posix, g, { dot: false, nocase: false }));
560
620
  }
@@ -576,10 +636,24 @@ function blockReason(unitType: string, mode: string, what: string): string {
576
636
  * - "read-only" → blocks all writes, bash, and subagent dispatch.
577
637
  * - "planning" → blocks writes to paths outside <basePath>/.gsd/,
578
638
  * bash that isn't read-only, and subagent dispatch.
639
+ * - "planning-dispatch"
640
+ * → like "planning", but permits subagent dispatch only
641
+ * when every forwarded agent class is globally allowed
642
+ * and listed in the policy's allowedSubagents.
579
643
  * - "docs" → like "planning" but also allows writes to paths
580
644
  * matching `allowedPathGlobs` relative to basePath.
581
645
  *
582
- * `policy` of null means "no manifest resolved" pass-through.
646
+ * `pathOrCommand` is the file path for write/edit-shaped tools and the
647
+ * shell command for bash. Other tools ignore this argument.
648
+ *
649
+ * `policy` of null means "no manifest resolved" — pass-through. Callers
650
+ * that have no active unit (interactive sessions) pass null and this
651
+ * predicate is a no-op.
652
+ *
653
+ * `agentClasses` is supplied by the tool hook for subagent-shaped calls. If
654
+ * absent, planning-dispatch fails closed so stale callers cannot silently
655
+ * bypass the agent allowlists. An explicitly supplied-but-empty list is
656
+ * allowed through so the downstream tool call can reject the malformed input.
583
657
  */
584
658
  export function shouldBlockPlanningUnit(
585
659
  toolName: string,
@@ -587,26 +661,77 @@ export function shouldBlockPlanningUnit(
587
661
  basePath: string,
588
662
  unitType: string,
589
663
  policy: ToolsPolicy | null | undefined,
664
+ agentClasses?: readonly string[],
590
665
  ): { block: boolean; reason?: string } {
591
666
  if (!policy) return { block: false };
592
667
  if (policy.mode === "all") return { block: false };
593
668
 
594
669
  const tool = toolName;
595
670
 
671
+ // Read-only mode: only Read-class tools are permitted.
596
672
  if (policy.mode === "read-only") {
597
673
  if (PLANNING_SAFE_TOOLS.has(tool)) return { block: false };
598
674
  if (tool.startsWith("gsd_")) return { block: false };
599
675
  if (PLANNING_WRITE_TOOLS.has(tool) || tool === "bash" || PLANNING_SUBAGENT_TOOLS.has(tool)) {
600
676
  return { block: true, reason: blockReason(unitType, policy.mode, `${tool} is not permitted (read-only)`) };
601
677
  }
678
+ // Unknown tool in read-only mode — block by default.
602
679
  return { block: true, reason: blockReason(unitType, policy.mode, `tool "${tool}" is not on the read-only allowlist`) };
603
680
  }
604
681
 
605
- // planning / docs modes
682
+ // planning / planning-dispatch / docs modes share the same surface for safe tools, bash, and subagent.
606
683
  if (PLANNING_SAFE_TOOLS.has(tool)) return { block: false };
607
684
  if (tool.startsWith("gsd_")) return { block: false };
608
685
 
609
686
  if (PLANNING_SUBAGENT_TOOLS.has(tool)) {
687
+ if (policy.mode === "planning-dispatch") {
688
+ const requested = (agentClasses ?? []).map(a => a.trim()).filter(Boolean);
689
+ const allowedSubagents = Array.isArray(policy.allowedSubagents) ? policy.allowedSubagents : [];
690
+ const allowed = new Set(allowedSubagents);
691
+ // When agentClasses is undefined, the caller has not been updated to extract
692
+ // agent identities yet. Block and warn so stale callers surface in telemetry
693
+ // instead of silently bypassing the gate.
694
+ if (agentClasses === undefined) {
695
+ warnMissingPlanningDispatchAgentClasses(unitType, policy.mode, tool);
696
+ return {
697
+ block: true,
698
+ reason: blockReason(
699
+ unitType,
700
+ policy.mode,
701
+ `subagent dispatch blocked: stale caller did not supply agent identities for "${tool}"; update extractSubagentAgentClasses to handle this input shape`,
702
+ ),
703
+ };
704
+ }
705
+ // agentClasses was explicitly provided but resolved to an empty list (for
706
+ // example, a bare tool call with no agent field). Pass through; no agents
707
+ // to validate means the downstream tool call itself will fail.
708
+ if (requested.length === 0) {
709
+ return { block: false };
710
+ }
711
+ const globallyDisallowed = requested.find(a => !isReadOnlySpecialist(a));
712
+ if (globallyDisallowed) {
713
+ return {
714
+ block: true,
715
+ reason: blockReason(
716
+ unitType,
717
+ policy.mode,
718
+ `subagent dispatch of "${globallyDisallowed}" not permitted; only read-only specialists (${allowedPlanningDispatchAgentsList()}) may be dispatched from planning-dispatch units`,
719
+ ),
720
+ };
721
+ }
722
+ const disallowedByPolicy = requested.find(a => !allowed.has(a));
723
+ if (disallowedByPolicy) {
724
+ return {
725
+ block: true,
726
+ reason: blockReason(
727
+ unitType,
728
+ policy.mode,
729
+ `subagent dispatch of "${disallowedByPolicy}" not permitted by ToolsPolicy.allowedSubagents; permitted agents for this unit: ${allowedSubagents.join(", ")}`,
730
+ ),
731
+ };
732
+ }
733
+ return { block: false };
734
+ }
610
735
  return { block: true, reason: blockReason(unitType, policy.mode, `subagent dispatch is not permitted in planning units`) };
611
736
  }
612
737
 
@@ -628,8 +753,10 @@ export function shouldBlockPlanningUnit(
628
753
  }
629
754
  const absPath = isAbsolute(pathOrCommand) ? pathOrCommand : resolve(basePath, pathOrCommand);
630
755
 
756
+ // Always allow .gsd/ writes — that's where planning artifacts live.
631
757
  if (isPathUnderGsd(absPath, basePath)) return { block: false };
632
758
 
759
+ // docs mode additionally allows the manifest's allowedPathGlobs.
633
760
  if (policy.mode === "docs" && matchesAllowedGlob(absPath, basePath, policy.allowedPathGlobs)) {
634
761
  return { block: false };
635
762
  }
@@ -644,5 +771,8 @@ export function shouldBlockPlanningUnit(
644
771
  };
645
772
  }
646
773
 
774
+ // Unknown tool name — pass through. Other layers (queue, pending-gate,
775
+ // CONTEXT.md write) catch known mutating shapes; defaulting to allow here
776
+ // avoids breaking gsd_* MCP tools or future safe additions.
647
777
  return { block: false };
648
778
  }
@@ -1,9 +1,8 @@
1
1
  import { existsSync, readFileSync, readdirSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
- import { join } from "node:path";
3
+ import { join, resolve } from "node:path";
4
4
 
5
5
  import { loadRegistry } from "../workflow-templates.js";
6
- import { resolveProjectRoot } from "../worktree.js";
7
6
 
8
7
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
9
8
 
@@ -15,7 +14,7 @@ export interface GsdCommandDefinition {
15
14
  type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
16
15
 
17
16
  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|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language";
17
+ "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|workflow|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language|worktree";
19
18
 
20
19
  export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
21
20
  { cmd: "help", desc: "Categorized command reference with descriptions" },
@@ -84,6 +83,7 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
84
83
  { cmd: "add-tests", desc: "Generate tests for completed slices" },
85
84
  { cmd: "scan", desc: "Rapid codebase assessment — lightweight alternative to full map (--focus tech|arch|quality|concerns|tech+arch)" },
86
85
  { cmd: "language", desc: "Set or clear the global response language (e.g. /gsd language Chinese)" },
86
+ { cmd: "worktree", desc: "Manage worktrees from the TUI (list, merge, clean, remove)" },
87
87
  ];
88
88
 
89
89
  const NESTED_COMPLETIONS: CompletionMap = {
@@ -300,6 +300,12 @@ const NESTED_COMPLETIONS: CompletionMap = {
300
300
  { cmd: "off", desc: "Clear the language preference (revert to default)" },
301
301
  { cmd: "clear", desc: "Alias for off — clear the language preference" },
302
302
  ],
303
+ worktree: [
304
+ { cmd: "list", desc: "Show all worktrees with status" },
305
+ { cmd: "merge", desc: "Merge a worktree into main and clean up" },
306
+ { cmd: "clean", desc: "Remove all merged/empty worktrees" },
307
+ { cmd: "remove", desc: "Remove a worktree (--force to skip safety checks)" },
308
+ ],
303
309
  };
304
310
 
305
311
  function filterOptions(
@@ -346,6 +352,77 @@ function getExtensionCompletions(prefix: string, action: string) {
346
352
  }
347
353
  }
348
354
 
355
+ function normalizePathForCompare(path: string): string {
356
+ return path.replaceAll("\\", "/").replace(/\/+$/, "");
357
+ }
358
+
359
+ function findWorktreeSegment(normalizedPath: string): { gsdIdx: number; afterWorktrees: number } | null {
360
+ const directMarker = "/.gsd/worktrees/";
361
+ const directIdx = normalizedPath.indexOf(directMarker);
362
+ if (directIdx !== -1) {
363
+ return { gsdIdx: directIdx, afterWorktrees: directIdx + directMarker.length };
364
+ }
365
+
366
+ const symlinkMatch = normalizedPath.match(/\/\.gsd\/projects\/[a-f0-9]+\/worktrees\//);
367
+ if (symlinkMatch?.index !== undefined) {
368
+ return { gsdIdx: symlinkMatch.index, afterWorktrees: symlinkMatch.index + symlinkMatch[0].length };
369
+ }
370
+
371
+ return null;
372
+ }
373
+
374
+ function resolveProjectRootFromGitFile(worktreePath: string): string | null {
375
+ try {
376
+ let dir = worktreePath;
377
+ for (let i = 0; i < 30; i++) {
378
+ const gitPath = join(dir, ".git");
379
+ if (existsSync(gitPath)) {
380
+ const content = readFileSync(gitPath, "utf8").trim();
381
+ if (content.startsWith("gitdir: ")) {
382
+ const gitDir = resolve(dir, content.slice(8));
383
+ const dotGitDir = resolve(gitDir, "..", "..");
384
+ if (dotGitDir.endsWith(".git") || dotGitDir.endsWith(".git/") || dotGitDir.endsWith(".git\\")) {
385
+ return resolve(dotGitDir, "..");
386
+ }
387
+ const commonDirPath = join(gitDir, "commondir");
388
+ if (existsSync(commonDirPath)) {
389
+ const commonDir = readFileSync(commonDirPath, "utf8").trim();
390
+ return resolve(resolve(gitDir, commonDir), "..");
391
+ }
392
+ }
393
+ break;
394
+ }
395
+ const parent = resolve(dir, "..");
396
+ if (parent === dir) break;
397
+ dir = parent;
398
+ }
399
+ } catch {
400
+ // Completion must stay best-effort.
401
+ }
402
+ return null;
403
+ }
404
+
405
+ function resolveProjectRootForCompletion(basePath: string): string {
406
+ if (process.env.GSD_PROJECT_ROOT) return process.env.GSD_PROJECT_ROOT;
407
+
408
+ const normalizedPath = normalizePathForCompare(basePath);
409
+ const segment = findWorktreeSegment(normalizedPath);
410
+ if (!segment) return basePath;
411
+
412
+ const separator = basePath.includes("\\") ? "\\" : "/";
413
+ const gsdMarker = `${separator}.gsd${separator}`;
414
+ const gsdIdx = basePath.indexOf(gsdMarker);
415
+ const candidate = gsdIdx !== -1 ? basePath.slice(0, gsdIdx) : basePath.slice(0, segment.gsdIdx);
416
+
417
+ const normalizedGsdHome = normalizePathForCompare(gsdHome);
418
+ const candidateGsdPath = normalizePathForCompare(join(candidate, ".gsd"));
419
+ if (candidateGsdPath === normalizedGsdHome || candidateGsdPath.startsWith(`${normalizedGsdHome}/`)) {
420
+ return resolveProjectRootFromGitFile(basePath) ?? basePath;
421
+ }
422
+
423
+ return candidate;
424
+ }
425
+
349
426
  export function getGsdArgumentCompletions(prefix: string) {
350
427
  const hasTrailingSpace = prefix.endsWith(" ");
351
428
  const parts = prefix.trim().split(/\s+/);
@@ -406,7 +483,7 @@ export function getGsdArgumentCompletions(prefix: string) {
406
483
  // Workflow definition-name completion for `workflow run <name>` and `workflow validate <name>`
407
484
  if (command === "workflow" && (subcommand === "run" || subcommand === "validate") && parts.length <= 3) {
408
485
  try {
409
- const defsDir = join(resolveProjectRoot(process.cwd()), ".gsd", "workflow-defs");
486
+ const defsDir = join(resolveProjectRootForCompletion(process.cwd()), ".gsd", "workflow-defs");
410
487
  if (existsSync(defsDir)) {
411
488
  return readdirSync(defsDir)
412
489
  .filter((f) => f.endsWith(".yaml") && f.startsWith(third))
@@ -443,7 +520,7 @@ export function getGsdArgumentCompletions(prefix: string) {
443
520
  } catch { /* ignore */ }
444
521
  };
445
522
  try {
446
- const base = resolveProjectRoot(process.cwd());
523
+ const base = resolveProjectRootForCompletion(process.cwd());
447
524
  scanDir(join(base, ".gsd", "workflows"), "project");
448
525
  scanDir(join(base, ".gsd", "workflow-defs"), "project-legacy");
449
526
  scanDir(join(gsdHome, "workflows"), "global");
@@ -64,16 +64,21 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
64
64
  " /gsd pause Pause auto-mode (preserves state, /gsd auto to resume)",
65
65
  " /gsd discuss Start guided milestone/slice discussion",
66
66
  " /gsd new-milestone Create milestone from headless context (used by gsd headless)",
67
+ " /gsd quick Execute a quick task without full planning overhead",
68
+ " /gsd dispatch Dispatch a specific phase directly [research|plan|execute|complete|uat|replan]",
69
+ " /gsd parallel Parallel milestone orchestration [start|status|stop|pause|resume|merge|watch]",
70
+ " /gsd workflow Custom workflow lifecycle [new|run|list|validate|pause|resume]",
67
71
  "",
68
72
  "VISIBILITY",
69
73
  ` /gsd status Show progress dashboard (${formattedShortcutPair("dashboard")})`,
70
74
  ` /gsd parallel watch Open parallel worker monitor (${formattedShortcutPair("parallel")})`,
75
+ " /gsd widget Cycle status widget [full|small|min|off]",
71
76
  " /gsd visualize Interactive 10-tab TUI (progress, timeline, deps, metrics, health, agent, changes, knowledge, captures, export)",
72
77
  " /gsd queue Show queued/dispatched units and execution order",
73
78
  " /gsd history View execution history [--cost] [--phase] [--model] [N]",
74
79
  " /gsd changelog Show categorized release notes [version]",
75
80
  ` /gsd notifications View persistent notification history [clear|tail|filter] (${formattedShortcutPair("notifications")})`,
76
- " /gsd logs Browse activity logs, debug logs, and metrics",
81
+ " /gsd logs Browse activity logs, debug logs, and metrics [debug|tail|clear]",
77
82
  " /gsd debug Create/list/continue persistent debug sessions",
78
83
  "",
79
84
  "COURSE CORRECTION",
@@ -82,6 +87,9 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
82
87
  " /gsd triage Classify and route pending captures",
83
88
  " /gsd skip <unit> Prevent a unit from auto-mode dispatch",
84
89
  " /gsd undo Revert last completed unit [--force]",
90
+ " /gsd undo-task Reset a specific task's completion state [DB + markdown]",
91
+ " /gsd reset-slice Reset a slice and all its tasks [DB + markdown]",
92
+ " /gsd rate Rate last unit's model tier [over|ok|under]",
85
93
  " /gsd rethink Conversational project reorganization — reorder, park, discard, add milestones",
86
94
  " /gsd park [id] Park a milestone — skip without deleting [reason]",
87
95
  " /gsd unpark [id] Reactivate a parked milestone",
@@ -90,6 +98,15 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
90
98
  " /gsd knowledge <type> <text> Add rule, pattern, or lesson to KNOWLEDGE.md",
91
99
  " /gsd codebase [generate|update|stats] Manage the CODEBASE.md cache used in prompt context",
92
100
  "",
101
+ "SHIPPING & BACKLOG",
102
+ " /gsd ship Create a PR from milestone artifacts [--dry-run|--draft|--base|--force]",
103
+ " /gsd do <text> Route freeform text to the right GSD command",
104
+ " /gsd session-report Show session cost, tokens, and work summary [--json|--save]",
105
+ " /gsd backlog Manage backlog items [add|promote|remove|list]",
106
+ " /gsd pr-branch Create a clean PR branch filtering .gsd/ commits [--dry-run|--name]",
107
+ " /gsd add-tests Generate tests for completed slices",
108
+ " /gsd scan Rapid codebase assessment [--focus tech|arch|quality|concerns|tech+arch]",
109
+ "",
93
110
  "SETUP & CONFIGURATION",
94
111
  " /gsd onboarding Re-run setup wizard [--resume|--reset|--step <name>]",
95
112
  " /gsd setup Configuration hub [llm|model|search|remote|keys|prefs|onboarding]",
@@ -102,18 +119,23 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
102
119
  " /gsd config (deprecated) Set tool API keys — use /gsd keys instead",
103
120
  " /gsd show-config Show effective configuration (models, routing, toggles)",
104
121
  " /gsd hooks Show post-unit hook configuration",
122
+ " /gsd run-hook Manually trigger a specific hook",
123
+ " /gsd skill-health Skill lifecycle dashboard",
105
124
  " /gsd extensions Manage extensions [list|enable|disable|info]",
106
125
  " /gsd fast Toggle OpenAI service tier [on|off|flex|status]",
107
126
  " /gsd mcp MCP server status and connectivity [status|check <server>|init [dir]]",
108
127
  "",
109
128
  "MAINTENANCE",
110
129
  " /gsd doctor Diagnose and repair .gsd/ state [audit|fix|heal] [scope]",
130
+ " /gsd forensics Examine execution logs and post-mortem analysis",
111
131
  " /gsd export Export milestone/slice results [--json|--markdown|--html] [--all]",
112
132
  " /gsd cleanup Remove merged branches or snapshots [branches|snapshots]",
133
+ " /gsd worktree Manage worktrees from the TUI [list|merge|clean|remove]",
113
134
  " /gsd migrate Migrate .planning/ (v1) to .gsd/ (v2) format",
114
135
  " /gsd remote Control remote auto-mode [slack|discord|status|disconnect]",
115
136
  " /gsd inspect Show SQLite DB diagnostics (schema, row counts, recent entries)",
116
137
  " /gsd update Update GSD to the latest version via npm",
138
+ " /gsd language Set or clear the global response language [off|clear|<language>]",
117
139
  ];
118
140
  const full = ["full", "--full", "all"].includes(args.trim().toLowerCase());
119
141
  ctx.ui.notify((full ? fullLines : summaryLines).join("\n"), "info");
@@ -262,5 +262,15 @@ Examples:
262
262
  await handleScan(trimmed.replace(/^scan\s*/, "").trim(), ctx, pi);
263
263
  return true;
264
264
  }
265
+ if (
266
+ trimmed === "worktree" ||
267
+ trimmed.startsWith("worktree ") ||
268
+ trimmed === "wt" ||
269
+ trimmed.startsWith("wt ")
270
+ ) {
271
+ const { handleWorktree } = await import("../../commands-worktree.js");
272
+ await handleWorktree(trimmed.replace(/^(worktree|wt)\s*/, "").trim(), ctx);
273
+ return true;
274
+ }
265
275
  return false;
266
276
  }
@@ -8,6 +8,7 @@ import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
8
8
  import { AuthStorage } from "@gsd/pi-coding-agent";
9
9
  import { existsSync, mkdirSync } from "node:fs";
10
10
  import { join, dirname } from "node:path";
11
+ import { getHomeDir } from "./home-dir.js";
11
12
 
12
13
  /**
13
14
  * Tool API key configurations.
@@ -34,7 +35,7 @@ function getStoredToolKey(auth: AuthStorage, providerId: string): string | undef
34
35
  */
35
36
  export function loadToolApiKeys(): void {
36
37
  try {
37
- const authPath = join(process.env.HOME ?? "", ".gsd", "agent", "auth.json");
38
+ const authPath = join(getHomeDir(), ".gsd", "agent", "auth.json");
38
39
  if (!existsSync(authPath)) return;
39
40
 
40
41
  const auth = AuthStorage.create(authPath);
@@ -50,7 +51,7 @@ export function loadToolApiKeys(): void {
50
51
  }
51
52
 
52
53
  export function getConfigAuthStorage(): AuthStorage {
53
- const authPath = join(process.env.HOME ?? "", ".gsd", "agent", "auth.json");
54
+ const authPath = join(getHomeDir(), ".gsd", "agent", "auth.json");
54
55
  mkdirSync(dirname(authPath), { recursive: true });
55
56
  return AuthStorage.create(authPath);
56
57
  }
@@ -12,7 +12,47 @@ import { dirname, join, resolve } from "node:path";
12
12
  import { homedir, tmpdir } from "node:os";
13
13
  import { execFileSync } from "node:child_process";
14
14
  import { lockSync, unlockSync } from "proper-lockfile";
15
- import semver from "semver";
15
+
16
+ /**
17
+ * Strict numeric comparison of two npm-style version strings.
18
+ *
19
+ * Returns true when `a` is strictly greater than `b`. Compares the dotted
20
+ * release components numerically (so `1.10.0` > `1.9.0`) and treats any
21
+ * prerelease suffix (`-beta.1`, `-rc.2`) as less than the equivalent
22
+ * release version (`1.0.0` > `1.0.0-beta.1`). Sufficient for npm package
23
+ * version comparison in the extension installer; we don't need the full
24
+ * semver range/intersect machinery here.
25
+ *
26
+ * Replaces the earlier `import semver from "semver"` — that import broke
27
+ * `tsc -p tsconfig.json` whenever `@types/semver` failed to install
28
+ * (Issue #4946) because the file is pulled in transitively despite being
29
+ * under the `src/resources` exclude.
30
+ */
31
+ export function isVersionGreater(a: string, b: string): boolean {
32
+ const split = (v: string): { release: number[]; pre: string | null } => {
33
+ const dash = v.indexOf("-");
34
+ const release = (dash === -1 ? v : v.slice(0, dash))
35
+ .split(".")
36
+ .map(part => Number.parseInt(part, 10) || 0);
37
+ const pre = dash === -1 ? null : v.slice(dash + 1);
38
+ return { release, pre };
39
+ };
40
+ const sa = split(a);
41
+ const sb = split(b);
42
+ const len = Math.max(sa.release.length, sb.release.length);
43
+ for (let i = 0; i < len; i++) {
44
+ const ai = sa.release[i] ?? 0;
45
+ const bi = sb.release[i] ?? 0;
46
+ if (ai !== bi) return ai > bi;
47
+ }
48
+ // Release components equal — a release version beats any prerelease,
49
+ // and prerelease strings are compared lexicographically (good enough
50
+ // for `beta.1` vs `beta.2`, the only realistic case here).
51
+ if (sa.pre === null && sb.pre !== null) return true;
52
+ if (sa.pre !== null && sb.pre === null) return false;
53
+ if (sa.pre !== null && sb.pre !== null) return sa.pre > sb.pre;
54
+ return false;
55
+ }
16
56
 
17
57
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
18
58
 
@@ -538,7 +578,7 @@ async function updateSingleExtension(
538
578
  return;
539
579
  }
540
580
 
541
- if (semver.gt(latest, current)) {
581
+ if (isVersionGreater(latest, current)) {
542
582
  ctx.ui.notify(`Updating "${id}": v${current} → v${latest}...`, "info");
543
583
  await handleInstall(packageName, ctx);
544
584
  } else {
@@ -599,7 +639,7 @@ async function updateAllExtensions(
599
639
  continue;
600
640
  }
601
641
 
602
- if (semver.gt(latest, current)) {
642
+ if (isVersionGreater(latest, current)) {
603
643
  ctx.ui.notify(` ${entry.id}: v${current} → v${latest} (updating)`, "info");
604
644
  await handleInstall(packageName, ctx);
605
645
  updated++;