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
@@ -26,6 +26,7 @@ import {
26
26
  import { detectStuck } from "./detect-stuck.js";
27
27
  import { runUnit } from "./run-unit.js";
28
28
  import { debugLog } from "../debug-logger.js";
29
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
29
30
  import { PROJECT_FILES, hasProjectFileInAncestor } from "../detection.js";
30
31
  import { MergeConflictError } from "../git-service.js";
31
32
  import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
@@ -81,11 +82,7 @@ export function resetSessionTimeoutState(): void {
81
82
  * Exported for testing as _resolveReportBasePath.
82
83
  */
83
84
  export function _resolveReportBasePath(s: Pick<AutoSession, "originalBasePath" | "basePath">): string {
84
- // Strip /.gsd/worktrees/ suffix when basePath is itself a worktree path and
85
- // originalBasePath is falsy — prevents reports landing in the worktree (#3729).
86
- const resolved = s.originalBasePath || s.basePath;
87
- const markerIdx = resolved.indexOf("/.gsd/worktrees/");
88
- return markerIdx !== -1 ? resolved.slice(0, markerIdx) : resolved;
85
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
89
86
  }
90
87
 
91
88
  /**
@@ -96,12 +93,7 @@ export function _resolveReportBasePath(s: Pick<AutoSession, "originalBasePath" |
96
93
  export function _resolveDispatchGuardBasePath(
97
94
  s: Pick<AutoSession, "originalBasePath" | "basePath">,
98
95
  ): string {
99
- // Strip /.gsd/worktrees/ suffix when basePath is itself a worktree path and
100
- // originalBasePath is falsy — prevents guard checks running against the
101
- // worktree instead of the project root (#3729).
102
- const resolved = s.originalBasePath || s.basePath;
103
- const markerIdx = resolved.indexOf("/.gsd/worktrees/");
104
- return markerIdx !== -1 ? resolved.slice(0, markerIdx) : resolved;
96
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
105
97
  }
106
98
 
107
99
  const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
@@ -1342,7 +1334,7 @@ export async function runUnitPhase(
1342
1334
  iterData: IterationData,
1343
1335
  loopState: LoopState,
1344
1336
  sidecarItem?: SidecarItem,
1345
- ): Promise<PhaseResult<{ unitStartedAt: number }>> {
1337
+ ): Promise<PhaseResult<{ unitStartedAt?: number; requestDispatchedAt?: number }>> {
1346
1338
  const { ctx, pi, s, deps, prefs } = ic;
1347
1339
  const { unitType, unitId, prompt, state, mid } = iterData;
1348
1340
 
@@ -1860,7 +1852,7 @@ export async function runUnitPhase(
1860
1852
  );
1861
1853
  // Fall through to next iteration where dispatch will re-derive
1862
1854
  // and re-dispatch this unit.
1863
- return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
1855
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
1864
1856
  }
1865
1857
  }
1866
1858
  }
@@ -1924,7 +1916,7 @@ export async function runUnitPhase(
1924
1916
  s.checkpointSha = null;
1925
1917
  }
1926
1918
 
1927
- return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
1919
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
1928
1920
  }
1929
1921
 
1930
1922
  // ─── runFinalize ──────────────────────────────────────────────────────────────
@@ -171,6 +171,7 @@ export async function runUnit(
171
171
  // ── Send the prompt ──
172
172
  debugLog("runUnit", { phase: "send-message", unitType, unitId });
173
173
 
174
+ const requestDispatchedAt = Date.now();
174
175
  pi.sendMessage(
175
176
  { customType: "gsd-auto", content: prompt, display: s.verbose },
176
177
  { triggerTurn: true },
@@ -201,6 +202,7 @@ export async function runUnit(
201
202
  unitId,
202
203
  status: result.status,
203
204
  });
205
+ const finalResult: UnitResult = { ...result, requestDispatchedAt };
204
206
 
205
207
  // Discard trailing follow-up messages (e.g. async_job_result notifications)
206
208
  // from the completed unit. Without this, queued follow-ups trigger wasteful
@@ -216,5 +218,5 @@ export async function runUnit(
216
218
  logWarning("engine", "clearQueue failed after unit completion", { error: String(e) });
217
219
  }
218
220
 
219
- return result;
221
+ return finalResult;
220
222
  }
@@ -21,6 +21,7 @@ import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent
21
21
  import type { GitServiceImpl } from "../git-service.js";
22
22
  import type { CaptureEntry } from "../captures.js";
23
23
  import type { BudgetAlertLevel } from "../auto-budget.js";
24
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
24
25
 
25
26
  // ─── Exported Types ──────────────────────────────────────────────────────────
26
27
 
@@ -193,6 +194,8 @@ export class AutoSession {
193
194
  lastPromptCharCount: number | undefined;
194
195
  lastBaselineCharCount: number | undefined;
195
196
  pendingQuickTasks: CaptureEntry[] = [];
197
+ /** Timestamp of the last LLM request dispatch (ms since epoch). Used for proactive rate limiting. */
198
+ lastRequestTimestamp = 0;
196
199
 
197
200
  // ── Safety harness ───────────────────────────────────────────────────────
198
201
  /** SHA of the pre-unit git checkpoint ref. Cleared on success or rollback. */
@@ -224,12 +227,7 @@ export class AutoSession {
224
227
  }
225
228
 
226
229
  get lockBasePath(): string {
227
- // Prefer originalBasePath (project root); fall back to basePath.
228
- // Strip /.gsd/worktrees/ suffix if basePath is itself a worktree path
229
- // to avoid reading/writing the lock inside the worktree (#3729).
230
- const resolved = this.originalBasePath || this.basePath;
231
- const markerIdx = resolved.indexOf("/.gsd/worktrees/");
232
- return markerIdx !== -1 ? resolved.slice(0, markerIdx) : resolved;
230
+ return resolveWorktreeProjectRoot(this.basePath, this.originalBasePath);
233
231
  }
234
232
 
235
233
  reset(): void {
@@ -294,6 +292,7 @@ export class AutoSession {
294
292
  this.lastPromptCharCount = undefined;
295
293
  this.lastBaselineCharCount = undefined;
296
294
  this.pendingQuickTasks = [];
295
+ this.lastRequestTimestamp = 0;
297
296
  this.sidecarQueue = [];
298
297
  this.rewriteAttemptCount = 0;
299
298
  this.consecutiveCompleteBootstraps = 0;
@@ -66,6 +66,7 @@ export interface UnitResult {
66
66
  status: "completed" | "cancelled" | "error";
67
67
  event?: AgentEndEvent;
68
68
  errorContext?: ErrorContext;
69
+ requestDispatchedAt?: number;
69
70
  }
70
71
 
71
72
  // ─── Phase pipeline types ────────────────────────────────────────────────────
@@ -19,6 +19,7 @@ import { getActiveHook } from "./post-unit-hooks.js";
19
19
  import { getLedger, getProjectTotals } from "./metrics.js";
20
20
  import { getErrorMessage } from "./error-utils.js";
21
21
  import { nativeIsRepo } from "./native-git-bridge.js";
22
+ import { getHomeDir } from "./home-dir.js";
22
23
  import {
23
24
  resolveMilestoneFile,
24
25
  resolveSliceFile,
@@ -582,8 +583,8 @@ export function updateProgressWidget(
582
583
  let widgetPwd: string;
583
584
  {
584
585
  let fullPwd = process.cwd();
585
- const widgetHome = process.env.HOME || process.env.USERPROFILE;
586
- if (widgetHome && fullPwd.startsWith(widgetHome)) {
586
+ const widgetHome = getHomeDir();
587
+ if (widgetHome && (fullPwd === widgetHome || fullPwd.startsWith(widgetHome + "/") || fullPwd.startsWith(widgetHome + "\\"))) {
587
588
  fullPwd = `~${fullPwd.slice(widgetHome.length)}`;
588
589
  }
589
590
  const parts = fullPwd.split("/");
@@ -797,14 +797,25 @@ export const DISPATCH_RULES: DispatchRule[] = [
797
797
  if (state.phase !== "executing" || !state.activeTask) return null;
798
798
  if (!state.activeSlice) return null; // fall through
799
799
 
800
- // Only activate when reactive_execution is explicitly enabled
800
+ // Reactive dispatch is on by default when there are enough ready tasks to
801
+ // benefit from parallelism. Users opt out explicitly via
802
+ // `reactive_execution.enabled: false`. The downstream safety checks
803
+ // (graph ambiguity, ready-task count, conflict-free selection) still gate
804
+ // every actual dispatch, so the worst-case "default-on" outcome is the
805
+ // same fall-through to sequential execution as before.
801
806
  const reactiveConfig = prefs?.reactive_execution;
802
- if (!reactiveConfig?.enabled) return null;
807
+ if (reactiveConfig?.enabled === false) return null;
803
808
 
804
809
  const sid = state.activeSlice.id;
805
810
  const sTitle = state.activeSlice.title;
806
- const maxParallel = reactiveConfig.max_parallel ?? 2;
807
- const subagentModel = reactiveConfig.subagent_model ?? resolveModelWithFallbacksForUnit("subagent")?.primary;
811
+ const maxParallel = reactiveConfig?.max_parallel ?? 2;
812
+ const subagentModel = reactiveConfig?.subagent_model ?? resolveModelWithFallbacksForUnit("subagent")?.primary;
813
+ // Default-on safety threshold: only activate reactive dispatch when at
814
+ // least N tasks are ready. Users who explicitly enabled reactive_execution
815
+ // keep the legacy threshold of 2 (matches the prior "any parallelism is
816
+ // better than none" intent). Default-on installs require >=3 to avoid
817
+ // surprising users with parallelism on small slices.
818
+ const minReadyTasksForReactive = reactiveConfig?.enabled === true ? 2 : 3;
808
819
 
809
820
  // Dry-run mode: max_parallel=1 means graph is derived and logged but
810
821
  // execution remains sequential
@@ -831,8 +842,9 @@ export const DISPATCH_RULES: DispatchRule[] = [
831
842
  const completed = new Set(graph.filter((n) => n.done).map((n) => n.id));
832
843
  const readyIds = getReadyTasks(graph, completed, new Set());
833
844
 
834
- // Only activate reactive dispatch when >1 task is ready
835
- if (readyIds.length <= 1) return null;
845
+ // Only activate reactive dispatch when enough tasks are ready.
846
+ // Threshold is 2 when explicitly opted in, 3 when default-on.
847
+ if (readyIds.length < minReadyTasksForReactive) return null;
836
848
 
837
849
  const uokFlags = resolveUokFlags(prefs);
838
850
  const selected = uokFlags.executionGraph
@@ -37,7 +37,7 @@ import { composeInlinedContext, type ArtifactResolver } from "./unit-context-com
37
37
  import { logWarning } from "./workflow-logger.js";
38
38
  import { inlineGraphSubgraph } from "./graph-context.js";
39
39
  import { buildExtractionStepsBlock } from "./commands-extract-learnings.js";
40
- import { warnIfManifestHasMissingSkills } from "./skill-manifest.js";
40
+ import { resolveSkillManifest, warnIfManifestHasMissingSkills } from "./skill-manifest.js";
41
41
 
42
42
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
43
43
 
@@ -776,6 +776,25 @@ function formatSkillActivationBlock(skillNames: string[]): string {
776
776
  return `<skill_activation>${calls}.</skill_activation>`;
777
777
  }
778
778
 
779
+ /**
780
+ * Manifest-driven recommendations block — informational only, does NOT
781
+ * auto-invoke. Lists per-unit-type skills that are installed but not already
782
+ * activated by explicit user intent (always_use_skills / prefer_skills /
783
+ * skill_rules / task-plan skills_used). Surfaces relevant skills to the
784
+ * model so they can be invoked when the model judges them useful.
785
+ *
786
+ * This is the additive complement to the existing activation directive:
787
+ * activation force-invokes (explicit intent), recommendations remind
788
+ * (manifest defaults). User intent is preserved as the stronger signal
789
+ * (RFC #4779 design principle); this block only adds visibility.
790
+ */
791
+ function formatSkillRecommendationsBlock(unitType: string | undefined, skillNames: string[]): string {
792
+ if (!unitType) return "";
793
+ const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
794
+ if (safe.length === 0) return "";
795
+ return `<skill_recommendations unit="${unitType}">For this unit type, also consider invoking: ${safe.join(", ")}. Use Skill({ skill: 'name' }) when relevant — these are recommendations, not requirements.</skill_recommendations>`;
796
+ }
797
+
779
798
  export function buildSkillActivationBlock(params: {
780
799
  base: string;
781
800
  milestoneId: string;
@@ -846,10 +865,49 @@ export function buildSkillActivationBlock(params: {
846
865
  }
847
866
  }
848
867
 
868
+ // Heuristic auto-match (gated on skill_discovery: "auto").
869
+ // For each installed skill, check if its name or description appears in the
870
+ // unit's context tokens (milestone/slice/task titles). Only consider skills
871
+ // already on the unit-type manifest allowlist — this keeps the heuristic
872
+ // narrow and avoids wildly off-topic activations.
873
+ // Users who set `skill_discovery: "off"` or "suggest" do not get
874
+ // auto-matched skills (the recommendations block still surfaces manifest
875
+ // skills passively); only "auto" actually adds them to the activation
876
+ // directive set. Default `skill_discovery` is "suggest", so this is opt-in.
877
+ if ((prefs?.skill_discovery ?? "suggest") === "auto") {
878
+ const manifestAllow = resolveSkillManifest(params.unitType);
879
+ const allowSet = manifestAllow ? new Set(manifestAllow) : null;
880
+ for (const skill of visibleSkills) {
881
+ const normalized = normalizeSkillReference(skill.name);
882
+ if (matched.has(normalized) || avoided.has(normalized)) continue;
883
+ // Respect the manifest allowlist when present; wildcard (null) lets all
884
+ // installed skills compete for keyword match.
885
+ if (allowSet && !allowSet.has(normalized)) continue;
886
+ if (skillMatchesContext(skill, contextTokens)) {
887
+ matched.add(normalized);
888
+ }
889
+ }
890
+ }
891
+
849
892
  const ordered = [...matched]
850
893
  .filter(name => installedNames.has(name) && !avoided.has(name))
851
894
  .sort();
852
- return formatSkillActivationBlock(ordered);
895
+ const activationBlock = formatSkillActivationBlock(ordered);
896
+
897
+ // Manifest-driven recommendations (additive, does not override explicit intent).
898
+ // Only surface skills the manifest declares for this unit type that are
899
+ // installed and not already in matched/avoided.
900
+ const matchedSet = new Set(ordered);
901
+ const manifestList = resolveSkillManifest(params.unitType);
902
+ const recommendations = (manifestList ?? [])
903
+ .filter(name => installedNames.has(name) && !avoided.has(name) && !matchedSet.has(name))
904
+ .sort();
905
+ const recommendationsBlock = formatSkillRecommendationsBlock(params.unitType, recommendations);
906
+
907
+ if (!activationBlock && !recommendationsBlock) return "";
908
+ if (!activationBlock) return recommendationsBlock;
909
+ if (!recommendationsBlock) return activationBlock;
910
+ return `${activationBlock}\n${recommendationsBlock}`;
853
911
  }
854
912
 
855
913
  /**
@@ -9,6 +9,7 @@
9
9
 
10
10
  import type { ExtensionContext } from "@gsd/pi-coding-agent";
11
11
  import { parseUnitId } from "./unit-id.js";
12
+ import { MILESTONE_ID_RE } from "./milestone-ids.js";
12
13
  import { appendEvent } from "./workflow-events.js";
13
14
  import { atomicWriteSync } from "./atomic-write.js";
14
15
  import { clearParseCache } from "./files.js";
@@ -213,13 +214,40 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): { o
213
214
  function getChangedFilesFromMilestoneTaggedCommits(
214
215
  basePath: string,
215
216
  milestoneId: string,
217
+ ): { ok: boolean; matched: boolean; files: string[] } {
218
+ // Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
219
+ // by depth when .gsd/ is tracked in git.
220
+ const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
221
+ "log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
222
+ ]);
223
+ if (!scoped.ok) return scoped;
224
+ if (scoped.matched) return scoped;
225
+
226
+ // Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
227
+ // path-scoped scan matches no commits even though GSD-tagged commits
228
+ // referencing the milestone exist on the integration branch. Re-scan all
229
+ // of HEAD's history and rely on commitMatchesMilestone to bind by
230
+ // explicit milestone mention in the message body.
231
+ //
232
+ // Intentionally unbounded — symmetric with the primary scan, and avoids
233
+ // reintroducing the rolling-depth failure class removed in #4699 where
234
+ // milestone evidence aged out behind unrelated activity.
235
+ return scanGsdTaggedCommits(basePath, milestoneId, [
236
+ "log", "--format=%H%x1f%B%x1e", "HEAD",
237
+ ]);
238
+ }
239
+
240
+ function scanGsdTaggedCommits(
241
+ basePath: string,
242
+ milestoneId: string,
243
+ gitArgs: readonly string[],
216
244
  ): { ok: boolean; matched: boolean; files: string[] } {
217
245
  try {
218
- const logOutput = execFileSync(
219
- "git",
220
- ["log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`],
221
- { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
222
- );
246
+ const logOutput = execFileSync("git", [...gitArgs], {
247
+ cwd: basePath,
248
+ stdio: ["ignore", "pipe", "pipe"],
249
+ encoding: "utf-8",
250
+ });
223
251
  const records = logOutput
224
252
  .split("\x1e")
225
253
  .map((record) => record.trim())
@@ -270,15 +298,25 @@ function commitMatchesMilestone(message: string, milestoneId: string, files: rea
270
298
  if (commitTrailerStartsWithMilestone(message, milestoneId)) return true;
271
299
 
272
300
  // Meaningful execute-task commits currently store task scope as Sxx/Tyy
273
- // rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone only
274
- // when the commit also touched this milestone's artifacts.
301
+ // rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone when
302
+ // either the commit touched this milestone's artifacts, or — for projects
303
+ // where .gsd/ is gitignored/external (#5033) — the message explicitly
304
+ // names the milestone.
275
305
  if (/^GSD-Task:\s*S[^/\s]+\/T\S+/m.test(message)) {
276
- return files.some((file) => isMilestoneArtifactPath(file, milestoneId));
306
+ if (files.some((file) => isMilestoneArtifactPath(file, milestoneId))) return true;
307
+ if (commitMessageMentionsMilestone(message, milestoneId)) return true;
277
308
  }
278
309
 
279
310
  return false;
280
311
  }
281
312
 
313
+ function commitMessageMentionsMilestone(message: string, milestoneId: string): boolean {
314
+ if (!MILESTONE_ID_RE.test(milestoneId)) return false;
315
+
316
+ const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
317
+ return new RegExp(`\\b${escapedMilestone}\\b`).test(message);
318
+ }
319
+
282
320
  function commitTrailerStartsWithMilestone(message: string, milestoneId: string): boolean {
283
321
  const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
284
322
  const trailerPattern = new RegExp(
@@ -0,0 +1,51 @@
1
+ // GSD auto-mode runtime state
2
+ import { AutoSession } from "./auto/session.js";
3
+ import type { CurrentUnit } from "./auto/session.js";
4
+ import {
5
+ isDeterministicPolicyError,
6
+ isQueuedUserMessageSkip,
7
+ isToolInvocationError,
8
+ markToolEnd as markTrackedToolEnd,
9
+ markToolStart as markTrackedToolStart,
10
+ } from "./auto-tool-tracking.js";
11
+
12
+ export const autoSession = new AutoSession();
13
+
14
+ export type AutoRuntimeSnapshot = {
15
+ active: boolean;
16
+ paused: boolean;
17
+ currentUnit: CurrentUnit | null;
18
+ basePath: string;
19
+ };
20
+
21
+ export function getAutoRuntimeSnapshot(): AutoRuntimeSnapshot {
22
+ return {
23
+ active: autoSession.active,
24
+ paused: autoSession.paused,
25
+ currentUnit: autoSession.currentUnit ? { ...autoSession.currentUnit } : null,
26
+ basePath: autoSession.basePath,
27
+ };
28
+ }
29
+
30
+ export function isAutoActive(): boolean {
31
+ return autoSession.active;
32
+ }
33
+
34
+ export function isAutoPaused(): boolean {
35
+ return autoSession.paused;
36
+ }
37
+
38
+ export function markToolStart(toolCallId: string, toolName?: string): void {
39
+ markTrackedToolStart(toolCallId, autoSession.active, toolName);
40
+ }
41
+
42
+ export function markToolEnd(toolCallId: string): void {
43
+ markTrackedToolEnd(toolCallId);
44
+ }
45
+
46
+ export function recordToolInvocationError(toolName: string, errorMsg: string): void {
47
+ if (!autoSession.active) return;
48
+ if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg) || isDeterministicPolicyError(errorMsg)) {
49
+ autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
50
+ }
51
+ }
@@ -315,7 +315,7 @@ export function auditOrphanedMilestoneBranches(
315
315
  // Branch is NOT merged — preserve for safety, warn the user
316
316
  warnings.push(
317
317
  `Branch ${branch} exists for completed milestone ${milestoneId} but is NOT merged into ${mainBranch}. ` +
318
- `This may contain unmerged work. Merge manually or run \`/gsd health --fix\` to resolve.`,
318
+ `This may contain unmerged work. Merge manually or run \`/gsd doctor fix\` to resolve.`,
319
319
  );
320
320
 
321
321
  // #4764 telemetry
@@ -151,8 +151,6 @@ export const DETERMINISTIC_POLICY_ERROR_STRINGS = [
151
151
  */
152
152
  export function isDeterministicPolicyError(errorMsg: string): boolean {
153
153
  if (!errorMsg) return false;
154
- return (
155
- DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg) ||
156
- DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s))
157
- );
154
+ return DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg)
155
+ || DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s));
158
156
  }
@@ -46,6 +46,11 @@ import {
46
46
  resolveGitHeadPath,
47
47
  nudgeGitBranchCache,
48
48
  } from "./worktree.js";
49
+ import {
50
+ isGsdWorktreePath,
51
+ normalizeWorktreePathForCompare,
52
+ resolveWorktreeProjectRoot,
53
+ } from "./worktree-root.js";
49
54
  import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
50
55
  import { debugLog } from "./debug-logger.js";
51
56
  import { logWarning, logError } from "./workflow-logger.js";
@@ -990,6 +995,12 @@ export function autoWorktreeBranch(milestoneId: string): string {
990
995
  return `milestone/${milestoneId}`;
991
996
  }
992
997
 
998
+ function normalizeLocalBranchRef(branch: string): string {
999
+ return branch.startsWith("refs/heads/")
1000
+ ? branch.slice("refs/heads/".length)
1001
+ : branch;
1002
+ }
1003
+
993
1004
  // ─── Branch-mode Entry ─────────────────────────────────────────────────────
994
1005
 
995
1006
  /**
@@ -1196,6 +1207,18 @@ export function createAutoWorktree(
1196
1207
  basePath: string,
1197
1208
  milestoneId: string,
1198
1209
  ): string {
1210
+ basePath = resolveWorktreeProjectRoot(basePath);
1211
+
1212
+ // Check if repo has commits — git worktree requires a valid HEAD
1213
+ try {
1214
+ execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
1215
+ } catch {
1216
+ throw new GSDError(
1217
+ GSD_GIT_ERROR,
1218
+ `Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`,
1219
+ );
1220
+ }
1221
+
1199
1222
  const branch = autoWorktreeBranch(milestoneId);
1200
1223
 
1201
1224
  // Check if the milestone branch already exists — it survives auto-mode
@@ -1345,6 +1368,8 @@ export function teardownAutoWorktree(
1345
1368
  milestoneId: string,
1346
1369
  opts: { preserveBranch?: boolean } = {},
1347
1370
  ): void {
1371
+ originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
1372
+
1348
1373
  const branch = autoWorktreeBranch(milestoneId);
1349
1374
  const { preserveBranch = false } = opts;
1350
1375
  const previousCwd = process.cwd();
@@ -1396,16 +1421,28 @@ export function teardownAutoWorktree(
1396
1421
 
1397
1422
  /**
1398
1423
  * Detect if the process is currently inside an auto-worktree.
1399
- * Checks both module state and git branch prefix.
1424
+ * Uses the current directory structure plus git branch prefix so detection
1425
+ * still works after process restart when module state has been reset.
1400
1426
  */
1401
1427
  export function isInAutoWorktree(basePath: string): boolean {
1402
- if (!originalBase) return false;
1403
1428
  const cwd = process.cwd();
1404
- const resolvedBase = existsSync(basePath) ? realpathSync(basePath) : basePath;
1405
- const wtDir = join(resolvedBase, ".gsd", "worktrees");
1406
- if (!cwd.startsWith(wtDir)) return false;
1407
- const branch = nativeGetCurrentBranch(cwd);
1408
- return branch.startsWith("milestone/");
1429
+ if (!isGsdWorktreePath(cwd)) return false;
1430
+
1431
+ const projectRoot = resolveWorktreeProjectRoot(basePath, originalBase);
1432
+ const cwdProjectRoot = resolveWorktreeProjectRoot(cwd, originalBase);
1433
+ if (
1434
+ normalizeWorktreePathForCompare(projectRoot) !==
1435
+ normalizeWorktreePathForCompare(cwdProjectRoot)
1436
+ ) {
1437
+ return false;
1438
+ }
1439
+
1440
+ try {
1441
+ const branch = nativeGetCurrentBranch(cwd);
1442
+ return branch.startsWith("milestone/");
1443
+ } catch {
1444
+ return false;
1445
+ }
1409
1446
  }
1410
1447
 
1411
1448
  /**
@@ -1420,6 +1457,8 @@ export function getAutoWorktreePath(
1420
1457
  basePath: string,
1421
1458
  milestoneId: string,
1422
1459
  ): string | null {
1460
+ basePath = resolveWorktreeProjectRoot(basePath);
1461
+
1423
1462
  const p = worktreePath(basePath, milestoneId);
1424
1463
  if (!existsSync(p)) return null;
1425
1464
 
@@ -1448,6 +1487,8 @@ export function enterAutoWorktree(
1448
1487
  basePath: string,
1449
1488
  milestoneId: string,
1450
1489
  ): string {
1490
+ basePath = resolveWorktreeProjectRoot(basePath);
1491
+
1451
1492
  const p = worktreePath(basePath, milestoneId);
1452
1493
  if (!existsSync(p)) {
1453
1494
  throw new GSDError(
@@ -1504,6 +1545,10 @@ export function getAutoWorktreeOriginalBase(): string | null {
1504
1545
  return originalBase;
1505
1546
  }
1506
1547
 
1548
+ export function _resetAutoWorktreeOriginalBaseForTests(): void {
1549
+ originalBase = null;
1550
+ }
1551
+
1507
1552
  export function getActiveAutoWorktreeContext(): {
1508
1553
  originalBase: string;
1509
1554
  worktreeName: string;
@@ -1511,11 +1556,14 @@ export function getActiveAutoWorktreeContext(): {
1511
1556
  } | null {
1512
1557
  if (!originalBase) return null;
1513
1558
  const cwd = process.cwd();
1514
- const resolvedBase = existsSync(originalBase)
1515
- ? realpathSync(originalBase)
1516
- : originalBase;
1517
- const wtDir = join(resolvedBase, ".gsd", "worktrees");
1518
- if (!cwd.startsWith(wtDir)) return null;
1559
+ if (!isGsdWorktreePath(cwd)) return null;
1560
+ const cwdProjectRoot = resolveWorktreeProjectRoot(cwd, originalBase);
1561
+ if (
1562
+ normalizeWorktreePathForCompare(cwdProjectRoot) !==
1563
+ normalizeWorktreePathForCompare(originalBase)
1564
+ ) {
1565
+ return null;
1566
+ }
1519
1567
  const worktreeName = detectWorktreeName(cwd);
1520
1568
  if (!worktreeName) return null;
1521
1569
  const branch = nativeGetCurrentBranch(cwd);
@@ -1636,6 +1684,10 @@ export function mergeMilestoneToMain(
1636
1684
  }
1637
1685
 
1638
1686
  // 3. chdir to original base
1687
+ // Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
1688
+ // entering the function. Subsequent throws restore to previousCwd, leaving
1689
+ // the caller in worktree-cwd; callers (worktree-resolver) are responsible
1690
+ // for any further cwd movement on the error path.
1639
1691
  const previousCwd = process.cwd();
1640
1692
  process.chdir(originalBasePath_);
1641
1693
 
@@ -1656,6 +1708,24 @@ export function mergeMilestoneToMain(
1656
1708
  const mainBranch =
1657
1709
  integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
1658
1710
 
1711
+ // Fail closed when the resolved integration branch is the milestone branch
1712
+ // itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
1713
+ // as "milestone/<MID>") would otherwise let the squash merge resolve to a
1714
+ // self-merge: nothing-to-commit + empty self-diff in the post-merge safety
1715
+ // check (#1792) collapse to a false success, and the worktree-resolver
1716
+ // emits worktree-merged for work that never landed on a distinct
1717
+ // integration branch.
1718
+ if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
1719
+ process.chdir(previousCwd);
1720
+ throw new GSDError(
1721
+ GSD_GIT_ERROR,
1722
+ `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
1723
+ `"${milestoneBranch}" — refusing to self-merge. Integration branch metadata is invalid; ` +
1724
+ `set a distinct main_branch in GSD preferences or repair the milestone integration record ` +
1725
+ `before retrying milestone completion.`,
1726
+ );
1727
+ }
1728
+
1659
1729
  // Remove transient project-root state files before any branch or merge
1660
1730
  // operation. Untracked milestone metadata can otherwise block squash merges.
1661
1731
  clearProjectRootStateFiles(originalBasePath_, milestoneId);