gsd-pi 2.78.0 → 2.78.1-dev.82bcf6b71

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 (577) 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 +26 -12
  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-direct-dispatch.js +55 -21
  28. package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
  29. package/dist/resources/extensions/gsd/auto-prompts.js +69 -2
  30. package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
  31. package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
  32. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  33. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  34. package/dist/resources/extensions/gsd/auto-worktree.js +75 -13
  35. package/dist/resources/extensions/gsd/auto.js +39 -14
  36. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
  38. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  39. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
  40. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +112 -31
  41. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
  42. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
  43. package/dist/resources/extensions/gsd/bootstrap/system-context.js +45 -8
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
  45. package/dist/resources/extensions/gsd/commands/catalog.js +76 -5
  46. package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -1
  47. package/dist/resources/extensions/gsd/commands/handlers/ops.js +8 -0
  48. package/dist/resources/extensions/gsd/commands-config.js +3 -2
  49. package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
  50. package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
  51. package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
  52. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
  53. package/dist/resources/extensions/gsd/commands-worktree.js +309 -0
  54. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  55. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  56. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  57. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
  58. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  59. package/dist/resources/extensions/gsd/forensics.js +10 -8
  60. package/dist/resources/extensions/gsd/git-service.js +12 -5
  61. package/dist/resources/extensions/gsd/gsd-db.js +11 -2
  62. package/dist/resources/extensions/gsd/guided-flow.js +25 -24
  63. package/dist/resources/extensions/gsd/home-dir.js +16 -0
  64. package/dist/resources/extensions/gsd/key-manager.js +2 -1
  65. package/dist/resources/extensions/gsd/memory-store.js +66 -31
  66. package/dist/resources/extensions/gsd/migrate/command.js +3 -2
  67. package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
  68. package/dist/resources/extensions/gsd/model-router.js +114 -9
  69. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
  70. package/dist/resources/extensions/gsd/preferences-models.js +91 -15
  71. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  72. package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
  73. package/dist/resources/extensions/gsd/preferences.js +5 -3
  74. package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  77. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +2 -0
  79. package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  80. package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  81. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +2 -0
  82. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
  83. package/dist/resources/extensions/gsd/state.js +42 -0
  84. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  85. package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
  86. package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
  87. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  88. package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
  89. package/dist/resources/extensions/gsd/worktree-command.js +26 -46
  90. package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
  91. package/dist/resources/extensions/gsd/worktree-resolver.js +28 -13
  92. package/dist/resources/extensions/gsd/worktree-root.js +124 -0
  93. package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
  94. package/dist/resources/extensions/gsd/worktree.js +4 -115
  95. package/dist/resources/extensions/mcp-client/index.js +6 -9
  96. package/dist/resources/extensions/ollama/index.js +15 -2
  97. package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
  98. package/dist/resources/extensions/ollama/ollama-client.js +40 -4
  99. package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
  100. package/dist/resources/extensions/subagent/index.js +324 -178
  101. package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
  102. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  103. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  104. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  105. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  106. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  107. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  108. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  109. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  110. package/dist/resources/skills/lint/SKILL.md +4 -0
  111. package/dist/resources/skills/review/SKILL.md +4 -0
  112. package/dist/resources/skills/test/SKILL.md +3 -0
  113. package/dist/rtk-shared.d.ts +3 -0
  114. package/dist/rtk-shared.js +17 -0
  115. package/dist/rtk.d.ts +2 -5
  116. package/dist/rtk.js +3 -20
  117. package/dist/runtime-checks.d.ts +27 -0
  118. package/dist/runtime-checks.js +38 -0
  119. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  120. package/dist/web/standalone/.next/BUILD_ID +1 -1
  121. package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -19
  122. package/dist/web/standalone/.next/build-manifest.json +4 -4
  123. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  124. package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
  125. package/dist/web/standalone/.next/required-server-files.json +3 -3
  126. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  127. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  165. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  195. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
  201. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  215. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  217. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  221. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/index.html +1 -1
  231. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  232. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  233. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  234. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  236. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  237. package/dist/web/standalone/.next/server/app/page.js +2 -2
  238. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -19
  240. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  241. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  242. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  244. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/middleware.js +2 -2
  246. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  248. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  249. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  250. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  251. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  252. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
  259. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
  260. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
  261. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  263. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  264. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +1 -0
  268. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  269. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  270. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  271. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  272. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  273. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  274. package/dist/web/standalone/package.json +2 -1
  275. package/dist/web/standalone/server.js +1 -1
  276. package/dist/welcome-screen.js +27 -1
  277. package/dist/worktree-cli.d.ts +1 -0
  278. package/dist/worktree-cli.js +9 -3
  279. package/dist/worktree-status-banner.d.ts +1 -0
  280. package/dist/worktree-status-banner.js +132 -0
  281. package/package.json +1 -3
  282. package/packages/daemon/package.json +2 -2
  283. package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
  284. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
  285. package/packages/mcp-server/dist/alias-telemetry.js +30 -0
  286. package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
  287. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  288. package/packages/mcp-server/dist/workflow-tools.js +74 -46
  289. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  290. package/packages/mcp-server/package.json +2 -2
  291. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  292. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  293. package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
  294. package/packages/mcp-server/src/workflow-tools.ts +93 -58
  295. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  296. package/packages/native/package.json +1 -1
  297. package/packages/native/tsconfig.tsbuildinfo +1 -1
  298. package/packages/pi-agent-core/package.json +1 -1
  299. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  300. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
  301. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
  302. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
  303. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
  304. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  305. package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
  306. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  307. package/packages/pi-ai/dist/types.d.ts +13 -0
  308. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  309. package/packages/pi-ai/dist/types.js.map +1 -1
  310. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
  312. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  313. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
  314. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  315. package/packages/pi-ai/package.json +1 -1
  316. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  317. package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
  318. package/packages/pi-ai/src/types.ts +13 -0
  319. package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
  320. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
  321. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  322. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
  324. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/messages.js +4 -0
  327. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  329. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
  331. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
  333. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
  335. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
  337. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
  339. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
  341. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
  349. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
  351. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
  352. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
  353. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
  354. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
  355. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
  356. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
  357. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
  358. package/packages/pi-coding-agent/package.json +1 -1
  359. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
  360. package/packages/pi-coding-agent/src/core/messages.ts +4 -0
  361. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
  362. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
  363. package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
  364. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  365. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
  366. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
  367. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  368. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  369. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  370. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  371. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
  372. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  373. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  374. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  375. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  376. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  377. package/packages/pi-tui/package.json +1 -1
  378. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
  379. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  380. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  381. package/packages/rpc-client/package.json +1 -1
  382. package/pkg/package.json +1 -1
  383. package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
  384. package/src/resources/extensions/google-search/index.ts +2 -9
  385. package/src/resources/extensions/gsd/auto/loop.ts +24 -2
  386. package/src/resources/extensions/gsd/auto/phases.ts +6 -14
  387. package/src/resources/extensions/gsd/auto/run-unit.ts +26 -12
  388. package/src/resources/extensions/gsd/auto/session.ts +5 -6
  389. package/src/resources/extensions/gsd/auto/types.ts +1 -0
  390. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
  391. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +60 -24
  392. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
  393. package/src/resources/extensions/gsd/auto-prompts.ts +66 -2
  394. package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
  395. package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
  396. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  397. package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
  398. package/src/resources/extensions/gsd/auto-worktree.ts +97 -12
  399. package/src/resources/extensions/gsd/auto.ts +37 -10
  400. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
  401. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
  402. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  403. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
  404. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +121 -31
  405. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
  406. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
  407. package/src/resources/extensions/gsd/bootstrap/system-context.ts +50 -8
  408. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
  409. package/src/resources/extensions/gsd/commands/catalog.ts +82 -5
  410. package/src/resources/extensions/gsd/commands/handlers/core.ts +23 -1
  411. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  412. package/src/resources/extensions/gsd/commands-config.ts +3 -2
  413. package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
  414. package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
  415. package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
  416. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
  417. package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
  418. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  419. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  420. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  421. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
  422. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  423. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  424. package/src/resources/extensions/gsd/forensics.ts +12 -7
  425. package/src/resources/extensions/gsd/git-service.ts +13 -5
  426. package/src/resources/extensions/gsd/gsd-db.ts +12 -2
  427. package/src/resources/extensions/gsd/guided-flow.ts +27 -26
  428. package/src/resources/extensions/gsd/home-dir.ts +19 -0
  429. package/src/resources/extensions/gsd/journal.ts +4 -1
  430. package/src/resources/extensions/gsd/key-manager.ts +2 -1
  431. package/src/resources/extensions/gsd/memory-store.ts +81 -28
  432. package/src/resources/extensions/gsd/migrate/command.ts +3 -2
  433. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  434. package/src/resources/extensions/gsd/model-router.ts +172 -9
  435. package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
  436. package/src/resources/extensions/gsd/preferences-models.ts +101 -15
  437. package/src/resources/extensions/gsd/preferences-types.ts +6 -0
  438. package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
  439. package/src/resources/extensions/gsd/preferences.ts +16 -2
  440. package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
  441. package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  442. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  443. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  444. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +2 -0
  445. package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  446. package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  447. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +2 -0
  448. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
  449. package/src/resources/extensions/gsd/state.ts +42 -0
  450. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  451. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +179 -1
  452. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
  453. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
  454. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
  455. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
  457. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +50 -27
  458. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
  459. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
  460. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
  461. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
  462. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
  463. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
  464. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
  465. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
  466. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
  467. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
  468. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
  469. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
  470. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  471. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
  472. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  473. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
  474. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
  475. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  476. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
  477. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
  478. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +25 -65
  479. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
  480. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
  481. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
  482. package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
  483. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  484. package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
  485. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  486. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
  487. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
  488. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
  489. package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
  490. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
  491. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
  492. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  493. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
  494. package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
  495. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  496. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
  497. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
  498. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
  499. package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
  500. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
  501. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
  502. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  503. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
  504. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +34 -0
  505. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
  506. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
  507. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
  508. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +8 -2
  509. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +12 -6
  510. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
  511. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
  512. package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
  513. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
  514. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
  515. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
  516. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
  517. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  518. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +235 -0
  519. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +85 -0
  520. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
  521. package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
  523. package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
  524. package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
  525. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  526. package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
  527. package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
  528. package/src/resources/extensions/gsd/worktree-command.ts +31 -44
  529. package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
  530. package/src/resources/extensions/gsd/worktree-resolver.ts +28 -14
  531. package/src/resources/extensions/gsd/worktree-root.ts +144 -0
  532. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  533. package/src/resources/extensions/gsd/worktree.ts +8 -119
  534. package/src/resources/extensions/mcp-client/index.ts +6 -10
  535. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  536. package/src/resources/extensions/ollama/index.ts +16 -2
  537. package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
  538. package/src/resources/extensions/ollama/ollama-client.ts +41 -4
  539. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
  540. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  541. package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
  542. package/src/resources/extensions/subagent/index.ts +165 -7
  543. package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
  544. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  545. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  546. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  547. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  548. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  549. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  550. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  551. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  552. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  553. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
  554. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  555. package/src/resources/skills/lint/SKILL.md +4 -0
  556. package/src/resources/skills/review/SKILL.md +4 -0
  557. package/src/resources/skills/test/SKILL.md +3 -0
  558. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
  559. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
  560. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
  561. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  562. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  563. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  564. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  565. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  566. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
  567. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
  568. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
  569. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  571. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  572. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
  573. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
  574. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
  575. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
  576. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → hcvW7f3yv1JHzlWe7tIc6}/_buildManifest.js +0 -0
  577. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → hcvW7f3yv1JHzlWe7tIc6}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ 38cf2a787658e575
@@ -5,10 +5,30 @@
5
5
  * Results are cached for 30 seconds to avoid shelling out on every
6
6
  * model-availability check.
7
7
  *
8
- * Auth verification follows the T3 Code pattern: run `claude auth status`
9
- * and check the exit code + output for an authenticated session.
8
+ * Auth verification runs `claude auth status --json` and inspects the
9
+ * `loggedIn` field, falling back to plain `claude auth status` and a text
10
+ * heuristic when the JSON shape is unavailable (older Claude CLI builds).
11
+ *
12
+ * Set GSD_CLAUDE_DEBUG=1 to print the probe's binary selection and auth
13
+ * outputs to stderr — useful when diagnosing platform-specific detection
14
+ * failures (Issue #4997).
10
15
  */
11
16
  import { execFileSync } from "node:child_process";
17
+ /**
18
+ * Spawn the Claude CLI without triggering Node's DEP0190.
19
+ *
20
+ * Passing `args` together with `shell: true` is deprecated in Node 22+
21
+ * because the args are concatenated into the command string without
22
+ * escaping. On Windows we still need a shell to resolve `.cmd` shims, so
23
+ * we invoke `cmd /c <command> <args...>` explicitly. On POSIX we don't
24
+ * need a shell at all.
25
+ */
26
+ function spawnClaude(command, args, opts) {
27
+ if (process.platform === "win32") {
28
+ return execFileSync("cmd", ["/c", command, ...args], opts);
29
+ }
30
+ return execFileSync(command, args, opts);
31
+ }
12
32
  /**
13
33
  * Candidate executable names for the Claude Code CLI.
14
34
  *
@@ -23,33 +43,114 @@ const CLAUDE_COMMAND = process.platform === "win32" ? "claude.cmd" : "claude";
23
43
  * installed" results in readiness checks.
24
44
  */
25
45
  const CLAUDE_COMMAND_CANDIDATES = process.platform === "win32" ? [CLAUDE_COMMAND, "claude.exe", "claude"] : [CLAUDE_COMMAND];
26
- function execClaude(args) {
27
- let lastError;
46
+ // Keep the version probe snappy — `claude --version` is a quick path.
47
+ const VERSION_TIMEOUT_MS = 5_000;
48
+ // Auth status can be much slower on Windows because the spawn goes through
49
+ // cmd.exe → claude.cmd → node → Claude CLI. 15s leaves headroom on cold spawns
50
+ // without making startup feel hung when the CLI is genuinely missing.
51
+ const AUTH_TIMEOUT_MS = 15_000;
52
+ function debugLog(...parts) {
53
+ if (process.env.GSD_CLAUDE_DEBUG) {
54
+ process.stderr.write(`[claude-readiness] ${parts.map((p) => (typeof p === "string" ? p : JSON.stringify(p))).join(" ")}\n`);
55
+ }
56
+ }
57
+ /**
58
+ * Find the first candidate that responds to `--version`. Returns the
59
+ * candidate name on success, null if none worked.
60
+ *
61
+ * On Windows with `cmd /c`, a missing candidate surfaces as a
62
+ * non-zero exit from cmd.exe rather than ENOENT — so we cannot rely on
63
+ * the error code to decide "try next". Treat any failure as "try next"
64
+ * for the version probe; the only thing that matters for binary
65
+ * detection is whether *some* candidate produces a `claude --version`
66
+ * line.
67
+ */
68
+ function findWorkingCommand() {
28
69
  for (const command of CLAUDE_COMMAND_CANDIDATES) {
29
70
  try {
30
- return execFileSync(command, args, {
31
- timeout: 5_000,
71
+ spawnClaude(command, ["--version"], {
72
+ timeout: VERSION_TIMEOUT_MS,
32
73
  stdio: "pipe",
33
- shell: process.platform === "win32",
34
74
  });
75
+ debugLog("version probe ok via", command);
76
+ return command;
35
77
  }
36
78
  catch (error) {
37
- lastError = error;
38
- const code = error?.code;
39
- // Windows Git Bash can surface `.cmd` spawn failures as EINVAL instead
40
- // of ENOENT. Treat both as "try next candidate".
41
- if (code === "ENOENT" || code === "EINVAL") {
42
- continue;
79
+ debugLog("version probe failed for", command, "code=", error?.code);
80
+ continue;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Decide auth state from `claude auth status` output.
87
+ *
88
+ * Newer Claude CLI builds emit JSON by default with a `loggedIn` boolean.
89
+ * Older builds emit free-form text. We prefer the structured signal and fall
90
+ * back to a text heuristic. Note: the text heuristic only covers English
91
+ * phrasing — the JSON path is the durable signal.
92
+ */
93
+ function parseAuthStatus(output) {
94
+ const trimmed = output.trim();
95
+ if (!trimmed)
96
+ return null;
97
+ if (trimmed.startsWith("{")) {
98
+ try {
99
+ const parsed = JSON.parse(trimmed);
100
+ if (typeof parsed.loggedIn === "boolean") {
101
+ return parsed.loggedIn;
43
102
  }
44
- throw error;
45
103
  }
104
+ catch {
105
+ // Fall through to text heuristic.
106
+ }
107
+ }
108
+ const lower = trimmed.toLowerCase();
109
+ if (/not logged in|no credentials|unauthenticated|not authenticated/.test(lower)) {
110
+ return false;
111
+ }
112
+ if (/logged in|authenticated|signed in|email|subscription/.test(lower)) {
113
+ return true;
114
+ }
115
+ return null;
116
+ }
117
+ function probeAuth(command) {
118
+ // Try --json first (newer CLIs).
119
+ try {
120
+ const out = spawnClaude(command, ["auth", "status", "--json"], {
121
+ timeout: AUTH_TIMEOUT_MS,
122
+ stdio: "pipe",
123
+ }).toString();
124
+ debugLog("auth status --json output:", out.slice(0, 200));
125
+ const parsed = parseAuthStatus(out);
126
+ if (parsed !== null)
127
+ return parsed;
128
+ }
129
+ catch (error) {
130
+ debugLog("auth status --json threw:", error.message?.slice(0, 200));
131
+ }
132
+ // Fallback: plain `auth status` (older CLIs that don't accept --json).
133
+ try {
134
+ const out = spawnClaude(command, ["auth", "status"], {
135
+ timeout: AUTH_TIMEOUT_MS,
136
+ stdio: "pipe",
137
+ }).toString();
138
+ debugLog("auth status output:", out.slice(0, 200));
139
+ return parseAuthStatus(out);
140
+ }
141
+ catch (error) {
142
+ debugLog("auth status threw:", error.message?.slice(0, 200));
143
+ return null;
46
144
  }
47
- throw lastError ?? new Error(`Claude CLI executable not found (tried: ${CLAUDE_COMMAND_CANDIDATES.join(", ")})`);
48
145
  }
49
146
  let cachedBinaryPresent = null;
50
147
  let cachedAuthed = null;
51
148
  let lastCheckMs = 0;
52
149
  const CHECK_INTERVAL_MS = 30_000;
150
+ /**
151
+ * Refresh the cached binary/auth state when the cache window has expired.
152
+ * Preserves a known auth state across soft-fail auth probes.
153
+ */
53
154
  function refreshCache() {
54
155
  const now = Date.now();
55
156
  if (cachedBinaryPresent !== null && now - lastCheckMs < CHECK_INTERVAL_MS) {
@@ -57,28 +158,23 @@ function refreshCache() {
57
158
  }
58
159
  // Set timestamp first to prevent re-entrant checks during the same window
59
160
  lastCheckMs = now;
60
- // Check binary presence
61
- try {
62
- execClaude(["--version"]);
63
- cachedBinaryPresent = true;
64
- }
65
- catch {
161
+ const command = findWorkingCommand();
162
+ if (!command) {
66
163
  cachedBinaryPresent = false;
67
164
  cachedAuthed = false;
68
165
  return;
69
166
  }
70
- // Check auth status — exit code 0 with non-error output means authenticated
71
- try {
72
- const output = execClaude(["auth", "status"])
73
- .toString()
74
- .toLowerCase();
75
- // The CLI outputs "not logged in", "no credentials", or similar when unauthenticated
76
- cachedAuthed = !(/not logged in|no credentials|unauthenticated|not authenticated/i.test(output));
77
- }
78
- catch {
79
- // Non-zero exit code means not authenticated
80
- cachedAuthed = false;
167
+ cachedBinaryPresent = true;
168
+ const authed = probeAuth(command);
169
+ if (authed === null) {
170
+ // Couldn't determine auth state from CLI output. Don't clobber a
171
+ // previously known-good cache; otherwise default to false so we don't
172
+ // silently route requests to an unauthenticated CLI.
173
+ if (cachedAuthed === null)
174
+ cachedAuthed = false;
175
+ return;
81
176
  }
177
+ cachedAuthed = authed;
82
178
  }
83
179
  /**
84
180
  * Whether the `claude` binary is installed (regardless of auth state).
@@ -1,7 +1,3 @@
1
- export default function (pi) {
2
- pi.on("session_start", async (_event, ctx) => {
3
- ctx.ui.notify("google_search is being extracted to @gsd-extensions/google-search " +
4
- "(not yet published to npm). This stub will be replaced once the " +
5
- "package is available. No action needed for now.", "warning");
6
- });
1
+ export default function (_pi) {
2
+ // Deprecation notice intentionally suppressed until @gsd-extensions/google-search ships.
7
3
  }
@@ -163,6 +163,17 @@ function resolveDispatchNodeKind(unitType, sidecarItem) {
163
163
  }
164
164
  return "unit";
165
165
  }
166
+ async function enforceMinRequestInterval(s, prefs) {
167
+ const minInterval = prefs?.min_request_interval_ms ?? 0;
168
+ if (minInterval > 0 && s.lastRequestTimestamp > 0) {
169
+ const elapsed = Date.now() - s.lastRequestTimestamp;
170
+ if (elapsed < minInterval) {
171
+ const waitMs = minInterval - elapsed;
172
+ debugLog("autoLoop", { phase: "rate-limit-wait", waitMs });
173
+ await new Promise(r => setTimeout(r, waitMs));
174
+ }
175
+ }
176
+ }
166
177
  async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem) {
167
178
  if (dispatchContract === "legacy-direct") {
168
179
  return runUnitPhase(ic, iterData, loopState, sidecarItem);
@@ -392,7 +403,13 @@ export async function autoLoop(ctx, pi, s, deps, options) {
392
403
  break;
393
404
  }
394
405
  // ── Unit execution (shared with dev path) ──
406
+ await enforceMinRequestInterval(s, prefs);
395
407
  const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState);
408
+ if (unitPhaseResult.action === "next") {
409
+ const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
410
+ if (typeof requestTimestamp === "number")
411
+ s.lastRequestTimestamp = requestTimestamp;
412
+ }
396
413
  deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
397
414
  unitType: iterData.unitType,
398
415
  unitId: iterData.unitId,
@@ -555,7 +572,13 @@ export async function autoLoop(ctx, pi, s, deps, options) {
555
572
  sidecarKind: sidecarItem.kind,
556
573
  });
557
574
  }
575
+ await enforceMinRequestInterval(s, prefs);
558
576
  const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem);
577
+ if (unitPhaseResult.action === "next") {
578
+ const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
579
+ if (typeof requestTimestamp === "number")
580
+ s.lastRequestTimestamp = requestTimestamp;
581
+ }
559
582
  deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
560
583
  unitType: iterData.unitType,
561
584
  unitId: iterData.unitId,
@@ -11,6 +11,7 @@ import { MAX_RECOVERY_CHARS, BUDGET_THRESHOLDS, MAX_FINALIZE_TIMEOUTS, } from ".
11
11
  import { detectStuck } from "./detect-stuck.js";
12
12
  import { runUnit } from "./run-unit.js";
13
13
  import { debugLog } from "../debug-logger.js";
14
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
14
15
  import { PROJECT_FILES, hasProjectFileInAncestor } from "../detection.js";
15
16
  import { MergeConflictError } from "../git-service.js";
16
17
  import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
@@ -48,11 +49,7 @@ export function resetSessionTimeoutState() {
48
49
  * Exported for testing as _resolveReportBasePath.
49
50
  */
50
51
  export function _resolveReportBasePath(s) {
51
- // Strip /.gsd/worktrees/ suffix when basePath is itself a worktree path and
52
- // originalBasePath is falsy — prevents reports landing in the worktree (#3729).
53
- const resolved = s.originalBasePath || s.basePath;
54
- const markerIdx = resolved.indexOf("/.gsd/worktrees/");
55
- return markerIdx !== -1 ? resolved.slice(0, markerIdx) : resolved;
52
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
56
53
  }
57
54
  /**
58
55
  * Resolve the authoritative project base for dispatch guards.
@@ -60,12 +57,7 @@ export function _resolveReportBasePath(s) {
60
57
  * unit is running inside an auto worktree.
61
58
  */
62
59
  export function _resolveDispatchGuardBasePath(s) {
63
- // Strip /.gsd/worktrees/ suffix when basePath is itself a worktree path and
64
- // originalBasePath is falsy — prevents guard checks running against the
65
- // worktree instead of the project root (#3729).
66
- const resolved = s.originalBasePath || s.basePath;
67
- const markerIdx = resolved.indexOf("/.gsd/worktrees/");
68
- return markerIdx !== -1 ? resolved.slice(0, markerIdx) : resolved;
60
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
69
61
  }
70
62
  const PLAN_V2_GATE_PHASES = new Set([
71
63
  "executing",
@@ -1365,7 +1357,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1365
1357
  ctx.ui.notify(`${unitType} ${unitId} completed with 0 tool calls — context exhaustion, will retry`, "warning");
1366
1358
  // Fall through to next iteration where dispatch will re-derive
1367
1359
  // and re-dispatch this unit.
1368
- return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
1360
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
1369
1361
  }
1370
1362
  }
1371
1363
  }
@@ -1418,7 +1410,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1418
1410
  }
1419
1411
  s.checkpointSha = null;
1420
1412
  }
1421
- return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
1413
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
1422
1414
  }
1423
1415
  // ─── runFinalize ──────────────────────────────────────────────────────────────
1424
1416
  /**
@@ -22,6 +22,29 @@ let sessionSwitchGeneration = 0;
22
22
  */
23
23
  export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
24
24
  debugLog("runUnit", { phase: "start", unitType, unitId });
25
+ // Ensure cwd matches basePath BEFORE newSession() captures it. The new
26
+ // session reads process.cwd() during construction to anchor its tool
27
+ // runtime and system prompt; if cwd has drifted (async_bash, background
28
+ // jobs, prior unit cleanup), the session would otherwise be rooted to
29
+ // the wrong directory. Must be synchronous — no awaits between chdir
30
+ // and newSession (#1389, #4762 follow-up).
31
+ try {
32
+ if (process.cwd() !== s.basePath) {
33
+ process.chdir(s.basePath);
34
+ }
35
+ }
36
+ catch (e) {
37
+ const msg = `Failed to chdir to basePath before newSession (basePath: ${s.basePath}): ${String(e)}`;
38
+ logWarning("engine", msg, { basePath: s.basePath, error: String(e) });
39
+ return {
40
+ status: "cancelled",
41
+ errorContext: {
42
+ message: msg,
43
+ category: "session-failed",
44
+ isTransient: true,
45
+ },
46
+ };
47
+ }
25
48
  // ── Session creation with timeout ──
26
49
  debugLog("runUnit", { phase: "session-create", unitType, unitId });
27
50
  let sessionResult;
@@ -91,17 +114,6 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
91
114
  const unitPromise = new Promise((resolve) => {
92
115
  _setCurrentResolve(resolve);
93
116
  });
94
- // Ensure cwd matches basePath before dispatch (#1389).
95
- // async_bash and background jobs can drift cwd away from the worktree.
96
- // Realigning here prevents commits from landing on the wrong branch.
97
- try {
98
- if (process.cwd() !== s.basePath) {
99
- process.chdir(s.basePath);
100
- }
101
- }
102
- catch (e) {
103
- logWarning("engine", "Failed to chdir to basePath before dispatch", { basePath: s.basePath, error: String(e) });
104
- }
105
117
  // ── Provider request-readiness pre-check (#4555) ──
106
118
  // Verify the provider can accept requests before dispatching. If the token
107
119
  // has expired since bootstrap, return cancelled immediately so the unit is
@@ -138,6 +150,7 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
138
150
  const capturedTurnGen = getCurrentTurnGeneration();
139
151
  // ── Send the prompt ──
140
152
  debugLog("runUnit", { phase: "send-message", unitType, unitId });
153
+ const requestDispatchedAt = Date.now();
141
154
  pi.sendMessage({ customType: "gsd-auto", content: prompt, display: s.verbose }, { triggerTurn: true });
142
155
  // ── Await agent_end with absolute timeout (H4 fix) ──
143
156
  // If supervision fails to resolve unitPromise within 30s, treat as cancelled.
@@ -160,6 +173,7 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
160
173
  unitId,
161
174
  status: result.status,
162
175
  });
176
+ const finalResult = { ...result, requestDispatchedAt };
163
177
  // Discard trailing follow-up messages (e.g. async_job_result notifications)
164
178
  // from the completed unit. Without this, queued follow-ups trigger wasteful
165
179
  // LLM turns before the next session can start (#1642).
@@ -174,5 +188,5 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
174
188
  catch (e) {
175
189
  logWarning("engine", "clearQueue failed after unit completion", { error: String(e) });
176
190
  }
177
- return result;
191
+ return finalResult;
178
192
  }
@@ -15,6 +15,7 @@
15
15
  * auto-session-encapsulation.test.ts enforce that auto.ts has no module-level
16
16
  * `let` or `var` declarations.
17
17
  */
18
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
18
19
  // ─── Constants ───────────────────────────────────────────────────────────────
19
20
  export const STUB_RECOVERY_THRESHOLD = 2;
20
21
  export const NEW_SESSION_TIMEOUT_MS = 120_000;
@@ -118,6 +119,8 @@ export class AutoSession {
118
119
  lastPromptCharCount;
119
120
  lastBaselineCharCount;
120
121
  pendingQuickTasks = [];
122
+ /** Timestamp of the last LLM request dispatch (ms since epoch). Used for proactive rate limiting. */
123
+ lastRequestTimestamp = 0;
121
124
  // ── Safety harness ───────────────────────────────────────────────────────
122
125
  /** SHA of the pre-unit git checkpoint ref. Cleared on success or rollback. */
123
126
  checkpointSha = null;
@@ -153,12 +156,7 @@ export class AutoSession {
153
156
  this.unitLifetimeDispatches.clear();
154
157
  }
155
158
  get lockBasePath() {
156
- // Prefer originalBasePath (project root); fall back to basePath.
157
- // Strip /.gsd/worktrees/ suffix if basePath is itself a worktree path
158
- // to avoid reading/writing the lock inside the worktree (#3729).
159
- const resolved = this.originalBasePath || this.basePath;
160
- const markerIdx = resolved.indexOf("/.gsd/worktrees/");
161
- return markerIdx !== -1 ? resolved.slice(0, markerIdx) : resolved;
159
+ return resolveWorktreeProjectRoot(this.basePath, this.originalBasePath);
162
160
  }
163
161
  reset() {
164
162
  this.clearTimers();
@@ -215,6 +213,7 @@ export class AutoSession {
215
213
  this.lastPromptCharCount = undefined;
216
214
  this.lastBaselineCharCount = undefined;
217
215
  this.pendingQuickTasks = [];
216
+ this.lastRequestTimestamp = 0;
218
217
  this.sidecarQueue = [];
219
218
  this.rewriteAttemptCount = 0;
220
219
  this.consecutiveCompleteBootstraps = 0;
@@ -10,6 +10,7 @@ import { getActiveHook } from "./post-unit-hooks.js";
10
10
  import { getLedger, getProjectTotals } from "./metrics.js";
11
11
  import { getErrorMessage } from "./error-utils.js";
12
12
  import { nativeIsRepo } from "./native-git-bridge.js";
13
+ import { getHomeDir } from "./home-dir.js";
13
14
  import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
14
15
  import { readFileSync, writeFileSync, existsSync } from "node:fs";
15
16
  import { execFileSync } from "node:child_process";
@@ -461,8 +462,8 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
461
462
  let widgetPwd;
462
463
  {
463
464
  let fullPwd = process.cwd();
464
- const widgetHome = process.env.HOME || process.env.USERPROFILE;
465
- if (widgetHome && fullPwd.startsWith(widgetHome)) {
465
+ const widgetHome = getHomeDir();
466
+ if (widgetHome && (fullPwd === widgetHome || fullPwd.startsWith(widgetHome + "/") || fullPwd.startsWith(widgetHome + "\\"))) {
466
467
  fullPwd = `~${fullPwd.slice(widgetHome.length)}`;
467
468
  }
468
469
  const parts = fullPwd.split("/");
@@ -10,6 +10,8 @@ import { resolveMilestoneFile, resolveSliceFile, relSliceFile, } from "./paths.j
10
10
  import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
11
11
  import { loadEffectiveGSDPreferences } from "./preferences.js";
12
12
  import { pauseAuto } from "./auto.js";
13
+ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
14
+ import { logWarning } from "./workflow-logger.js";
13
15
  import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, } from "./workflow-mcp.js";
14
16
  export async function dispatchDirectPhase(ctx, pi, phase, base) {
15
17
  const state = await deriveState(base);
@@ -19,6 +21,12 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
19
21
  ctx.ui.notify("Cannot dispatch: no active milestone.", "warning");
20
22
  return;
21
23
  }
24
+ const projectRoot = base;
25
+ // Switch the dispatch base to the canonical milestone worktree if one
26
+ // exists. Without this, /gsd dispatch invoked from the project root would
27
+ // build prompts and create a session anchored to the project root even
28
+ // though the milestone's actual code lives in the worktree.
29
+ const dispatchBase = resolveCanonicalMilestoneRoot(base, mid);
22
30
  const normalized = phase.toLowerCase();
23
31
  let unitType;
24
32
  let unitId;
@@ -37,7 +45,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
37
45
  }
38
46
  // When require_slice_discussion is enabled, pause auto-mode before
39
47
  // each new slice so the user can discuss requirements first (#789).
40
- const sliceContextFile = resolveSliceFile(base, mid, sid, "CONTEXT");
48
+ const sliceContextFile = resolveSliceFile(dispatchBase, mid, sid, "CONTEXT");
41
49
  const requireDiscussion = loadEffectiveGSDPreferences()?.preferences?.phases?.require_slice_discussion;
42
50
  if (requireDiscussion && !sliceContextFile) {
43
51
  ctx.ui.notify(`Slice ${sid} requires discussion before planning. Run /gsd discuss to discuss this slice, then /gsd auto to resume.`, "info");
@@ -46,12 +54,12 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
46
54
  }
47
55
  unitType = "research-slice";
48
56
  unitId = `${mid}/${sid}`;
49
- prompt = await buildResearchSlicePrompt(mid, midTitle, sid, sTitle, base);
57
+ prompt = await buildResearchSlicePrompt(mid, midTitle, sid, sTitle, dispatchBase);
50
58
  }
51
59
  else {
52
60
  unitType = "research-milestone";
53
61
  unitId = mid;
54
- prompt = await buildResearchMilestonePrompt(mid, midTitle, base);
62
+ prompt = await buildResearchMilestonePrompt(mid, midTitle, dispatchBase);
55
63
  }
56
64
  break;
57
65
  }
@@ -68,7 +76,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
68
76
  }
69
77
  unitType = "plan-slice";
70
78
  unitId = `${mid}/${sid}`;
71
- prompt = await buildPlanSlicePrompt(mid, midTitle, sid, sTitle, base, undefined, {
79
+ prompt = await buildPlanSlicePrompt(mid, midTitle, sid, sTitle, dispatchBase, undefined, {
72
80
  sessionContextWindow: ctx.model?.contextWindow,
73
81
  modelRegistry: ctx.modelRegistry,
74
82
  });
@@ -76,7 +84,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
76
84
  else {
77
85
  unitType = "plan-milestone";
78
86
  unitId = mid;
79
- prompt = await buildPlanMilestonePrompt(mid, midTitle, base);
87
+ prompt = await buildPlanMilestonePrompt(mid, midTitle, dispatchBase);
80
88
  }
81
89
  break;
82
90
  }
@@ -96,7 +104,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
96
104
  }
97
105
  unitType = "execute-task";
98
106
  unitId = `${mid}/${sid}/${tid}`;
99
- prompt = await buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base, {
107
+ prompt = await buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, dispatchBase, {
100
108
  sessionContextWindow: ctx.model?.contextWindow,
101
109
  modelRegistry: ctx.modelRegistry,
102
110
  });
@@ -115,12 +123,12 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
115
123
  }
116
124
  unitType = "complete-slice";
117
125
  unitId = `${mid}/${sid}`;
118
- prompt = await buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, base);
126
+ prompt = await buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, dispatchBase);
119
127
  }
120
128
  else {
121
129
  unitType = "complete-milestone";
122
130
  unitId = mid;
123
- prompt = await buildCompleteMilestonePrompt(mid, midTitle, base);
131
+ prompt = await buildCompleteMilestonePrompt(mid, midTitle, dispatchBase);
124
132
  }
125
133
  break;
126
134
  }
@@ -133,7 +141,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
133
141
  }
134
142
  if (completedSliceIds.length === 0) {
135
143
  // File-based fallback: parse roadmap checkboxes
136
- const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
144
+ const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
137
145
  if (roadmapPath) {
138
146
  const roadmapContent = await loadFile(roadmapPath);
139
147
  if (roadmapContent) {
@@ -148,7 +156,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
148
156
  const completedSliceId = completedSliceIds[completedSliceIds.length - 1];
149
157
  unitType = "reassess-roadmap";
150
158
  unitId = `${mid}/${completedSliceId}`;
151
- prompt = await buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base);
159
+ prompt = await buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, dispatchBase);
152
160
  break;
153
161
  }
154
162
  case "uat":
@@ -163,7 +171,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
163
171
  }
164
172
  if (uatCompletedSliceIds.length === 0) {
165
173
  // File-based fallback: parse roadmap checkboxes
166
- const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
174
+ const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
167
175
  if (roadmapPath) {
168
176
  const roadmapContent = await loadFile(roadmapPath);
169
177
  if (roadmapContent) {
@@ -176,7 +184,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
176
184
  return;
177
185
  }
178
186
  const sid = uatCompletedSliceIds[uatCompletedSliceIds.length - 1];
179
- const uatFile = resolveSliceFile(base, mid, sid, "UAT");
187
+ const uatFile = resolveSliceFile(dispatchBase, mid, sid, "UAT");
180
188
  if (!uatFile) {
181
189
  ctx.ui.notify("Cannot dispatch run-uat: no UAT file found.", "warning");
182
190
  return;
@@ -186,10 +194,10 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
186
194
  ctx.ui.notify("Cannot dispatch run-uat: UAT file is empty.", "warning");
187
195
  return;
188
196
  }
189
- const uatPath = relSliceFile(base, mid, sid, "UAT");
197
+ const uatPath = relSliceFile(dispatchBase, mid, sid, "UAT");
190
198
  unitType = "run-uat";
191
199
  unitId = `${mid}/${sid}`;
192
- prompt = await buildRunUatPrompt(mid, sid, uatPath, uatContent, base);
200
+ prompt = await buildRunUatPrompt(mid, sid, uatPath, uatContent, dispatchBase);
193
201
  break;
194
202
  }
195
203
  case "replan":
@@ -202,7 +210,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
202
210
  }
203
211
  unitType = "replan-slice";
204
212
  unitId = `${mid}/${sid}`;
205
- prompt = await buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base);
213
+ prompt = await buildReplanSlicePrompt(mid, midTitle, sid, sTitle, dispatchBase);
206
214
  break;
207
215
  }
208
216
  default:
@@ -210,7 +218,7 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
210
218
  return;
211
219
  }
212
220
  const compatibilityError = getWorkflowTransportSupportError(ctx.model?.provider, getRequiredWorkflowToolsForAutoUnit(unitType), {
213
- projectRoot: base,
221
+ projectRoot,
214
222
  surface: "direct phase dispatch",
215
223
  unitType,
216
224
  authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
@@ -221,10 +229,36 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
221
229
  return;
222
230
  }
223
231
  ctx.ui.notify(`Dispatching ${unitType} for ${unitId}...`, "info");
224
- const result = await ctx.newSession();
225
- if (result.cancelled) {
226
- ctx.ui.notify("Session creation cancelled.", "warning");
227
- return;
232
+ const originalCwd = process.cwd();
233
+ try {
234
+ // Ensure cwd matches dispatchBase BEFORE newSession() captures it. Synchronous —
235
+ // no awaits between chdir and newSession.
236
+ try {
237
+ if (process.cwd() !== dispatchBase) {
238
+ process.chdir(dispatchBase);
239
+ }
240
+ }
241
+ catch (err) {
242
+ const msg = `Failed to chdir before direct-dispatch newSession (basePath: ${dispatchBase}): ${err instanceof Error ? err.message : String(err)}`;
243
+ logWarning("engine", msg, { file: "auto-direct-dispatch.ts", basePath: dispatchBase, error: err instanceof Error ? err.message : String(err) });
244
+ ctx.ui.notify(`${msg}. Cancelling dispatch to avoid running in the wrong directory.`, "error");
245
+ return;
246
+ }
247
+ const result = await ctx.newSession();
248
+ if (result.cancelled) {
249
+ ctx.ui.notify("Session creation cancelled.", "warning");
250
+ return;
251
+ }
252
+ pi.sendMessage({ customType: "gsd-dispatch", content: prompt, display: false }, { triggerTurn: true });
253
+ }
254
+ finally {
255
+ try {
256
+ if (process.cwd() !== originalCwd) {
257
+ process.chdir(originalCwd);
258
+ }
259
+ }
260
+ catch (err) {
261
+ logWarning("engine", `Failed to restore cwd after direct dispatch: ${err instanceof Error ? err.message : String(err)}`, { file: "auto-direct-dispatch.ts", basePath: originalCwd });
262
+ }
228
263
  }
229
- pi.sendMessage({ customType: "gsd-dispatch", content: prompt, display: false }, { triggerTurn: true });
230
264
  }