gsd-pi 2.78.0-dev.aeeb2ca00 → 2.78.1-dev.84a383f51

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 (383) hide show
  1. package/README.md +7 -7
  2. package/dist/claude-cli-check.js +64 -37
  3. package/dist/cli-policy.d.ts +13 -0
  4. package/dist/cli-policy.js +17 -0
  5. package/dist/cli.js +95 -55
  6. package/dist/headless-query.d.ts +22 -0
  7. package/dist/headless-query.js +24 -4
  8. package/dist/headless.d.ts +10 -0
  9. package/dist/headless.js +16 -1
  10. package/dist/loader.js +7 -10
  11. package/dist/onboarding.d.ts +10 -0
  12. package/dist/onboarding.js +2 -2
  13. package/dist/provider-migrations.d.ts +2 -2
  14. package/dist/provider-migrations.js +5 -2
  15. package/dist/resource-loader.d.ts +5 -2
  16. package/dist/resource-loader.js +28 -5
  17. package/dist/resources/.managed-resources-content-hash +1 -0
  18. package/dist/resources/extensions/claude-code-cli/readiness.js +77 -45
  19. package/dist/resources/extensions/gsd/auto/loop.js +23 -0
  20. package/dist/resources/extensions/gsd/auto/phases.js +2 -2
  21. package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
  22. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  23. package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
  24. package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
  25. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  27. package/dist/resources/extensions/gsd/auto-worktree.js +30 -0
  28. package/dist/resources/extensions/gsd/auto.js +14 -5
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
  30. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
  31. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  32. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +94 -31
  34. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +34 -8
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +38 -2
  37. package/dist/resources/extensions/gsd/commands/catalog.js +69 -5
  38. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
  39. package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
  40. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
  41. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  42. package/dist/resources/extensions/gsd/docs/preferences-reference.md +4 -0
  43. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
  44. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  45. package/dist/resources/extensions/gsd/forensics.js +2 -2
  46. package/dist/resources/extensions/gsd/git-service.js +12 -5
  47. package/dist/resources/extensions/gsd/gsd-db.js +11 -2
  48. package/dist/resources/extensions/gsd/guided-flow.js +23 -23
  49. package/dist/resources/extensions/gsd/memory-store.js +66 -31
  50. package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
  51. package/dist/resources/extensions/gsd/model-router.js +114 -9
  52. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
  53. package/dist/resources/extensions/gsd/preferences-models.js +91 -15
  54. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  55. package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
  56. package/dist/resources/extensions/gsd/preferences.js +5 -3
  57. package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
  58. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
  59. package/dist/resources/extensions/gsd/state.js +42 -0
  60. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  61. package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
  62. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
  64. package/dist/resources/extensions/gsd/worktree-command.js +26 -46
  65. package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
  66. package/dist/resources/extensions/mcp-client/index.js +6 -3
  67. package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
  68. package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
  69. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  70. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  71. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  72. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  73. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  74. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  75. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  76. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  77. package/dist/rtk-shared.d.ts +3 -0
  78. package/dist/rtk-shared.js +17 -0
  79. package/dist/rtk.d.ts +2 -5
  80. package/dist/rtk.js +3 -20
  81. package/dist/runtime-checks.d.ts +27 -0
  82. package/dist/runtime-checks.js +38 -0
  83. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  84. package/dist/web/standalone/.next/BUILD_ID +1 -1
  85. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  86. package/dist/web/standalone/.next/build-manifest.json +3 -3
  87. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  88. package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
  89. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
  110. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/index.html +1 -1
  112. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  113. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  114. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  115. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  120. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  122. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  124. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  125. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  126. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  127. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
  128. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
  129. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
  130. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
  131. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
  132. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
  133. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
  134. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
  135. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
  136. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
  137. package/dist/web/standalone/.next/static/chunks/app/{page-5b113fd32bc2a1c3.js → page-9bf2e0c50fb2ca05.js} +1 -1
  138. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +1 -0
  139. package/dist/web/standalone/package.json +2 -1
  140. package/dist/worktree-status-banner.d.ts +1 -0
  141. package/dist/worktree-status-banner.js +132 -0
  142. package/package.json +1 -1
  143. package/packages/daemon/package.json +2 -2
  144. package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
  145. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
  146. package/packages/mcp-server/dist/alias-telemetry.js +30 -0
  147. package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
  148. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  149. package/packages/mcp-server/dist/workflow-tools.js +74 -46
  150. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  151. package/packages/mcp-server/package.json +2 -2
  152. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  153. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  154. package/packages/mcp-server/src/workflow-tools.test.ts +26 -0
  155. package/packages/mcp-server/src/workflow-tools.ts +93 -58
  156. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  157. package/packages/native/package.json +1 -1
  158. package/packages/pi-agent-core/package.json +1 -1
  159. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  160. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
  161. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
  162. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
  163. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
  164. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  165. package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
  166. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  167. package/packages/pi-ai/dist/types.d.ts +13 -0
  168. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  169. package/packages/pi-ai/dist/types.js.map +1 -1
  170. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  171. package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
  172. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  173. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
  174. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  175. package/packages/pi-ai/package.json +1 -1
  176. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  177. package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
  178. package/packages/pi-ai/src/types.ts +13 -0
  179. package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
  180. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
  181. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  182. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
  184. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/messages.js +4 -0
  187. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  188. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  189. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  190. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
  191. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  192. package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
  193. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  194. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
  195. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
  197. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
  199. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
  201. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
  202. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
  203. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
  204. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
  205. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
  206. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  207. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
  209. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
  211. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
  212. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
  213. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
  214. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
  215. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
  216. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
  217. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
  218. package/packages/pi-coding-agent/package.json +1 -1
  219. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
  220. package/packages/pi-coding-agent/src/core/messages.ts +4 -0
  221. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
  222. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
  223. package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
  224. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  225. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
  226. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
  227. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  228. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  229. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  230. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  231. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
  232. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  233. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  234. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  235. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  236. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  237. package/packages/pi-tui/package.json +1 -1
  238. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
  239. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  240. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  241. package/packages/rpc-client/package.json +1 -1
  242. package/pkg/package.json +1 -1
  243. package/src/resources/extensions/claude-code-cli/readiness.ts +78 -46
  244. package/src/resources/extensions/gsd/auto/loop.ts +24 -2
  245. package/src/resources/extensions/gsd/auto/phases.ts +3 -3
  246. package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
  247. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  248. package/src/resources/extensions/gsd/auto/types.ts +1 -0
  249. package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
  250. package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
  251. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  252. package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
  253. package/src/resources/extensions/gsd/auto-worktree.ts +38 -0
  254. package/src/resources/extensions/gsd/auto.ts +14 -4
  255. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
  256. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
  257. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  258. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
  259. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +102 -31
  260. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
  261. package/src/resources/extensions/gsd/bootstrap/system-context.ts +39 -8
  262. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -11
  263. package/src/resources/extensions/gsd/commands/catalog.ts +75 -5
  264. package/src/resources/extensions/gsd/commands/handlers/core.ts +22 -1
  265. package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
  266. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
  267. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  268. package/src/resources/extensions/gsd/docs/preferences-reference.md +4 -0
  269. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
  270. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  271. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  272. package/src/resources/extensions/gsd/forensics.ts +2 -2
  273. package/src/resources/extensions/gsd/git-service.ts +13 -5
  274. package/src/resources/extensions/gsd/gsd-db.ts +12 -2
  275. package/src/resources/extensions/gsd/guided-flow.ts +25 -25
  276. package/src/resources/extensions/gsd/memory-store.ts +81 -28
  277. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  278. package/src/resources/extensions/gsd/model-router.ts +172 -9
  279. package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
  280. package/src/resources/extensions/gsd/preferences-models.ts +101 -15
  281. package/src/resources/extensions/gsd/preferences-types.ts +6 -0
  282. package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
  283. package/src/resources/extensions/gsd/preferences.ts +16 -2
  284. package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
  285. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
  286. package/src/resources/extensions/gsd/state.ts +42 -0
  287. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  288. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
  289. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
  290. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +9 -5
  291. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
  292. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  293. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
  294. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
  295. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
  296. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
  297. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
  298. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
  299. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
  300. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
  301. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
  302. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
  303. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
  304. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  305. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
  306. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  307. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
  308. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
  309. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  310. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
  311. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
  312. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
  313. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
  314. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
  315. package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
  316. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  317. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  318. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
  319. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +22 -0
  320. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
  321. package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
  322. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
  323. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
  324. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  325. package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
  326. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  327. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
  328. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
  329. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
  330. package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
  331. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
  332. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
  333. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  334. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
  335. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
  336. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
  337. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
  338. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
  339. package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
  340. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
  341. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
  342. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
  343. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  344. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -0
  345. package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
  346. package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
  347. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  348. package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
  349. package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
  350. package/src/resources/extensions/gsd/worktree-command.ts +31 -44
  351. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  352. package/src/resources/extensions/mcp-client/index.ts +6 -3
  353. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  354. package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
  355. package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
  356. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  357. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  358. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  359. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  360. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  361. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  362. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  363. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  364. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  365. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
  366. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  367. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
  368. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
  369. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
  370. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  371. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  372. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  373. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  374. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  375. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
  376. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
  377. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
  378. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
  379. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
  380. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
  381. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
  382. /package/dist/web/standalone/.next/static/{cAJH99yNS1UPbeSEiNRrV → UF5VF4F1tB0miEtJS7LyX}/_buildManifest.js +0 -0
  383. /package/dist/web/standalone/.next/static/{cAJH99yNS1UPbeSEiNRrV → UF5VF4F1tB0miEtJS7LyX}/_ssgManifest.js +0 -0
@@ -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
  }
@@ -990,6 +990,12 @@ export function autoWorktreeBranch(milestoneId: string): string {
990
990
  return `milestone/${milestoneId}`;
991
991
  }
992
992
 
993
+ function normalizeLocalBranchRef(branch: string): string {
994
+ return branch.startsWith("refs/heads/")
995
+ ? branch.slice("refs/heads/".length)
996
+ : branch;
997
+ }
998
+
993
999
  // ─── Branch-mode Entry ─────────────────────────────────────────────────────
994
1000
 
995
1001
  /**
@@ -1196,6 +1202,16 @@ export function createAutoWorktree(
1196
1202
  basePath: string,
1197
1203
  milestoneId: string,
1198
1204
  ): string {
1205
+ // Check if repo has commits — git worktree requires a valid HEAD
1206
+ try {
1207
+ execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
1208
+ } catch {
1209
+ throw new GSDError(
1210
+ GSD_GIT_ERROR,
1211
+ `Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`,
1212
+ );
1213
+ }
1214
+
1199
1215
  const branch = autoWorktreeBranch(milestoneId);
1200
1216
 
1201
1217
  // Check if the milestone branch already exists — it survives auto-mode
@@ -1636,6 +1652,10 @@ export function mergeMilestoneToMain(
1636
1652
  }
1637
1653
 
1638
1654
  // 3. chdir to original base
1655
+ // Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
1656
+ // entering the function. Subsequent throws restore to previousCwd, leaving
1657
+ // the caller in worktree-cwd; callers (worktree-resolver) are responsible
1658
+ // for any further cwd movement on the error path.
1639
1659
  const previousCwd = process.cwd();
1640
1660
  process.chdir(originalBasePath_);
1641
1661
 
@@ -1656,6 +1676,24 @@ export function mergeMilestoneToMain(
1656
1676
  const mainBranch =
1657
1677
  integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
1658
1678
 
1679
+ // Fail closed when the resolved integration branch is the milestone branch
1680
+ // itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
1681
+ // as "milestone/<MID>") would otherwise let the squash merge resolve to a
1682
+ // self-merge: nothing-to-commit + empty self-diff in the post-merge safety
1683
+ // check (#1792) collapse to a false success, and the worktree-resolver
1684
+ // emits worktree-merged for work that never landed on a distinct
1685
+ // integration branch.
1686
+ if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
1687
+ process.chdir(previousCwd);
1688
+ throw new GSDError(
1689
+ GSD_GIT_ERROR,
1690
+ `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
1691
+ `"${milestoneBranch}" — refusing to self-merge. Integration branch metadata is invalid; ` +
1692
+ `set a distinct main_branch in GSD preferences or repair the milestone integration record ` +
1693
+ `before retrying milestone completion.`,
1694
+ );
1695
+ }
1696
+
1659
1697
  // Remove transient project-root state files before any branch or merge
1660
1698
  // operation. Untracked milestone metadata can otherwise block squash merges.
1661
1699
  clearProjectRootStateFiles(originalBasePath_, milestoneId);
@@ -232,7 +232,6 @@ import { reorderForCaching } from "./prompt-ordering.js";
232
232
  // ─── Session State ─────────────────────────────────────────────────────────
233
233
 
234
234
  import {
235
- AutoSession,
236
235
  STUB_RECOVERY_THRESHOLD,
237
236
  NEW_SESSION_TIMEOUT_MS,
238
237
  } from "./auto/session.js";
@@ -250,11 +249,12 @@ export type {
250
249
  UnitRouting,
251
250
  StartModel,
252
251
  } from "./auto/session.js";
252
+ import { autoSession as s } from "./auto-runtime-state.js";
253
253
 
254
254
  // ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
255
255
  // ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
256
256
  // This file must NOT declare module-level `let` or `var` variables for state.
257
- // The single `s` instance below is the only mutable module-level binding.
257
+ // The single shared `s` instance below is the only mutable AutoSession binding.
258
258
  //
259
259
  // When adding features or fixing bugs:
260
260
  // - New mutable state → add a property to AutoSession, not a module-level variable
@@ -263,7 +263,6 @@ export type {
263
263
  //
264
264
  // Tests in auto-session-encapsulation.test.ts enforce this invariant.
265
265
  // ─────────────────────────────────────────────────────────────────────────────
266
- const s = new AutoSession();
267
266
 
268
267
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
269
268
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
@@ -1812,7 +1811,7 @@ const widgetStateAccessors: WidgetStateAccessors = {
1812
1811
  * Ensure directories, branches, and other prerequisites exist before
1813
1812
  * dispatching a unit. The LLM should never need to mkdir or git checkout.
1814
1813
  */
1815
- function ensurePreconditions(
1814
+ export function ensurePreconditions(
1816
1815
  unitType: string,
1817
1816
  unitId: string,
1818
1817
  base: string,
@@ -1822,6 +1821,17 @@ function ensurePreconditions(
1822
1821
 
1823
1822
  const mDir = resolveMilestonePath(base, mid);
1824
1823
  if (!mDir) {
1824
+ // Fix #4996: When dispatching a slice unit against an unrecognised milestone,
1825
+ // only create the directory if the milestone has a DB row.
1826
+ // Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
1827
+ // silently scaffold empty stub directories that later skew nextMilestoneId.
1828
+ if (sid !== undefined) {
1829
+ const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
1830
+ if (!hasDbRow) {
1831
+ logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
1832
+ return;
1833
+ }
1834
+ }
1825
1835
  const newDir = join(milestonesDir(base), mid);
1826
1836
  mkdirSync(join(newDir, "slices"), { recursive: true });
1827
1837
  }
@@ -2,24 +2,15 @@ import { Type } from "@sinclair/typebox";
2
2
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
3
3
  import { Text } from "@gsd/pi-tui";
4
4
 
5
- import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
6
5
  import { loadEffectiveGSDPreferences } from "../preferences.js";
7
6
  import { ensureDbOpen } from "./dynamic-tools.js";
8
7
  import { StringEnum } from "@gsd/pi-ai";
9
8
  import { logError } from "../workflow-logger.js";
10
9
  import { getErrorMessage } from "../error-utils.js";
11
- import {
12
- executeCompleteMilestone,
13
- executePlanMilestone,
14
- executePlanSlice,
15
- executeReplanSlice,
16
- executeReassessRoadmap,
17
- executeSaveGateResult,
18
- executeSliceComplete,
19
- executeSummarySave,
20
- executeTaskComplete,
21
- executeValidateMilestone,
22
- } from "../tools/workflow-tool-executors.js";
10
+
11
+ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
12
+ return import("../tools/workflow-tool-executors.js");
13
+ }
23
14
 
24
15
  /**
25
16
  * Register an alias tool that shares the same execute function as its canonical counterpart.
@@ -302,6 +293,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
302
293
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
303
294
 
304
295
  const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
296
+ const { executeSummarySave } = await loadWorkflowExecutors();
305
297
  return executeSummarySave(params, process.cwd());
306
298
  };
307
299
 
@@ -354,6 +346,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
354
346
  try {
355
347
  // Claim a reserved ID if the guided-flow already previewed one to the user.
356
348
  // This guarantees the ID shown in the UI matches the one materialised on disk.
349
+ const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
357
350
  const reserved = claimReservedId();
358
351
  if (reserved) {
359
352
  await ensureMilestoneDbRow(reserved);
@@ -435,6 +428,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
435
428
  // ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
436
429
 
437
430
  const planMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
431
+ const { executePlanMilestone } = await loadWorkflowExecutors();
438
432
  return executePlanMilestone(params, process.cwd());
439
433
  };
440
434
 
@@ -504,6 +498,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
504
498
  // ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
505
499
 
506
500
  const planSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
501
+ const { executePlanSlice } = await loadWorkflowExecutors();
507
502
  return executePlanSlice(params, process.cwd());
508
503
  };
509
504
 
@@ -626,6 +621,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
626
621
  // ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
627
622
 
628
623
  const taskCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
624
+ const { executeTaskComplete } = await loadWorkflowExecutors();
629
625
  return executeTaskComplete(params, process.cwd());
630
626
  };
631
627
 
@@ -696,6 +692,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
696
692
  // ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
697
693
 
698
694
  const sliceCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
695
+ const { executeSliceComplete } = await loadWorkflowExecutors();
699
696
  return executeSliceComplete(params, process.cwd());
700
697
  };
701
698
 
@@ -888,6 +885,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
888
885
  // ─── gsd_complete_milestone ────────────────────────────────────────────
889
886
 
890
887
  const milestoneCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
888
+ const { executeCompleteMilestone } = await loadWorkflowExecutors();
891
889
  return executeCompleteMilestone(params, process.cwd());
892
890
  };
893
891
 
@@ -933,6 +931,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
933
931
  // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
934
932
 
935
933
  const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
934
+ const { executeValidateMilestone } = await loadWorkflowExecutors();
936
935
  return executeValidateMilestone(params, process.cwd());
937
936
  };
938
937
 
@@ -970,6 +969,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
970
969
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
971
970
 
972
971
  const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
972
+ const { executeReplanSlice } = await loadWorkflowExecutors();
973
973
  return executeReplanSlice(params, process.cwd());
974
974
  };
975
975
 
@@ -1020,6 +1020,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1020
1020
  // ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
1021
1021
 
1022
1022
  const reassessRoadmapExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1023
+ const { executeReassessRoadmap } = await loadWorkflowExecutors();
1023
1024
  return executeReassessRoadmap(params, process.cwd());
1024
1025
  };
1025
1026
 
@@ -1275,6 +1276,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1275
1276
  // ─── gsd_save_gate_result ──────────────────────────────────────────────
1276
1277
 
1277
1278
  const saveGateResultExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1279
+ const { executeSaveGateResult } = await loadWorkflowExecutors();
1278
1280
  return executeSaveGateResult(params, process.cwd());
1279
1281
  };
1280
1282
 
@@ -6,12 +6,6 @@
6
6
  import { Type } from "@sinclair/typebox";
7
7
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
8
8
 
9
- import { executeGsdExec } from "../tools/exec-tool.js";
10
- import { executeExecSearch } from "../tools/exec-search-tool.js";
11
- import { executeResume } from "../tools/resume-tool.js";
12
- import { loadEffectiveGSDPreferences } from "../preferences.js";
13
- import { logWarning } from "../workflow-logger.js";
14
-
15
9
  export function registerExecTools(pi: ExtensionAPI): void {
16
10
  pi.registerTool({
17
11
  name: "gsd_exec",
@@ -46,7 +40,12 @@ export function registerExecTools(pi: ExtensionAPI): void {
46
40
  ),
47
41
  }),
48
42
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
49
- let prefs: Awaited<ReturnType<typeof loadEffectiveGSDPreferences>> | null = null;
43
+ const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
44
+ import("../tools/exec-tool.js"),
45
+ import("../preferences.js"),
46
+ import("../workflow-logger.js"),
47
+ ]);
48
+ let prefs: ReturnType<typeof loadEffectiveGSDPreferences> | null = null;
50
49
  try {
51
50
  prefs = loadEffectiveGSDPreferences();
52
51
  } catch (err) {
@@ -81,6 +80,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
81
80
  limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
82
81
  }),
83
82
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
83
+ const { executeExecSearch } = await import("../tools/exec-search-tool.js");
84
84
  return executeExecSearch(params as Parameters<typeof executeExecSearch>[0], {
85
85
  baseDir: process.cwd(),
86
86
  });
@@ -101,6 +101,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
101
101
  ],
102
102
  parameters: Type.Object({}),
103
103
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
104
+ const { executeResume } = await import("../tools/resume-tool.js");
104
105
  return executeResume(params as Parameters<typeof executeResume>[0], {
105
106
  baseDir: process.cwd(),
106
107
  });
@@ -3,8 +3,6 @@
3
3
  import { Type } from "@sinclair/typebox";
4
4
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
5
5
  import { ensureDbOpen } from "./dynamic-tools.js";
6
- import { executeMilestoneStatus } from "../tools/workflow-tool-executors.js";
7
- import { checkpointDatabase } from "../gsd-db.js";
8
6
 
9
7
  export function registerQueryTools(pi: ExtensionAPI): void {
10
8
  pi.registerTool({
@@ -29,6 +27,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
29
27
  details: { operation: "milestone_status", error: "db_unavailable" },
30
28
  };
31
29
  }
30
+ const { executeMilestoneStatus } = await import("../tools/workflow-tool-executors.js");
32
31
  return executeMilestoneStatus(params);
33
32
  },
34
33
  });
@@ -55,6 +54,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
55
54
  details: { operation: "checkpoint_db", error: "db_unavailable" },
56
55
  };
57
56
  }
57
+ const { checkpointDatabase } = await import("../gsd-db.js");
58
58
  checkpointDatabase();
59
59
  return {
60
60
  content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
@@ -3,9 +3,8 @@
3
3
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
4
4
 
5
5
  import { registerExitCommand } from "../exit-command.js";
6
- import { registerWorktreeCommand } from "../worktree-command.js";
6
+ import { registerLazyWorktreeCommands } from "../worktree-command-bootstrap.js";
7
7
  import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-extension-api.js";
8
- import { loadEcosystemExtensions } from "../ecosystem/loader.js";
9
8
  import { registerDbTools } from "./db-tools.js";
10
9
  import { registerDynamicTools } from "./dynamic-tools.js";
11
10
  import { registerExecTools } from "./exec-tools.js";
@@ -71,7 +70,7 @@ function installEpipeGuard(): void {
71
70
  export function registerGsdExtension(pi: ExtensionAPI): void {
72
71
  // Note: registerGSDCommand is called by index.ts before this function,
73
72
  // so we intentionally skip it here to avoid double-registration.
74
- registerWorktreeCommand(pi);
73
+ registerLazyWorktreeCommands(pi);
75
74
  registerExitCommand(pi);
76
75
 
77
76
  // Wire the Layer 2 event emitter bridge so deeply-nested GSD code can emit
@@ -116,12 +115,14 @@ export function registerGsdExtension(pi: ExtensionAPI): void {
116
115
  ["cmux-events", () => initCmuxEventListeners(pi.events)],
117
116
  ["hooks", () => registerHooks(pi, ecosystemHandlers)],
118
117
  ["ecosystem", () => {
119
- void loadEcosystemExtensions(pi, ecosystemHandlers).catch((err) => {
120
- logWarning(
121
- "ecosystem",
122
- `loader failed: ${err instanceof Error ? err.message : String(err)}`,
123
- );
124
- });
118
+ void import("../ecosystem/loader.js")
119
+ .then(({ loadEcosystemExtensions }) => loadEcosystemExtensions(pi, ecosystemHandlers))
120
+ .catch((err) => {
121
+ logWarning(
122
+ "ecosystem",
123
+ `loader failed: ${err instanceof Error ? err.message : String(err)}`,
124
+ );
125
+ });
125
126
  }],
126
127
  ];
127
128