lsd-pi 1.0.0 → 1.1.0

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 (1224) hide show
  1. package/README.md +283 -648
  2. package/dist/cli-theme.d.ts +1 -1
  3. package/dist/cli-theme.js +4 -4
  4. package/dist/cli.js +2 -2
  5. package/dist/headless.js +4 -6
  6. package/dist/help-text.js +1 -3
  7. package/dist/loader.js +8 -7
  8. package/dist/logo.d.ts +9 -0
  9. package/dist/logo.js +18 -8
  10. package/dist/lsd-brand.d.ts +14 -0
  11. package/dist/lsd-brand.js +42 -0
  12. package/dist/onboarding.js +51 -0
  13. package/dist/resource-loader.d.ts +2 -3
  14. package/dist/resource-loader.js +18 -20
  15. package/dist/resources/agents/generic.md +29 -0
  16. package/dist/resources/agents/scout.md +1 -0
  17. package/dist/resources/extensions/ask-user-questions.js +0 -4
  18. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +6 -0
  19. package/dist/resources/extensions/get-secrets-from-user.js +2 -3
  20. package/dist/resources/extensions/remote-questions/config.js +3 -3
  21. package/dist/resources/extensions/remote-questions/remote-command.js +4 -27
  22. package/dist/resources/extensions/search-the-web/native-search.js +1 -1
  23. package/dist/resources/extensions/search-the-web/provider.js +4 -12
  24. package/dist/resources/extensions/shared/debug-logger.js +103 -0
  25. package/dist/resources/extensions/shared/env-utils.js +17 -0
  26. package/dist/resources/extensions/shared/paths.js +17 -0
  27. package/dist/resources/extensions/shared/preferences.js +90 -0
  28. package/dist/resources/extensions/shared/remote-questions-config.js +27 -0
  29. package/dist/resources/extensions/shared/rtk-session-stats.js +2 -2
  30. package/dist/resources/extensions/shared/secrets-manifest.js +115 -0
  31. package/dist/resources/extensions/slash-commands/extension-manifest.json +2 -1
  32. package/dist/resources/extensions/slash-commands/index.js +2 -0
  33. package/dist/resources/extensions/slash-commands/plan.js +284 -0
  34. package/dist/resources/extensions/subagent/agents.js +1 -1
  35. package/dist/resources/extensions/subagent/approval-proxy.js +34 -0
  36. package/dist/resources/extensions/subagent/configured-model.js +9 -0
  37. package/dist/resources/extensions/subagent/index.js +95 -144
  38. package/dist/resources/extensions/subagent/model-resolution.js +12 -0
  39. package/dist/resources/extensions/ttsr/ttsr-manager.js +1 -1
  40. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  41. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +8 -7
  42. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  43. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +6 -5
  44. package/dist/shared-paths.d.ts +1 -0
  45. package/dist/shared-paths.js +17 -0
  46. package/dist/shared-preferences.d.ts +37 -0
  47. package/dist/shared-preferences.js +102 -0
  48. package/dist/welcome-screen.js +24 -18
  49. package/dist/worktree-cli.d.ts +4 -49
  50. package/dist/worktree-cli.js +197 -113
  51. package/package.json +6 -6
  52. package/packages/pi-coding-agent/dist/cli/args.d.ts +1 -1
  53. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  54. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  55. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  56. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  57. package/packages/pi-coding-agent/dist/core/agent-session.js +13 -1
  58. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  59. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  60. package/packages/pi-coding-agent/dist/core/auth-storage.js +35 -0
  61. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  62. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +24 -0
  63. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  64. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +3 -0
  65. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  66. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +8 -0
  67. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  68. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +12 -0
  69. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  70. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +77 -15
  71. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  72. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  73. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  74. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +76 -0
  75. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  76. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  77. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  78. package/packages/pi-coding-agent/dist/core/package-manager.js +8 -8
  79. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  80. package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.d.ts +2 -0
  81. package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.d.ts.map +1 -0
  82. package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js +59 -0
  83. package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js.map +1 -0
  84. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  85. package/packages/pi-coding-agent/dist/core/resource-loader.js +32 -14
  86. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  87. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +13 -3
  88. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  89. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  90. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  91. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -6
  92. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  93. package/packages/pi-coding-agent/dist/core/skills.js +18 -13
  94. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  95. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -1
  96. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  97. package/packages/pi-coding-agent/dist/core/tool-approval.d.ts +1 -1
  98. package/packages/pi-coding-agent/dist/core/tool-approval.d.ts.map +1 -1
  99. package/packages/pi-coding-agent/dist/core/tool-approval.js +2 -0
  100. package/packages/pi-coding-agent/dist/core/tool-approval.js.map +1 -1
  101. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  102. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  103. package/packages/pi-coding-agent/dist/index.js +1 -1
  104. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  105. package/packages/pi-coding-agent/dist/main.js +1 -1
  106. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  107. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  108. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  109. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +11 -1
  110. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  111. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +1 -1
  112. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  113. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +11 -4
  114. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  115. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +7 -0
  116. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  117. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +33 -3
  118. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  119. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  120. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  121. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +129 -57
  122. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  123. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  124. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +12 -3
  125. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  127. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +46 -6
  128. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  129. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  130. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +28 -20
  131. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  132. package/packages/pi-coding-agent/package.json +1 -1
  133. package/packages/pi-coding-agent/src/cli/args.ts +1 -1
  134. package/packages/pi-coding-agent/src/core/agent-session.ts +14 -1
  135. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +30 -0
  136. package/packages/pi-coding-agent/src/core/auth-storage.ts +36 -0
  137. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +9 -0
  138. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +87 -0
  139. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +84 -16
  140. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  141. package/packages/pi-coding-agent/src/core/package-manager.ts +8 -8
  142. package/packages/pi-coding-agent/src/core/resource-loader-lsd-md.test.ts +67 -0
  143. package/packages/pi-coding-agent/src/core/resource-loader.ts +32 -13
  144. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -5
  145. package/packages/pi-coding-agent/src/core/skills.ts +20 -14
  146. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -1
  147. package/packages/pi-coding-agent/src/core/tool-approval.js +111 -0
  148. package/packages/pi-coding-agent/src/core/tool-approval.ts +2 -1
  149. package/packages/pi-coding-agent/src/index.ts +2 -0
  150. package/packages/pi-coding-agent/src/main.ts +1 -1
  151. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +14 -1
  152. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +11 -5
  153. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +40 -3
  154. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +135 -66
  155. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +12 -3
  156. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +70 -6
  157. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +28 -20
  158. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  159. package/pkg/dist/modes/interactive/theme/themes.js +28 -20
  160. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  161. package/pkg/package.json +1 -1
  162. package/src/resources/agents/generic.md +29 -0
  163. package/src/resources/agents/scout.md +1 -0
  164. package/src/resources/extensions/ask-user-questions.ts +0 -3
  165. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +6 -0
  166. package/src/resources/extensions/cmux/index.ts +29 -10
  167. package/src/resources/extensions/get-secrets-from-user.ts +2 -4
  168. package/src/resources/extensions/gsd/tests/test-helpers.ts +44 -44
  169. package/src/resources/extensions/remote-questions/config.ts +3 -3
  170. package/src/resources/extensions/remote-questions/remote-command.ts +4 -30
  171. package/src/resources/extensions/search-the-web/native-search.ts +2 -1
  172. package/src/resources/extensions/search-the-web/provider.ts +3 -10
  173. package/src/resources/extensions/shared/debug-logger.ts +102 -0
  174. package/src/resources/extensions/shared/env-utils.ts +18 -0
  175. package/src/resources/extensions/shared/paths.ts +15 -0
  176. package/src/resources/extensions/shared/preferences.ts +122 -0
  177. package/src/resources/extensions/shared/remote-questions-config.ts +30 -0
  178. package/src/resources/extensions/shared/rtk-session-stats.ts +2 -2
  179. package/src/resources/extensions/shared/secrets-manifest.ts +130 -0
  180. package/src/resources/extensions/slash-commands/extension-manifest.json +2 -1
  181. package/src/resources/extensions/slash-commands/index.ts +2 -0
  182. package/src/resources/extensions/slash-commands/plan.ts +328 -0
  183. package/src/resources/extensions/subagent/agents.ts +1 -1
  184. package/src/resources/extensions/subagent/approval-proxy.ts +70 -0
  185. package/src/resources/extensions/subagent/configured-model.ts +15 -0
  186. package/src/resources/extensions/subagent/index.ts +126 -185
  187. package/src/resources/extensions/subagent/model-resolution.ts +26 -0
  188. package/src/resources/extensions/ttsr/ttsr-manager.ts +1 -1
  189. package/src/resources/skills/create-skill/SKILL.md +2 -2
  190. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +8 -7
  191. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  192. package/src/resources/skills/create-skill/workflows/create-new-skill.md +6 -5
  193. package/dist/resources/extensions/github-sync/cli.js +0 -284
  194. package/dist/resources/extensions/github-sync/index.js +0 -73
  195. package/dist/resources/extensions/github-sync/mapping.js +0 -67
  196. package/dist/resources/extensions/github-sync/sync.js +0 -425
  197. package/dist/resources/extensions/github-sync/templates.js +0 -118
  198. package/dist/resources/extensions/github-sync/types.js +0 -7
  199. package/dist/resources/extensions/gsd/activity-log.js +0 -153
  200. package/dist/resources/extensions/gsd/atomic-write.js +0 -134
  201. package/dist/resources/extensions/gsd/auto/detect-stuck.js +0 -49
  202. package/dist/resources/extensions/gsd/auto/infra-errors.js +0 -49
  203. package/dist/resources/extensions/gsd/auto/loop-deps.js +0 -6
  204. package/dist/resources/extensions/gsd/auto/loop.js +0 -256
  205. package/dist/resources/extensions/gsd/auto/phases.js +0 -942
  206. package/dist/resources/extensions/gsd/auto/resolve.js +0 -90
  207. package/dist/resources/extensions/gsd/auto/run-unit.js +0 -106
  208. package/dist/resources/extensions/gsd/auto/session.js +0 -171
  209. package/dist/resources/extensions/gsd/auto/types.js +0 -23
  210. package/dist/resources/extensions/gsd/auto-artifact-paths.js +0 -116
  211. package/dist/resources/extensions/gsd/auto-budget.js +0 -30
  212. package/dist/resources/extensions/gsd/auto-dashboard.js +0 -751
  213. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +0 -212
  214. package/dist/resources/extensions/gsd/auto-dispatch.js +0 -627
  215. package/dist/resources/extensions/gsd/auto-loop.js +0 -13
  216. package/dist/resources/extensions/gsd/auto-model-selection.js +0 -192
  217. package/dist/resources/extensions/gsd/auto-observability.js +0 -54
  218. package/dist/resources/extensions/gsd/auto-post-unit.js +0 -548
  219. package/dist/resources/extensions/gsd/auto-prompts.js +0 -1686
  220. package/dist/resources/extensions/gsd/auto-recovery.js +0 -533
  221. package/dist/resources/extensions/gsd/auto-start.js +0 -544
  222. package/dist/resources/extensions/gsd/auto-supervisor.js +0 -73
  223. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +0 -180
  224. package/dist/resources/extensions/gsd/auto-timers.js +0 -261
  225. package/dist/resources/extensions/gsd/auto-tool-tracking.js +0 -77
  226. package/dist/resources/extensions/gsd/auto-unit-closeout.js +0 -30
  227. package/dist/resources/extensions/gsd/auto-utils.js +0 -20
  228. package/dist/resources/extensions/gsd/auto-verification.js +0 -163
  229. package/dist/resources/extensions/gsd/auto-worktree.js +0 -1645
  230. package/dist/resources/extensions/gsd/auto.js +0 -1087
  231. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -191
  232. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +0 -1207
  233. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +0 -149
  234. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +0 -62
  235. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +0 -18
  236. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +0 -53
  237. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -267
  238. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +0 -45
  239. package/dist/resources/extensions/gsd/bootstrap/system-context.js +0 -367
  240. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +0 -75
  241. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -105
  242. package/dist/resources/extensions/gsd/branch-patterns.js +0 -13
  243. package/dist/resources/extensions/gsd/cache.js +0 -27
  244. package/dist/resources/extensions/gsd/captures.js +0 -414
  245. package/dist/resources/extensions/gsd/changelog.js +0 -162
  246. package/dist/resources/extensions/gsd/claude-import.js +0 -591
  247. package/dist/resources/extensions/gsd/collision-diagnostics.js +0 -226
  248. package/dist/resources/extensions/gsd/commands/catalog.js +0 -336
  249. package/dist/resources/extensions/gsd/commands/context.js +0 -87
  250. package/dist/resources/extensions/gsd/commands/dispatcher.js +0 -21
  251. package/dist/resources/extensions/gsd/commands/handlers/auto.js +0 -175
  252. package/dist/resources/extensions/gsd/commands/handlers/core.js +0 -249
  253. package/dist/resources/extensions/gsd/commands/handlers/ops.js +0 -207
  254. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +0 -106
  255. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -253
  256. package/dist/resources/extensions/gsd/commands/index.js +0 -11
  257. package/dist/resources/extensions/gsd/commands-bootstrap.js +0 -224
  258. package/dist/resources/extensions/gsd/commands-cmux.js +0 -120
  259. package/dist/resources/extensions/gsd/commands-config.js +0 -94
  260. package/dist/resources/extensions/gsd/commands-extensions.js +0 -260
  261. package/dist/resources/extensions/gsd/commands-handlers.js +0 -318
  262. package/dist/resources/extensions/gsd/commands-inspect.js +0 -77
  263. package/dist/resources/extensions/gsd/commands-logs.js +0 -468
  264. package/dist/resources/extensions/gsd/commands-maintenance.js +0 -485
  265. package/dist/resources/extensions/gsd/commands-mcp-status.js +0 -187
  266. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +0 -664
  267. package/dist/resources/extensions/gsd/commands-rate.js +0 -31
  268. package/dist/resources/extensions/gsd/commands-workflow-templates.js +0 -408
  269. package/dist/resources/extensions/gsd/commands.js +0 -9
  270. package/dist/resources/extensions/gsd/complexity-classifier.js +0 -259
  271. package/dist/resources/extensions/gsd/constants.js +0 -15
  272. package/dist/resources/extensions/gsd/context-budget.js +0 -179
  273. package/dist/resources/extensions/gsd/context-injector.js +0 -74
  274. package/dist/resources/extensions/gsd/context-store.js +0 -166
  275. package/dist/resources/extensions/gsd/crash-recovery.js +0 -112
  276. package/dist/resources/extensions/gsd/custom-execution-policy.js +0 -48
  277. package/dist/resources/extensions/gsd/custom-verification.js +0 -147
  278. package/dist/resources/extensions/gsd/custom-workflow-engine.js +0 -165
  279. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -539
  280. package/dist/resources/extensions/gsd/db-writer.js +0 -518
  281. package/dist/resources/extensions/gsd/debug-logger.js +0 -161
  282. package/dist/resources/extensions/gsd/definition-loader.js +0 -352
  283. package/dist/resources/extensions/gsd/detection.js +0 -977
  284. package/dist/resources/extensions/gsd/dev-execution-policy.js +0 -24
  285. package/dist/resources/extensions/gsd/dev-workflow-engine.js +0 -82
  286. package/dist/resources/extensions/gsd/diff-context.js +0 -168
  287. package/dist/resources/extensions/gsd/dispatch-guard.js +0 -114
  288. package/dist/resources/extensions/gsd/docs/claude-marketplace-import.md +0 -214
  289. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -671
  290. package/dist/resources/extensions/gsd/doctor-checks.js +0 -5
  291. package/dist/resources/extensions/gsd/doctor-engine-checks.js +0 -168
  292. package/dist/resources/extensions/gsd/doctor-environment.js +0 -565
  293. package/dist/resources/extensions/gsd/doctor-format.js +0 -86
  294. package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -433
  295. package/dist/resources/extensions/gsd/doctor-global-checks.js +0 -74
  296. package/dist/resources/extensions/gsd/doctor-proactive.js +0 -349
  297. package/dist/resources/extensions/gsd/doctor-providers.js +0 -356
  298. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +0 -601
  299. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  300. package/dist/resources/extensions/gsd/doctor.js +0 -765
  301. package/dist/resources/extensions/gsd/engine-resolver.js +0 -40
  302. package/dist/resources/extensions/gsd/engine-types.js +0 -8
  303. package/dist/resources/extensions/gsd/env-utils.js +0 -29
  304. package/dist/resources/extensions/gsd/error-classifier.js +0 -108
  305. package/dist/resources/extensions/gsd/error-utils.js +0 -6
  306. package/dist/resources/extensions/gsd/errors.js +0 -24
  307. package/dist/resources/extensions/gsd/execution-policy.js +0 -8
  308. package/dist/resources/extensions/gsd/exit-command.js +0 -22
  309. package/dist/resources/extensions/gsd/export-html.js +0 -1271
  310. package/dist/resources/extensions/gsd/export.js +0 -264
  311. package/dist/resources/extensions/gsd/extension-manifest.json +0 -33
  312. package/dist/resources/extensions/gsd/file-watcher.js +0 -80
  313. package/dist/resources/extensions/gsd/files.js +0 -863
  314. package/dist/resources/extensions/gsd/forensics.js +0 -996
  315. package/dist/resources/extensions/gsd/git-constants.js +0 -11
  316. package/dist/resources/extensions/gsd/git-self-heal.js +0 -113
  317. package/dist/resources/extensions/gsd/git-service.js +0 -586
  318. package/dist/resources/extensions/gsd/gitignore.js +0 -285
  319. package/dist/resources/extensions/gsd/graph.js +0 -225
  320. package/dist/resources/extensions/gsd/gsd-db.js +0 -1808
  321. package/dist/resources/extensions/gsd/guided-flow-queue.js +0 -365
  322. package/dist/resources/extensions/gsd/guided-flow.js +0 -1456
  323. package/dist/resources/extensions/gsd/health-widget-core.js +0 -89
  324. package/dist/resources/extensions/gsd/health-widget.js +0 -126
  325. package/dist/resources/extensions/gsd/history.js +0 -119
  326. package/dist/resources/extensions/gsd/index.js +0 -5
  327. package/dist/resources/extensions/gsd/init-wizard.js +0 -487
  328. package/dist/resources/extensions/gsd/journal.js +0 -85
  329. package/dist/resources/extensions/gsd/json-persistence.js +0 -70
  330. package/dist/resources/extensions/gsd/jsonl-utils.js +0 -24
  331. package/dist/resources/extensions/gsd/key-manager.js +0 -820
  332. package/dist/resources/extensions/gsd/markdown-renderer.js +0 -891
  333. package/dist/resources/extensions/gsd/marketplace-discovery.js +0 -356
  334. package/dist/resources/extensions/gsd/md-importer.js +0 -623
  335. package/dist/resources/extensions/gsd/memory-extractor.js +0 -302
  336. package/dist/resources/extensions/gsd/memory-store.js +0 -366
  337. package/dist/resources/extensions/gsd/metrics.js +0 -419
  338. package/dist/resources/extensions/gsd/migrate/command.js +0 -157
  339. package/dist/resources/extensions/gsd/migrate/index.js +0 -7
  340. package/dist/resources/extensions/gsd/migrate/parser.js +0 -268
  341. package/dist/resources/extensions/gsd/migrate/parsers.js +0 -477
  342. package/dist/resources/extensions/gsd/migrate/preview.js +0 -47
  343. package/dist/resources/extensions/gsd/migrate/transformer.js +0 -278
  344. package/dist/resources/extensions/gsd/migrate/types.js +0 -4
  345. package/dist/resources/extensions/gsd/migrate/validator.js +0 -41
  346. package/dist/resources/extensions/gsd/migrate/writer.js +0 -477
  347. package/dist/resources/extensions/gsd/migrate-external.js +0 -207
  348. package/dist/resources/extensions/gsd/milestone-actions.js +0 -130
  349. package/dist/resources/extensions/gsd/milestone-id-utils.js +0 -28
  350. package/dist/resources/extensions/gsd/milestone-ids.js +0 -116
  351. package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
  352. package/dist/resources/extensions/gsd/model-cost-table.js +0 -66
  353. package/dist/resources/extensions/gsd/model-router.js +0 -246
  354. package/dist/resources/extensions/gsd/namespaced-registry.js +0 -322
  355. package/dist/resources/extensions/gsd/namespaced-resolver.js +0 -176
  356. package/dist/resources/extensions/gsd/native-git-bridge.js +0 -992
  357. package/dist/resources/extensions/gsd/native-parser-bridge.js +0 -156
  358. package/dist/resources/extensions/gsd/notifications.js +0 -105
  359. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  360. package/dist/resources/extensions/gsd/package.json +0 -11
  361. package/dist/resources/extensions/gsd/parallel-eligibility.js +0 -188
  362. package/dist/resources/extensions/gsd/parallel-merge.js +0 -194
  363. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +0 -413
  364. package/dist/resources/extensions/gsd/parallel-orchestrator.js +0 -850
  365. package/dist/resources/extensions/gsd/parsers-legacy.js +0 -256
  366. package/dist/resources/extensions/gsd/paths.js +0 -527
  367. package/dist/resources/extensions/gsd/plugin-importer.js +0 -254
  368. package/dist/resources/extensions/gsd/post-unit-hooks.js +0 -48
  369. package/dist/resources/extensions/gsd/preferences-models.js +0 -295
  370. package/dist/resources/extensions/gsd/preferences-skills.js +0 -160
  371. package/dist/resources/extensions/gsd/preferences-types.js +0 -82
  372. package/dist/resources/extensions/gsd/preferences-validation.js +0 -852
  373. package/dist/resources/extensions/gsd/preferences.js +0 -432
  374. package/dist/resources/extensions/gsd/progress-score.js +0 -121
  375. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +0 -150
  376. package/dist/resources/extensions/gsd/prompt-loader.js +0 -156
  377. package/dist/resources/extensions/gsd/prompt-ordering.js +0 -170
  378. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +0 -66
  379. package/dist/resources/extensions/gsd/prompts/complete-slice.md +0 -40
  380. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +0 -253
  381. package/dist/resources/extensions/gsd/prompts/discuss.md +0 -290
  382. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +0 -29
  383. package/dist/resources/extensions/gsd/prompts/execute-task.md +0 -80
  384. package/dist/resources/extensions/gsd/prompts/forensics.md +0 -196
  385. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +0 -32
  386. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +0 -3
  387. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +0 -110
  388. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +0 -62
  389. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +0 -3
  390. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -30
  391. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +0 -3
  392. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +0 -15
  393. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +0 -1
  394. package/dist/resources/extensions/gsd/prompts/heal-skill.md +0 -45
  395. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +0 -108
  396. package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -89
  397. package/dist/resources/extensions/gsd/prompts/queue.md +0 -132
  398. package/dist/resources/extensions/gsd/prompts/quick-task.md +0 -44
  399. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +0 -44
  400. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +0 -66
  401. package/dist/resources/extensions/gsd/prompts/replan-slice.md +0 -39
  402. package/dist/resources/extensions/gsd/prompts/research-milestone.md +0 -47
  403. package/dist/resources/extensions/gsd/prompts/research-slice.md +0 -57
  404. package/dist/resources/extensions/gsd/prompts/rethink.md +0 -83
  405. package/dist/resources/extensions/gsd/prompts/review-migration.md +0 -66
  406. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +0 -31
  407. package/dist/resources/extensions/gsd/prompts/run-uat.md +0 -89
  408. package/dist/resources/extensions/gsd/prompts/system.md +0 -220
  409. package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -63
  410. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +0 -47
  411. package/dist/resources/extensions/gsd/prompts/workflow-start.md +0 -28
  412. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +0 -123
  413. package/dist/resources/extensions/gsd/provider-error-pause.js +0 -31
  414. package/dist/resources/extensions/gsd/queue-order.js +0 -178
  415. package/dist/resources/extensions/gsd/queue-reorder-ui.js +0 -235
  416. package/dist/resources/extensions/gsd/quick.js +0 -206
  417. package/dist/resources/extensions/gsd/reactive-graph.js +0 -257
  418. package/dist/resources/extensions/gsd/repo-identity.js +0 -641
  419. package/dist/resources/extensions/gsd/reports.js +0 -409
  420. package/dist/resources/extensions/gsd/rethink.js +0 -120
  421. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  422. package/dist/resources/extensions/gsd/roadmap-slices.js +0 -255
  423. package/dist/resources/extensions/gsd/routing-history.js +0 -210
  424. package/dist/resources/extensions/gsd/rtk-status.js +0 -43
  425. package/dist/resources/extensions/gsd/rule-registry.js +0 -488
  426. package/dist/resources/extensions/gsd/rule-types.js +0 -6
  427. package/dist/resources/extensions/gsd/run-manager.js +0 -134
  428. package/dist/resources/extensions/gsd/safe-fs.js +0 -52
  429. package/dist/resources/extensions/gsd/service-tier.js +0 -158
  430. package/dist/resources/extensions/gsd/session-forensics.js +0 -435
  431. package/dist/resources/extensions/gsd/session-lock.js +0 -554
  432. package/dist/resources/extensions/gsd/session-status-io.js +0 -134
  433. package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
  434. package/dist/resources/extensions/gsd/skill-discovery.js +0 -122
  435. package/dist/resources/extensions/gsd/skill-health.js +0 -326
  436. package/dist/resources/extensions/gsd/skill-telemetry.js +0 -121
  437. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +0 -242
  438. package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +0 -83
  439. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +0 -64
  440. package/dist/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +0 -176
  441. package/dist/resources/extensions/gsd/state.js +0 -1407
  442. package/dist/resources/extensions/gsd/status-guards.js +0 -12
  443. package/dist/resources/extensions/gsd/structured-data-formatter.js +0 -98
  444. package/dist/resources/extensions/gsd/sync-lock.js +0 -89
  445. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -80
  446. package/dist/resources/extensions/gsd/templates/context.md +0 -76
  447. package/dist/resources/extensions/gsd/templates/decisions.md +0 -8
  448. package/dist/resources/extensions/gsd/templates/knowledge.md +0 -19
  449. package/dist/resources/extensions/gsd/templates/milestone-summary.md +0 -81
  450. package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -74
  451. package/dist/resources/extensions/gsd/templates/plan.md +0 -148
  452. package/dist/resources/extensions/gsd/templates/project.md +0 -31
  453. package/dist/resources/extensions/gsd/templates/reassessment.md +0 -29
  454. package/dist/resources/extensions/gsd/templates/requirements.md +0 -81
  455. package/dist/resources/extensions/gsd/templates/research.md +0 -79
  456. package/dist/resources/extensions/gsd/templates/roadmap.md +0 -131
  457. package/dist/resources/extensions/gsd/templates/runtime.md +0 -21
  458. package/dist/resources/extensions/gsd/templates/secrets-manifest.md +0 -22
  459. package/dist/resources/extensions/gsd/templates/slice-context.md +0 -58
  460. package/dist/resources/extensions/gsd/templates/slice-summary.md +0 -108
  461. package/dist/resources/extensions/gsd/templates/state.md +0 -17
  462. package/dist/resources/extensions/gsd/templates/task-plan.md +0 -87
  463. package/dist/resources/extensions/gsd/templates/task-summary.md +0 -66
  464. package/dist/resources/extensions/gsd/templates/uat.md +0 -54
  465. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  466. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  467. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  468. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  469. package/dist/resources/extensions/gsd/token-counter.js +0 -54
  470. package/dist/resources/extensions/gsd/tools/complete-milestone.js +0 -172
  471. package/dist/resources/extensions/gsd/tools/complete-slice.js +0 -276
  472. package/dist/resources/extensions/gsd/tools/complete-task.js +0 -205
  473. package/dist/resources/extensions/gsd/tools/plan-milestone.js +0 -250
  474. package/dist/resources/extensions/gsd/tools/plan-slice.js +0 -199
  475. package/dist/resources/extensions/gsd/tools/plan-task.js +0 -121
  476. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +0 -219
  477. package/dist/resources/extensions/gsd/tools/reopen-slice.js +0 -87
  478. package/dist/resources/extensions/gsd/tools/reopen-task.js +0 -91
  479. package/dist/resources/extensions/gsd/tools/replan-slice.js +0 -188
  480. package/dist/resources/extensions/gsd/tools/validate-milestone.js +0 -110
  481. package/dist/resources/extensions/gsd/triage-resolution.js +0 -322
  482. package/dist/resources/extensions/gsd/triage-ui.js +0 -135
  483. package/dist/resources/extensions/gsd/types.js +0 -4
  484. package/dist/resources/extensions/gsd/undo.js +0 -400
  485. package/dist/resources/extensions/gsd/unit-id.js +0 -7
  486. package/dist/resources/extensions/gsd/unit-ownership.js +0 -216
  487. package/dist/resources/extensions/gsd/unit-runtime.js +0 -132
  488. package/dist/resources/extensions/gsd/validate-directory.js +0 -143
  489. package/dist/resources/extensions/gsd/validation.js +0 -21
  490. package/dist/resources/extensions/gsd/verdict-parser.js +0 -96
  491. package/dist/resources/extensions/gsd/verification-evidence.js +0 -122
  492. package/dist/resources/extensions/gsd/verification-gate.js +0 -519
  493. package/dist/resources/extensions/gsd/visualizer-data.js +0 -674
  494. package/dist/resources/extensions/gsd/visualizer-overlay.js +0 -501
  495. package/dist/resources/extensions/gsd/visualizer-views.js +0 -945
  496. package/dist/resources/extensions/gsd/workflow-engine.js +0 -7
  497. package/dist/resources/extensions/gsd/workflow-events.js +0 -102
  498. package/dist/resources/extensions/gsd/workflow-logger.js +0 -192
  499. package/dist/resources/extensions/gsd/workflow-manifest.js +0 -263
  500. package/dist/resources/extensions/gsd/workflow-migration.js +0 -280
  501. package/dist/resources/extensions/gsd/workflow-projections.js +0 -405
  502. package/dist/resources/extensions/gsd/workflow-reconcile.js +0 -441
  503. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +0 -87
  504. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +0 -74
  505. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +0 -40
  506. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +0 -45
  507. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +0 -83
  508. package/dist/resources/extensions/gsd/workflow-templates/registry.json +0 -85
  509. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +0 -73
  510. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +0 -81
  511. package/dist/resources/extensions/gsd/workflow-templates/spike.md +0 -69
  512. package/dist/resources/extensions/gsd/workflow-templates.js +0 -200
  513. package/dist/resources/extensions/gsd/workspace-index.js +0 -190
  514. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +0 -40
  515. package/dist/resources/extensions/gsd/worktree-command.js +0 -702
  516. package/dist/resources/extensions/gsd/worktree-health.js +0 -126
  517. package/dist/resources/extensions/gsd/worktree-manager.js +0 -518
  518. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -480
  519. package/dist/resources/extensions/gsd/worktree.js +0 -310
  520. package/dist/resources/extensions/gsd/write-intercept.js +0 -84
  521. package/src/resources/extensions/github-sync/cli.ts +0 -364
  522. package/src/resources/extensions/github-sync/index.ts +0 -93
  523. package/src/resources/extensions/github-sync/mapping.ts +0 -81
  524. package/src/resources/extensions/github-sync/sync.ts +0 -557
  525. package/src/resources/extensions/github-sync/templates.ts +0 -183
  526. package/src/resources/extensions/github-sync/tests/cli.test.ts +0 -20
  527. package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +0 -43
  528. package/src/resources/extensions/github-sync/tests/mapping.test.ts +0 -104
  529. package/src/resources/extensions/github-sync/tests/templates.test.ts +0 -110
  530. package/src/resources/extensions/github-sync/types.ts +0 -47
  531. package/src/resources/extensions/gsd/activity-log.ts +0 -163
  532. package/src/resources/extensions/gsd/atomic-write.ts +0 -185
  533. package/src/resources/extensions/gsd/auto/detect-stuck.ts +0 -60
  534. package/src/resources/extensions/gsd/auto/infra-errors.ts +0 -48
  535. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -268
  536. package/src/resources/extensions/gsd/auto/loop.ts +0 -318
  537. package/src/resources/extensions/gsd/auto/phases.ts +0 -1327
  538. package/src/resources/extensions/gsd/auto/resolve.ts +0 -106
  539. package/src/resources/extensions/gsd/auto/run-unit.ts +0 -136
  540. package/src/resources/extensions/gsd/auto/session.ts +0 -237
  541. package/src/resources/extensions/gsd/auto/types.ts +0 -117
  542. package/src/resources/extensions/gsd/auto-artifact-paths.ts +0 -135
  543. package/src/resources/extensions/gsd/auto-budget.ts +0 -32
  544. package/src/resources/extensions/gsd/auto-dashboard.ts +0 -880
  545. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +0 -256
  546. package/src/resources/extensions/gsd/auto-dispatch.ts +0 -781
  547. package/src/resources/extensions/gsd/auto-loop.ts +0 -16
  548. package/src/resources/extensions/gsd/auto-model-selection.ts +0 -251
  549. package/src/resources/extensions/gsd/auto-observability.ts +0 -72
  550. package/src/resources/extensions/gsd/auto-post-unit.ts +0 -687
  551. package/src/resources/extensions/gsd/auto-prompts.ts +0 -1896
  552. package/src/resources/extensions/gsd/auto-recovery.ts +0 -594
  553. package/src/resources/extensions/gsd/auto-start.ts +0 -737
  554. package/src/resources/extensions/gsd/auto-supervisor.ts +0 -79
  555. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +0 -262
  556. package/src/resources/extensions/gsd/auto-timers.ts +0 -313
  557. package/src/resources/extensions/gsd/auto-tool-tracking.ts +0 -85
  558. package/src/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  559. package/src/resources/extensions/gsd/auto-utils.ts +0 -25
  560. package/src/resources/extensions/gsd/auto-verification.ts +0 -225
  561. package/src/resources/extensions/gsd/auto-worktree.ts +0 -1897
  562. package/src/resources/extensions/gsd/auto.ts +0 -1477
  563. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -219
  564. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +0 -1286
  565. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +0 -194
  566. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +0 -62
  567. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +0 -53
  568. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +0 -61
  569. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -282
  570. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +0 -56
  571. package/src/resources/extensions/gsd/bootstrap/system-context.ts +0 -416
  572. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +0 -91
  573. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -126
  574. package/src/resources/extensions/gsd/branch-patterns.ts +0 -16
  575. package/src/resources/extensions/gsd/cache.ts +0 -29
  576. package/src/resources/extensions/gsd/captures.ts +0 -502
  577. package/src/resources/extensions/gsd/changelog.ts +0 -213
  578. package/src/resources/extensions/gsd/claude-import.ts +0 -705
  579. package/src/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  580. package/src/resources/extensions/gsd/commands/catalog.ts +0 -359
  581. package/src/resources/extensions/gsd/commands/context.ts +0 -108
  582. package/src/resources/extensions/gsd/commands/dispatcher.ts +0 -32
  583. package/src/resources/extensions/gsd/commands/handlers/auto.ts +0 -184
  584. package/src/resources/extensions/gsd/commands/handlers/core.ts +0 -277
  585. package/src/resources/extensions/gsd/commands/handlers/ops.ts +0 -210
  586. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +0 -135
  587. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -281
  588. package/src/resources/extensions/gsd/commands/index.ts +0 -14
  589. package/src/resources/extensions/gsd/commands-bootstrap.ts +0 -253
  590. package/src/resources/extensions/gsd/commands-cmux.ts +0 -143
  591. package/src/resources/extensions/gsd/commands-config.ts +0 -108
  592. package/src/resources/extensions/gsd/commands-extensions.ts +0 -330
  593. package/src/resources/extensions/gsd/commands-handlers.ts +0 -404
  594. package/src/resources/extensions/gsd/commands-inspect.ts +0 -98
  595. package/src/resources/extensions/gsd/commands-logs.ts +0 -536
  596. package/src/resources/extensions/gsd/commands-maintenance.ts +0 -535
  597. package/src/resources/extensions/gsd/commands-mcp-status.ts +0 -247
  598. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +0 -784
  599. package/src/resources/extensions/gsd/commands-rate.ts +0 -55
  600. package/src/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  601. package/src/resources/extensions/gsd/commands.ts +0 -17
  602. package/src/resources/extensions/gsd/complexity-classifier.ts +0 -322
  603. package/src/resources/extensions/gsd/constants.ts +0 -21
  604. package/src/resources/extensions/gsd/context-budget.ts +0 -256
  605. package/src/resources/extensions/gsd/context-injector.ts +0 -100
  606. package/src/resources/extensions/gsd/context-store.ts +0 -196
  607. package/src/resources/extensions/gsd/crash-recovery.ts +0 -120
  608. package/src/resources/extensions/gsd/custom-execution-policy.ts +0 -74
  609. package/src/resources/extensions/gsd/custom-verification.ts +0 -182
  610. package/src/resources/extensions/gsd/custom-workflow-engine.ts +0 -217
  611. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -659
  612. package/src/resources/extensions/gsd/db-writer.ts +0 -612
  613. package/src/resources/extensions/gsd/debug-logger.ts +0 -178
  614. package/src/resources/extensions/gsd/definition-loader.ts +0 -462
  615. package/src/resources/extensions/gsd/detection.ts +0 -1148
  616. package/src/resources/extensions/gsd/dev-execution-policy.ts +0 -51
  617. package/src/resources/extensions/gsd/dev-workflow-engine.ts +0 -110
  618. package/src/resources/extensions/gsd/diff-context.ts +0 -214
  619. package/src/resources/extensions/gsd/dispatch-guard.ts +0 -120
  620. package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +0 -214
  621. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -671
  622. package/src/resources/extensions/gsd/doctor-checks.ts +0 -5
  623. package/src/resources/extensions/gsd/doctor-engine-checks.ts +0 -182
  624. package/src/resources/extensions/gsd/doctor-environment.ts +0 -642
  625. package/src/resources/extensions/gsd/doctor-format.ts +0 -98
  626. package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -441
  627. package/src/resources/extensions/gsd/doctor-global-checks.ts +0 -84
  628. package/src/resources/extensions/gsd/doctor-proactive.ts +0 -431
  629. package/src/resources/extensions/gsd/doctor-providers.ts +0 -415
  630. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +0 -627
  631. package/src/resources/extensions/gsd/doctor-types.ts +0 -123
  632. package/src/resources/extensions/gsd/doctor.ts +0 -808
  633. package/src/resources/extensions/gsd/engine-resolver.ts +0 -57
  634. package/src/resources/extensions/gsd/engine-types.ts +0 -71
  635. package/src/resources/extensions/gsd/env-utils.ts +0 -31
  636. package/src/resources/extensions/gsd/error-classifier.ts +0 -142
  637. package/src/resources/extensions/gsd/error-utils.ts +0 -6
  638. package/src/resources/extensions/gsd/errors.ts +0 -29
  639. package/src/resources/extensions/gsd/execution-policy.ts +0 -43
  640. package/src/resources/extensions/gsd/exit-command.ts +0 -30
  641. package/src/resources/extensions/gsd/export-html.ts +0 -1408
  642. package/src/resources/extensions/gsd/export.ts +0 -310
  643. package/src/resources/extensions/gsd/extension-manifest.json +0 -33
  644. package/src/resources/extensions/gsd/file-watcher.ts +0 -100
  645. package/src/resources/extensions/gsd/files.ts +0 -971
  646. package/src/resources/extensions/gsd/forensics.ts +0 -1178
  647. package/src/resources/extensions/gsd/git-constants.ts +0 -12
  648. package/src/resources/extensions/gsd/git-self-heal.ts +0 -127
  649. package/src/resources/extensions/gsd/git-service.ts +0 -755
  650. package/src/resources/extensions/gsd/gitignore.ts +0 -315
  651. package/src/resources/extensions/gsd/graph.ts +0 -312
  652. package/src/resources/extensions/gsd/gsd-db.ts +0 -2205
  653. package/src/resources/extensions/gsd/guided-flow-queue.ts +0 -439
  654. package/src/resources/extensions/gsd/guided-flow.ts +0 -1666
  655. package/src/resources/extensions/gsd/health-widget-core.ts +0 -111
  656. package/src/resources/extensions/gsd/health-widget.ts +0 -143
  657. package/src/resources/extensions/gsd/history.ts +0 -144
  658. package/src/resources/extensions/gsd/index.ts +0 -14
  659. package/src/resources/extensions/gsd/init-wizard.ts +0 -595
  660. package/src/resources/extensions/gsd/journal.ts +0 -139
  661. package/src/resources/extensions/gsd/json-persistence.ts +0 -75
  662. package/src/resources/extensions/gsd/jsonl-utils.ts +0 -21
  663. package/src/resources/extensions/gsd/key-manager.ts +0 -987
  664. package/src/resources/extensions/gsd/markdown-renderer.ts +0 -1132
  665. package/src/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  666. package/src/resources/extensions/gsd/md-importer.ts +0 -742
  667. package/src/resources/extensions/gsd/memory-extractor.ts +0 -360
  668. package/src/resources/extensions/gsd/memory-store.ts +0 -452
  669. package/src/resources/extensions/gsd/metrics.ts +0 -575
  670. package/src/resources/extensions/gsd/migrate/command.ts +0 -219
  671. package/src/resources/extensions/gsd/migrate/index.ts +0 -42
  672. package/src/resources/extensions/gsd/migrate/parser.ts +0 -323
  673. package/src/resources/extensions/gsd/migrate/parsers.ts +0 -539
  674. package/src/resources/extensions/gsd/migrate/preview.ts +0 -48
  675. package/src/resources/extensions/gsd/migrate/transformer.ts +0 -346
  676. package/src/resources/extensions/gsd/migrate/types.ts +0 -370
  677. package/src/resources/extensions/gsd/migrate/validator.ts +0 -55
  678. package/src/resources/extensions/gsd/migrate/writer.ts +0 -579
  679. package/src/resources/extensions/gsd/migrate-external.ts +0 -210
  680. package/src/resources/extensions/gsd/milestone-actions.ts +0 -143
  681. package/src/resources/extensions/gsd/milestone-id-utils.ts +0 -32
  682. package/src/resources/extensions/gsd/milestone-ids.ts +0 -135
  683. package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
  684. package/src/resources/extensions/gsd/model-cost-table.ts +0 -84
  685. package/src/resources/extensions/gsd/model-router.ts +0 -315
  686. package/src/resources/extensions/gsd/namespaced-registry.ts +0 -467
  687. package/src/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  688. package/src/resources/extensions/gsd/native-git-bridge.ts +0 -1197
  689. package/src/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  690. package/src/resources/extensions/gsd/notifications.ts +0 -135
  691. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  692. package/src/resources/extensions/gsd/package.json +0 -11
  693. package/src/resources/extensions/gsd/parallel-eligibility.ts +0 -242
  694. package/src/resources/extensions/gsd/parallel-merge.ts +0 -240
  695. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +0 -497
  696. package/src/resources/extensions/gsd/parallel-orchestrator.ts +0 -1013
  697. package/src/resources/extensions/gsd/parsers-legacy.ts +0 -290
  698. package/src/resources/extensions/gsd/paths.ts +0 -561
  699. package/src/resources/extensions/gsd/plugin-importer.ts +0 -411
  700. package/src/resources/extensions/gsd/post-unit-hooks.ts +0 -86
  701. package/src/resources/extensions/gsd/preferences-models.ts +0 -330
  702. package/src/resources/extensions/gsd/preferences-skills.ts +0 -175
  703. package/src/resources/extensions/gsd/preferences-types.ts +0 -285
  704. package/src/resources/extensions/gsd/preferences-validation.ts +0 -823
  705. package/src/resources/extensions/gsd/preferences.ts +0 -539
  706. package/src/resources/extensions/gsd/progress-score.ts +0 -161
  707. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  708. package/src/resources/extensions/gsd/prompt-loader.ts +0 -169
  709. package/src/resources/extensions/gsd/prompt-ordering.ts +0 -200
  710. package/src/resources/extensions/gsd/prompts/complete-milestone.md +0 -66
  711. package/src/resources/extensions/gsd/prompts/complete-slice.md +0 -40
  712. package/src/resources/extensions/gsd/prompts/discuss-headless.md +0 -253
  713. package/src/resources/extensions/gsd/prompts/discuss.md +0 -290
  714. package/src/resources/extensions/gsd/prompts/doctor-heal.md +0 -29
  715. package/src/resources/extensions/gsd/prompts/execute-task.md +0 -80
  716. package/src/resources/extensions/gsd/prompts/forensics.md +0 -196
  717. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +0 -32
  718. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +0 -3
  719. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +0 -110
  720. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +0 -62
  721. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +0 -3
  722. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -30
  723. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +0 -3
  724. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +0 -15
  725. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +0 -1
  726. package/src/resources/extensions/gsd/prompts/heal-skill.md +0 -45
  727. package/src/resources/extensions/gsd/prompts/plan-milestone.md +0 -108
  728. package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -89
  729. package/src/resources/extensions/gsd/prompts/queue.md +0 -132
  730. package/src/resources/extensions/gsd/prompts/quick-task.md +0 -44
  731. package/src/resources/extensions/gsd/prompts/reactive-execute.md +0 -44
  732. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +0 -66
  733. package/src/resources/extensions/gsd/prompts/replan-slice.md +0 -39
  734. package/src/resources/extensions/gsd/prompts/research-milestone.md +0 -47
  735. package/src/resources/extensions/gsd/prompts/research-slice.md +0 -57
  736. package/src/resources/extensions/gsd/prompts/rethink.md +0 -83
  737. package/src/resources/extensions/gsd/prompts/review-migration.md +0 -66
  738. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +0 -31
  739. package/src/resources/extensions/gsd/prompts/run-uat.md +0 -89
  740. package/src/resources/extensions/gsd/prompts/system.md +0 -220
  741. package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -63
  742. package/src/resources/extensions/gsd/prompts/validate-milestone.md +0 -47
  743. package/src/resources/extensions/gsd/prompts/workflow-start.md +0 -28
  744. package/src/resources/extensions/gsd/prompts/worktree-merge.md +0 -123
  745. package/src/resources/extensions/gsd/provider-error-pause.ts +0 -49
  746. package/src/resources/extensions/gsd/queue-order.ts +0 -230
  747. package/src/resources/extensions/gsd/queue-reorder-ui.ts +0 -277
  748. package/src/resources/extensions/gsd/quick.ts +0 -257
  749. package/src/resources/extensions/gsd/reactive-graph.ts +0 -319
  750. package/src/resources/extensions/gsd/repo-identity.ts +0 -657
  751. package/src/resources/extensions/gsd/reports.ts +0 -504
  752. package/src/resources/extensions/gsd/rethink.ts +0 -160
  753. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  754. package/src/resources/extensions/gsd/roadmap-slices.ts +0 -273
  755. package/src/resources/extensions/gsd/routing-history.ts +0 -286
  756. package/src/resources/extensions/gsd/rtk-status.ts +0 -53
  757. package/src/resources/extensions/gsd/rule-registry.ts +0 -598
  758. package/src/resources/extensions/gsd/rule-types.ts +0 -68
  759. package/src/resources/extensions/gsd/run-manager.ts +0 -180
  760. package/src/resources/extensions/gsd/safe-fs.ts +0 -47
  761. package/src/resources/extensions/gsd/service-tier.ts +0 -196
  762. package/src/resources/extensions/gsd/session-forensics.ts +0 -546
  763. package/src/resources/extensions/gsd/session-lock.ts +0 -640
  764. package/src/resources/extensions/gsd/session-status-io.ts +0 -179
  765. package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
  766. package/src/resources/extensions/gsd/skill-discovery.ts +0 -140
  767. package/src/resources/extensions/gsd/skill-health.ts +0 -418
  768. package/src/resources/extensions/gsd/skill-telemetry.ts +0 -137
  769. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +0 -242
  770. package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +0 -83
  771. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +0 -64
  772. package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +0 -176
  773. package/src/resources/extensions/gsd/state.ts +0 -1554
  774. package/src/resources/extensions/gsd/status-guards.ts +0 -13
  775. package/src/resources/extensions/gsd/structured-data-formatter.ts +0 -146
  776. package/src/resources/extensions/gsd/sync-lock.ts +0 -94
  777. package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -80
  778. package/src/resources/extensions/gsd/templates/context.md +0 -76
  779. package/src/resources/extensions/gsd/templates/decisions.md +0 -8
  780. package/src/resources/extensions/gsd/templates/knowledge.md +0 -19
  781. package/src/resources/extensions/gsd/templates/milestone-summary.md +0 -81
  782. package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -74
  783. package/src/resources/extensions/gsd/templates/plan.md +0 -148
  784. package/src/resources/extensions/gsd/templates/project.md +0 -31
  785. package/src/resources/extensions/gsd/templates/reassessment.md +0 -29
  786. package/src/resources/extensions/gsd/templates/requirements.md +0 -81
  787. package/src/resources/extensions/gsd/templates/research.md +0 -79
  788. package/src/resources/extensions/gsd/templates/roadmap.md +0 -131
  789. package/src/resources/extensions/gsd/templates/runtime.md +0 -21
  790. package/src/resources/extensions/gsd/templates/secrets-manifest.md +0 -22
  791. package/src/resources/extensions/gsd/templates/slice-context.md +0 -58
  792. package/src/resources/extensions/gsd/templates/slice-summary.md +0 -108
  793. package/src/resources/extensions/gsd/templates/state.md +0 -17
  794. package/src/resources/extensions/gsd/templates/task-plan.md +0 -87
  795. package/src/resources/extensions/gsd/templates/task-summary.md +0 -66
  796. package/src/resources/extensions/gsd/templates/uat.md +0 -54
  797. package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +0 -91
  798. package/src/resources/extensions/gsd/tests/activity-log.test.ts +0 -175
  799. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -143
  800. package/src/resources/extensions/gsd/tests/atomic-write.test.ts +0 -144
  801. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  802. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -211
  803. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -213
  804. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -2307
  805. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +0 -61
  806. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
  807. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +0 -209
  808. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +0 -129
  809. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +0 -88
  810. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -255
  811. package/src/resources/extensions/gsd/tests/auto-stale-lock-self-kill.test.ts +0 -87
  812. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +0 -37
  813. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -28
  814. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -218
  815. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  816. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +0 -80
  817. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +0 -83
  818. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -133
  819. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  820. package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +0 -180
  821. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -294
  822. package/src/resources/extensions/gsd/tests/captures.test.ts +0 -524
  823. package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +0 -191
  824. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -350
  825. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
  826. package/src/resources/extensions/gsd/tests/cmux.test.ts +0 -215
  827. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -506
  828. package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  829. package/src/resources/extensions/gsd/tests/commands-config.test.ts +0 -24
  830. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +0 -46
  831. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  832. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +0 -283
  833. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -311
  834. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -432
  835. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +0 -106
  836. package/src/resources/extensions/gsd/tests/complete-task.test.ts +0 -454
  837. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +0 -111
  838. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
  839. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  840. package/src/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  841. package/src/resources/extensions/gsd/tests/context-injector.test.ts +0 -313
  842. package/src/resources/extensions/gsd/tests/context-store.test.ts +0 -454
  843. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +0 -120
  844. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -122
  845. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -535
  846. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -415
  847. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +0 -339
  848. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -329
  849. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +0 -87
  850. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
  851. package/src/resources/extensions/gsd/tests/db-writer.test.ts +0 -656
  852. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  853. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +0 -762
  854. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -512
  855. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +0 -121
  856. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -1127
  857. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
  858. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -310
  859. package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -982
  860. package/src/resources/extensions/gsd/tests/detection.test.ts +0 -1190
  861. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +0 -314
  862. package/src/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  863. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
  864. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
  865. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  866. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -281
  867. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -265
  868. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -126
  869. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -172
  870. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  871. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -603
  872. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
  873. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  874. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
  875. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
  876. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +0 -271
  877. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +0 -164
  878. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +0 -120
  879. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
  880. package/src/resources/extensions/gsd/tests/exit-command.test.ts +0 -101
  881. package/src/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  882. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -379
  883. package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  884. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +0 -18
  885. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +0 -278
  886. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
  887. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  888. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  889. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +0 -121
  890. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +0 -43
  891. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  892. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +0 -232
  893. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +0 -189
  894. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +0 -156
  895. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -593
  896. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -351
  897. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -114
  898. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +0 -440
  899. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -406
  900. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
  901. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
  902. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
  903. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  904. package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
  905. package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -179
  906. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
  907. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +0 -98
  908. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  909. package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  910. package/src/resources/extensions/gsd/tests/infra-error.test.ts +0 -129
  911. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +0 -195
  912. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +0 -248
  913. package/src/resources/extensions/gsd/tests/integration/atomic-task-closeout.test.ts +0 -72
  914. package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
  915. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -825
  916. package/src/resources/extensions/gsd/tests/integration/auto-secrets-gate.test.ts +0 -194
  917. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +0 -121
  918. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -759
  919. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -348
  920. package/src/resources/extensions/gsd/tests/integration/continue-here.test.ts +0 -281
  921. package/src/resources/extensions/gsd/tests/integration/doctor-completion-deferral.test.ts +0 -88
  922. package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
  923. package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
  924. package/src/resources/extensions/gsd/tests/integration/doctor-environment-worktree.test.ts +0 -164
  925. package/src/resources/extensions/gsd/tests/integration/doctor-environment.test.ts +0 -403
  926. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
  927. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -212
  928. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -653
  929. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -325
  930. package/src/resources/extensions/gsd/tests/integration/doctor-roadmap-summary-atomicity.test.ts +0 -123
  931. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -377
  932. package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
  933. package/src/resources/extensions/gsd/tests/integration/e2e-workflow-pipeline-integration.test.ts +0 -476
  934. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +0 -415
  935. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +0 -119
  936. package/src/resources/extensions/gsd/tests/integration/git-self-heal.test.ts +0 -131
  937. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +0 -1458
  938. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
  939. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +0 -256
  940. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  941. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +0 -359
  942. package/src/resources/extensions/gsd/tests/integration/inherited-repo-home-dir.test.ts +0 -191
  943. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +0 -266
  944. package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
  945. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +0 -634
  946. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -360
  947. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -166
  948. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -577
  949. package/src/resources/extensions/gsd/tests/integration/parallel-workers-multi-milestone-e2e.test.ts +0 -337
  950. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +0 -98
  951. package/src/resources/extensions/gsd/tests/integration/plugin-importer-live.test.ts +0 -481
  952. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +0 -155
  953. package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
  954. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +0 -253
  955. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +0 -609
  956. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
  957. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -364
  958. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -237
  959. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +0 -223
  960. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +0 -119
  961. package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +0 -429
  962. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -601
  963. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +0 -147
  964. package/src/resources/extensions/gsd/tests/journal.test.ts +0 -341
  965. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +0 -183
  966. package/src/resources/extensions/gsd/tests/key-manager.test.ts +0 -429
  967. package/src/resources/extensions/gsd/tests/knowledge.test.ts +0 -250
  968. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +0 -15
  969. package/src/resources/extensions/gsd/tests/manifest-status.test.ts +0 -274
  970. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +0 -1161
  971. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  972. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +0 -103
  973. package/src/resources/extensions/gsd/tests/md-importer.test.ts +0 -416
  974. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -254
  975. package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  976. package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -332
  977. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +0 -66
  978. package/src/resources/extensions/gsd/tests/metrics.test.ts +0 -384
  979. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
  980. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +0 -429
  981. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -748
  982. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -619
  983. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -390
  984. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -295
  985. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -361
  986. package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +0 -73
  987. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +0 -51
  988. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -140
  989. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +0 -130
  990. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -103
  991. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  992. package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -272
  993. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -220
  994. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -278
  995. package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  996. package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  997. package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  998. package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  999. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -152
  1000. package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -134
  1001. package/src/resources/extensions/gsd/tests/overrides.test.ts +0 -124
  1002. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -330
  1003. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
  1004. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -284
  1005. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
  1006. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +0 -60
  1007. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -736
  1008. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +0 -277
  1009. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +0 -226
  1010. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -199
  1011. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +0 -85
  1012. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
  1013. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +0 -354
  1014. package/src/resources/extensions/gsd/tests/parsers.test.ts +0 -1867
  1015. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +0 -103
  1016. package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +0 -48
  1017. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
  1018. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -231
  1019. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  1020. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -298
  1021. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +0 -179
  1022. package/src/resources/extensions/gsd/tests/plan-task.test.ts +0 -145
  1023. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +0 -305
  1024. package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  1025. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +0 -171
  1026. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -300
  1027. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +0 -133
  1028. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -463
  1029. package/src/resources/extensions/gsd/tests/preflight-context-draft-filter.test.ts +0 -115
  1030. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
  1031. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +0 -174
  1032. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  1033. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  1034. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -239
  1035. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +0 -387
  1036. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
  1037. package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  1038. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
  1039. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -479
  1040. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +0 -347
  1041. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -100
  1042. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
  1043. package/src/resources/extensions/gsd/tests/queue-order.test.ts +0 -192
  1044. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
  1045. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
  1046. package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +0 -90
  1047. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +0 -511
  1048. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +0 -299
  1049. package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  1050. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -442
  1051. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -135
  1052. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
  1053. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +0 -176
  1054. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  1055. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +0 -59
  1056. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +0 -110
  1057. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +0 -755
  1058. package/src/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  1059. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +0 -155
  1060. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +0 -165
  1061. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +0 -410
  1062. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -606
  1063. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +0 -231
  1064. package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -101
  1065. package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  1066. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  1067. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
  1068. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +0 -305
  1069. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
  1070. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -399
  1071. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -395
  1072. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +0 -296
  1073. package/src/resources/extensions/gsd/tests/routing-history.test.ts +0 -229
  1074. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +0 -411
  1075. package/src/resources/extensions/gsd/tests/run-manager.test.ts +0 -229
  1076. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +0 -176
  1077. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -319
  1078. package/src/resources/extensions/gsd/tests/service-tier.test.ts +0 -127
  1079. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +0 -166
  1080. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -315
  1081. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +0 -224
  1082. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +0 -209
  1083. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +0 -181
  1084. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +0 -103
  1085. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +0 -233
  1086. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
  1087. package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  1088. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
  1089. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +0 -53
  1090. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  1091. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -65
  1092. package/src/resources/extensions/gsd/tests/stale-milestone-id-reservation.test.ts +0 -79
  1093. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -139
  1094. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +0 -100
  1095. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +0 -125
  1096. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
  1097. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
  1098. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
  1099. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
  1100. package/src/resources/extensions/gsd/tests/status-guards.test.ts +0 -30
  1101. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +0 -67
  1102. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
  1103. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -158
  1104. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -366
  1105. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
  1106. package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +0 -44
  1107. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
  1108. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +0 -108
  1109. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +0 -145
  1110. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +0 -122
  1111. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -84
  1112. package/src/resources/extensions/gsd/tests/test-utils.ts +0 -165
  1113. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +0 -118
  1114. package/src/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  1115. package/src/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  1116. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +0 -166
  1117. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +0 -125
  1118. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -345
  1119. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -563
  1120. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
  1121. package/src/resources/extensions/gsd/tests/unborn-branch.test.ts +0 -85
  1122. package/src/resources/extensions/gsd/tests/undo.test.ts +0 -462
  1123. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -203
  1124. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +0 -258
  1125. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -257
  1126. package/src/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  1127. package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +0 -115
  1128. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
  1129. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +0 -237
  1130. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +0 -115
  1131. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -393
  1132. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +0 -166
  1133. package/src/resources/extensions/gsd/tests/validation.test.ts +0 -72
  1134. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
  1135. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -601
  1136. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -999
  1137. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
  1138. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -143
  1139. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -444
  1140. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -235
  1141. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -716
  1142. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +0 -97
  1143. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +0 -146
  1144. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +0 -205
  1145. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -403
  1146. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -278
  1147. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +0 -173
  1148. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -171
  1149. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  1150. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -117
  1151. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -202
  1152. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
  1153. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +0 -175
  1154. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +0 -445
  1155. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +0 -142
  1156. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +0 -181
  1157. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -200
  1158. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +0 -220
  1159. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -238
  1160. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
  1161. package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  1162. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +0 -155
  1163. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -962
  1164. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +0 -65
  1165. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +0 -133
  1166. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -617
  1167. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +0 -204
  1168. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +0 -206
  1169. package/src/resources/extensions/gsd/tests/worktree.test.ts +0 -279
  1170. package/src/resources/extensions/gsd/tests/write-gate.test.ts +0 -193
  1171. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +0 -76
  1172. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
  1173. package/src/resources/extensions/gsd/token-counter.ts +0 -65
  1174. package/src/resources/extensions/gsd/tools/complete-milestone.ts +0 -229
  1175. package/src/resources/extensions/gsd/tools/complete-slice.ts +0 -340
  1176. package/src/resources/extensions/gsd/tools/complete-task.ts +0 -257
  1177. package/src/resources/extensions/gsd/tools/plan-milestone.ts +0 -304
  1178. package/src/resources/extensions/gsd/tools/plan-slice.ts +0 -250
  1179. package/src/resources/extensions/gsd/tools/plan-task.ts +0 -152
  1180. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -288
  1181. package/src/resources/extensions/gsd/tools/reopen-slice.ts +0 -126
  1182. package/src/resources/extensions/gsd/tools/reopen-task.ts +0 -130
  1183. package/src/resources/extensions/gsd/tools/replan-slice.ts +0 -243
  1184. package/src/resources/extensions/gsd/tools/validate-milestone.ts +0 -156
  1185. package/src/resources/extensions/gsd/triage-resolution.ts +0 -413
  1186. package/src/resources/extensions/gsd/triage-ui.ts +0 -187
  1187. package/src/resources/extensions/gsd/types.ts +0 -593
  1188. package/src/resources/extensions/gsd/undo.ts +0 -464
  1189. package/src/resources/extensions/gsd/unit-id.ts +0 -14
  1190. package/src/resources/extensions/gsd/unit-ownership.ts +0 -275
  1191. package/src/resources/extensions/gsd/unit-runtime.ts +0 -189
  1192. package/src/resources/extensions/gsd/validate-directory.ts +0 -164
  1193. package/src/resources/extensions/gsd/validation.ts +0 -23
  1194. package/src/resources/extensions/gsd/verdict-parser.ts +0 -110
  1195. package/src/resources/extensions/gsd/verification-evidence.ts +0 -202
  1196. package/src/resources/extensions/gsd/verification-gate.ts +0 -634
  1197. package/src/resources/extensions/gsd/visualizer-data.ts +0 -953
  1198. package/src/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  1199. package/src/resources/extensions/gsd/visualizer-views.ts +0 -1229
  1200. package/src/resources/extensions/gsd/workflow-engine.ts +0 -38
  1201. package/src/resources/extensions/gsd/workflow-events.ts +0 -154
  1202. package/src/resources/extensions/gsd/workflow-logger.ts +0 -244
  1203. package/src/resources/extensions/gsd/workflow-manifest.ts +0 -351
  1204. package/src/resources/extensions/gsd/workflow-migration.ts +0 -345
  1205. package/src/resources/extensions/gsd/workflow-projections.ts +0 -458
  1206. package/src/resources/extensions/gsd/workflow-reconcile.ts +0 -532
  1207. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +0 -87
  1208. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +0 -74
  1209. package/src/resources/extensions/gsd/workflow-templates/full-project.md +0 -40
  1210. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +0 -45
  1211. package/src/resources/extensions/gsd/workflow-templates/refactor.md +0 -83
  1212. package/src/resources/extensions/gsd/workflow-templates/registry.json +0 -85
  1213. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +0 -73
  1214. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +0 -81
  1215. package/src/resources/extensions/gsd/workflow-templates/spike.md +0 -69
  1216. package/src/resources/extensions/gsd/workflow-templates.ts +0 -252
  1217. package/src/resources/extensions/gsd/workspace-index.ts +0 -272
  1218. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +0 -46
  1219. package/src/resources/extensions/gsd/worktree-command.ts +0 -846
  1220. package/src/resources/extensions/gsd/worktree-health.ts +0 -178
  1221. package/src/resources/extensions/gsd/worktree-manager.ts +0 -630
  1222. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -640
  1223. package/src/resources/extensions/gsd/worktree.ts +0 -336
  1224. package/src/resources/extensions/gsd/write-intercept.ts +0 -90
@@ -1,1645 +0,0 @@
1
- /**
2
- * GSD Auto-Worktree -- lifecycle management for auto-mode worktrees.
3
- *
4
- * Auto-mode creates worktrees with `milestone/<MID>` branches (distinct from
5
- * manual `/worktree` which uses `worktree/<name>` branches). This module
6
- * manages create, enter, detect, and teardown for auto-mode worktrees.
7
- */
8
- import { existsSync, cpSync, readFileSync, readdirSync, mkdirSync, realpathSync, rmSync, unlinkSync, statSync, lstatSync as lstatSyncFn, } from "node:fs";
9
- import { isAbsolute, join, sep as pathSep } from "node:path";
10
- import { homedir } from "node:os";
11
- import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
12
- import { reconcileWorktreeDb, isDbAvailable, getMilestone, getMilestoneSlices, } from "./gsd-db.js";
13
- import { atomicWriteSync } from "./atomic-write.js";
14
- import { execFileSync } from "node:child_process";
15
- import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
16
- import { gsdRoot } from "./paths.js";
17
- import { createWorktree, removeWorktree, resolveGitDir, worktreePath, } from "./worktree-manager.js";
18
- import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
19
- import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
20
- import { debugLog } from "./debug-logger.js";
21
- import { logWarning } from "./workflow-logger.js";
22
- import { loadEffectiveGSDPreferences } from "./preferences.js";
23
- import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, nativeMergeAbort, } from "./native-git-bridge.js";
24
- const gsdHome = process.env.LSD_HOME || join(homedir(), ".lsd");
25
- const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
26
- const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
27
- // ─── Shared Constants & Helpers ─────────────────────────────────────────────
28
- /**
29
- * Root-level .gsd/ state files synced between worktree and project root.
30
- * Single source of truth — used by syncGsdStateToWorktree, syncWorktreeStateBack,
31
- * and the dispatch-level sync functions.
32
- */
33
- const ROOT_STATE_FILES = [
34
- "DECISIONS.md",
35
- "REQUIREMENTS.md",
36
- "PROJECT.md",
37
- "KNOWLEDGE.md",
38
- "OVERRIDES.md",
39
- "QUEUE.md",
40
- "completed-units.json",
41
- "metrics.json",
42
- "mcp.json",
43
- // NOTE: project preferences are intentionally NOT in ROOT_STATE_FILES.
44
- // Forward-sync (main → worktree) is handled explicitly in syncGsdStateToWorktree().
45
- // Back-sync (worktree → main) must NEVER overwrite the project root's copy
46
- // because the project root is authoritative for preferences (#2684).
47
- ];
48
- /**
49
- * Check if two filesystem paths resolve to the same real location.
50
- * Returns false if either path cannot be resolved (e.g. doesn't exist).
51
- */
52
- function isSamePath(a, b) {
53
- try {
54
- return realpathSync(a) === realpathSync(b);
55
- }
56
- catch {
57
- return false;
58
- }
59
- }
60
- // ─── ASSESSMENT Force-Sync Helper (#2821) ─────────────────────────────────
61
- /** Regex matching YAML frontmatter `verdict:` field. */
62
- const VERDICT_RE = /verdict:\s*[\w-]+/i;
63
- /**
64
- * Walk a milestone directory and force-overwrite ASSESSMENT files in the
65
- * destination when the source copy contains a `verdict:` field.
66
- *
67
- * This is the targeted fix for the UAT stuck-loop (#2821): the main
68
- * safeCopyRecursive uses force:false to protect worktree-authoritative
69
- * files (#1886), but ASSESSMENT files written by run-uat must be
70
- * forward-synced when the project root has a verdict. Without this,
71
- * the worktree retains a stale FAIL or missing ASSESSMENT and
72
- * checkNeedsRunUat re-dispatches run-uat indefinitely.
73
- *
74
- * Only overwrites when the source has a verdict — never clobbers a
75
- * worktree ASSESSMENT with a verdictless project-root copy.
76
- */
77
- function forceOverwriteAssessmentsWithVerdict(srcMilestoneDir, dstMilestoneDir) {
78
- if (!existsSync(srcMilestoneDir))
79
- return;
80
- // Walk slices/<SID>/ looking for *-ASSESSMENT.md files
81
- const slicesDir = join(srcMilestoneDir, "slices");
82
- if (!existsSync(slicesDir))
83
- return;
84
- try {
85
- for (const sliceEntry of readdirSync(slicesDir, { withFileTypes: true })) {
86
- if (!sliceEntry.isDirectory())
87
- continue;
88
- const srcSliceDir = join(slicesDir, sliceEntry.name);
89
- const dstSliceDir = join(dstMilestoneDir, "slices", sliceEntry.name);
90
- try {
91
- for (const fileEntry of readdirSync(srcSliceDir, { withFileTypes: true })) {
92
- if (!fileEntry.isFile())
93
- continue;
94
- if (!fileEntry.name.endsWith("-ASSESSMENT.md"))
95
- continue;
96
- const srcFile = join(srcSliceDir, fileEntry.name);
97
- try {
98
- const srcContent = readFileSync(srcFile, "utf-8");
99
- if (!VERDICT_RE.test(srcContent))
100
- continue; // no verdict in source — skip
101
- // Source has a verdict — force-copy into worktree
102
- mkdirSync(dstSliceDir, { recursive: true });
103
- safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
104
- }
105
- catch {
106
- /* non-fatal per file */
107
- }
108
- }
109
- }
110
- catch {
111
- /* non-fatal per slice */
112
- }
113
- }
114
- }
115
- catch {
116
- /* non-fatal */
117
- }
118
- }
119
- // ─── Module State ──────────────────────────────────────────────────────────
120
- /** Original project root before chdir into auto-worktree. */
121
- let originalBase = null;
122
- function clearProjectRootStateFiles(basePath, milestoneId) {
123
- const gsdDir = gsdRoot(basePath);
124
- const transientFiles = [
125
- join(gsdDir, "STATE.md"),
126
- join(gsdDir, "auto.lock"),
127
- join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
128
- ];
129
- for (const file of transientFiles) {
130
- try {
131
- unlinkSync(file);
132
- }
133
- catch {
134
- /* non-fatal — file may not exist */
135
- }
136
- }
137
- // Clean up entire synced milestone directory and runtime/units.
138
- // syncStateToProjectRoot() copies these into the project root during
139
- // execution. If they remain as untracked files when we attempt
140
- // `git merge --squash`, git rejects the merge with "local changes would
141
- // be overwritten", causing silent data loss (#1738).
142
- const syncedDirs = [
143
- join(gsdDir, "milestones", milestoneId),
144
- join(gsdDir, "runtime", "units"),
145
- ];
146
- for (const dir of syncedDirs) {
147
- try {
148
- if (existsSync(dir)) {
149
- // Only remove files that are untracked by git — tracked files are
150
- // managed by the branch checkout and should not be deleted.
151
- const untrackedOutput = execFileSync("git", ["ls-files", "--others", "--exclude-standard", dir], { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
152
- if (untrackedOutput) {
153
- for (const f of untrackedOutput.split("\n").filter(Boolean)) {
154
- try {
155
- unlinkSync(join(basePath, f));
156
- }
157
- catch {
158
- /* non-fatal */
159
- }
160
- }
161
- }
162
- }
163
- }
164
- catch {
165
- /* non-fatal — git command may fail if not in repo */
166
- }
167
- }
168
- }
169
- // ─── Build Artifact Auto-Resolve ─────────────────────────────────────────────
170
- /** Patterns for machine-generated build artifacts that can be safely
171
- * auto-resolved by accepting --theirs during merge. These files are
172
- * regenerable and never contain meaningful manual edits. */
173
- export const SAFE_AUTO_RESOLVE_PATTERNS = [
174
- /\.tsbuildinfo$/,
175
- /\.pyc$/,
176
- /\/__pycache__\//,
177
- /\.DS_Store$/,
178
- /\.map$/,
179
- ];
180
- /** Returns true if the file path is safe to auto-resolve during merge.
181
- * Covers `.gsd/` state files and common build artifacts. */
182
- export const isSafeToAutoResolve = (filePath) => filePath.startsWith(".gsd/") ||
183
- SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
184
- // ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
185
- /**
186
- * Sync milestone artifacts from project root INTO worktree before deriveState.
187
- * Covers the case where the LLM wrote artifacts to the main repo filesystem
188
- * (e.g. via absolute paths) but the worktree has stale data. Also deletes
189
- * gsd.db in the worktree so it rebuilds from fresh disk state (#853).
190
- * Non-fatal — sync failure should never block dispatch.
191
- */
192
- export function syncProjectRootToWorktree(projectRoot, worktreePath_, milestoneId) {
193
- if (!worktreePath_ || !projectRoot || worktreePath_ === projectRoot)
194
- return;
195
- if (!milestoneId)
196
- return;
197
- const prGsd = join(projectRoot, ".gsd");
198
- const wtGsd = join(worktreePath_, ".gsd");
199
- // When .gsd is a symlink to the same external directory in both locations,
200
- // cpSync rejects the copy because source === destination (ERR_FS_CP_EINVAL).
201
- // Compare realpaths and skip when they resolve to the same physical path (#2184).
202
- if (isSamePath(prGsd, wtGsd))
203
- return;
204
- // Copy milestone directory from project root to worktree — additive only.
205
- // force:false prevents cpSync from overwriting existing worktree files.
206
- // Without this, worktree-authoritative files (e.g. VALIDATION.md written
207
- // by validate-milestone) get clobbered by stale project root copies,
208
- // causing an infinite re-validation loop (#1886).
209
- safeCopyRecursive(join(prGsd, "milestones", milestoneId), join(wtGsd, "milestones", milestoneId), { force: false });
210
- // Force-sync ASSESSMENT files that have a verdict from project root (#2821).
211
- // The additive-only copy above preserves worktree-authoritative files, but
212
- // ASSESSMENT files are special: after run-uat writes a verdict and post-unit
213
- // syncs it to the project root, the worktree may retain a stale copy (e.g.
214
- // verdict:fail while the project root has verdict:pass from a retry). On
215
- // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
216
- // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
217
- // run-uat indefinitely (stuck-loop ×9).
218
- forceOverwriteAssessmentsWithVerdict(join(prGsd, "milestones", milestoneId), join(wtGsd, "milestones", milestoneId));
219
- // Forward-sync completed-units.json from project root to worktree.
220
- // Project root is authoritative for completion state after crash recovery;
221
- // without this, the worktree re-dispatches already-completed units (#1886).
222
- safeCopy(join(prGsd, "completed-units.json"), join(wtGsd, "completed-units.json"), { force: true });
223
- // Delete worktree gsd.db ONLY if it is empty (0 bytes).
224
- // An empty DB is stale/corrupt and should be rebuilt (#853).
225
- // A non-empty DB was populated by gsd-migrate on respawn and must be
226
- // preserved — deleting it truncates the file to 0 bytes when
227
- // openDatabase re-creates it, causing "no such table" failures (#2815).
228
- try {
229
- const wtDb = join(wtGsd, "gsd.db");
230
- if (existsSync(wtDb)) {
231
- const size = statSync(wtDb).size;
232
- if (size === 0) {
233
- unlinkSync(wtDb);
234
- }
235
- }
236
- }
237
- catch {
238
- /* non-fatal */
239
- }
240
- }
241
- /**
242
- * Sync dispatch-critical .gsd/ state files from worktree to project root.
243
- * Only runs when inside an auto-worktree (worktreePath differs from projectRoot).
244
- * Copies: STATE.md + active milestone directory (roadmap, slice plans, task summaries).
245
- * Non-fatal — sync failure should never block dispatch.
246
- */
247
- export function syncStateToProjectRoot(worktreePath_, projectRoot, milestoneId) {
248
- if (!worktreePath_ || !projectRoot || worktreePath_ === projectRoot)
249
- return;
250
- if (!milestoneId)
251
- return;
252
- const wtGsd = join(worktreePath_, ".gsd");
253
- const prGsd = join(projectRoot, ".gsd");
254
- // When .gsd is a symlink to the same external directory in both locations,
255
- // cpSync rejects the copy because source === destination (ERR_FS_CP_EINVAL).
256
- // Compare realpaths and skip when they resolve to the same physical path (#2184).
257
- if (isSamePath(wtGsd, prGsd))
258
- return;
259
- // 1. STATE.md — the quick-glance status used by initial deriveState()
260
- safeCopy(join(wtGsd, "STATE.md"), join(prGsd, "STATE.md"), { force: true });
261
- // 2. Milestone directory — ROADMAP, slice PLANs, task summaries
262
- // Copy the entire milestone .gsd subtree so deriveState reads current checkboxes
263
- safeCopyRecursive(join(wtGsd, "milestones", milestoneId), join(prGsd, "milestones", milestoneId), { force: true });
264
- // 3. metrics.json — session cost/token tracking (#2313).
265
- // Without this, metrics accumulated in the worktree are invisible from the
266
- // project root and never appear in the dashboard or skill-health reports.
267
- safeCopy(join(wtGsd, "metrics.json"), join(prGsd, "metrics.json"), { force: true });
268
- // 4. Runtime records — unit dispatch state used by selfHealRuntimeRecords().
269
- // Without this, a crash during a unit leaves the runtime record only in the
270
- // worktree. If the next session resolves basePath before worktree re-entry,
271
- // selfHeal can't find or clear the stale record (#769).
272
- safeCopyRecursive(join(wtGsd, "runtime", "units"), join(prGsd, "runtime", "units"), { force: true });
273
- }
274
- // ─── Resource Staleness ───────────────────────────────────────────────────
275
- /**
276
- * Read the resource version (semver) from the managed-resources manifest.
277
- * Uses gsdVersion instead of syncedAt so that launching a second session
278
- * doesn't falsely trigger staleness (#804).
279
- */
280
- export function readResourceVersion() {
281
- const agentDir = process.env.GSD_CODING_AGENT_DIR || join(gsdHome, "agent");
282
- const manifestPath = join(agentDir, "managed-resources.json");
283
- try {
284
- const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
285
- return typeof manifest?.gsdVersion === "string"
286
- ? manifest.gsdVersion
287
- : null;
288
- }
289
- catch {
290
- return null;
291
- }
292
- }
293
- /**
294
- * Check if managed resources have been updated since session start.
295
- * Returns a warning message if stale, null otherwise.
296
- */
297
- export function checkResourcesStale(versionOnStart) {
298
- if (versionOnStart === null)
299
- return null;
300
- const current = readResourceVersion();
301
- if (current === null)
302
- return null;
303
- if (current !== versionOnStart) {
304
- return "GSD resources were updated since this session started. Restart gsd to load the new code.";
305
- }
306
- return null;
307
- }
308
- // ─── Stale Worktree Escape ────────────────────────────────────────────────
309
- /**
310
- * Detect and escape a stale worktree cwd (#608).
311
- *
312
- * After milestone completion + merge, the worktree directory is removed but
313
- * the process cwd may still point inside `.gsd/worktrees/<MID>/`.
314
- * When a new session starts, `process.cwd()` is passed as `base` to startAuto
315
- * and all subsequent writes land in the wrong directory. This function detects
316
- * that scenario and chdir back to the project root.
317
- *
318
- * Returns the corrected base path.
319
- */
320
- export function escapeStaleWorktree(base) {
321
- // Direct layout: /.gsd/worktrees/
322
- const directMarker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
323
- let idx = base.indexOf(directMarker);
324
- if (idx === -1) {
325
- // Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
326
- const symlinkRe = new RegExp(`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`);
327
- const match = base.match(symlinkRe);
328
- if (!match || match.index === undefined)
329
- return base;
330
- idx = match.index;
331
- }
332
- // base is inside .gsd/worktrees/<something> — extract the project root
333
- const projectRoot = base.slice(0, idx);
334
- // Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
335
- // the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
336
- // when .gsd is a symlink into ~/.gsd/projects/<hash> and process.cwd()
337
- // resolved through the symlink. Returning ~ would be catastrophic (#1676).
338
- const candidateGsd = join(projectRoot, ".gsd").replaceAll("\\", "/");
339
- const gsdHomePath = gsdHome.replaceAll("\\", "/");
340
- if (candidateGsd === gsdHomePath || candidateGsd.startsWith(gsdHomePath + "/")) {
341
- // Don't chdir to home — return base unchanged.
342
- // resolveProjectRoot() in worktree.ts has the full git-file-based recovery
343
- // and will be called by the caller (startAuto → projectRoot()).
344
- return base;
345
- }
346
- try {
347
- process.chdir(projectRoot);
348
- }
349
- catch {
350
- // If chdir fails, return the original — caller will handle errors downstream
351
- return base;
352
- }
353
- return projectRoot;
354
- }
355
- /**
356
- * Clean stale runtime unit files for completed milestones.
357
- *
358
- * After restart, stale runtime/units/*.json from prior milestones can
359
- * cause deriveState to resume the wrong milestone (#887). Removes files
360
- * for milestones that have a SUMMARY (fully complete).
361
- */
362
- export function cleanStaleRuntimeUnits(gsdRootPath, hasMilestoneSummary) {
363
- const runtimeUnitsDir = join(gsdRootPath, "runtime", "units");
364
- if (!existsSync(runtimeUnitsDir))
365
- return 0;
366
- let cleaned = 0;
367
- try {
368
- for (const file of readdirSync(runtimeUnitsDir)) {
369
- if (!file.endsWith(".json"))
370
- continue;
371
- const midMatch = file.match(/(M\d+(?:-[a-z0-9]{6})?)/);
372
- if (!midMatch)
373
- continue;
374
- if (hasMilestoneSummary(midMatch[1])) {
375
- try {
376
- unlinkSync(join(runtimeUnitsDir, file));
377
- cleaned++;
378
- }
379
- catch {
380
- /* non-fatal */
381
- }
382
- }
383
- }
384
- }
385
- catch {
386
- /* non-fatal */
387
- }
388
- return cleaned;
389
- }
390
- // ─── Worktree ↔ Main Repo Sync (#1311) ──────────────────────────────────────
391
- /**
392
- * Sync .gsd/ state from the main repo into the worktree.
393
- *
394
- * When .gsd/ is a symlink to the external state directory, both the main
395
- * repo and worktree share the same directory — no sync needed.
396
- *
397
- * When .gsd/ is a real directory (e.g., git-tracked or manage_gitignore:false),
398
- * the worktree has its own copy that may be stale. This function copies
399
- * missing milestones, CONTEXT, ROADMAP, DECISIONS, REQUIREMENTS, and
400
- * PROJECT files from the main repo's .gsd/ into the worktree's .gsd/.
401
- *
402
- * Only adds missing content — never overwrites existing files in the worktree
403
- * (the worktree's execution state is authoritative for in-progress work).
404
- */
405
- export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
406
- const mainGsd = gsdRoot(mainBasePath);
407
- const wtGsd = gsdRoot(worktreePath_);
408
- const synced = [];
409
- // If both resolve to the same directory (symlink), no sync needed
410
- if (isSamePath(mainGsd, wtGsd))
411
- return { synced };
412
- if (!existsSync(mainGsd) || !existsSync(wtGsd))
413
- return { synced };
414
- // Sync root-level .gsd/ files (DECISIONS, REQUIREMENTS, PROJECT, KNOWLEDGE, etc.)
415
- for (const f of ROOT_STATE_FILES) {
416
- const src = join(mainGsd, f);
417
- const dst = join(wtGsd, f);
418
- if (existsSync(src) && !existsSync(dst)) {
419
- try {
420
- cpSync(src, dst);
421
- synced.push(f);
422
- }
423
- catch {
424
- /* non-fatal */
425
- }
426
- }
427
- }
428
- // Forward-sync project preferences from project root to worktree (additive only).
429
- // Prefer the canonical uppercase file name, but keep the legacy lowercase
430
- // fallback so older repos still work on case-sensitive filesystems.
431
- {
432
- const worktreeHasPreferences = existsSync(join(wtGsd, PROJECT_PREFERENCES_FILE))
433
- || existsSync(join(wtGsd, LEGACY_PROJECT_PREFERENCES_FILE));
434
- if (!worktreeHasPreferences) {
435
- for (const file of [PROJECT_PREFERENCES_FILE, LEGACY_PROJECT_PREFERENCES_FILE]) {
436
- const src = join(mainGsd, file);
437
- const dst = join(wtGsd, file);
438
- if (existsSync(src)) {
439
- try {
440
- cpSync(src, dst);
441
- synced.push(file);
442
- }
443
- catch {
444
- /* non-fatal */
445
- }
446
- break;
447
- }
448
- }
449
- }
450
- }
451
- // Sync milestones: copy entire milestone directories that are missing
452
- const mainMilestonesDir = join(mainGsd, "milestones");
453
- const wtMilestonesDir = join(wtGsd, "milestones");
454
- if (existsSync(mainMilestonesDir)) {
455
- try {
456
- mkdirSync(wtMilestonesDir, { recursive: true });
457
- const mainMilestones = readdirSync(mainMilestonesDir, {
458
- withFileTypes: true,
459
- })
460
- .filter((d) => d.isDirectory())
461
- .map((d) => d.name);
462
- for (const mid of mainMilestones) {
463
- const srcDir = join(mainMilestonesDir, mid);
464
- const dstDir = join(wtMilestonesDir, mid);
465
- if (!existsSync(dstDir)) {
466
- // Entire milestone missing from worktree — copy it
467
- try {
468
- cpSync(srcDir, dstDir, { recursive: true });
469
- synced.push(`milestones/${mid}/`);
470
- }
471
- catch {
472
- /* non-fatal */
473
- }
474
- }
475
- else {
476
- // Milestone directory exists but may be missing files (stale snapshot).
477
- // Sync individual top-level milestone files (CONTEXT, ROADMAP, RESEARCH, etc.)
478
- try {
479
- const srcFiles = readdirSync(srcDir).filter((f) => f.endsWith(".md") || f.endsWith(".json"));
480
- for (const f of srcFiles) {
481
- const srcFile = join(srcDir, f);
482
- const dstFile = join(dstDir, f);
483
- if (!existsSync(dstFile)) {
484
- try {
485
- const srcStat = lstatSyncFn(srcFile);
486
- if (srcStat.isFile()) {
487
- cpSync(srcFile, dstFile);
488
- synced.push(`milestones/${mid}/${f}`);
489
- }
490
- }
491
- catch {
492
- /* non-fatal */
493
- }
494
- }
495
- }
496
- // Sync slices directory if it exists in main but not in worktree
497
- const srcSlicesDir = join(srcDir, "slices");
498
- const dstSlicesDir = join(dstDir, "slices");
499
- if (existsSync(srcSlicesDir) && !existsSync(dstSlicesDir)) {
500
- try {
501
- cpSync(srcSlicesDir, dstSlicesDir, { recursive: true });
502
- synced.push(`milestones/${mid}/slices/`);
503
- }
504
- catch {
505
- /* non-fatal */
506
- }
507
- }
508
- else if (existsSync(srcSlicesDir) && existsSync(dstSlicesDir)) {
509
- // Both exist — sync missing slice directories
510
- const srcSlices = readdirSync(srcSlicesDir, {
511
- withFileTypes: true,
512
- })
513
- .filter((d) => d.isDirectory())
514
- .map((d) => d.name);
515
- for (const sid of srcSlices) {
516
- const srcSlice = join(srcSlicesDir, sid);
517
- const dstSlice = join(dstSlicesDir, sid);
518
- if (!existsSync(dstSlice)) {
519
- try {
520
- cpSync(srcSlice, dstSlice, { recursive: true });
521
- synced.push(`milestones/${mid}/slices/${sid}/`);
522
- }
523
- catch {
524
- /* non-fatal */
525
- }
526
- }
527
- }
528
- }
529
- }
530
- catch {
531
- /* non-fatal */
532
- }
533
- }
534
- }
535
- }
536
- catch {
537
- /* non-fatal */
538
- }
539
- }
540
- return { synced };
541
- }
542
- /**
543
- * Sync milestone artifacts from worktree back to the main external state directory.
544
- * Called before milestone merge to ensure completion artifacts (SUMMARY, VALIDATION,
545
- * updated ROADMAP) are visible from the project root (#1412).
546
- *
547
- * Syncs:
548
- * 1. Root-level .gsd/ files (REQUIREMENTS, PROJECT, DECISIONS, KNOWLEDGE,
549
- * OVERRIDES) — the worktree's versions overwrite main's because the
550
- * worktree is the authoritative execution context.
551
- * 2. ALL milestone directories found in the worktree — not just the
552
- * current milestoneId. The complete-milestone unit may create artifacts
553
- * for the *next* milestone (CONTEXT, ROADMAP, new requirements) which
554
- * must survive worktree teardown.
555
- *
556
- * History: Originally only synced milestones/<milestoneId>/ and assumed
557
- * root-level files would be carried by the squash merge. In practice,
558
- * .gsd/ files are often untracked (gitignored or never committed), so the
559
- * squash merge carries nothing. This caused next-milestone artifacts and
560
- * updated REQUIREMENTS/PROJECT to be silently lost on teardown.
561
- */
562
- export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
563
- const mainGsd = gsdRoot(mainBasePath);
564
- const wtGsd = gsdRoot(worktreePath);
565
- const synced = [];
566
- // If both resolve to the same directory (symlink), no sync needed
567
- if (isSamePath(mainGsd, wtGsd))
568
- return { synced };
569
- if (!existsSync(wtGsd) || !existsSync(mainGsd))
570
- return { synced };
571
- // ── 0. Pre-upgrade worktree DB reconciliation ────────────────────────
572
- // If the worktree has its own gsd.db (copied before the WAL transition),
573
- // reconcile its hierarchy data into the project root DB before syncing
574
- // files. This handles in-flight worktrees that were created before the
575
- // upgrade to shared WAL mode.
576
- const wtLocalDb = join(wtGsd, "gsd.db");
577
- const mainDb = join(mainGsd, "gsd.db");
578
- if (existsSync(wtLocalDb) && existsSync(mainDb)) {
579
- try {
580
- reconcileWorktreeDb(mainDb, wtLocalDb);
581
- synced.push("gsd.db (pre-upgrade reconcile)");
582
- }
583
- catch {
584
- // Non-fatal — file sync below is the fallback
585
- }
586
- }
587
- // ── 1. Sync root-level .gsd/ files back ──────────────────────────────
588
- // The worktree is authoritative — complete-milestone updates REQUIREMENTS,
589
- // PROJECT, etc. These must overwrite main's copies so they survive teardown.
590
- // Also includes QUEUE.md, completed-units.json, and metrics.json which are
591
- // written during milestone closeout and lost on teardown without explicit sync
592
- // (#1787, #2313).
593
- for (const f of ROOT_STATE_FILES) {
594
- const src = join(wtGsd, f);
595
- const dst = join(mainGsd, f);
596
- if (existsSync(src)) {
597
- try {
598
- cpSync(src, dst, { force: true });
599
- synced.push(f);
600
- }
601
- catch {
602
- /* non-fatal */
603
- }
604
- }
605
- }
606
- // ── 2. Sync ALL milestone directories ────────────────────────────────
607
- // The complete-milestone unit may create next-milestone artifacts (e.g.
608
- // M007 setup while closing M006). We must sync every milestone directory
609
- // in the worktree, not just the current one.
610
- const wtMilestonesDir = join(wtGsd, "milestones");
611
- if (!existsSync(wtMilestonesDir))
612
- return { synced };
613
- try {
614
- const wtMilestones = readdirSync(wtMilestonesDir, { withFileTypes: true })
615
- .filter((d) => d.isDirectory())
616
- .map((d) => d.name);
617
- for (const mid of wtMilestones) {
618
- syncMilestoneDir(wtGsd, mainGsd, mid, synced);
619
- }
620
- }
621
- catch {
622
- /* non-fatal */
623
- }
624
- return { synced };
625
- }
626
- /**
627
- * Sync a single milestone directory from worktree to main.
628
- * Copies milestone-level .md files, slice-level files, and task summaries.
629
- */
630
- /** Copy matching files from srcDir to dstDir (non-fatal per file). */
631
- function syncDirFiles(srcDir, dstDir, filter, synced, prefix) {
632
- try {
633
- for (const entry of readdirSync(srcDir, { withFileTypes: true })) {
634
- if (!entry.isFile() || !filter(entry.name))
635
- continue;
636
- try {
637
- cpSync(join(srcDir, entry.name), join(dstDir, entry.name), { force: true });
638
- synced.push(`${prefix}${entry.name}`);
639
- }
640
- catch {
641
- /* non-fatal */
642
- }
643
- }
644
- }
645
- catch {
646
- /* non-fatal — srcDir may not be readable */
647
- }
648
- }
649
- function syncMilestoneDir(wtGsd, mainGsd, mid, synced) {
650
- const wtMilestoneDir = join(wtGsd, "milestones", mid);
651
- const mainMilestoneDir = join(mainGsd, "milestones", mid);
652
- if (!existsSync(wtMilestoneDir))
653
- return;
654
- mkdirSync(mainMilestoneDir, { recursive: true });
655
- const isMd = (name) => name.endsWith(".md");
656
- // Sync milestone-level files (SUMMARY, VALIDATION, ROADMAP, CONTEXT)
657
- syncDirFiles(wtMilestoneDir, mainMilestoneDir, isMd, synced, `milestones/${mid}/`);
658
- // Sync slice-level files (summaries, UATs) and task summaries (#1678)
659
- const wtSlicesDir = join(wtMilestoneDir, "slices");
660
- const mainSlicesDir = join(mainMilestoneDir, "slices");
661
- if (!existsSync(wtSlicesDir))
662
- return;
663
- try {
664
- for (const sliceEntry of readdirSync(wtSlicesDir, { withFileTypes: true })) {
665
- if (!sliceEntry.isDirectory())
666
- continue;
667
- const sid = sliceEntry.name;
668
- const wtSliceDir = join(wtSlicesDir, sid);
669
- const mainSliceDir = join(mainSlicesDir, sid);
670
- mkdirSync(mainSliceDir, { recursive: true });
671
- syncDirFiles(wtSliceDir, mainSliceDir, isMd, synced, `milestones/${mid}/slices/${sid}/`);
672
- const wtTasksDir = join(wtSliceDir, "tasks");
673
- const mainTasksDir = join(mainSliceDir, "tasks");
674
- if (existsSync(wtTasksDir)) {
675
- mkdirSync(mainTasksDir, { recursive: true });
676
- syncDirFiles(wtTasksDir, mainTasksDir, isMd, synced, `milestones/${mid}/slices/${sid}/tasks/`);
677
- }
678
- }
679
- }
680
- catch {
681
- /* non-fatal */
682
- }
683
- }
684
- // ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
685
- /**
686
- * Run the user-configured post-create hook script after worktree creation.
687
- * The script receives SOURCE_DIR and WORKTREE_DIR as environment variables.
688
- * Failure is non-fatal — returns the error message or null on success.
689
- *
690
- * Reads the hook path from git.worktree_post_create in preferences.
691
- * Pass hookPath directly to bypass preference loading (useful for testing).
692
- */
693
- export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
694
- if (hookPath === undefined) {
695
- const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
696
- hookPath = prefs?.worktree_post_create;
697
- }
698
- if (!hookPath)
699
- return null;
700
- // Resolve relative paths against the source project root.
701
- // On Windows, convert 8.3 short paths (e.g. RUNNER~1) to long paths
702
- // so execFileSync can locate the file correctly.
703
- let resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
704
- if (!existsSync(resolved)) {
705
- return `Worktree post-create hook not found: ${resolved}`;
706
- }
707
- if (process.platform === "win32") {
708
- try {
709
- resolved = realpathSync.native(resolved);
710
- }
711
- catch { /* keep original */ }
712
- }
713
- try {
714
- // .bat/.cmd files on Windows require shell mode — execFileSync cannot
715
- // spawn them directly (EINVAL).
716
- const needsShell = process.platform === "win32" && /\.(bat|cmd)$/i.test(resolved);
717
- execFileSync(resolved, [], {
718
- cwd: worktreeDir,
719
- env: {
720
- ...process.env,
721
- SOURCE_DIR: sourceDir,
722
- WORKTREE_DIR: worktreeDir,
723
- },
724
- stdio: ["ignore", "pipe", "pipe"],
725
- encoding: "utf-8",
726
- timeout: 30_000, // 30 second timeout
727
- shell: needsShell,
728
- });
729
- return null;
730
- }
731
- catch (err) {
732
- const msg = err instanceof Error ? err.message : String(err);
733
- return `Worktree post-create hook failed: ${msg}`;
734
- }
735
- }
736
- // ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
737
- export function autoWorktreeBranch(milestoneId) {
738
- return `milestone/${milestoneId}`;
739
- }
740
- // ─── Public API ────────────────────────────────────────────────────────────
741
- /**
742
- * Create a new auto-worktree for a milestone, chdir into it, and store
743
- * the original base path for later teardown.
744
- *
745
- * Atomic: chdir + originalBase update happen in the same try block
746
- * to prevent split-brain.
747
- */
748
- /**
749
- * Forward-merge plan checkbox state from the project root into a freshly
750
- * re-attached worktree (#778).
751
- *
752
- * When auto-mode stops via crash (not graceful stop), the milestone branch
753
- * HEAD may be behind the filesystem state at the project root because
754
- * syncStateToProjectRoot() runs after every task completion but the final
755
- * git commit may not have happened before the crash. On restart the worktree
756
- * is re-attached to the branch HEAD, which has [ ] for the crashed task,
757
- * causing verifyExpectedArtifact() to fail and triggering an infinite
758
- * dispatch/skip loop.
759
- *
760
- * Fix: after re-attaching, read every *.md plan file in the milestone
761
- * directory at the project root and apply any [x] checkbox states that are
762
- * ahead of the worktree version (forward-only: never downgrade [x] → [ ]).
763
- *
764
- * This is safe because syncStateToProjectRoot() is the authoritative source
765
- * of post-task state at the project root — it writes the same [x] the LLM
766
- * produced, then the auto-commit follows. If the commit never happened, the
767
- * filesystem copy is still valid and correct.
768
- */
769
- function reconcilePlanCheckboxes(projectRoot, wtPath, milestoneId) {
770
- const srcMilestone = join(projectRoot, ".gsd", "milestones", milestoneId);
771
- const dstMilestone = join(wtPath, ".gsd", "milestones", milestoneId);
772
- if (!existsSync(srcMilestone) || !existsSync(dstMilestone))
773
- return;
774
- // Walk all markdown files in the milestone directory (plans, summaries, etc.)
775
- function walkMd(dir) {
776
- const results = [];
777
- try {
778
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
779
- const full = join(dir, entry.name);
780
- if (entry.isDirectory()) {
781
- results.push(...walkMd(full));
782
- }
783
- else if (entry.isFile() && entry.name.endsWith(".md")) {
784
- results.push(full);
785
- }
786
- }
787
- }
788
- catch {
789
- /* non-fatal */
790
- }
791
- return results;
792
- }
793
- for (const srcFile of walkMd(srcMilestone)) {
794
- const rel = srcFile.slice(srcMilestone.length);
795
- const dstFile = dstMilestone + rel;
796
- if (!existsSync(dstFile))
797
- continue; // only reconcile existing files
798
- let srcContent;
799
- let dstContent;
800
- try {
801
- srcContent = readFileSync(srcFile, "utf-8");
802
- dstContent = readFileSync(dstFile, "utf-8");
803
- }
804
- catch {
805
- continue;
806
- }
807
- if (srcContent === dstContent)
808
- continue;
809
- // Extract all checked task IDs from the source (project root)
810
- // Pattern: - [x] **T<id>: or - [x] **S<id>: (case-insensitive x)
811
- const checkedRe = /^- \[[xX]\] \*\*([TS]\d+):/gm;
812
- const srcChecked = new Set();
813
- for (const m of srcContent.matchAll(checkedRe))
814
- srcChecked.add(m[1]);
815
- if (srcChecked.size === 0)
816
- continue;
817
- // Forward-apply: replace [ ] → [x] for any IDs that are checked in src
818
- let updated = dstContent;
819
- let changed = false;
820
- for (const id of srcChecked) {
821
- const escapedId = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
822
- const uncheckedRe = new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm");
823
- if (uncheckedRe.test(updated)) {
824
- updated = updated.replace(new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm"), "$1[x]$2");
825
- changed = true;
826
- }
827
- }
828
- if (changed) {
829
- try {
830
- atomicWriteSync(dstFile, updated, "utf-8");
831
- }
832
- catch {
833
- /* non-fatal */
834
- }
835
- }
836
- }
837
- }
838
- export function createAutoWorktree(basePath, milestoneId) {
839
- const branch = autoWorktreeBranch(milestoneId);
840
- // Check if the milestone branch already exists — it survives auto-mode
841
- // stop/pause and contains committed work from prior sessions. If it exists,
842
- // re-attach the worktree to it WITHOUT resetting. Only create a fresh branch
843
- // from the integration branch when no prior work exists.
844
- const branchExists = nativeBranchExists(basePath, branch);
845
- let info;
846
- if (branchExists) {
847
- // Re-attach worktree to the existing milestone branch (preserving commits)
848
- info = createWorktree(basePath, milestoneId, {
849
- branch,
850
- reuseExistingBranch: true,
851
- });
852
- }
853
- else {
854
- // Fresh start — create branch from integration branch
855
- const integrationBranch = readIntegrationBranch(basePath, milestoneId) ?? undefined;
856
- info = createWorktree(basePath, milestoneId, {
857
- branch,
858
- startPoint: integrationBranch,
859
- });
860
- }
861
- // Copy .gsd/ planning artifacts from the source repo into the new worktree.
862
- // Worktrees are fresh git checkouts — untracked files don't carry over.
863
- // Planning artifacts may be untracked if the project's .gitignore had a
864
- // blanket .gsd/ rule (pre-v2.14.0). Without this copy, auto-mode loops
865
- // on plan-slice because the plan file doesn't exist in the worktree.
866
- //
867
- // IMPORTANT: Skip when re-attaching to an existing branch (#759).
868
- // The branch checkout already has committed artifacts with correct state
869
- // (e.g. [x] for completed slices). Copying from the project root would
870
- // overwrite them with stale data ([ ] checkboxes) because the root is
871
- // not always fully synced.
872
- if (!branchExists) {
873
- copyPlanningArtifacts(basePath, info.path);
874
- }
875
- else {
876
- // Re-attaching to an existing branch: forward-merge any plan checkpoint
877
- // state from the project root into the worktree (#778).
878
- //
879
- // If auto-mode stopped via crash, the milestone branch HEAD may lag behind
880
- // the project root filesystem because syncStateToProjectRoot() ran after
881
- // task completion but the auto-commit never fired. On restart the worktree
882
- // is re-created from the branch HEAD (which has [ ] for the crashed task),
883
- // causing verifyExpectedArtifact() to return false → stale-key eviction →
884
- // infinite dispatch/skip loop. Reconciling here ensures the worktree sees
885
- // the same [x] state that syncStateToProjectRoot() wrote to the root.
886
- reconcilePlanCheckboxes(basePath, info.path, milestoneId);
887
- }
888
- // Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets
889
- const hookError = runWorktreePostCreateHook(basePath, info.path);
890
- if (hookError) {
891
- // Non-fatal — log but don't prevent worktree usage
892
- logWarning("reconcile", hookError, { worktree: info.name });
893
- }
894
- const previousCwd = process.cwd();
895
- try {
896
- process.chdir(info.path);
897
- originalBase = basePath;
898
- }
899
- catch (err) {
900
- // If chdir fails, the worktree was created but we couldn't enter it.
901
- // Don't store originalBase -- caller can retry or clean up.
902
- throw new GSDError(GSD_IO_ERROR, `Auto-worktree created at ${info.path} but chdir failed: ${err instanceof Error ? err.message : String(err)}`);
903
- }
904
- nudgeGitBranchCache(previousCwd);
905
- return info.path;
906
- }
907
- /**
908
- * Copy .gsd/ planning artifacts from source repo to a new worktree.
909
- * Copies milestones/, DECISIONS.md, REQUIREMENTS.md, PROJECT.md, QUEUE.md,
910
- * STATE.md, KNOWLEDGE.md, and OVERRIDES.md.
911
- * Skips runtime files (auto.lock, metrics.json, etc.) and the worktrees/ dir.
912
- * Best-effort — failures are non-fatal since auto-mode can recreate artifacts.
913
- */
914
- function copyPlanningArtifacts(srcBase, wtPath) {
915
- const srcGsd = join(srcBase, ".gsd");
916
- const dstGsd = join(wtPath, ".gsd");
917
- if (!existsSync(srcGsd))
918
- return;
919
- // Copy milestones/ directory (planning files, roadmaps, plans, research)
920
- safeCopyRecursive(join(srcGsd, "milestones"), join(dstGsd, "milestones"), {
921
- force: true,
922
- filter: (src) => !src.endsWith("-META.json"),
923
- });
924
- // Copy top-level planning files
925
- for (const file of [
926
- "DECISIONS.md",
927
- "REQUIREMENTS.md",
928
- "PROJECT.md",
929
- "QUEUE.md",
930
- "STATE.md",
931
- "KNOWLEDGE.md",
932
- "OVERRIDES.md",
933
- "mcp.json",
934
- ]) {
935
- safeCopy(join(srcGsd, file), join(dstGsd, file), { force: true });
936
- }
937
- // Seed canonical PREFERENCES.md when available; fall back to legacy lowercase.
938
- if (existsSync(join(srcGsd, PROJECT_PREFERENCES_FILE))) {
939
- safeCopy(join(srcGsd, PROJECT_PREFERENCES_FILE), join(dstGsd, PROJECT_PREFERENCES_FILE), { force: true });
940
- }
941
- else if (existsSync(join(srcGsd, LEGACY_PROJECT_PREFERENCES_FILE))) {
942
- safeCopy(join(srcGsd, LEGACY_PROJECT_PREFERENCES_FILE), join(dstGsd, LEGACY_PROJECT_PREFERENCES_FILE), { force: true });
943
- }
944
- // Shared WAL (R012): worktrees use the project root's DB directly.
945
- // No longer copy gsd.db into the worktree — the DB path resolver in
946
- // ensureDbOpen() detects the worktree location and opens the root DB.
947
- // Compat note: reconcileWorktreeDb() in mergeMilestoneToMain handles
948
- // worktrees that already have a local gsd.db from before this change.
949
- }
950
- /**
951
- * Teardown an auto-worktree: chdir back to original base, then remove
952
- * the worktree and its branch.
953
- */
954
- export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
955
- const branch = autoWorktreeBranch(milestoneId);
956
- const { preserveBranch = false } = opts;
957
- const previousCwd = process.cwd();
958
- try {
959
- process.chdir(originalBasePath);
960
- originalBase = null;
961
- }
962
- catch (err) {
963
- throw new GSDError(GSD_IO_ERROR, `Failed to chdir back to ${originalBasePath} during teardown: ${err instanceof Error ? err.message : String(err)}`);
964
- }
965
- nudgeGitBranchCache(previousCwd);
966
- removeWorktree(originalBasePath, milestoneId, {
967
- branch,
968
- deleteBranch: !preserveBranch,
969
- });
970
- // Verify cleanup succeeded — warn if the worktree directory is still on disk.
971
- // On Windows, bash-based cleanup can silently fail when paths contain
972
- // backslashes (#1436), leaving ~1 GB+ orphaned directories.
973
- const wtDir = worktreePath(originalBasePath, milestoneId);
974
- if (existsSync(wtDir)) {
975
- logWarning("reconcile", `Worktree directory still exists after teardown: ${wtDir}. ` +
976
- `This is likely an orphaned directory consuming disk space. ` +
977
- `Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`, { worktree: milestoneId });
978
- // Attempt a direct filesystem removal as a fallback
979
- try {
980
- rmSync(wtDir, { recursive: true, force: true });
981
- }
982
- catch {
983
- // Non-fatal — the warning above tells the user how to clean up
984
- }
985
- }
986
- }
987
- /**
988
- * Detect if the process is currently inside an auto-worktree.
989
- * Checks both module state and git branch prefix.
990
- */
991
- export function isInAutoWorktree(basePath) {
992
- if (!originalBase)
993
- return false;
994
- const cwd = process.cwd();
995
- const resolvedBase = existsSync(basePath) ? realpathSync(basePath) : basePath;
996
- const wtDir = join(resolvedBase, ".gsd", "worktrees");
997
- if (!cwd.startsWith(wtDir))
998
- return false;
999
- const branch = nativeGetCurrentBranch(cwd);
1000
- return branch.startsWith("milestone/");
1001
- }
1002
- /**
1003
- * Get the filesystem path for an auto-worktree, or null if it doesn't exist
1004
- * or is not a valid git worktree.
1005
- *
1006
- * Validates that the path is a real git worktree (has a .git file with a
1007
- * gitdir: pointer) rather than just a stray directory. This prevents
1008
- * mis-detection of leftover directories as active worktrees (#695).
1009
- */
1010
- export function getAutoWorktreePath(basePath, milestoneId) {
1011
- const p = worktreePath(basePath, milestoneId);
1012
- if (!existsSync(p))
1013
- return null;
1014
- // Validate this is a real git worktree, not a stray directory.
1015
- // A git worktree has a .git *file* (not directory) containing "gitdir: <path>".
1016
- const gitPath = join(p, ".git");
1017
- if (!existsSync(gitPath))
1018
- return null;
1019
- try {
1020
- const content = readFileSync(gitPath, "utf8").trim();
1021
- if (!content.startsWith("gitdir: "))
1022
- return null;
1023
- }
1024
- catch {
1025
- return null;
1026
- }
1027
- return p;
1028
- }
1029
- /**
1030
- * Enter an existing auto-worktree (chdir into it, store originalBase).
1031
- * Use for resume -- the worktree already exists from a prior create.
1032
- *
1033
- * Atomic: chdir + originalBase update in same try block.
1034
- */
1035
- export function enterAutoWorktree(basePath, milestoneId) {
1036
- const p = worktreePath(basePath, milestoneId);
1037
- if (!existsSync(p)) {
1038
- throw new GSDError(GSD_IO_ERROR, `Auto-worktree for ${milestoneId} does not exist at ${p}`);
1039
- }
1040
- // Validate this is a real git worktree, not a stray directory (#695)
1041
- const gitPath = join(p, ".git");
1042
- if (!existsSync(gitPath)) {
1043
- throw new GSDError(GSD_GIT_ERROR, `Auto-worktree path ${p} exists but is not a git worktree (no .git)`);
1044
- }
1045
- try {
1046
- const content = readFileSync(gitPath, "utf8").trim();
1047
- if (!content.startsWith("gitdir: ")) {
1048
- throw new GSDError(GSD_GIT_ERROR, `Auto-worktree path ${p} has a .git but it is not a worktree gitdir pointer`);
1049
- }
1050
- }
1051
- catch (err) {
1052
- if (err instanceof Error && err.message.includes("worktree"))
1053
- throw err;
1054
- throw new GSDError(GSD_IO_ERROR, `Auto-worktree path ${p} exists but .git is unreadable`);
1055
- }
1056
- const previousCwd = process.cwd();
1057
- try {
1058
- process.chdir(p);
1059
- originalBase = basePath;
1060
- }
1061
- catch (err) {
1062
- throw new GSDError(GSD_IO_ERROR, `Failed to enter auto-worktree at ${p}: ${err instanceof Error ? err.message : String(err)}`);
1063
- }
1064
- nudgeGitBranchCache(previousCwd);
1065
- return p;
1066
- }
1067
- /**
1068
- * Get the original project root stored when entering an auto-worktree.
1069
- * Returns null if not currently in an auto-worktree.
1070
- */
1071
- export function getAutoWorktreeOriginalBase() {
1072
- return originalBase;
1073
- }
1074
- export function getActiveAutoWorktreeContext() {
1075
- if (!originalBase)
1076
- return null;
1077
- const cwd = process.cwd();
1078
- const resolvedBase = existsSync(originalBase)
1079
- ? realpathSync(originalBase)
1080
- : originalBase;
1081
- const wtDir = join(resolvedBase, ".gsd", "worktrees");
1082
- if (!cwd.startsWith(wtDir))
1083
- return null;
1084
- const worktreeName = detectWorktreeName(cwd);
1085
- if (!worktreeName)
1086
- return null;
1087
- const branch = nativeGetCurrentBranch(cwd);
1088
- if (!branch.startsWith("milestone/"))
1089
- return null;
1090
- return {
1091
- originalBase,
1092
- worktreeName,
1093
- branch,
1094
- };
1095
- }
1096
- // ─── Merge Milestone -> Main ───────────────────────────────────────────────
1097
- /**
1098
- * Auto-commit any dirty (uncommitted) state in the given directory.
1099
- * Returns true if a commit was made, false if working tree was clean.
1100
- */
1101
- function autoCommitDirtyState(cwd) {
1102
- try {
1103
- const status = nativeWorkingTreeStatus(cwd);
1104
- if (!status)
1105
- return false;
1106
- nativeAddAllWithExclusions(cwd, RUNTIME_EXCLUSION_PATHS);
1107
- const result = nativeCommit(cwd, "chore: auto-commit before milestone merge");
1108
- return result !== null;
1109
- }
1110
- catch (e) {
1111
- debugLog("autoCommitDirtyState", { error: String(e) });
1112
- return false;
1113
- }
1114
- }
1115
- /**
1116
- * Squash-merge the milestone branch into main with a rich commit message
1117
- * listing all completed slices, then tear down the worktree.
1118
- *
1119
- * Sequence:
1120
- * 1. Auto-commit dirty worktree state
1121
- * 2. chdir to originalBasePath
1122
- * 3. git checkout main
1123
- * 4. git merge --squash milestone/<MID>
1124
- * 5. git commit with rich message
1125
- * 6. Auto-push if enabled
1126
- * 7. Delete milestone branch
1127
- * 8. Remove worktree directory
1128
- * 9. Clear originalBase
1129
- *
1130
- * On merge conflict: throws MergeConflictError.
1131
- * On "nothing to commit" after squash: safe only if milestone work is already
1132
- * on the integration branch. Throws if unanchored code changes would be lost.
1133
- */
1134
- export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapContent) {
1135
- const worktreeCwd = process.cwd();
1136
- const milestoneBranch = autoWorktreeBranch(milestoneId);
1137
- // 1. Auto-commit dirty state in worktree before leaving
1138
- autoCommitDirtyState(worktreeCwd);
1139
- // Reconcile worktree DB into main DB before leaving worktree context.
1140
- // Skip when both paths resolve to the same physical file (shared WAL /
1141
- // symlink layout) — ATTACHing a WAL-mode file to itself corrupts the
1142
- // database (#2823).
1143
- if (isDbAvailable()) {
1144
- try {
1145
- const worktreeDbPath = join(worktreeCwd, ".gsd", "gsd.db");
1146
- const mainDbPath = join(originalBasePath_, ".gsd", "gsd.db");
1147
- if (!isSamePath(worktreeDbPath, mainDbPath)) {
1148
- reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1149
- }
1150
- }
1151
- catch {
1152
- /* non-fatal */
1153
- }
1154
- }
1155
- // 2. Get completed slices for commit message
1156
- let completedSlices = [];
1157
- if (isDbAvailable()) {
1158
- completedSlices = getMilestoneSlices(milestoneId)
1159
- .filter(s => s.status === "complete")
1160
- .map(s => ({ id: s.id, title: s.title }));
1161
- }
1162
- // Fallback: parse roadmap content when DB is unavailable
1163
- if (completedSlices.length === 0 && roadmapContent) {
1164
- const sliceRe = /- \[x\] \*\*(\w+):\s*(.+?)\*\*/gi;
1165
- let m;
1166
- while ((m = sliceRe.exec(roadmapContent)) !== null) {
1167
- completedSlices.push({ id: m[1], title: m[2] });
1168
- }
1169
- }
1170
- // 3. chdir to original base
1171
- const previousCwd = process.cwd();
1172
- process.chdir(originalBasePath_);
1173
- // 4. Resolve integration branch — prefer milestone metadata, then preferences,
1174
- // then auto-detect (origin/HEAD → main → master → current). Never hardcode
1175
- // "main": repos using "master" or a custom default branch would fail at
1176
- // checkout and leave the user with a broken merge state (#1668).
1177
- const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
1178
- const integrationBranch = readIntegrationBranch(originalBasePath_, milestoneId);
1179
- const mainBranch = integrationBranch ?? prefs.main_branch ?? nativeDetectMainBranch(originalBasePath_);
1180
- // Remove transient project-root state files before any branch or merge
1181
- // operation. Untracked milestone metadata can otherwise block squash merges.
1182
- clearProjectRootStateFiles(originalBasePath_, milestoneId);
1183
- // 5. Checkout integration branch (skip if already current — avoids git error
1184
- // when main is already checked out in the project-root worktree, #757)
1185
- const currentBranchAtBase = nativeGetCurrentBranch(originalBasePath_);
1186
- if (currentBranchAtBase !== mainBranch) {
1187
- nativeCheckoutBranch(originalBasePath_, mainBranch);
1188
- }
1189
- // 6. Build rich commit message
1190
- const dbMilestone = getMilestone(milestoneId);
1191
- let milestoneTitle = (dbMilestone?.title ?? "").replace(/^M\d+:\s*/, "").trim();
1192
- // Fallback: parse title from roadmap content header (e.g. "# M020: Backend foundation")
1193
- if (!milestoneTitle && roadmapContent) {
1194
- const titleMatch = roadmapContent.match(new RegExp(`^#\\s+${milestoneId}:\\s*(.+)`, "m"));
1195
- if (titleMatch)
1196
- milestoneTitle = titleMatch[1].trim();
1197
- }
1198
- milestoneTitle = milestoneTitle || milestoneId;
1199
- const subject = `feat: ${milestoneTitle}`;
1200
- let body = "";
1201
- if (completedSlices.length > 0) {
1202
- const sliceLines = completedSlices
1203
- .map((s) => `- ${s.id}: ${s.title}`)
1204
- .join("\n");
1205
- body = `\n\nCompleted slices:\n${sliceLines}\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1206
- }
1207
- else {
1208
- body = `\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1209
- }
1210
- const commitMessage = subject + body;
1211
- // 6b. Reconcile worktree HEAD with milestone branch ref (#1846).
1212
- // When the worktree HEAD detaches and advances past the named branch,
1213
- // the branch ref becomes stale. Squash-merging the stale ref silently
1214
- // orphans all commits between the branch ref and the actual worktree HEAD.
1215
- // Fix: fast-forward the branch ref to the worktree HEAD before merging.
1216
- // Only applies when merging from an actual worktree (worktreeCwd differs
1217
- // from originalBasePath_).
1218
- if (worktreeCwd !== originalBasePath_) {
1219
- try {
1220
- const worktreeHead = execFileSync("git", ["rev-parse", "HEAD"], {
1221
- cwd: worktreeCwd,
1222
- stdio: ["ignore", "pipe", "pipe"],
1223
- encoding: "utf-8",
1224
- }).trim();
1225
- const branchHead = execFileSync("git", ["rev-parse", milestoneBranch], {
1226
- cwd: originalBasePath_,
1227
- stdio: ["ignore", "pipe", "pipe"],
1228
- encoding: "utf-8",
1229
- }).trim();
1230
- if (worktreeHead && branchHead && worktreeHead !== branchHead) {
1231
- if (nativeIsAncestor(originalBasePath_, branchHead, worktreeHead)) {
1232
- // Worktree HEAD is strictly ahead — fast-forward the branch ref
1233
- nativeUpdateRef(originalBasePath_, `refs/heads/${milestoneBranch}`, worktreeHead);
1234
- debugLog("mergeMilestoneToMain", {
1235
- action: "fast-forward-branch-ref",
1236
- milestoneBranch,
1237
- oldRef: branchHead.slice(0, 8),
1238
- newRef: worktreeHead.slice(0, 8),
1239
- });
1240
- }
1241
- else {
1242
- // Diverged — fail loudly rather than silently losing commits
1243
- process.chdir(previousCwd);
1244
- throw new GSDError(GSD_GIT_ERROR, `Worktree HEAD (${worktreeHead.slice(0, 8)}) diverged from ` +
1245
- `${milestoneBranch} (${branchHead.slice(0, 8)}). ` +
1246
- `Manual reconciliation required before merge.`);
1247
- }
1248
- }
1249
- }
1250
- catch (err) {
1251
- // Re-throw GSDError (divergence); swallow rev-parse failures
1252
- // (e.g. worktree dir already removed by external cleanup)
1253
- if (err instanceof GSDError)
1254
- throw err;
1255
- debugLog("mergeMilestoneToMain", {
1256
- action: "reconcile-skipped",
1257
- reason: String(err),
1258
- });
1259
- }
1260
- }
1261
- // 7. Stash any pre-existing dirty files so the squash merge is not
1262
- // blocked by unrelated local changes (#2151). clearProjectRootStateFiles
1263
- // only removes untracked .gsd/ files; tracked dirty files elsewhere (e.g.
1264
- // .planning/work-state.json with stash conflict markers) are invisible to
1265
- // that cleanup but will cause `git merge --squash` to reject.
1266
- let stashed = false;
1267
- try {
1268
- const status = execFileSync("git", ["status", "--porcelain"], {
1269
- cwd: originalBasePath_,
1270
- stdio: ["ignore", "pipe", "pipe"],
1271
- encoding: "utf-8",
1272
- }).trim();
1273
- if (status) {
1274
- // Use --include-untracked to stash untracked files that would block
1275
- // the squash merge, but EXCLUDE .gsd/milestones/ (#2505).
1276
- // --include-untracked without exclusion sweeps queued milestone
1277
- // CONTEXT files into the stash. If stash pop later fails, those files
1278
- // are permanently trapped in the stash entry and lost on the next
1279
- // stash push or drop.
1280
- execFileSync("git", [
1281
- "stash", "push", "--include-untracked",
1282
- "-m", `gsd: pre-merge stash for ${milestoneId}`,
1283
- "--", ":(exclude).gsd/milestones",
1284
- ], { cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
1285
- stashed = true;
1286
- }
1287
- }
1288
- catch {
1289
- // Stash failure is non-fatal — proceed without stash and let the merge
1290
- // report the dirty tree if it fails.
1291
- }
1292
- // 7a. Shelter queued milestone directories before the squash merge (#2505).
1293
- // The milestone branch may contain copies of queued milestone dirs (via
1294
- // copyPlanningArtifacts), so `git merge --squash` rejects when those same
1295
- // files exist as untracked in the working tree. Temporarily move them to
1296
- // a backup location, then restore after the merge+commit.
1297
- const milestonesDir = join(gsdRoot(originalBasePath_), "milestones");
1298
- const shelterDir = join(gsdRoot(originalBasePath_), ".milestone-shelter");
1299
- const shelteredDirs = [];
1300
- // Helper: restore sheltered milestone directories (#2505).
1301
- // Called on both success and error paths to ensure queued CONTEXT files
1302
- // are never permanently lost.
1303
- const restoreShelter = () => {
1304
- if (shelteredDirs.length === 0)
1305
- return;
1306
- for (const dirName of shelteredDirs) {
1307
- try {
1308
- mkdirSync(milestonesDir, { recursive: true });
1309
- cpSync(join(shelterDir, dirName), join(milestonesDir, dirName), { recursive: true, force: true });
1310
- }
1311
- catch { /* best-effort */ }
1312
- }
1313
- try {
1314
- rmSync(shelterDir, { recursive: true, force: true });
1315
- }
1316
- catch { /* best-effort */ }
1317
- };
1318
- try {
1319
- if (existsSync(milestonesDir)) {
1320
- const entries = readdirSync(milestonesDir, { withFileTypes: true });
1321
- for (const entry of entries) {
1322
- if (!entry.isDirectory())
1323
- continue;
1324
- // Only shelter directories that do NOT belong to the milestone being merged
1325
- if (entry.name === milestoneId)
1326
- continue;
1327
- const srcDir = join(milestonesDir, entry.name);
1328
- const dstDir = join(shelterDir, entry.name);
1329
- try {
1330
- mkdirSync(shelterDir, { recursive: true });
1331
- cpSync(srcDir, dstDir, { recursive: true, force: true });
1332
- rmSync(srcDir, { recursive: true, force: true });
1333
- shelteredDirs.push(entry.name);
1334
- }
1335
- catch {
1336
- // Non-fatal — if shelter fails, the merge may still succeed
1337
- }
1338
- }
1339
- }
1340
- }
1341
- catch {
1342
- // Non-fatal — proceed with merge; untracked files may block it
1343
- }
1344
- // 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
1345
- const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
1346
- if (!mergeResult.success) {
1347
- // Dirty working tree — the merge was rejected before it started (e.g.
1348
- // untracked .gsd/ files left by syncStateToProjectRoot). Preserve the
1349
- // milestone branch so commits are not lost.
1350
- if (mergeResult.conflicts.includes("__dirty_working_tree__")) {
1351
- // Defensively clean merge state — the native path may leave MERGE_HEAD
1352
- // even when the merge is rejected (#2912).
1353
- try {
1354
- const gitDir_ = resolveGitDir(originalBasePath_);
1355
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1356
- const p = join(gitDir_, f);
1357
- if (existsSync(p))
1358
- unlinkSync(p);
1359
- }
1360
- }
1361
- catch { /* best-effort */ }
1362
- // Pop stash before throwing so local work is not lost.
1363
- if (stashed) {
1364
- try {
1365
- execFileSync("git", ["stash", "pop"], {
1366
- cwd: originalBasePath_,
1367
- stdio: ["ignore", "pipe", "pipe"],
1368
- encoding: "utf-8",
1369
- });
1370
- }
1371
- catch { /* stash pop conflict is non-fatal */ }
1372
- }
1373
- restoreShelter();
1374
- // Restore cwd so the caller is not stranded on the integration branch
1375
- process.chdir(previousCwd);
1376
- // Surface the actual dirty filenames from git stderr instead of
1377
- // generically blaming .gsd/ (#2151).
1378
- const fileList = mergeResult.dirtyFiles?.length
1379
- ? `Dirty files:\n${mergeResult.dirtyFiles.map((f) => ` ${f}`).join("\n")}`
1380
- : `Check \`git status\` in the project root for details.`;
1381
- throw new GSDError(GSD_GIT_ERROR, `Squash merge of ${milestoneBranch} rejected: working tree has dirty or untracked files ` +
1382
- `that conflict with the merge. ${fileList}`);
1383
- }
1384
- // Check for conflicts — use merge result first, fall back to nativeConflictFiles
1385
- const conflictedFiles = mergeResult.conflicts.length > 0
1386
- ? mergeResult.conflicts
1387
- : nativeConflictFiles(originalBasePath_);
1388
- if (conflictedFiles.length > 0) {
1389
- // Separate auto-resolvable conflicts (GSD state files + build artifacts)
1390
- // from real code conflicts. GSD state files diverge between branches
1391
- // during normal operation. Build artifacts are machine-generated and
1392
- // regenerable. Both are safe to accept from the milestone branch.
1393
- const autoResolvable = conflictedFiles.filter(isSafeToAutoResolve);
1394
- const codeConflicts = conflictedFiles.filter((f) => !isSafeToAutoResolve(f));
1395
- // Auto-resolve safe conflicts by accepting the milestone branch version
1396
- if (autoResolvable.length > 0) {
1397
- for (const safeFile of autoResolvable) {
1398
- try {
1399
- nativeCheckoutTheirs(originalBasePath_, [safeFile]);
1400
- nativeAddPaths(originalBasePath_, [safeFile]);
1401
- }
1402
- catch {
1403
- // If checkout --theirs fails, try removing the file from the merge
1404
- // (it's a runtime file that shouldn't be committed anyway)
1405
- nativeRmForce(originalBasePath_, [safeFile]);
1406
- }
1407
- }
1408
- }
1409
- // If there are still real code conflicts, escalate
1410
- if (codeConflicts.length > 0) {
1411
- // Abort merge state so MERGE_HEAD is not left on disk (#2912).
1412
- // libgit2's merge creates MERGE_HEAD even for squash merges; if left
1413
- // dangling, subsequent merges fail and doctor reports corrupt state.
1414
- try {
1415
- nativeMergeAbort(originalBasePath_);
1416
- }
1417
- catch { /* best-effort */ }
1418
- try {
1419
- const gitDir_ = resolveGitDir(originalBasePath_);
1420
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1421
- const p = join(gitDir_, f);
1422
- if (existsSync(p))
1423
- unlinkSync(p);
1424
- }
1425
- }
1426
- catch { /* best-effort */ }
1427
- // Pop stash before throwing so local work is not lost (#2151).
1428
- if (stashed) {
1429
- try {
1430
- execFileSync("git", ["stash", "pop"], {
1431
- cwd: originalBasePath_,
1432
- stdio: ["ignore", "pipe", "pipe"],
1433
- encoding: "utf-8",
1434
- });
1435
- }
1436
- catch { /* stash pop conflict is non-fatal */ }
1437
- }
1438
- restoreShelter();
1439
- throw new MergeConflictError(codeConflicts, "squash", milestoneBranch, mainBranch);
1440
- }
1441
- }
1442
- // No conflicts detected — possibly "already up to date", fall through to commit
1443
- }
1444
- // 9. Commit (handle nothing-to-commit gracefully)
1445
- const commitResult = nativeCommit(originalBasePath_, commitMessage);
1446
- const nothingToCommit = commitResult === null;
1447
- // 9a. Clean up merge state files left by git merge --squash (#1853, #2912).
1448
- // git only removes SQUASH_MSG when the commit reads it directly (plain
1449
- // `git commit`). nativeCommit uses `-F -` (stdin) or libgit2, neither
1450
- // of which trigger git's SQUASH_MSG cleanup. MERGE_HEAD is created by
1451
- // libgit2's merge even in squash mode and is not removed by nativeCommit.
1452
- // If left on disk, doctor reports `corrupt_merge_state` on every subsequent run.
1453
- try {
1454
- const gitDir_ = resolveGitDir(originalBasePath_);
1455
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1456
- const p = join(gitDir_, f);
1457
- if (existsSync(p))
1458
- unlinkSync(p);
1459
- }
1460
- }
1461
- catch { /* best-effort */ }
1462
- // 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
1463
- // Pop after commit so stashed changes do not interfere with the squash merge
1464
- // or the commit content. Conflict on pop is non-fatal — the stash entry is
1465
- // preserved and the user can resolve manually with `git stash pop`.
1466
- if (stashed) {
1467
- try {
1468
- execFileSync("git", ["stash", "pop"], {
1469
- cwd: originalBasePath_,
1470
- stdio: ["ignore", "pipe", "pipe"],
1471
- encoding: "utf-8",
1472
- });
1473
- }
1474
- catch {
1475
- // Stash pop after squash merge can conflict on .gsd/ state files that
1476
- // diverged between branches. Left unresolved, these UU entries block
1477
- // every subsequent merge. Auto-resolve them the same way we handle
1478
- // .gsd/ conflicts during the merge itself: accept HEAD (the just-committed
1479
- // version) and drop the now-applied stash.
1480
- const uu = nativeConflictFiles(originalBasePath_);
1481
- const gsdUU = uu.filter((f) => f.startsWith(".gsd/"));
1482
- const nonGsdUU = uu.filter((f) => !f.startsWith(".gsd/"));
1483
- if (gsdUU.length > 0) {
1484
- for (const f of gsdUU) {
1485
- try {
1486
- // Accept the committed (HEAD) version of the state file
1487
- execFileSync("git", ["checkout", "HEAD", "--", f], {
1488
- cwd: originalBasePath_,
1489
- stdio: ["ignore", "pipe", "pipe"],
1490
- encoding: "utf-8",
1491
- });
1492
- nativeAddPaths(originalBasePath_, [f]);
1493
- }
1494
- catch {
1495
- // Last resort: remove the conflicted state file
1496
- nativeRmForce(originalBasePath_, [f]);
1497
- }
1498
- }
1499
- }
1500
- if (nonGsdUU.length === 0) {
1501
- // All conflicts were .gsd/ files — safe to drop the stash
1502
- try {
1503
- execFileSync("git", ["stash", "drop"], {
1504
- cwd: originalBasePath_,
1505
- stdio: ["ignore", "pipe", "pipe"],
1506
- encoding: "utf-8",
1507
- });
1508
- }
1509
- catch { /* stash may already be consumed */ }
1510
- }
1511
- else {
1512
- // Non-.gsd conflicts remain — leave stash for manual resolution
1513
- logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
1514
- files: nonGsdUU.join(", "),
1515
- });
1516
- }
1517
- }
1518
- }
1519
- // 9a-iii. Restore sheltered queued milestone directories (#2505).
1520
- restoreShelter();
1521
- // 9b. Safety check (#1792): if nothing was committed, verify the milestone
1522
- // work is already on the integration branch before allowing teardown.
1523
- // Compare only non-.gsd/ paths — .gsd/ state files diverge normally and
1524
- // are auto-resolved during the squash merge.
1525
- if (nothingToCommit) {
1526
- const numstat = nativeDiffNumstat(originalBasePath_, mainBranch, milestoneBranch);
1527
- const codeChanges = numstat.filter((entry) => !entry.path.startsWith(".gsd/"));
1528
- if (codeChanges.length > 0) {
1529
- // Milestone has unanchored code changes — abort teardown.
1530
- process.chdir(previousCwd);
1531
- throw new GSDError(GSD_GIT_ERROR, `Squash merge produced nothing to commit but milestone branch "${milestoneBranch}" ` +
1532
- `has ${codeChanges.length} code file(s) not on "${mainBranch}". ` +
1533
- `Aborting worktree teardown to prevent data loss.`);
1534
- }
1535
- }
1536
- // 9c. Detect whether any non-.gsd/ code files were actually merged (#1906).
1537
- // When a milestone only produced .gsd/ metadata (summaries, roadmaps) but no
1538
- // real code, the user sees "milestone complete" but nothing changed in their
1539
- // codebase. Surface this so the caller can warn the user.
1540
- let codeFilesChanged = false;
1541
- if (!nothingToCommit) {
1542
- try {
1543
- const mergedFiles = nativeDiffNumstat(originalBasePath_, "HEAD~1", "HEAD");
1544
- codeFilesChanged = mergedFiles.some((entry) => !entry.path.startsWith(".gsd/"));
1545
- }
1546
- catch {
1547
- // If HEAD~1 doesn't exist (first commit), assume code was changed
1548
- codeFilesChanged = true;
1549
- }
1550
- }
1551
- // 10. Auto-push if enabled
1552
- let pushed = false;
1553
- if (prefs.auto_push === true && !nothingToCommit) {
1554
- const remote = prefs.remote ?? "origin";
1555
- try {
1556
- execFileSync("git", ["push", remote, mainBranch], {
1557
- cwd: originalBasePath_,
1558
- stdio: ["ignore", "pipe", "pipe"],
1559
- encoding: "utf-8",
1560
- });
1561
- pushed = true;
1562
- }
1563
- catch {
1564
- // Push failure is non-fatal
1565
- }
1566
- }
1567
- // 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
1568
- let prCreated = false;
1569
- if (prefs.auto_pr === true && !nothingToCommit) {
1570
- const remote = prefs.remote ?? "origin";
1571
- const prTarget = prefs.pr_target_branch ?? mainBranch;
1572
- try {
1573
- // Push the milestone branch to remote first
1574
- execFileSync("git", ["push", remote, milestoneBranch], {
1575
- cwd: originalBasePath_,
1576
- stdio: ["ignore", "pipe", "pipe"],
1577
- encoding: "utf-8",
1578
- });
1579
- // Create PR via gh CLI with explicit --head and --base (#2302)
1580
- execFileSync("gh", [
1581
- "pr", "create", "--draft",
1582
- "--base", prTarget,
1583
- "--head", milestoneBranch,
1584
- "--title", `Milestone ${milestoneId} complete`,
1585
- "--body", "Auto-created by GSD on milestone completion.",
1586
- ], {
1587
- cwd: originalBasePath_,
1588
- stdio: ["ignore", "pipe", "pipe"],
1589
- encoding: "utf-8",
1590
- });
1591
- prCreated = true;
1592
- }
1593
- catch {
1594
- // PR creation failure is non-fatal — gh may not be installed or authenticated
1595
- }
1596
- }
1597
- // 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
1598
- // throws only when the milestone has unanchored code changes, passes
1599
- // through when the code is genuinely already on the integration branch.
1600
- // 11a. Pre-teardown safety net (#1853): if the worktree still has uncommitted
1601
- // changes (e.g. nativeHasChanges cache returned stale false, or auto-commit
1602
- // silently failed), force one final commit so code is not destroyed by
1603
- // `git worktree remove --force`.
1604
- if (existsSync(worktreeCwd)) {
1605
- try {
1606
- const dirtyCheck = nativeWorkingTreeStatus(worktreeCwd);
1607
- if (dirtyCheck) {
1608
- debugLog("mergeMilestoneToMain", {
1609
- phase: "pre-teardown-dirty",
1610
- worktreeCwd,
1611
- status: dirtyCheck.slice(0, 200),
1612
- });
1613
- nativeAddAllWithExclusions(worktreeCwd, RUNTIME_EXCLUSION_PATHS);
1614
- nativeCommit(worktreeCwd, "chore: pre-teardown auto-commit of uncommitted worktree changes");
1615
- }
1616
- }
1617
- catch (e) {
1618
- debugLog("mergeMilestoneToMain", {
1619
- phase: "pre-teardown-commit-error",
1620
- error: String(e),
1621
- });
1622
- }
1623
- }
1624
- // 12. Remove worktree directory first (must happen before branch deletion)
1625
- try {
1626
- removeWorktree(originalBasePath_, milestoneId, {
1627
- branch: null,
1628
- deleteBranch: false,
1629
- });
1630
- }
1631
- catch {
1632
- // Best-effort -- worktree dir may already be gone
1633
- }
1634
- // 13. Delete milestone branch (after worktree removal so ref is unlocked)
1635
- try {
1636
- nativeBranchDelete(originalBasePath_, milestoneBranch);
1637
- }
1638
- catch {
1639
- // Best-effort
1640
- }
1641
- // 14. Clear module state
1642
- originalBase = null;
1643
- nudgeGitBranchCache(previousCwd);
1644
- return { commitMessage, pushed, prCreated, codeFilesChanged };
1645
- }