gsd-pi 2.78.0 → 2.78.1-dev.0fdacd524

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 (574) 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 +60 -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 +4 -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 +14 -14
  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 +14 -14
  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 +82 -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/steer-worktree-path.test.ts +17 -1
  509. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
  510. package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
  511. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
  512. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
  513. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
  514. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
  515. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  516. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +235 -0
  517. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
  518. package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
  519. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
  520. package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
  521. package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
  522. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  523. package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
  524. package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
  525. package/src/resources/extensions/gsd/worktree-command.ts +31 -44
  526. package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
  527. package/src/resources/extensions/gsd/worktree-resolver.ts +4 -14
  528. package/src/resources/extensions/gsd/worktree-root.ts +144 -0
  529. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  530. package/src/resources/extensions/gsd/worktree.ts +8 -119
  531. package/src/resources/extensions/mcp-client/index.ts +6 -10
  532. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  533. package/src/resources/extensions/ollama/index.ts +16 -2
  534. package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
  535. package/src/resources/extensions/ollama/ollama-client.ts +41 -4
  536. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
  537. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  538. package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
  539. package/src/resources/extensions/subagent/index.ts +165 -7
  540. package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
  541. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  542. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  543. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  544. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  545. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  546. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  547. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  548. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  549. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  550. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
  551. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  552. package/src/resources/skills/lint/SKILL.md +4 -0
  553. package/src/resources/skills/review/SKILL.md +4 -0
  554. package/src/resources/skills/test/SKILL.md +3 -0
  555. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
  556. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
  557. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
  558. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  559. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  560. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  561. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  562. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  563. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
  564. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
  565. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
  566. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  567. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  569. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
  570. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
  571. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
  572. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
  573. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → 4iu6IYeYfxOq8OidlDqp6}/_buildManifest.js +0 -0
  574. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → 4iu6IYeYfxOq8OidlDqp6}/_ssgManifest.js +0 -0
@@ -655,14 +655,25 @@ export const DISPATCH_RULES = [
655
655
  return null;
656
656
  if (!state.activeSlice)
657
657
  return null; // fall through
658
- // Only activate when reactive_execution is explicitly enabled
658
+ // Reactive dispatch is on by default when there are enough ready tasks to
659
+ // benefit from parallelism. Users opt out explicitly via
660
+ // `reactive_execution.enabled: false`. The downstream safety checks
661
+ // (graph ambiguity, ready-task count, conflict-free selection) still gate
662
+ // every actual dispatch, so the worst-case "default-on" outcome is the
663
+ // same fall-through to sequential execution as before.
659
664
  const reactiveConfig = prefs?.reactive_execution;
660
- if (!reactiveConfig?.enabled)
665
+ if (reactiveConfig?.enabled === false)
661
666
  return null;
662
667
  const sid = state.activeSlice.id;
663
668
  const sTitle = state.activeSlice.title;
664
- const maxParallel = reactiveConfig.max_parallel ?? 2;
665
- const subagentModel = reactiveConfig.subagent_model ?? resolveModelWithFallbacksForUnit("subagent")?.primary;
669
+ const maxParallel = reactiveConfig?.max_parallel ?? 2;
670
+ const subagentModel = reactiveConfig?.subagent_model ?? resolveModelWithFallbacksForUnit("subagent")?.primary;
671
+ // Default-on safety threshold: only activate reactive dispatch when at
672
+ // least N tasks are ready. Users who explicitly enabled reactive_execution
673
+ // keep the legacy threshold of 2 (matches the prior "any parallelism is
674
+ // better than none" intent). Default-on installs require >=3 to avoid
675
+ // surprising users with parallelism on small slices.
676
+ const minReadyTasksForReactive = reactiveConfig?.enabled === true ? 2 : 3;
666
677
  // Dry-run mode: max_parallel=1 means graph is derived and logged but
667
678
  // execution remains sequential
668
679
  if (maxParallel <= 1)
@@ -678,8 +689,9 @@ export const DISPATCH_RULES = [
678
689
  return null;
679
690
  const completed = new Set(graph.filter((n) => n.done).map((n) => n.id));
680
691
  const readyIds = getReadyTasks(graph, completed, new Set());
681
- // Only activate reactive dispatch when >1 task is ready
682
- if (readyIds.length <= 1)
692
+ // Only activate reactive dispatch when enough tasks are ready.
693
+ // Threshold is 2 when explicitly opted in, 3 when default-on.
694
+ if (readyIds.length < minReadyTasksForReactive)
683
695
  return null;
684
696
  const uokFlags = resolveUokFlags(prefs);
685
697
  const selected = uokFlags.executionGraph
@@ -23,7 +23,7 @@ import { composeInlinedContext } from "./unit-context-composer.js";
23
23
  import { logWarning } from "./workflow-logger.js";
24
24
  import { inlineGraphSubgraph } from "./graph-context.js";
25
25
  import { buildExtractionStepsBlock } from "./commands-extract-learnings.js";
26
- import { warnIfManifestHasMissingSkills } from "./skill-manifest.js";
26
+ import { resolveSkillManifest, warnIfManifestHasMissingSkills } from "./skill-manifest.js";
27
27
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
28
28
  /**
29
29
  * Historical static ceiling for the preamble cap. Kept as an upper bound even
@@ -675,6 +675,26 @@ function formatSkillActivationBlock(skillNames) {
675
675
  const calls = safe.map(name => `Call Skill({ skill: '${name}' })`).join('. ');
676
676
  return `<skill_activation>${calls}.</skill_activation>`;
677
677
  }
678
+ /**
679
+ * Manifest-driven recommendations block — informational only, does NOT
680
+ * auto-invoke. Lists per-unit-type skills that are installed but not already
681
+ * activated by explicit user intent (always_use_skills / prefer_skills /
682
+ * skill_rules / task-plan skills_used). Surfaces relevant skills to the
683
+ * model so they can be invoked when the model judges them useful.
684
+ *
685
+ * This is the additive complement to the existing activation directive:
686
+ * activation force-invokes (explicit intent), recommendations remind
687
+ * (manifest defaults). User intent is preserved as the stronger signal
688
+ * (RFC #4779 design principle); this block only adds visibility.
689
+ */
690
+ function formatSkillRecommendationsBlock(unitType, skillNames) {
691
+ if (!unitType)
692
+ return "";
693
+ const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
694
+ if (safe.length === 0)
695
+ return "";
696
+ 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>`;
697
+ }
678
698
  export function buildSkillActivationBlock(params) {
679
699
  const prefs = params.preferences ?? loadEffectiveGSDPreferences(params.base)?.preferences;
680
700
  const contextTokens = tokenizeSkillContext(params.milestoneId, params.milestoneTitle, params.sliceId, params.sliceTitle, params.taskId, params.taskTitle);
@@ -717,10 +737,51 @@ export function buildSkillActivationBlock(params) {
717
737
  logWarning("prompt", `parseTaskPlanFile failed: ${err instanceof Error ? err.message : String(err)}`);
718
738
  }
719
739
  }
740
+ // Heuristic auto-match (gated on skill_discovery: "auto").
741
+ // For each installed skill, check if its name or description appears in the
742
+ // unit's context tokens (milestone/slice/task titles). Only consider skills
743
+ // already on the unit-type manifest allowlist — this keeps the heuristic
744
+ // narrow and avoids wildly off-topic activations.
745
+ // Users who set `skill_discovery: "off"` or "suggest" do not get
746
+ // auto-matched skills (the recommendations block still surfaces manifest
747
+ // skills passively); only "auto" actually adds them to the activation
748
+ // directive set. Default `skill_discovery` is "suggest", so this is opt-in.
749
+ if ((prefs?.skill_discovery ?? "suggest") === "auto") {
750
+ const manifestAllow = resolveSkillManifest(params.unitType);
751
+ const allowSet = manifestAllow ? new Set(manifestAllow) : null;
752
+ for (const skill of visibleSkills) {
753
+ const normalized = normalizeSkillReference(skill.name);
754
+ if (matched.has(normalized) || avoided.has(normalized))
755
+ continue;
756
+ // Respect the manifest allowlist when present; wildcard (null) lets all
757
+ // installed skills compete for keyword match.
758
+ if (allowSet && !allowSet.has(normalized))
759
+ continue;
760
+ if (skillMatchesContext(skill, contextTokens)) {
761
+ matched.add(normalized);
762
+ }
763
+ }
764
+ }
720
765
  const ordered = [...matched]
721
766
  .filter(name => installedNames.has(name) && !avoided.has(name))
722
767
  .sort();
723
- return formatSkillActivationBlock(ordered);
768
+ const activationBlock = formatSkillActivationBlock(ordered);
769
+ // Manifest-driven recommendations (additive, does not override explicit intent).
770
+ // Only surface skills the manifest declares for this unit type that are
771
+ // installed and not already in matched/avoided.
772
+ const matchedSet = new Set(ordered);
773
+ const manifestList = resolveSkillManifest(params.unitType);
774
+ const recommendations = (manifestList ?? [])
775
+ .filter(name => installedNames.has(name) && !avoided.has(name) && !matchedSet.has(name))
776
+ .sort();
777
+ const recommendationsBlock = formatSkillRecommendationsBlock(params.unitType, recommendations);
778
+ if (!activationBlock && !recommendationsBlock)
779
+ return "";
780
+ if (!activationBlock)
781
+ return recommendationsBlock;
782
+ if (!recommendationsBlock)
783
+ return activationBlock;
784
+ return `${activationBlock}\n${recommendationsBlock}`;
724
785
  }
725
786
  /**
726
787
  * Build the skill discovery template variables for research prompts.
@@ -1059,6 +1120,7 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
1059
1120
  export async function buildDiscussMilestonePrompt(mid, midTitle, base, structuredQuestionsAvailable = "false") {
1060
1121
  const discussTemplates = inlineTemplate("context", "Context");
1061
1122
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1123
+ workingDirectory: base,
1062
1124
  milestoneId: mid,
1063
1125
  milestoneTitle: midTitle,
1064
1126
  inlinedTemplates: discussTemplates,
@@ -2262,6 +2324,7 @@ export async function buildParallelResearchSlicesPrompt(mid, midTitle, slices, b
2262
2324
  ].join("\n"));
2263
2325
  }
2264
2326
  return loadPrompt("parallel-research-slices", {
2327
+ workingDirectory: basePath,
2265
2328
  mid,
2266
2329
  midTitle,
2267
2330
  sliceCount: String(slices.length),
@@ -2289,11 +2352,14 @@ export async function buildGateEvaluatePrompt(mid, midTitle, sid, sTitle, base,
2289
2352
  const gateDefs = getGatesForTurn("gate-evaluate").filter((def) => pendingIds.has(def.id));
2290
2353
  const subagentSections = [];
2291
2354
  const gateListLines = [];
2355
+ const normalizedBase = base.replaceAll("\\", "/");
2292
2356
  for (const def of gateDefs) {
2293
2357
  gateListLines.push(`- **${def.id}**: ${def.question}`);
2294
2358
  const subPrompt = [
2295
2359
  `You are evaluating quality gate **${def.id}** for slice ${sid} (${sTitle}).`,
2296
2360
  "",
2361
+ `**Working directory:** \`${normalizedBase}\`. All file reads, writes, and shell commands MUST operate relative to this directory. Do NOT \`cd\` to any other directory.`,
2362
+ "",
2297
2363
  `## Question: ${def.question}`,
2298
2364
  "",
2299
2365
  def.guidance,
@@ -2401,6 +2467,7 @@ export async function buildRewriteDocsPrompt(mid, midTitle, activeSlice, base, o
2401
2467
  ].join("\n")).join("\n\n");
2402
2468
  const documentList = docList.length > 0 ? docList.join("\n") : "- No active plan documents found.";
2403
2469
  return loadPrompt("rewrite-docs", {
2470
+ workingDirectory: base,
2404
2471
  milestoneId: mid,
2405
2472
  milestoneTitle: midTitle,
2406
2473
  sliceId: sid ?? "none",
@@ -7,6 +7,7 @@
7
7
  * globals or AutoContext dependency.
8
8
  */
9
9
  import { parseUnitId } from "./unit-id.js";
10
+ import { MILESTONE_ID_RE } from "./milestone-ids.js";
10
11
  import { appendEvent } from "./workflow-events.js";
11
12
  import { atomicWriteSync } from "./atomic-write.js";
12
13
  import { clearParseCache } from "./files.js";
@@ -168,8 +169,35 @@ function getChangedFilesSinceBranch(basePath, targetBranch) {
168
169
  }
169
170
  }
170
171
  function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
172
+ // Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
173
+ // by depth when .gsd/ is tracked in git.
174
+ const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
175
+ "log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
176
+ ]);
177
+ if (!scoped.ok)
178
+ return scoped;
179
+ if (scoped.matched)
180
+ return scoped;
181
+ // Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
182
+ // path-scoped scan matches no commits even though GSD-tagged commits
183
+ // referencing the milestone exist on the integration branch. Re-scan all
184
+ // of HEAD's history and rely on commitMatchesMilestone to bind by
185
+ // explicit milestone mention in the message body.
186
+ //
187
+ // Intentionally unbounded — symmetric with the primary scan, and avoids
188
+ // reintroducing the rolling-depth failure class removed in #4699 where
189
+ // milestone evidence aged out behind unrelated activity.
190
+ return scanGsdTaggedCommits(basePath, milestoneId, [
191
+ "log", "--format=%H%x1f%B%x1e", "HEAD",
192
+ ]);
193
+ }
194
+ function scanGsdTaggedCommits(basePath, milestoneId, gitArgs) {
171
195
  try {
172
- const logOutput = execFileSync("git", ["log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`], { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
196
+ const logOutput = execFileSync("git", [...gitArgs], {
197
+ cwd: basePath,
198
+ stdio: ["ignore", "pipe", "pipe"],
199
+ encoding: "utf-8",
200
+ });
173
201
  const records = logOutput
174
202
  .split("\x1e")
175
203
  .map((record) => record.trim())
@@ -213,13 +241,24 @@ function commitMatchesMilestone(message, milestoneId, files) {
213
241
  if (commitTrailerStartsWithMilestone(message, milestoneId))
214
242
  return true;
215
243
  // Meaningful execute-task commits currently store task scope as Sxx/Tyy
216
- // rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone only
217
- // when the commit also touched this milestone's artifacts.
244
+ // rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone when
245
+ // either the commit touched this milestone's artifacts, or — for projects
246
+ // where .gsd/ is gitignored/external (#5033) — the message explicitly
247
+ // names the milestone.
218
248
  if (/^GSD-Task:\s*S[^/\s]+\/T\S+/m.test(message)) {
219
- return files.some((file) => isMilestoneArtifactPath(file, milestoneId));
249
+ if (files.some((file) => isMilestoneArtifactPath(file, milestoneId)))
250
+ return true;
251
+ if (commitMessageMentionsMilestone(message, milestoneId))
252
+ return true;
220
253
  }
221
254
  return false;
222
255
  }
256
+ function commitMessageMentionsMilestone(message, milestoneId) {
257
+ if (!MILESTONE_ID_RE.test(milestoneId))
258
+ return false;
259
+ const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
260
+ return new RegExp(`\\b${escapedMilestone}\\b`).test(message);
261
+ }
223
262
  function commitTrailerStartsWithMilestone(message, milestoneId) {
224
263
  const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
225
264
  const trailerPattern = new RegExp(`^GSD-(?:Task|Unit):\\s*${escapedMilestone}(?:$|[\\s/])`, "m");
@@ -0,0 +1,31 @@
1
+ // GSD auto-mode runtime state
2
+ import { AutoSession } from "./auto/session.js";
3
+ import { isDeterministicPolicyError, isQueuedUserMessageSkip, isToolInvocationError, markToolEnd as markTrackedToolEnd, markToolStart as markTrackedToolStart, } from "./auto-tool-tracking.js";
4
+ export const autoSession = new AutoSession();
5
+ export function getAutoRuntimeSnapshot() {
6
+ return {
7
+ active: autoSession.active,
8
+ paused: autoSession.paused,
9
+ currentUnit: autoSession.currentUnit ? { ...autoSession.currentUnit } : null,
10
+ basePath: autoSession.basePath,
11
+ };
12
+ }
13
+ export function isAutoActive() {
14
+ return autoSession.active;
15
+ }
16
+ export function isAutoPaused() {
17
+ return autoSession.paused;
18
+ }
19
+ export function markToolStart(toolCallId, toolName) {
20
+ markTrackedToolStart(toolCallId, autoSession.active, toolName);
21
+ }
22
+ export function markToolEnd(toolCallId) {
23
+ markTrackedToolEnd(toolCallId);
24
+ }
25
+ export function recordToolInvocationError(toolName, errorMsg) {
26
+ if (!autoSession.active)
27
+ return;
28
+ if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg) || isDeterministicPolicyError(errorMsg)) {
29
+ autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
30
+ }
31
+ }
@@ -208,7 +208,7 @@ export function auditOrphanedMilestoneBranches(basePath, isolationMode) {
208
208
  else {
209
209
  // Branch is NOT merged — preserve for safety, warn the user
210
210
  warnings.push(`Branch ${branch} exists for completed milestone ${milestoneId} but is NOT merged into ${mainBranch}. ` +
211
- `This may contain unmerged work. Merge manually or run \`/gsd health --fix\` to resolve.`);
211
+ `This may contain unmerged work. Merge manually or run \`/gsd doctor fix\` to resolve.`);
212
212
  // #4764 telemetry
213
213
  try {
214
214
  emitWorktreeOrphaned(basePath, milestoneId, {
@@ -139,6 +139,6 @@ export const DETERMINISTIC_POLICY_ERROR_STRINGS = [
139
139
  export function isDeterministicPolicyError(errorMsg) {
140
140
  if (!errorMsg)
141
141
  return false;
142
- return (DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg) ||
143
- DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s)));
142
+ return DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg)
143
+ || DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s));
144
144
  }
@@ -16,6 +16,7 @@ import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
16
16
  import { gsdRoot } from "./paths.js";
17
17
  import { createWorktree, removeWorktree, resolveGitDir, worktreePath, isInsideWorktreesDir, } from "./worktree-manager.js";
18
18
  import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
19
+ import { isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
19
20
  import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
20
21
  import { debugLog } from "./debug-logger.js";
21
22
  import { logWarning, logError } from "./workflow-logger.js";
@@ -857,6 +858,11 @@ export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
857
858
  export function autoWorktreeBranch(milestoneId) {
858
859
  return `milestone/${milestoneId}`;
859
860
  }
861
+ function normalizeLocalBranchRef(branch) {
862
+ return branch.startsWith("refs/heads/")
863
+ ? branch.slice("refs/heads/".length)
864
+ : branch;
865
+ }
860
866
  // ─── Branch-mode Entry ─────────────────────────────────────────────────────
861
867
  /**
862
868
  * Enter branch isolation mode for a milestone.
@@ -1033,6 +1039,14 @@ function reconcilePlanCheckboxes(projectRoot, wtPath, milestoneId) {
1033
1039
  }
1034
1040
  }
1035
1041
  export function createAutoWorktree(basePath, milestoneId) {
1042
+ basePath = resolveWorktreeProjectRoot(basePath);
1043
+ // Check if repo has commits — git worktree requires a valid HEAD
1044
+ try {
1045
+ execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
1046
+ }
1047
+ catch {
1048
+ throw new GSDError(GSD_GIT_ERROR, `Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`);
1049
+ }
1036
1050
  const branch = autoWorktreeBranch(milestoneId);
1037
1051
  // Check if the milestone branch already exists — it survives auto-mode
1038
1052
  // stop/pause and contains committed work from prior sessions. If it exists,
@@ -1159,6 +1173,7 @@ function copyPlanningArtifacts(srcBase, wtPath) {
1159
1173
  * the worktree and its branch.
1160
1174
  */
1161
1175
  export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
1176
+ originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
1162
1177
  const branch = autoWorktreeBranch(milestoneId);
1163
1178
  const { preserveBranch = false } = opts;
1164
1179
  const previousCwd = process.cwd();
@@ -1200,18 +1215,26 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
1200
1215
  }
1201
1216
  /**
1202
1217
  * Detect if the process is currently inside an auto-worktree.
1203
- * Checks both module state and git branch prefix.
1218
+ * Uses the current directory structure plus git branch prefix so detection
1219
+ * still works after process restart when module state has been reset.
1204
1220
  */
1205
1221
  export function isInAutoWorktree(basePath) {
1206
- if (!originalBase)
1207
- return false;
1208
1222
  const cwd = process.cwd();
1209
- const resolvedBase = existsSync(basePath) ? realpathSync(basePath) : basePath;
1210
- const wtDir = join(resolvedBase, ".gsd", "worktrees");
1211
- if (!cwd.startsWith(wtDir))
1223
+ if (!isGsdWorktreePath(cwd))
1212
1224
  return false;
1213
- const branch = nativeGetCurrentBranch(cwd);
1214
- return branch.startsWith("milestone/");
1225
+ const projectRoot = resolveWorktreeProjectRoot(basePath, originalBase);
1226
+ const cwdProjectRoot = resolveWorktreeProjectRoot(cwd, originalBase);
1227
+ if (normalizeWorktreePathForCompare(projectRoot) !==
1228
+ normalizeWorktreePathForCompare(cwdProjectRoot)) {
1229
+ return false;
1230
+ }
1231
+ try {
1232
+ const branch = nativeGetCurrentBranch(cwd);
1233
+ return branch.startsWith("milestone/");
1234
+ }
1235
+ catch {
1236
+ return false;
1237
+ }
1215
1238
  }
1216
1239
  /**
1217
1240
  * Get the filesystem path for an auto-worktree, or null if it doesn't exist
@@ -1222,6 +1245,7 @@ export function isInAutoWorktree(basePath) {
1222
1245
  * mis-detection of leftover directories as active worktrees (#695).
1223
1246
  */
1224
1247
  export function getAutoWorktreePath(basePath, milestoneId) {
1248
+ basePath = resolveWorktreeProjectRoot(basePath);
1225
1249
  const p = worktreePath(basePath, milestoneId);
1226
1250
  if (!existsSync(p))
1227
1251
  return null;
@@ -1248,6 +1272,7 @@ export function getAutoWorktreePath(basePath, milestoneId) {
1248
1272
  * Atomic: chdir + originalBase update in same try block.
1249
1273
  */
1250
1274
  export function enterAutoWorktree(basePath, milestoneId) {
1275
+ basePath = resolveWorktreeProjectRoot(basePath);
1251
1276
  const p = worktreePath(basePath, milestoneId);
1252
1277
  if (!existsSync(p)) {
1253
1278
  throw new GSDError(GSD_IO_ERROR, `Auto-worktree for ${milestoneId} does not exist at ${p}`);
@@ -1286,16 +1311,20 @@ export function enterAutoWorktree(basePath, milestoneId) {
1286
1311
  export function getAutoWorktreeOriginalBase() {
1287
1312
  return originalBase;
1288
1313
  }
1314
+ export function _resetAutoWorktreeOriginalBaseForTests() {
1315
+ originalBase = null;
1316
+ }
1289
1317
  export function getActiveAutoWorktreeContext() {
1290
1318
  if (!originalBase)
1291
1319
  return null;
1292
1320
  const cwd = process.cwd();
1293
- const resolvedBase = existsSync(originalBase)
1294
- ? realpathSync(originalBase)
1295
- : originalBase;
1296
- const wtDir = join(resolvedBase, ".gsd", "worktrees");
1297
- if (!cwd.startsWith(wtDir))
1321
+ if (!isGsdWorktreePath(cwd))
1298
1322
  return null;
1323
+ const cwdProjectRoot = resolveWorktreeProjectRoot(cwd, originalBase);
1324
+ if (normalizeWorktreePathForCompare(cwdProjectRoot) !==
1325
+ normalizeWorktreePathForCompare(originalBase)) {
1326
+ return null;
1327
+ }
1299
1328
  const worktreeName = detectWorktreeName(cwd);
1300
1329
  if (!worktreeName)
1301
1330
  return null;
@@ -1408,6 +1437,10 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1408
1437
  }
1409
1438
  }
1410
1439
  // 3. chdir to original base
1440
+ // Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
1441
+ // entering the function. Subsequent throws restore to previousCwd, leaving
1442
+ // the caller in worktree-cwd; callers (worktree-resolver) are responsible
1443
+ // for any further cwd movement on the error path.
1411
1444
  const previousCwd = process.cwd();
1412
1445
  process.chdir(originalBasePath_);
1413
1446
  // 4. Resolve integration branch — prefer milestone metadata, then preferences,
@@ -1422,6 +1455,20 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1422
1455
  ? prefs.main_branch
1423
1456
  : undefined;
1424
1457
  const mainBranch = integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
1458
+ // Fail closed when the resolved integration branch is the milestone branch
1459
+ // itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
1460
+ // as "milestone/<MID>") would otherwise let the squash merge resolve to a
1461
+ // self-merge: nothing-to-commit + empty self-diff in the post-merge safety
1462
+ // check (#1792) collapse to a false success, and the worktree-resolver
1463
+ // emits worktree-merged for work that never landed on a distinct
1464
+ // integration branch.
1465
+ if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
1466
+ process.chdir(previousCwd);
1467
+ throw new GSDError(GSD_GIT_ERROR, `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
1468
+ `"${milestoneBranch}" — refusing to self-merge. Integration branch metadata is invalid; ` +
1469
+ `set a distinct main_branch in GSD preferences or repair the milestone integration record ` +
1470
+ `before retrying milestone completion.`);
1471
+ }
1425
1472
  // Remove transient project-root state files before any branch or merge
1426
1473
  // operation. Untracked milestone metadata can otherwise block squash merges.
1427
1474
  clearProjectRootStateFiles(originalBasePath_, milestoneId);
@@ -80,13 +80,12 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
80
80
  import { resolveUokFlags } from "./uok/flags.js";
81
81
  import { WorktreeResolver, } from "./worktree-resolver.js";
82
82
  import { reorderForCaching } from "./prompt-ordering.js";
83
- // ─── Session State ─────────────────────────────────────────────────────────
84
- import { AutoSession, } from "./auto/session.js";
85
83
  export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
84
+ import { autoSession as s } from "./auto-runtime-state.js";
86
85
  // ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
87
86
  // ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
88
87
  // This file must NOT declare module-level `let` or `var` variables for state.
89
- // The single `s` instance below is the only mutable module-level binding.
88
+ // The single shared `s` instance below is the only mutable AutoSession binding.
90
89
  //
91
90
  // When adding features or fixing bugs:
92
91
  // - New mutable state → add a property to AutoSession, not a module-level variable
@@ -95,7 +94,6 @@ export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session
95
94
  //
96
95
  // Tests in auto-session-encapsulation.test.ts enforce this invariant.
97
96
  // ─────────────────────────────────────────────────────────────────────────────
98
- const s = new AutoSession();
99
97
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
100
98
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
101
99
  function captureProjectRootEnv(projectRoot) {
@@ -1408,10 +1406,21 @@ const widgetStateAccessors = {
1408
1406
  * Ensure directories, branches, and other prerequisites exist before
1409
1407
  * dispatching a unit. The LLM should never need to mkdir or git checkout.
1410
1408
  */
1411
- function ensurePreconditions(unitType, unitId, base, state) {
1409
+ export function ensurePreconditions(unitType, unitId, base, state) {
1412
1410
  const { milestone: mid, slice: sid } = parseUnitId(unitId);
1413
1411
  const mDir = resolveMilestonePath(base, mid);
1414
1412
  if (!mDir) {
1413
+ // Fix #4996: When dispatching a slice unit against an unrecognised milestone,
1414
+ // only create the directory if the milestone has a DB row.
1415
+ // Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
1416
+ // silently scaffold empty stub directories that later skew nextMilestoneId.
1417
+ if (sid !== undefined) {
1418
+ const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
1419
+ if (!hasDbRow) {
1420
+ logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
1421
+ return;
1422
+ }
1423
+ }
1415
1424
  const newDir = join(milestonesDir(base), mid);
1416
1425
  mkdirSync(join(newDir, "slices"), { recursive: true });
1417
1426
  }
@@ -1432,15 +1441,18 @@ function ensurePreconditions(unitType, unitId, base, state) {
1432
1441
  }
1433
1442
  }
1434
1443
  export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, triggerUnitId, hookPrompt, hookModel, targetBasePath) {
1444
+ const wasActive = s.active;
1445
+ const previousBasePath = s.basePath;
1446
+ const previousCurrentUnit = s.currentUnit ? { ...s.currentUnit } : null;
1435
1447
  if (!s.active) {
1436
1448
  s.active = true;
1437
1449
  s.stepMode = true;
1438
1450
  s.cmdCtx = ctx;
1439
- s.basePath = targetBasePath;
1440
1451
  s.autoStartTime = Date.now();
1441
1452
  s.currentUnit = null;
1442
1453
  s.pendingQuickTasks = [];
1443
1454
  }
1455
+ s.basePath = targetBasePath;
1444
1456
  const hookUnitType = `hook/${hookName}`;
1445
1457
  const hookStartedAt = Date.now();
1446
1458
  s.currentUnit = {
@@ -1448,6 +1460,27 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1448
1460
  id: triggerUnitId,
1449
1461
  startedAt: hookStartedAt,
1450
1462
  };
1463
+ // Ensure cwd matches basePath BEFORE newSession() captures it (#1389).
1464
+ // newSession() snapshots process.cwd() during construction; chdir-ing
1465
+ // afterward leaves the session rooted to whatever cwd was when the call
1466
+ // was made. Must be synchronous — no awaits between chdir and newSession.
1467
+ try {
1468
+ if (process.cwd() !== s.basePath)
1469
+ process.chdir(s.basePath);
1470
+ }
1471
+ catch (err) {
1472
+ const msg = `Failed to chdir before hook newSession (basePath: ${s.basePath}): ${err instanceof Error ? err.message : String(err)}`;
1473
+ logWarning("engine", msg, { file: "auto.ts", basePath: s.basePath, error: err instanceof Error ? err.message : String(err) });
1474
+ ctx.ui.notify(`${msg}. Cancelling hook dispatch to avoid running in the wrong directory.`, "error");
1475
+ if (wasActive) {
1476
+ s.basePath = previousBasePath;
1477
+ s.currentUnit = previousCurrentUnit;
1478
+ }
1479
+ else {
1480
+ s.reset();
1481
+ }
1482
+ return false;
1483
+ }
1451
1484
  const result = await s.cmdCtx.newSession();
1452
1485
  if (result.cancelled) {
1453
1486
  await stopAuto(ctx, pi);
@@ -1490,14 +1523,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1490
1523
  }, hookHardTimeoutMs);
1491
1524
  ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
1492
1525
  ctx.ui.notify(`Running post-unit hook: ${hookName}`, "info");
1493
- // Ensure cwd matches basePath before hook dispatch (#1389)
1494
- try {
1495
- if (process.cwd() !== s.basePath)
1496
- process.chdir(s.basePath);
1497
- }
1498
- catch (err) {
1499
- logWarning("engine", `chdir failed before hook dispatch: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1500
- }
1501
1526
  debugLog("dispatchHookUnit", {
1502
1527
  phase: "send-message",
1503
1528
  promptLength: hookPrompt.length,
@@ -1,11 +1,12 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import { Text } from "@gsd/pi-tui";
3
- import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
4
3
  import { loadEffectiveGSDPreferences } from "../preferences.js";
5
4
  import { ensureDbOpen } from "./dynamic-tools.js";
6
5
  import { StringEnum } from "@gsd/pi-ai";
7
6
  import { logError } from "../workflow-logger.js";
8
- import { executeCompleteMilestone, executePlanMilestone, executePlanSlice, executeReplanSlice, executeReassessRoadmap, executeSaveGateResult, executeSliceComplete, executeSummarySave, executeTaskComplete, executeValidateMilestone, } from "../tools/workflow-tool-executors.js";
7
+ async function loadWorkflowExecutors() {
8
+ return import("../tools/workflow-tool-executors.js");
9
+ }
9
10
  /**
10
11
  * Register an alias tool that shares the same execute function as its canonical counterpart.
11
12
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -280,6 +281,7 @@ export function registerDbTools(pi) {
280
281
  registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
281
282
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
282
283
  const summarySaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
284
+ const { executeSummarySave } = await loadWorkflowExecutors();
283
285
  return executeSummarySave(params, process.cwd());
284
286
  };
285
287
  const summarySaveTool = {
@@ -330,6 +332,7 @@ export function registerDbTools(pi) {
330
332
  try {
331
333
  // Claim a reserved ID if the guided-flow already previewed one to the user.
332
334
  // This guarantees the ID shown in the UI matches the one materialised on disk.
335
+ const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
333
336
  const reserved = claimReservedId();
334
337
  if (reserved) {
335
338
  await ensureMilestoneDbRow(reserved);
@@ -408,6 +411,7 @@ export function registerDbTools(pi) {
408
411
  registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
409
412
  // ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
410
413
  const planMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
414
+ const { executePlanMilestone } = await loadWorkflowExecutors();
411
415
  return executePlanMilestone(params, process.cwd());
412
416
  };
413
417
  const planMilestoneTool = {
@@ -472,6 +476,7 @@ export function registerDbTools(pi) {
472
476
  registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
473
477
  // ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
474
478
  const planSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
479
+ const { executePlanSlice } = await loadWorkflowExecutors();
475
480
  return executePlanSlice(params, process.cwd());
476
481
  };
477
482
  const planSliceTool = {
@@ -585,6 +590,7 @@ export function registerDbTools(pi) {
585
590
  registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
586
591
  // ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
587
592
  const taskCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
593
+ const { executeTaskComplete } = await loadWorkflowExecutors();
588
594
  return executeTaskComplete(params, process.cwd());
589
595
  };
590
596
  const taskCompleteTool = {
@@ -647,6 +653,7 @@ export function registerDbTools(pi) {
647
653
  registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
648
654
  // ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
649
655
  const sliceCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
656
+ const { executeSliceComplete } = await loadWorkflowExecutors();
650
657
  return executeSliceComplete(params, process.cwd());
651
658
  };
652
659
  const sliceCompleteTool = {
@@ -811,6 +818,7 @@ export function registerDbTools(pi) {
811
818
  });
812
819
  // ─── gsd_complete_milestone ────────────────────────────────────────────
813
820
  const milestoneCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
821
+ const { executeCompleteMilestone } = await loadWorkflowExecutors();
814
822
  return executeCompleteMilestone(params, process.cwd());
815
823
  };
816
824
  const milestoneCompleteTool = {
@@ -851,6 +859,7 @@ export function registerDbTools(pi) {
851
859
  registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
852
860
  // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
853
861
  const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
862
+ const { executeValidateMilestone } = await loadWorkflowExecutors();
854
863
  return executeValidateMilestone(params, process.cwd());
855
864
  };
856
865
  const milestoneValidateTool = {
@@ -883,6 +892,7 @@ export function registerDbTools(pi) {
883
892
  registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
884
893
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
885
894
  const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
895
+ const { executeReplanSlice } = await loadWorkflowExecutors();
886
896
  return executeReplanSlice(params, process.cwd());
887
897
  };
888
898
  const replanSliceTool = {
@@ -925,6 +935,7 @@ export function registerDbTools(pi) {
925
935
  registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
926
936
  // ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
927
937
  const reassessRoadmapExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
938
+ const { executeReassessRoadmap } = await loadWorkflowExecutors();
928
939
  return executeReassessRoadmap(params, process.cwd());
929
940
  };
930
941
  const reassessRoadmapTool = {
@@ -1157,6 +1168,7 @@ export function registerDbTools(pi) {
1157
1168
  registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
1158
1169
  // ─── gsd_save_gate_result ──────────────────────────────────────────────
1159
1170
  const saveGateResultExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
1171
+ const { executeSaveGateResult } = await loadWorkflowExecutors();
1160
1172
  return executeSaveGateResult(params, process.cwd());
1161
1173
  };
1162
1174
  const saveGateResultTool = {