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,1458 +0,0 @@
1
- import { describe, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, symlinkSync } from "node:fs";
4
- import { join, dirname } from "node:path";
5
- import { tmpdir } from "node:os";
6
- import { execSync } from "node:child_process";
7
-
8
- import {
9
- inferCommitType,
10
- buildTaskCommitMessage,
11
- GitServiceImpl,
12
- MergeConflictError,
13
- RUNTIME_EXCLUSION_PATHS,
14
- VALID_BRANCH_NAME,
15
- runGit,
16
- readIntegrationBranch,
17
- resolveMilestoneIntegrationBranch,
18
- writeIntegrationBranch,
19
- type GitPreferences,
20
- type CommitOptions,
21
- type PreMergeCheckResult,
22
- type TaskCommitContext,
23
- } from "../../git-service.ts";
24
- import { nativeAddAllWithExclusions } from "../../native-git-bridge.ts";
25
- function run(command: string, cwd: string): string {
26
- return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
27
- }
28
-
29
- describe('git-service', async () => {
30
- // ─── inferCommitType ───────────────────────────────────────────────────
31
-
32
-
33
- assert.deepStrictEqual(
34
- inferCommitType("Implement user authentication"),
35
- "feat",
36
- "generic feature title → feat"
37
- );
38
-
39
- assert.deepStrictEqual(
40
- inferCommitType("Add dashboard page"),
41
- "feat",
42
- "add-style title → feat"
43
- );
44
-
45
- assert.deepStrictEqual(
46
- inferCommitType("Fix login redirect bug"),
47
- "fix",
48
- "title with 'fix' → fix"
49
- );
50
-
51
- assert.deepStrictEqual(
52
- inferCommitType("Bug in session handling"),
53
- "fix",
54
- "title with 'bug' → fix"
55
- );
56
-
57
- assert.deepStrictEqual(
58
- inferCommitType("Hotfix for production crash"),
59
- "fix",
60
- "title with 'hotfix' → fix"
61
- );
62
-
63
- assert.deepStrictEqual(
64
- inferCommitType("Patch memory leak"),
65
- "fix",
66
- "title with 'patch' → fix"
67
- );
68
-
69
- assert.deepStrictEqual(
70
- inferCommitType("Refactor state management"),
71
- "refactor",
72
- "title with 'refactor' → refactor"
73
- );
74
-
75
- assert.deepStrictEqual(
76
- inferCommitType("Restructure project layout"),
77
- "refactor",
78
- "title with 'restructure' → refactor"
79
- );
80
-
81
- assert.deepStrictEqual(
82
- inferCommitType("Reorganize module imports"),
83
- "refactor",
84
- "title with 'reorganize' → refactor"
85
- );
86
-
87
- assert.deepStrictEqual(
88
- inferCommitType("Update API documentation"),
89
- "docs",
90
- "title with 'documentation' → docs"
91
- );
92
-
93
- assert.deepStrictEqual(
94
- inferCommitType("Add doc for setup guide"),
95
- "docs",
96
- "title with 'doc' → docs"
97
- );
98
-
99
- assert.deepStrictEqual(
100
- inferCommitType("Add unit tests for auth"),
101
- "test",
102
- "title with 'tests' → test"
103
- );
104
-
105
- assert.deepStrictEqual(
106
- inferCommitType("Testing infrastructure setup"),
107
- "test",
108
- "title with 'testing' → test"
109
- );
110
-
111
- assert.deepStrictEqual(
112
- inferCommitType("Chore: update dependencies"),
113
- "chore",
114
- "title with 'chore' → chore"
115
- );
116
-
117
- assert.deepStrictEqual(
118
- inferCommitType("Cleanup unused imports"),
119
- "chore",
120
- "title with 'cleanup' → chore"
121
- );
122
-
123
- assert.deepStrictEqual(
124
- inferCommitType("Clean up stale branches"),
125
- "chore",
126
- "title with 'clean up' → chore"
127
- );
128
-
129
- assert.deepStrictEqual(
130
- inferCommitType("Archive old milestones"),
131
- "chore",
132
- "title with 'archive' → chore"
133
- );
134
-
135
- assert.deepStrictEqual(
136
- inferCommitType("Remove deprecated endpoints"),
137
- "chore",
138
- "title with 'remove' → chore"
139
- );
140
-
141
- assert.deepStrictEqual(
142
- inferCommitType("Delete temp files"),
143
- "chore",
144
- "title with 'delete' → chore"
145
- );
146
-
147
- // Mixed keywords — first match wins
148
- assert.deepStrictEqual(
149
- inferCommitType("Fix and refactor the login module"),
150
- "fix",
151
- "mixed keywords → first match wins (fix before refactor)"
152
- );
153
-
154
- assert.deepStrictEqual(
155
- inferCommitType("Refactor test utilities"),
156
- "refactor",
157
- "mixed keywords → first match wins (refactor before test)"
158
- );
159
-
160
- // Unknown / unrecognized title → feat
161
- assert.deepStrictEqual(
162
- inferCommitType("Build the new pipeline"),
163
- "feat",
164
- "unrecognized title → feat"
165
- );
166
-
167
- assert.deepStrictEqual(
168
- inferCommitType(""),
169
- "feat",
170
- "empty title → feat"
171
- );
172
-
173
- // Word boundary: "testify" should NOT match "test"
174
- assert.deepStrictEqual(
175
- inferCommitType("Testify integration"),
176
- "feat",
177
- "'testify' does not match 'test' — word boundary prevents partial match"
178
- );
179
-
180
- // "documentary" should NOT match "doc" (word boundary)
181
- assert.deepStrictEqual(
182
- inferCommitType("Documentary style UI"),
183
- "feat",
184
- "'documentary' does not match 'doc' — word boundary prevents partial match"
185
- );
186
-
187
- // "prefix" should NOT match "fix" (word boundary)
188
- assert.deepStrictEqual(
189
- inferCommitType("Add prefix to all IDs"),
190
- "feat",
191
- "'prefix' does not match 'fix' — word boundary prevents partial match"
192
- );
193
-
194
- // ─── inferCommitType with oneLiner ──────────────────────────────────────
195
-
196
-
197
- assert.deepStrictEqual(
198
- inferCommitType("implement dashboard", "Fixed rendering bug in sidebar"),
199
- "fix",
200
- "one-liner with 'fixed' overrides generic title → fix"
201
- );
202
-
203
- assert.deepStrictEqual(
204
- inferCommitType("add search", "Optimized query performance with caching"),
205
- "perf",
206
- "one-liner with 'performance' and 'caching' → perf"
207
- );
208
-
209
- // ─── buildTaskCommitMessage ─────────────────────────────────────────────
210
-
211
- test('buildTaskCommitMessage', () => {
212
- const msg = buildTaskCommitMessage({
213
- taskId: "S01/T02",
214
- taskTitle: "implement user authentication",
215
- oneLiner: "Added JWT-based auth with refresh token rotation",
216
- keyFiles: ["src/auth.ts", "src/middleware/jwt.ts"],
217
- });
218
- assert.ok(msg.startsWith("feat:"), "message starts with type: (no scope)");
219
- assert.ok(!msg.includes("(S01/T02)"), "no GSD ID in subject line");
220
- assert.ok(msg.includes("JWT-based auth"), "message includes one-liner content");
221
- assert.ok(msg.includes("- src/auth.ts"), "message body includes key files");
222
- assert.ok(msg.includes("- src/middleware/jwt.ts"), "message body includes second key file");
223
- assert.ok(msg.includes("GSD-Task: S01/T02"), "GSD-Task trailer in body");
224
- });
225
-
226
- {
227
- const msg = buildTaskCommitMessage({
228
- taskId: "S02/T01",
229
- taskTitle: "fix login redirect bug",
230
- });
231
- assert.ok(msg.startsWith("fix:"), "infers fix type from title");
232
- assert.ok(msg.includes("fix login redirect bug"), "uses task title when no one-liner");
233
- assert.ok(msg.includes("GSD-Task: S02/T01"), "GSD-Task trailer present");
234
- }
235
-
236
- {
237
- const msg = buildTaskCommitMessage({
238
- taskId: "S01/T03",
239
- taskTitle: "add tests",
240
- oneLiner: "Unit tests for auth module with coverage",
241
- });
242
- assert.ok(msg.startsWith("test:"), "infers test type");
243
- assert.ok(msg.includes("GSD-Task: S01/T03"), "GSD-Task trailer present");
244
- }
245
-
246
- // ─── RUNTIME_EXCLUSION_PATHS ───────────────────────────────────────────
247
-
248
-
249
- assert.deepStrictEqual(
250
- RUNTIME_EXCLUSION_PATHS.length,
251
- 13,
252
- "exactly 13 runtime exclusion paths"
253
- );
254
-
255
- const expectedPaths = [
256
- ".gsd/activity/",
257
- ".gsd/runtime/",
258
- ".gsd/worktrees/",
259
- ".gsd/auto.lock",
260
- ".gsd/metrics.json",
261
- ".gsd/completed-units.json",
262
- ".gsd/STATE.md",
263
- ".gsd/gsd.db",
264
- ".gsd/gsd.db-shm",
265
- ".gsd/gsd.db-wal",
266
- ".gsd/journal/",
267
- ".gsd/doctor-history.jsonl",
268
- ".gsd/DISCUSSION-MANIFEST.json",
269
- ];
270
-
271
- assert.deepStrictEqual(
272
- [...RUNTIME_EXCLUSION_PATHS],
273
- expectedPaths,
274
- "paths match expected set in order"
275
- );
276
-
277
- assert.ok(
278
- RUNTIME_EXCLUSION_PATHS.includes(".gsd/activity/"),
279
- "includes .gsd/activity/"
280
- );
281
- assert.ok(
282
- RUNTIME_EXCLUSION_PATHS.includes(".gsd/STATE.md"),
283
- "includes .gsd/STATE.md"
284
- );
285
-
286
- // ─── runGit ────────────────────────────────────────────────────────────
287
-
288
-
289
- const tempDir = mkdtempSync(join(tmpdir(), "gsd-git-service-test-"));
290
- runGit(tempDir, ["init", "-b", "main"]);
291
- runGit(tempDir, ["config", "user.name", "Pi Test"]);
292
- runGit(tempDir, ["config", "user.email", "pi@example.com"]);
293
-
294
- // runGit should work on a valid repo
295
- const branch = runGit(tempDir, ["branch", "--show-current"]);
296
- assert.deepStrictEqual(branch, "main", "runGit returns current branch");
297
-
298
- // runGit allowFailure returns empty string on failure
299
- const result = runGit(tempDir, ["log", "--oneline"], { allowFailure: true });
300
- assert.deepStrictEqual(result, "", "runGit allowFailure returns empty on error (no commits yet)");
301
-
302
- // runGit throws on failure without allowFailure
303
- let threw = false;
304
- try {
305
- runGit(tempDir, ["log", "--oneline"]);
306
- } catch (e) {
307
- threw = true;
308
- assert.ok(
309
- (e as Error).message.includes("git log --oneline failed"),
310
- "error message includes command and path"
311
- );
312
- }
313
- assert.ok(threw, "runGit throws without allowFailure on error");
314
-
315
- // ─── Type exports compile check ────────────────────────────────────────
316
-
317
-
318
- // These are compile-time checks — if we got here, the types import fine
319
- const _prefs: GitPreferences = { auto_push: true, remote: "origin" };
320
- const _opts: CommitOptions = { message: "test" };
321
- assert.ok(true, "GitPreferences type exported and usable");
322
- assert.ok(true, "CommitOptions type exported and usable");
323
-
324
- // Cleanup T01 temp dir
325
- rmSync(tempDir, { recursive: true, force: true });
326
-
327
- // ─── Helper: create file with intermediate dirs ────────────────────────
328
-
329
- function createFile(base: string, relativePath: string, content: string = "x"): void {
330
- const full = join(base, relativePath);
331
- mkdirSync(dirname(full), { recursive: true });
332
- writeFileSync(full, content, "utf-8");
333
- }
334
-
335
- function initTempRepo(): string {
336
- const dir = mkdtempSync(join(tmpdir(), "gsd-git-t02-"));
337
- runGit(dir, ["init", "-b", "main"]);
338
- runGit(dir, ["config", "user.name", "Pi Test"]);
339
- runGit(dir, ["config", "user.email", "pi@example.com"]);
340
- // Need an initial commit so HEAD exists
341
- createFile(dir, ".gitkeep", "");
342
- runGit(dir, ["add", "-A"]);
343
- runGit(dir, ["commit", "-m", "init"]);
344
- return dir;
345
- }
346
-
347
- // ─── GitServiceImpl: smart staging ─────────────────────────────────────
348
-
349
- test('GitServiceImpl: smart staging', () => {
350
- const repo = initTempRepo();
351
- const svc = new GitServiceImpl(repo);
352
-
353
- // Create runtime files (should be excluded from staging)
354
- createFile(repo, ".gsd/activity/log.jsonl", "log data");
355
- createFile(repo, ".gsd/runtime/state.json", '{"state":true}');
356
- createFile(repo, ".gsd/STATE.md", "# State");
357
- createFile(repo, ".gsd/auto.lock", "lock");
358
- createFile(repo, ".gsd/metrics.json", "{}");
359
- createFile(repo, ".gsd/worktrees/wt/file.txt", "wt data");
360
-
361
- // Create a real file (should be staged)
362
- createFile(repo, "src/code.ts", 'console.log("hello");');
363
-
364
- const result = svc.commit({ message: "test: smart staging" });
365
-
366
- assert.deepStrictEqual(result, "test: smart staging", "commit returns the commit message");
367
-
368
- // Verify only src/code.ts is in the commit
369
- const showStat = run("git show --stat --format= HEAD", repo);
370
- assert.ok(showStat.includes("src/code.ts"), "src/code.ts is in the commit");
371
- assert.ok(!showStat.includes(".gsd/activity"), ".gsd/activity/ excluded from commit");
372
- assert.ok(!showStat.includes(".gsd/runtime"), ".gsd/runtime/ excluded from commit");
373
- assert.ok(!showStat.includes("STATE.md"), ".gsd/STATE.md excluded from commit");
374
- assert.ok(!showStat.includes("auto.lock"), ".gsd/auto.lock excluded from commit");
375
- assert.ok(!showStat.includes("metrics.json"), ".gsd/metrics.json excluded from commit");
376
- assert.ok(!showStat.includes(".gsd/worktrees"), ".gsd/worktrees/ excluded from commit");
377
-
378
- // Verify runtime files are still untracked
379
- // git status --short may collapse to "?? .gsd/" or show individual files
380
- // Use --untracked-files=all to force individual listing
381
- const statusOut = run("git status --short --untracked-files=all", repo);
382
- assert.ok(statusOut.includes(".gsd/activity/"), "activity still untracked after commit");
383
- assert.ok(statusOut.includes(".gsd/runtime/"), "runtime still untracked after commit");
384
- assert.ok(statusOut.includes(".gsd/STATE.md"), "STATE.md still untracked after commit");
385
-
386
- rmSync(repo, { recursive: true, force: true });
387
- });
388
-
389
- // ─── GitServiceImpl: smart staging excludes tracked runtime files ──────
390
-
391
- test('GitServiceImpl: smart staging excludes tracked runtime files', () => {
392
- // Reproduces the real bug: .gsd/ runtime files that are already tracked
393
- // (in the git index) must be excluded from staging even when .gsd/ is
394
- // in .gitignore. The old pathspec-exclude approach failed silently in
395
- // this case and fell back to `git add -A`, staging everything.
396
- //
397
- // The fix has three layers:
398
- // 1. Auto-cleanup: git rm --cached removes tracked runtime files from index
399
- // 2. Stage-then-unstage: git add -A + git reset HEAD replaces pathspec excludes
400
- // 3. Pre-checkout discard: git checkout -- .gsd/ clears dirty runtime files
401
-
402
- const repo = initTempRepo();
403
- const svc = new GitServiceImpl(repo);
404
-
405
- // Simulate a repo where .gsd/ files were previously force-added
406
- createFile(repo, ".gsd/metrics.json", '{"version":1}');
407
- createFile(repo, ".gsd/completed-units.json", '["unit1"]');
408
- createFile(repo, ".gsd/activity/log.jsonl", '{"ts":1}');
409
- createFile(repo, "src/real.ts", "real code");
410
- // Force-add .gsd/ files to simulate historical tracking
411
- runGit(repo, ["add", "-f", ".gsd/metrics.json", ".gsd/completed-units.json", ".gsd/activity/log.jsonl", "src/real.ts"]);
412
- runGit(repo, ["commit", "-F", "-"], { input: "init with tracked runtime files" });
413
-
414
- // Add .gitignore with .gsd/ (matches real-world setup from ensureGitignore)
415
- createFile(repo, ".gitignore", ".gsd/\n");
416
- runGit(repo, ["add", ".gitignore"]);
417
- runGit(repo, ["commit", "-F", "-"], { input: "add gitignore" });
418
-
419
- // Verify runtime files are tracked (precondition)
420
- const tracked = run("git ls-files .gsd/", repo);
421
- assert.ok(tracked.includes("metrics.json"), "precondition: metrics.json tracked");
422
- assert.ok(tracked.includes("completed-units.json"), "precondition: completed-units.json tracked");
423
- assert.ok(tracked.includes("activity/log.jsonl"), "precondition: activity log tracked");
424
-
425
- // Now modify both runtime and real files
426
- createFile(repo, ".gsd/metrics.json", '{"version":2}');
427
- createFile(repo, ".gsd/completed-units.json", '["unit1","unit2"]');
428
- createFile(repo, ".gsd/activity/log.jsonl", '{"ts":2}');
429
- createFile(repo, "src/real.ts", "updated code");
430
-
431
- // autoCommit should commit real.ts. The first call also runs auto-cleanup
432
- // which removes runtime files from the index via a dedicated commit.
433
- const msg = svc.autoCommit("execute-task", "M001/S01/T01");
434
- assert.ok(msg !== null, "autoCommit produces a commit");
435
-
436
- const show = run("git show --stat HEAD", repo);
437
- assert.ok(show.includes("src/real.ts"), "real files are committed");
438
-
439
- // After the commit, runtime files must no longer be in the git index.
440
- // They remain on disk but are untracked (protected by .gitignore).
441
- const trackedAfter = run("git ls-files .gsd/", repo);
442
- assert.deepStrictEqual(trackedAfter, "", "no .gsd/ runtime files remain in the index");
443
-
444
- // Verify a second autoCommit with changed runtime files does NOT stage them
445
- createFile(repo, ".gsd/metrics.json", '{"version":3}');
446
- createFile(repo, ".gsd/completed-units.json", '["unit1","unit2","unit3"]');
447
- createFile(repo, "src/real.ts", "third version");
448
-
449
- const msg2 = svc.autoCommit("execute-task", "M001/S01/T02");
450
- assert.ok(msg2 !== null, "second autoCommit produces a commit");
451
-
452
- const show2 = run("git show --stat HEAD", repo);
453
- assert.ok(show2.includes("src/real.ts"), "real files committed in second commit");
454
- assert.ok(!show2.includes("metrics"), "metrics.json not in second commit");
455
- assert.ok(!show2.includes("completed-units"), "completed-units.json not in second commit");
456
- assert.ok(!show2.includes("activity"), "activity not in second commit");
457
-
458
- rmSync(repo, { recursive: true, force: true });
459
- });
460
-
461
- // ─── GitServiceImpl: autoCommit on clean repo ──────────────────────────
462
-
463
- test('GitServiceImpl: autoCommit', () => {
464
- const repo = initTempRepo();
465
- const svc = new GitServiceImpl(repo);
466
-
467
- // Clean repo — autoCommit should return null
468
- const cleanResult = svc.autoCommit("task", "T01");
469
- assert.deepStrictEqual(cleanResult, null, "autoCommit on clean repo returns null");
470
-
471
- rmSync(repo, { recursive: true, force: true });
472
- });
473
-
474
- // ─── GitServiceImpl: autoCommit on dirty repo ──────────────────────────
475
-
476
- test('GitServiceImpl: autoCommit on dirty repo', () => {
477
- const repo = initTempRepo();
478
- const svc = new GitServiceImpl(repo);
479
-
480
- createFile(repo, "src/new-feature.ts", "export const x = 1;");
481
-
482
- // Without task context, autoCommit uses generic chore message
483
- const msg = svc.autoCommit("task", "T01");
484
- assert.deepStrictEqual(msg, "chore: auto-commit after task\n\nGSD-Unit: T01", "autoCommit returns generic format with trailer");
485
-
486
- const log = run("git log --oneline -1", repo);
487
- assert.ok(log.includes("chore: auto-commit after task"), "generic commit message is in git log");
488
-
489
- // With task context, autoCommit uses meaningful message
490
- createFile(repo, "src/auth.ts", "export function login() {}");
491
- const msg2 = svc.autoCommit("task", "S01/T02", [], {
492
- taskId: "S01/T02",
493
- taskTitle: "implement user authentication endpoint",
494
- oneLiner: "Added JWT-based auth with refresh token rotation",
495
- keyFiles: ["src/auth.ts"],
496
- });
497
- assert.ok(msg2 !== null, "autoCommit with task context returns a message");
498
- assert.ok(msg2!.startsWith("feat:"), "meaningful commit uses feat type without scope");
499
- assert.ok(msg2!.includes("JWT-based auth"), "meaningful commit includes one-liner content");
500
- assert.ok(msg2!.includes("GSD-Task: S01/T02"), "meaningful commit has GSD-Task trailer");
501
-
502
- rmSync(repo, { recursive: true, force: true });
503
- });
504
-
505
- // ─── GitServiceImpl: empty-after-staging guard ─────────────────────────
506
-
507
- test('GitServiceImpl: empty-after-staging guard', () => {
508
- const repo = initTempRepo();
509
- const svc = new GitServiceImpl(repo);
510
-
511
- // Create only runtime files
512
- createFile(repo, ".gsd/activity/x.jsonl", "data");
513
-
514
- const result = svc.autoCommit("task", "T02");
515
- assert.deepStrictEqual(result, null, "autoCommit returns null when only runtime files are dirty");
516
-
517
- // Verify no new commit was created (should still be at init commit)
518
- const logCount = run("git rev-list --count HEAD", repo);
519
- assert.deepStrictEqual(logCount, "1", "no new commit created when only runtime files changed");
520
-
521
- rmSync(repo, { recursive: true, force: true });
522
- });
523
-
524
- // ─── GitServiceImpl: autoCommit with extraExclusions ───────────────────
525
-
526
- test('GitServiceImpl: autoCommit with extraExclusions', () => {
527
- const repo = initTempRepo();
528
- const svc = new GitServiceImpl(repo);
529
-
530
- // Create both a .gsd/ planning file and a regular source file
531
- createFile(repo, ".gsd/milestones/M001/M001-ROADMAP.md", "- [x] S01");
532
- createFile(repo, "src/feature.ts", "export const y = 2;");
533
-
534
- // Auto-commit with .gsd/ excluded (simulates pre-switch)
535
- const msg = svc.autoCommit("pre-switch", "main", [".gsd/"]);
536
- assert.deepStrictEqual(msg, "chore: auto-commit after pre-switch\n\nGSD-Unit: main", "pre-switch autoCommit with .gsd/ exclusion commits");
537
-
538
- // Verify .gsd/ file was NOT committed
539
- const show = run("git show --stat HEAD", repo);
540
- assert.ok(!show.includes("ROADMAP"), ".gsd/ files excluded from pre-switch auto-commit");
541
- assert.ok(show.includes("feature.ts"), "non-.gsd/ files included in pre-switch auto-commit");
542
-
543
- rmSync(repo, { recursive: true, force: true });
544
- });
545
-
546
- // ─── GitServiceImpl: autoCommit extraExclusions — only .gsd/ dirty ────
547
-
548
- test('GitServiceImpl: autoCommit extraExclusions — only .gsd/ dirty', () => {
549
- const repo = initTempRepo();
550
- const svc = new GitServiceImpl(repo);
551
-
552
- // Create only .gsd/ planning files
553
- createFile(repo, ".gsd/milestones/M001/M001-ROADMAP.md", "- [x] S01");
554
- createFile(repo, ".gsd/STATE.md", "state content");
555
-
556
- // Auto-commit with .gsd/ excluded — nothing else to commit
557
- const result = svc.autoCommit("pre-switch", "main", [".gsd/"]);
558
- assert.deepStrictEqual(result, null, "autoCommit returns null when only .gsd/ files are dirty and excluded");
559
-
560
- rmSync(repo, { recursive: true, force: true });
561
- });
562
-
563
- // ─── GitServiceImpl: commit returns null when nothing staged ───────────
564
-
565
- test('GitServiceImpl: commit empty', () => {
566
- const repo = initTempRepo();
567
- const svc = new GitServiceImpl(repo);
568
-
569
- // Nothing dirty, commit should return null
570
- const result = svc.commit({ message: "should not commit" });
571
- assert.deepStrictEqual(result, null, "commit returns null when nothing to stage");
572
-
573
- rmSync(repo, { recursive: true, force: true });
574
- });
575
-
576
- // ─── Helper: create repo for branch tests ────────────────────────────
577
-
578
- function initBranchTestRepo(): string {
579
- const dir = mkdtempSync(join(tmpdir(), "gsd-git-t03-"));
580
- runGit(dir, ["init", "-b", "main"]);
581
- runGit(dir, ["config", "user.name", "Pi Test"]);
582
- runGit(dir, ["config", "user.email", "pi@example.com"]);
583
- createFile(dir, ".gitkeep", "");
584
- runGit(dir, ["add", "-A"]);
585
- runGit(dir, ["commit", "-m", "init"]);
586
- return dir;
587
- }
588
-
589
- // ─── getCurrentBranch ────────────────────────────────────────────────
590
-
591
- test('Branch queries', () => {
592
- const repo = initBranchTestRepo();
593
- const svc = new GitServiceImpl(repo);
594
-
595
- assert.deepStrictEqual(svc.getCurrentBranch(), "main", "getCurrentBranch returns main on main branch");
596
-
597
- run("git checkout -b gsd/M001/S01", repo);
598
- assert.deepStrictEqual(svc.getCurrentBranch(), "gsd/M001/S01", "getCurrentBranch returns slice branch name");
599
-
600
- run("git checkout -b feature/foo", repo);
601
- assert.deepStrictEqual(svc.getCurrentBranch(), "feature/foo", "getCurrentBranch returns feature branch name");
602
-
603
- rmSync(repo, { recursive: true, force: true });
604
- });
605
-
606
- // ─── getMainBranch ────────────────────────────────────────────────────
607
-
608
- test('getMainBranch', () => {
609
- const repo = initBranchTestRepo();
610
- const svc = new GitServiceImpl(repo);
611
-
612
- // Basic case: repo has "main" branch
613
- assert.deepStrictEqual(svc.getMainBranch(), "main", "getMainBranch returns main when main exists");
614
-
615
- rmSync(repo, { recursive: true, force: true });
616
- });
617
-
618
- {
619
- // master-only repo
620
- const repo = mkdtempSync(join(tmpdir(), "gsd-git-t03-master-"));
621
- runGit(repo, ["init", "-b", "master"]);
622
- runGit(repo, ["config", "user.name", "Pi Test"]);
623
- runGit(repo, ["config", "user.email", "pi@example.com"]);
624
- createFile(repo, ".gitkeep", "");
625
- runGit(repo, ["add", "-A"]);
626
- runGit(repo, ["commit", "-m", "init"]);
627
-
628
- const svc = new GitServiceImpl(repo);
629
- assert.deepStrictEqual(svc.getMainBranch(), "master", "getMainBranch returns master when only master exists");
630
-
631
- rmSync(repo, { recursive: true, force: true });
632
- }
633
-
634
- // ═══════════════════════════════════════════════════════════════════════
635
- // S05: Enhanced features — snapshots, pre-merge checks
636
- // ═══════════════════════════════════════════════════════════════════════
637
-
638
- // ─── createSnapshot: default (enabled) ─────────────────────────────────
639
-
640
- test('createSnapshot: enabled by default when prefs omitted', () => {
641
- const repo = initBranchTestRepo();
642
- const svc = new GitServiceImpl(repo);
643
-
644
- // Create a branch with a commit
645
- run("git checkout -b gsd/M001/S01", repo);
646
- createFile(repo, "src/snap.ts", "snapshot me");
647
- svc.commit({ message: "snapshot test commit" });
648
-
649
- // Create snapshot ref for this branch
650
- svc.createSnapshot("gsd/M001/S01");
651
-
652
- // Verify ref exists under refs/gsd/snapshots/
653
- const refs = run("git for-each-ref refs/gsd/snapshots/", repo);
654
- assert.ok(refs.includes("refs/gsd/snapshots/gsd/M001/S01/"), "snapshot ref created under refs/gsd/snapshots/");
655
-
656
- rmSync(repo, { recursive: true, force: true });
657
- });
658
-
659
- // ─── createSnapshot: prefs disabled ────────────────────────────────────
660
-
661
- test('createSnapshot: disabled', () => {
662
- const repo = initBranchTestRepo();
663
- const svc = new GitServiceImpl(repo, { snapshots: false });
664
-
665
- run("git checkout -b gsd/M001/S01", repo);
666
- createFile(repo, "src/no-snap.ts", "no snapshot");
667
- svc.commit({ message: "no snapshot commit" });
668
-
669
- // createSnapshot should be a no-op when disabled
670
- svc.createSnapshot("gsd/M001/S01");
671
-
672
- const refs = run("git for-each-ref refs/gsd/snapshots/", repo);
673
- assert.deepStrictEqual(refs, "", "no snapshot ref created when prefs.snapshots is false");
674
-
675
- rmSync(repo, { recursive: true, force: true });
676
- });
677
-
678
- // ─── runPreMergeCheck: default (auto-detect) ──────────────────────────
679
-
680
- test('runPreMergeCheck: auto-detects when prefs omitted', () => {
681
- const repo = initBranchTestRepo();
682
- createFile(repo, "package.json", JSON.stringify({
683
- name: "test-default",
684
- scripts: { test: 'node -e "process.exit(0)"' },
685
- }));
686
- run("git add -A", repo);
687
- run('git commit -m "add package.json"', repo);
688
-
689
- // No pre_merge_check pref set — should auto-detect and run
690
- const svc = new GitServiceImpl(repo);
691
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
692
-
693
- assert.deepStrictEqual(result.passed, true, "runPreMergeCheck auto-detects and passes when prefs omitted");
694
- assert.ok(!result.skipped, "runPreMergeCheck is not skipped when prefs omitted and package.json exists");
695
-
696
- rmSync(repo, { recursive: true, force: true });
697
- });
698
-
699
- test('runPreMergeCheck: gracefully skips when prefs omitted and no package.json', () => {
700
- const repo = initBranchTestRepo();
701
- // No package.json — auto-detect should skip gracefully
702
- const svc = new GitServiceImpl(repo);
703
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
704
-
705
- assert.deepStrictEqual(result.passed, true, "runPreMergeCheck passes when no package.json (skip)");
706
- assert.deepStrictEqual(result.skipped, true, "runPreMergeCheck skips when no test runner detected");
707
-
708
- rmSync(repo, { recursive: true, force: true });
709
- });
710
-
711
- // ─── runPreMergeCheck: pass ────────────────────────────────────────────
712
-
713
- test('runPreMergeCheck: pass', () => {
714
- const repo = initBranchTestRepo();
715
- // Create package.json with passing test script
716
- createFile(repo, "package.json", JSON.stringify({
717
- name: "test-pass",
718
- scripts: { test: 'node -e "process.exit(0)"' },
719
- }));
720
- run("git add -A", repo);
721
- run('git commit -m "add package.json"', repo);
722
-
723
- const svc = new GitServiceImpl(repo, { pre_merge_check: true });
724
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
725
-
726
- assert.deepStrictEqual(result.passed, true, "runPreMergeCheck returns passed:true when tests pass");
727
- assert.ok(!result.skipped, "runPreMergeCheck is not skipped when enabled");
728
-
729
- rmSync(repo, { recursive: true, force: true });
730
- });
731
-
732
- // ─── runPreMergeCheck: fail ────────────────────────────────────────────
733
-
734
- test('runPreMergeCheck: fail', () => {
735
- const repo = initBranchTestRepo();
736
- // Create package.json with failing test script
737
- createFile(repo, "package.json", JSON.stringify({
738
- name: "test-fail",
739
- scripts: { test: 'node -e "process.exit(1)"' },
740
- }));
741
- run("git add -A", repo);
742
- run('git commit -m "add failing package.json"', repo);
743
-
744
- const svc = new GitServiceImpl(repo, { pre_merge_check: true });
745
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
746
-
747
- assert.deepStrictEqual(result.passed, false, "runPreMergeCheck returns passed:false when tests fail");
748
- assert.ok(!result.skipped, "runPreMergeCheck is not skipped when enabled");
749
-
750
- rmSync(repo, { recursive: true, force: true });
751
- });
752
-
753
- // ─── runPreMergeCheck: disabled ────────────────────────────────────────
754
-
755
- test('runPreMergeCheck: disabled', () => {
756
- const repo = initBranchTestRepo();
757
- createFile(repo, "package.json", JSON.stringify({
758
- name: "test-disabled",
759
- scripts: { test: 'node -e "process.exit(1)"' },
760
- }));
761
- run("git add -A", repo);
762
- run('git commit -m "add package.json"', repo);
763
-
764
- const svc = new GitServiceImpl(repo, { pre_merge_check: false });
765
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
766
-
767
- assert.deepStrictEqual(result.skipped, true, "runPreMergeCheck skipped when pre_merge_check is false");
768
- assert.deepStrictEqual(result.passed, true, "runPreMergeCheck returns passed:true when skipped (no block)");
769
-
770
- rmSync(repo, { recursive: true, force: true });
771
- });
772
-
773
- // ─── runPreMergeCheck: custom command ──────────────────────────────────
774
-
775
- test('runPreMergeCheck: custom command', () => {
776
- const repo = initBranchTestRepo();
777
- // Custom command string overrides auto-detection
778
- const svc = new GitServiceImpl(repo, { pre_merge_check: 'node -e "process.exit(0)"' });
779
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
780
-
781
- assert.deepStrictEqual(result.passed, true, "runPreMergeCheck passes with custom command that exits 0");
782
- assert.ok(!result.skipped, "custom command is not skipped");
783
-
784
- rmSync(repo, { recursive: true, force: true });
785
- });
786
-
787
- // ─── VALID_BRANCH_NAME regex ──────────────────────────────────────────
788
-
789
- test('VALID_BRANCH_NAME regex', () => {
790
- // Valid branch names
791
- assert.ok(VALID_BRANCH_NAME.test("main"), "VALID_BRANCH_NAME accepts 'main'");
792
- assert.ok(VALID_BRANCH_NAME.test("master"), "VALID_BRANCH_NAME accepts 'master'");
793
- assert.ok(VALID_BRANCH_NAME.test("develop"), "VALID_BRANCH_NAME accepts 'develop'");
794
- assert.ok(VALID_BRANCH_NAME.test("feature/foo"), "VALID_BRANCH_NAME accepts 'feature/foo'");
795
- assert.ok(VALID_BRANCH_NAME.test("release-1.0"), "VALID_BRANCH_NAME accepts 'release-1.0'");
796
- assert.ok(VALID_BRANCH_NAME.test("my_branch"), "VALID_BRANCH_NAME accepts 'my_branch'");
797
- assert.ok(VALID_BRANCH_NAME.test("v2.0.1"), "VALID_BRANCH_NAME accepts 'v2.0.1'");
798
-
799
- // Invalid / injection attempts
800
- assert.ok(!VALID_BRANCH_NAME.test("main; rm -rf /"), "VALID_BRANCH_NAME rejects shell injection");
801
- assert.ok(!VALID_BRANCH_NAME.test("main && echo pwned"), "VALID_BRANCH_NAME rejects && injection");
802
- assert.ok(!VALID_BRANCH_NAME.test(""), "VALID_BRANCH_NAME rejects empty string");
803
- assert.ok(!VALID_BRANCH_NAME.test("branch name"), "VALID_BRANCH_NAME rejects spaces");
804
- assert.ok(!VALID_BRANCH_NAME.test("branch`cmd`"), "VALID_BRANCH_NAME rejects backticks");
805
- assert.ok(!VALID_BRANCH_NAME.test("branch$(cmd)"), "VALID_BRANCH_NAME rejects $() subshell");
806
- });
807
-
808
- // ─── getMainBranch: configured main_branch preference ──────────────────
809
-
810
- test('getMainBranch: configured main_branch', () => {
811
- const repo = initBranchTestRepo();
812
- const svc = new GitServiceImpl(repo, { main_branch: "trunk" });
813
-
814
- assert.deepStrictEqual(svc.getMainBranch(), "trunk", "getMainBranch returns configured main_branch preference");
815
-
816
- rmSync(repo, { recursive: true, force: true });
817
- });
818
-
819
- // ─── getMainBranch: falls back to auto-detection when not set ──────────
820
-
821
- test('getMainBranch: fallback to auto-detection', () => {
822
- const repo = initBranchTestRepo();
823
- const svc = new GitServiceImpl(repo, {});
824
-
825
- assert.deepStrictEqual(svc.getMainBranch(), "main", "getMainBranch falls back to auto-detection when main_branch not set");
826
-
827
- rmSync(repo, { recursive: true, force: true });
828
- });
829
-
830
- // ─── getMainBranch: ignores invalid branch names ───────────────────────
831
-
832
- test('getMainBranch: ignores invalid branch name', () => {
833
- const repo = initBranchTestRepo();
834
- const svc = new GitServiceImpl(repo, { main_branch: "main; rm -rf /" });
835
-
836
- assert.deepStrictEqual(svc.getMainBranch(), "main", "getMainBranch ignores invalid branch name and falls back to auto-detection");
837
-
838
- rmSync(repo, { recursive: true, force: true });
839
- });
840
-
841
- // ─── PreMergeCheckResult type export compile check ─────────────────────
842
-
843
- test('PreMergeCheckResult type export', () => {
844
- const _checkResult: PreMergeCheckResult = { passed: true, skipped: false };
845
- assert.ok(true, "PreMergeCheckResult type exported and usable");
846
- });
847
-
848
- // ═══════════════════════════════════════════════════════════════════════
849
- // Integration branch — feature-branch workflow support
850
- // ═══════════════════════════════════════════════════════════════════════
851
-
852
- // ─── writeIntegrationBranch / readIntegrationBranch: round-trip ────────
853
-
854
- test('Integration branch: write and read', () => {
855
- const repo = initBranchTestRepo();
856
-
857
- // Initially no integration branch
858
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "readIntegrationBranch returns null when no metadata");
859
-
860
- // Write integration branch
861
- writeIntegrationBranch(repo, "M001", "f-123-new-thing");
862
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "f-123-new-thing", "readIntegrationBranch returns written branch");
863
-
864
- rmSync(repo, { recursive: true, force: true });
865
- });
866
-
867
- // ─── writeIntegrationBranch: updates when branch changes (#300) ──────
868
-
869
- test('Integration branch: updates on branch change', () => {
870
- const repo = initBranchTestRepo();
871
-
872
- writeIntegrationBranch(repo, "M001", "f-123-first");
873
- writeIntegrationBranch(repo, "M001", "f-456-second"); // updates to new branch (#300)
874
-
875
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "f-456-second", "second write updates integration branch to new value");
876
-
877
- rmSync(repo, { recursive: true, force: true });
878
- });
879
-
880
- // ─── writeIntegrationBranch: same branch is idempotent ─────────────────
881
-
882
- test('Integration branch: same branch is idempotent', () => {
883
- const repo = initBranchTestRepo();
884
-
885
- writeIntegrationBranch(repo, "M001", "f-123-first");
886
- writeIntegrationBranch(repo, "M001", "f-123-first"); // same branch — no-op
887
-
888
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "f-123-first", "same branch write is idempotent");
889
-
890
- rmSync(repo, { recursive: true, force: true });
891
- });
892
-
893
- // ─── writeIntegrationBranch: rejects slice branches ───────────────────
894
-
895
- test('Integration branch: rejects slice branches', () => {
896
- const repo = initBranchTestRepo();
897
-
898
- writeIntegrationBranch(repo, "M001", "gsd/M001/S01");
899
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "slice branches are not recorded as integration branch");
900
-
901
- rmSync(repo, { recursive: true, force: true });
902
- });
903
-
904
- // ─── writeIntegrationBranch: rejects workflow-template branches (#2498) ─
905
-
906
- test('Integration branch: rejects workflow-template branches', () => {
907
- const repo = initBranchTestRepo();
908
-
909
- // All 8 registered workflow templates should be rejected
910
- writeIntegrationBranch(repo, "M001", "gsd/hotfix/fix-login");
911
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "hotfix branch is not recorded");
912
-
913
- writeIntegrationBranch(repo, "M001", "gsd/bugfix/null-pointer");
914
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "bugfix branch is not recorded");
915
-
916
- writeIntegrationBranch(repo, "M001", "gsd/small-feature/add-button");
917
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "small-feature branch is not recorded");
918
-
919
- writeIntegrationBranch(repo, "M001", "gsd/refactor/rename-module");
920
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "refactor branch is not recorded");
921
-
922
- writeIntegrationBranch(repo, "M001", "gsd/spike/evaluate-lib");
923
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "spike branch is not recorded");
924
-
925
- writeIntegrationBranch(repo, "M001", "gsd/security-audit/owasp-scan");
926
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "security-audit branch is not recorded");
927
-
928
- writeIntegrationBranch(repo, "M001", "gsd/dep-upgrade/bump-react");
929
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "dep-upgrade branch is not recorded");
930
-
931
- writeIntegrationBranch(repo, "M001", "gsd/full-project/new-app");
932
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "full-project branch is not recorded");
933
-
934
- rmSync(repo, { recursive: true, force: true });
935
- });
936
-
937
- // ─── writeIntegrationBranch: still records legitimate branches ────────
938
-
939
- test('Integration branch: records non-ephemeral gsd branches', () => {
940
- const repo = initBranchTestRepo();
941
-
942
- // A normal feature branch should still be recorded
943
- writeIntegrationBranch(repo, "M001", "feature/new-thing");
944
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "feature/new-thing", "normal branches are recorded");
945
-
946
- // The main branch should be recorded
947
- writeIntegrationBranch(repo, "M002", "main");
948
- assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main", "main branch is recorded");
949
-
950
- rmSync(repo, { recursive: true, force: true });
951
- });
952
-
953
- // ─── writeIntegrationBranch: rejects invalid branch names ─────────────
954
-
955
- test('Integration branch: rejects invalid names', () => {
956
- const repo = initBranchTestRepo();
957
-
958
- writeIntegrationBranch(repo, "M001", "bad; rm -rf /");
959
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "invalid branch name is not recorded");
960
-
961
- rmSync(repo, { recursive: true, force: true });
962
- });
963
-
964
- // ─── getMainBranch: uses integration branch when milestone set ────────
965
-
966
- test('getMainBranch: integration branch from milestone metadata', () => {
967
- const repo = initBranchTestRepo();
968
-
969
- // Create a feature branch
970
- run("git checkout -b f-123-feature", repo);
971
- run("git checkout main", repo);
972
-
973
- // Write integration branch metadata
974
- writeIntegrationBranch(repo, "M001", "f-123-feature");
975
-
976
- // Without milestone set, getMainBranch returns "main"
977
- const svc = new GitServiceImpl(repo);
978
- assert.deepStrictEqual(svc.getMainBranch(), "main", "getMainBranch returns main when no milestone set");
979
-
980
- // With milestone set, getMainBranch returns the integration branch
981
- svc.setMilestoneId("M001");
982
- assert.deepStrictEqual(svc.getMainBranch(), "f-123-feature", "getMainBranch returns integration branch when milestone set");
983
-
984
- rmSync(repo, { recursive: true, force: true });
985
- });
986
-
987
- // ─── getMainBranch: main_branch pref still takes priority ─────────────
988
-
989
- test('getMainBranch: main_branch pref overrides integration branch', () => {
990
- const repo = initBranchTestRepo();
991
-
992
- run("git checkout -b f-123-feature", repo);
993
- run("git checkout -b trunk", repo);
994
- run("git checkout main", repo);
995
-
996
- writeIntegrationBranch(repo, "M001", "f-123-feature");
997
-
998
- // Explicit preference still wins
999
- const svc = new GitServiceImpl(repo, { main_branch: "trunk" });
1000
- svc.setMilestoneId("M001");
1001
- assert.deepStrictEqual(svc.getMainBranch(), "trunk", "main_branch preference overrides integration branch");
1002
-
1003
- rmSync(repo, { recursive: true, force: true });
1004
- });
1005
-
1006
- // ─── getMainBranch: falls back when integration branch deleted ────────
1007
-
1008
- test('getMainBranch: fallback when integration branch deleted', () => {
1009
- const repo = initBranchTestRepo();
1010
-
1011
- // Write metadata pointing to a branch that doesn't exist
1012
- writeIntegrationBranch(repo, "M001", "deleted-branch");
1013
-
1014
- const svc = new GitServiceImpl(repo);
1015
- svc.setMilestoneId("M001");
1016
- assert.deepStrictEqual(svc.getMainBranch(), "main", "getMainBranch falls back to main when integration branch no longer exists");
1017
-
1018
- rmSync(repo, { recursive: true, force: true });
1019
- });
1020
-
1021
- // ─── resolveMilestoneIntegrationBranch: recorded branch wins when it exists ───
1022
-
1023
- test('Integration branch: resolver prefers recorded branch', () => {
1024
- const repo = initBranchTestRepo();
1025
- run("git checkout -b feature/live", repo);
1026
- run("git checkout main", repo);
1027
- writeIntegrationBranch(repo, "M001", "feature/live");
1028
-
1029
- const resolved = resolveMilestoneIntegrationBranch(repo, "M001");
1030
- assert.deepStrictEqual(resolved.status, "recorded", "resolver reports recorded branch when metadata branch exists");
1031
- assert.deepStrictEqual(resolved.recordedBranch, "feature/live", "resolver includes recorded branch");
1032
- assert.deepStrictEqual(resolved.effectiveBranch, "feature/live", "resolver uses recorded branch as effective branch");
1033
-
1034
- rmSync(repo, { recursive: true, force: true });
1035
- });
1036
-
1037
- // ─── resolveMilestoneIntegrationBranch: falls back to detected default ────────
1038
-
1039
- test('Integration branch: resolver falls back to detected default', () => {
1040
- const repo = initBranchTestRepo();
1041
- writeIntegrationBranch(repo, "M001", "deleted-branch");
1042
-
1043
- const resolved = resolveMilestoneIntegrationBranch(repo, "M001");
1044
- assert.deepStrictEqual(resolved.status, "fallback", "resolver reports fallback when recorded branch is stale");
1045
- assert.deepStrictEqual(resolved.recordedBranch, "deleted-branch", "resolver preserves stale recorded branch for diagnostics");
1046
- assert.deepStrictEqual(resolved.effectiveBranch, "main", "resolver falls back to detected default branch");
1047
- assert.ok(
1048
- resolved.reason.includes("deleted-branch") && resolved.reason.includes("main"),
1049
- "resolver reason mentions stale recorded branch and fallback branch",
1050
- );
1051
-
1052
- rmSync(repo, { recursive: true, force: true });
1053
- });
1054
-
1055
- // ─── resolveMilestoneIntegrationBranch: configured main_branch is fallback ─────
1056
-
1057
- test('Integration branch: resolver uses configured fallback branch', () => {
1058
- const repo = initBranchTestRepo();
1059
- run("git checkout -b trunk", repo);
1060
- run("git checkout main", repo);
1061
- writeIntegrationBranch(repo, "M001", "deleted-branch");
1062
-
1063
- const resolved = resolveMilestoneIntegrationBranch(repo, "M001", { main_branch: "trunk" });
1064
- assert.deepStrictEqual(resolved.status, "fallback", "resolver reports fallback when using configured main_branch");
1065
- assert.deepStrictEqual(resolved.effectiveBranch, "trunk", "resolver prefers configured main_branch as fallback");
1066
- assert.ok(
1067
- resolved.reason.includes("deleted-branch") && resolved.reason.includes("trunk"),
1068
- "configured fallback reason mentions stale branch and configured branch",
1069
- );
1070
-
1071
- rmSync(repo, { recursive: true, force: true });
1072
- });
1073
-
1074
- // ─── Per-milestone isolation: different milestones, different targets ──
1075
-
1076
- test('Integration branch: per-milestone isolation', () => {
1077
- const repo = initBranchTestRepo();
1078
-
1079
- run("git checkout -b feature-a", repo);
1080
- run("git checkout -b feature-b", repo);
1081
- run("git checkout main", repo);
1082
-
1083
- writeIntegrationBranch(repo, "M001", "feature-a");
1084
- writeIntegrationBranch(repo, "M002", "feature-b");
1085
-
1086
- const svc = new GitServiceImpl(repo);
1087
-
1088
- svc.setMilestoneId("M001");
1089
- assert.deepStrictEqual(svc.getMainBranch(), "feature-a", "M001 integration branch is feature-a");
1090
-
1091
- svc.setMilestoneId("M002");
1092
- assert.deepStrictEqual(svc.getMainBranch(), "feature-b", "M002 integration branch is feature-b");
1093
-
1094
- svc.setMilestoneId(null);
1095
- assert.deepStrictEqual(svc.getMainBranch(), "main", "no milestone set → falls back to main");
1096
-
1097
- rmSync(repo, { recursive: true, force: true });
1098
- });
1099
-
1100
- // ─── Backward compatibility: no metadata → existing behavior ──────────
1101
-
1102
- test('Integration branch: backward compat', () => {
1103
- const repo = initBranchTestRepo();
1104
- const svc = new GitServiceImpl(repo);
1105
-
1106
- // Set milestone but no metadata file exists
1107
- svc.setMilestoneId("M001");
1108
- assert.deepStrictEqual(svc.getMainBranch(), "main", "backward compat: no metadata file → falls back to main");
1109
-
1110
- rmSync(repo, { recursive: true, force: true });
1111
- });
1112
-
1113
- // ─── untrackRuntimeFiles: removes tracked runtime files from index ───
1114
-
1115
- test('untrackRuntimeFiles', async () => {
1116
- const { untrackRuntimeFiles } = await import("../../gitignore.ts");
1117
- const repo = mkdtempSync(join(tmpdir(), "gsd-untrack-"));
1118
- runGit(repo, ["init", "-b", "main"]);
1119
- runGit(repo, ["config", "user.email", "test@test.com"]);
1120
- runGit(repo, ["config", "user.name", "Test"]);
1121
-
1122
- // Create and track runtime files (simulates pre-.gitignore state)
1123
- mkdirSync(join(repo, ".gsd", "activity"), { recursive: true });
1124
- mkdirSync(join(repo, ".gsd", "runtime"), { recursive: true });
1125
- writeFileSync(join(repo, ".gsd", "completed-units.json"), '["u1"]');
1126
- writeFileSync(join(repo, ".gsd", "metrics.json"), '{}');
1127
- writeFileSync(join(repo, ".gsd", "STATE.md"), "# State");
1128
- writeFileSync(join(repo, ".gsd", "activity", "log.jsonl"), "{}");
1129
- writeFileSync(join(repo, ".gsd", "runtime", "data.json"), "{}");
1130
- writeFileSync(join(repo, "src.ts"), "code");
1131
- runGit(repo, ["add", "-A"]);
1132
- runGit(repo, ["commit", "-m", "init"]);
1133
-
1134
- // Precondition: runtime files are tracked
1135
- const trackedBefore = run("git ls-files .gsd/", repo);
1136
- assert.ok(trackedBefore.includes("completed-units.json"), "untrack: precondition — completed-units tracked");
1137
- assert.ok(trackedBefore.includes("metrics.json"), "untrack: precondition — metrics tracked");
1138
-
1139
- // Run untrackRuntimeFiles
1140
- untrackRuntimeFiles(repo);
1141
-
1142
- // Runtime files should be removed from the index
1143
- const trackedAfter = run("git ls-files .gsd/", repo);
1144
- assert.deepStrictEqual(trackedAfter, "", "untrack: all runtime files removed from index");
1145
-
1146
- // Non-runtime files remain tracked
1147
- const srcTracked = run("git ls-files src.ts", repo);
1148
- assert.ok(srcTracked.includes("src.ts"), "untrack: non-runtime files remain tracked");
1149
-
1150
- // Files still exist on disk
1151
- assert.ok(existsSync(join(repo, ".gsd", "completed-units.json")),
1152
- "untrack: completed-units.json still on disk");
1153
- assert.ok(existsSync(join(repo, ".gsd", "metrics.json")),
1154
- "untrack: metrics.json still on disk");
1155
-
1156
- // Idempotent — running again doesn't error
1157
- untrackRuntimeFiles(repo);
1158
- assert.ok(true, "untrack: second call is idempotent (no error)");
1159
-
1160
- rmSync(repo, { recursive: true, force: true });
1161
- });
1162
-
1163
- // ─── smartStage excludes runtime files but allows milestone artifacts ──
1164
-
1165
- test('smartStage excludes runtime files, allows milestone artifacts', () => {
1166
- const repo = mkdtempSync(join(tmpdir(), "gsd-smart-stage-excludes-"));
1167
- runGit(repo, ["init", "-b", "main"]);
1168
- runGit(repo, ["config", "user.email", "test@test.com"]);
1169
- runGit(repo, ["config", "user.name", "Test"]);
1170
- writeFileSync(join(repo, "README.md"), "init");
1171
- runGit(repo, ["add", "-A"]);
1172
- runGit(repo, ["commit", "-m", "init"]);
1173
-
1174
- // Create .gsd/ runtime files + milestone artifacts + a normal source file
1175
- mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
1176
- mkdirSync(join(repo, ".gsd", "runtime"), { recursive: true });
1177
- mkdirSync(join(repo, ".gsd", "activity"), { recursive: true });
1178
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "ROADMAP.md"), "# Roadmap");
1179
- writeFileSync(join(repo, ".gsd", "PREFERENCES.md"), "---\nversion: 1\n---");
1180
- writeFileSync(join(repo, ".gsd", "STATE.md"), "# State");
1181
- writeFileSync(join(repo, ".gsd", "runtime", "units.json"), "{}");
1182
- writeFileSync(join(repo, ".gsd", "activity", "log.jsonl"), "{}");
1183
- writeFileSync(join(repo, "src.ts"), "const x = 1;");
1184
-
1185
- // smartStage excludes only runtime paths, not all of .gsd/ (#1326)
1186
- const svc = new GitServiceImpl(repo);
1187
- const msg = svc.commit({ message: "test commit" });
1188
- assert.ok(msg !== null, "smartStage: commit succeeds");
1189
-
1190
- const committed = run("git show --name-only HEAD", repo);
1191
- assert.ok(committed.includes("src.ts"), "smartStage: source files ARE in commit");
1192
- // Runtime files should NOT be committed
1193
- assert.ok(!committed.includes(".gsd/STATE.md"), "smartStage: STATE.md excluded (runtime)");
1194
- assert.ok(!committed.includes(".gsd/runtime/"), "smartStage: runtime/ excluded");
1195
- assert.ok(!committed.includes(".gsd/activity/"), "smartStage: activity/ excluded");
1196
- // Milestone artifacts SHOULD be committed when not gitignored (#1326)
1197
- assert.ok(committed.includes(".gsd/milestones/"), "smartStage: milestone artifacts ARE committed");
1198
-
1199
- rmSync(repo, { recursive: true, force: true });
1200
- });
1201
-
1202
- // ─── writeIntegrationBranch: no commit (metadata in external storage) ──
1203
-
1204
- test('writeIntegrationBranch: no commit', () => {
1205
- const repo = initBranchTestRepo();
1206
- const commitsBefore = run("git rev-list --count HEAD", repo);
1207
-
1208
- writeIntegrationBranch(repo, "M001", "f-123-new-thing");
1209
-
1210
- // File should still be written to disk
1211
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "f-123-new-thing",
1212
- "writeIntegrationBranch: metadata file exists on disk");
1213
-
1214
- // No commit — .gsd/ is managed externally
1215
- const commitsAfter = run("git rev-list --count HEAD", repo);
1216
- assert.deepStrictEqual(commitsBefore, commitsAfter,
1217
- "writeIntegrationBranch: no git commit created for integration branch");
1218
-
1219
- rmSync(repo, { recursive: true, force: true });
1220
- });
1221
-
1222
- // ─── ensureGitignore: always adds .gsd to gitignore ──────────────────
1223
-
1224
- test('ensureGitignore: adds .gsd entry', async () => {
1225
- const { ensureGitignore } = await import("../../gitignore.ts");
1226
- const repo = mkdtempSync(join(tmpdir(), "gsd-gitignore-external-state-"));
1227
-
1228
- // Should add .gsd to gitignore (external state dir is a symlink)
1229
- const modified = ensureGitignore(repo);
1230
- assert.ok(modified, "ensureGitignore: gitignore was modified");
1231
-
1232
- const { readFileSync } = await import("node:fs");
1233
- const content = readFileSync(join(repo, ".gitignore"), "utf-8");
1234
- const lines = content.split("\n").map(l => l.trim()).filter(l => l && !l.startsWith("#"));
1235
- assert.ok(lines.includes(".gsd"), "ensureGitignore: .gitignore contains .gsd");
1236
-
1237
- // Idempotent — calling again doesn't add duplicates
1238
- const modified2 = ensureGitignore(repo);
1239
- assert.ok(!modified2, "ensureGitignore: second call is idempotent");
1240
-
1241
- rmSync(repo, { recursive: true, force: true });
1242
- });
1243
-
1244
- // ─── nativeAddAllWithExclusions: symlinked .gsd fallback ───────────────
1245
-
1246
- test('nativeAddAllWithExclusions: symlinked .gsd fallback', () => {
1247
- // When .gsd is a symlink, git rejects `:!.gsd/...` pathspecs with
1248
- // "fatal: pathspec '...' is beyond a symbolic link". The fix falls
1249
- // back to plain `git add -A`, which respects .gitignore.
1250
- const repo = initTempRepo();
1251
-
1252
- // Create the real .gsd directory outside the repo, then symlink it
1253
- const externalGsd = mkdtempSync(join(tmpdir(), "gsd-external-"));
1254
- mkdirSync(join(externalGsd, "activity"), { recursive: true });
1255
- writeFileSync(join(externalGsd, "activity", "log.jsonl"), "log data");
1256
- writeFileSync(join(externalGsd, "STATE.md"), "# State");
1257
-
1258
- // Symlink .gsd -> external directory
1259
- symlinkSync(externalGsd, join(repo, ".gsd"));
1260
-
1261
- // Add .gitignore so git add -A fallback skips .gsd/
1262
- writeFileSync(join(repo, ".gitignore"), ".gsd\n");
1263
-
1264
- // Create a real file that should be staged
1265
- createFile(repo, "src/app.ts", "export const x = 1;");
1266
-
1267
- // nativeAddAllWithExclusions should NOT throw despite .gsd being a symlink
1268
- let threw = false;
1269
- try {
1270
- nativeAddAllWithExclusions(repo, RUNTIME_EXCLUSION_PATHS);
1271
- } catch (e) {
1272
- threw = true;
1273
- console.error(" unexpected error:", e);
1274
- }
1275
- assert.ok(!threw, "nativeAddAllWithExclusions does not throw with symlinked .gsd");
1276
-
1277
- // Verify the real file was staged
1278
- const staged = run("git diff --cached --name-only", repo);
1279
- assert.ok(staged.includes("src/app.ts"), "real file staged despite symlinked .gsd");
1280
- assert.ok(!staged.includes(".gsd"), ".gsd content not staged");
1281
-
1282
- rmSync(repo, { recursive: true, force: true });
1283
- rmSync(externalGsd, { recursive: true, force: true });
1284
- });
1285
-
1286
- // ─── nativeAddAllWithExclusions: non-symlinked .gsd still works ───────
1287
-
1288
- test('nativeAddAllWithExclusions: non-symlinked .gsd still works', () => {
1289
- // Verify the normal (non-symlink) case still works with pathspec exclusions
1290
- const repo = initTempRepo();
1291
-
1292
- createFile(repo, ".gsd/activity/log.jsonl", "log data");
1293
- createFile(repo, ".gsd/STATE.md", "# State");
1294
- createFile(repo, "src/code.ts", "export const y = 2;");
1295
-
1296
- let threw = false;
1297
- try {
1298
- nativeAddAllWithExclusions(repo, RUNTIME_EXCLUSION_PATHS);
1299
- } catch {
1300
- threw = true;
1301
- }
1302
- assert.ok(!threw, "nativeAddAllWithExclusions works with normal .gsd directory");
1303
-
1304
- const staged = run("git diff --cached --name-only", repo);
1305
- assert.ok(staged.includes("src/code.ts"), "real file staged with normal .gsd");
1306
-
1307
- rmSync(repo, { recursive: true, force: true });
1308
- });
1309
-
1310
- // ─── MergeConflictError: constructor fields ───────────────────────────────
1311
-
1312
- test('MergeConflictError: constructor fields', () => {
1313
- const err = new MergeConflictError(
1314
- ["src/foo.ts", "src/bar.ts"],
1315
- "squash",
1316
- "gsd/M001/S01",
1317
- "main",
1318
- );
1319
- assert.deepStrictEqual(err.conflictedFiles, ["src/foo.ts", "src/bar.ts"], "MergeConflictError.conflictedFiles populated");
1320
- assert.deepStrictEqual(err.strategy, "squash", "MergeConflictError.strategy set");
1321
- assert.deepStrictEqual(err.branch, "gsd/M001/S01", "MergeConflictError.branch set");
1322
- assert.deepStrictEqual(err.mainBranch, "main", "MergeConflictError.mainBranch set");
1323
- assert.deepStrictEqual(err.name, "MergeConflictError", "MergeConflictError.name is MergeConflictError");
1324
- assert.ok(err.message.includes("src/foo.ts"), "MergeConflictError message lists conflicted files");
1325
- assert.ok(err.message.toLowerCase().includes("squash"), "MergeConflictError message mentions strategy");
1326
- assert.ok(err instanceof MergeConflictError, "MergeConflictError is an instanceof MergeConflictError");
1327
- assert.ok(err instanceof Error, "MergeConflictError is an Error instance");
1328
- });
1329
-
1330
- // ─── Integration branch: rejects gsd/quick/* branches ────────────────────
1331
-
1332
- test('Integration branch: rejects gsd/quick/* branches', () => {
1333
- const repo = initBranchTestRepo();
1334
-
1335
- writeIntegrationBranch(repo, "M001", "gsd/quick/1234-some-task");
1336
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null, "gsd/quick/* branches are not recorded as integration branch");
1337
-
1338
- rmSync(repo, { recursive: true, force: true });
1339
- });
1340
-
1341
- // ─── Integration branch: resolver returns missing when no metadata ────────
1342
-
1343
- test('Integration branch: resolver returns missing when no metadata', () => {
1344
- const repo = initBranchTestRepo();
1345
-
1346
- // No writeIntegrationBranch call — no metadata file exists
1347
- const resolved = resolveMilestoneIntegrationBranch(repo, "M999");
1348
- assert.deepStrictEqual(resolved.status, "missing", "resolver reports missing when no metadata file");
1349
- assert.deepStrictEqual(resolved.recordedBranch, null, "resolver recordedBranch is null when no metadata");
1350
- assert.deepStrictEqual(resolved.effectiveBranch, null, "resolver effectiveBranch is null when no metadata");
1351
- assert.ok(resolved.reason.includes("M999"), "resolver reason mentions the milestone ID");
1352
-
1353
- rmSync(repo, { recursive: true, force: true });
1354
- });
1355
-
1356
- // ─── Integration branch: resolver missing when both recorded and configured branches gone ───
1357
-
1358
- test('Integration branch: resolver missing when both recorded and configured branches gone', () => {
1359
- const repo = initBranchTestRepo();
1360
-
1361
- // Record a branch that doesn't exist
1362
- writeIntegrationBranch(repo, "M001", "deleted-feature");
1363
- // configured main_branch also doesn't exist
1364
- const resolved = resolveMilestoneIntegrationBranch(repo, "M001", { main_branch: "nonexistent-branch" });
1365
- assert.deepStrictEqual(resolved.status, "missing", "resolver reports missing when recorded branch and configured main_branch both absent");
1366
- assert.deepStrictEqual(resolved.recordedBranch, "deleted-feature", "resolver preserves stale recorded branch");
1367
- assert.deepStrictEqual(resolved.effectiveBranch, null, "resolver effectiveBranch is null when no safe fallback");
1368
- assert.ok(
1369
- resolved.reason.includes("deleted-feature") && resolved.reason.includes("nonexistent-branch"),
1370
- "reason mentions both stale branch and unavailable configured branch",
1371
- );
1372
-
1373
- rmSync(repo, { recursive: true, force: true });
1374
- });
1375
-
1376
- // ─── buildTaskCommitMessage: issueNumber appends Resolves trailer ─────────
1377
-
1378
- test('buildTaskCommitMessage: issueNumber appends Resolves trailer', () => {
1379
- const msg = buildTaskCommitMessage({
1380
- taskId: "S01/T03",
1381
- taskTitle: "fix login redirect",
1382
- issueNumber: 42,
1383
- });
1384
- assert.ok(msg.includes("Resolves #42"), "buildTaskCommitMessage includes Resolves #N trailer when issueNumber is set");
1385
- assert.ok(msg.startsWith("fix:"), "buildTaskCommitMessage infers fix type");
1386
- assert.ok(msg.includes("GSD-Task: S01/T03"), "GSD-Task trailer present");
1387
- // GSD-Task should come before Resolves
1388
- const taskIdx = msg.indexOf("GSD-Task: S01/T03");
1389
- const resolvesIdx = msg.indexOf("Resolves #42");
1390
- assert.ok(taskIdx < resolvesIdx, "GSD-Task trailer before Resolves trailer");
1391
- });
1392
-
1393
- {
1394
- // No issueNumber — no Resolves trailer
1395
- const msg = buildTaskCommitMessage({
1396
- taskId: "S01/T04",
1397
- taskTitle: "add dashboard widget",
1398
- });
1399
- assert.ok(!msg.includes("Resolves"), "buildTaskCommitMessage omits Resolves trailer when issueNumber is absent");
1400
- assert.ok(msg.includes("GSD-Task: S01/T04"), "GSD-Task trailer still present");
1401
- }
1402
-
1403
- // ─── runPreMergeCheck: skips when no package.json ────────────────────────
1404
-
1405
- test('runPreMergeCheck: skips when no package.json', () => {
1406
- const repo = initBranchTestRepo();
1407
- // No package.json created — auto-detect should skip gracefully
1408
- const svc = new GitServiceImpl(repo, { pre_merge_check: true });
1409
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
1410
-
1411
- assert.deepStrictEqual(result.passed, true, "runPreMergeCheck passes when no package.json (skip)");
1412
- assert.deepStrictEqual(result.skipped, true, "runPreMergeCheck skips when no package.json found");
1413
-
1414
- rmSync(repo, { recursive: true, force: true });
1415
- });
1416
-
1417
- // ─── autoCommit: symlinked .gsd does NOT stage milestone artifacts (#2247) ──
1418
-
1419
- test('autoCommit: symlinked .gsd does NOT stage milestone artifacts (#2247)', () => {
1420
- // When .gsd is a symlink (external state project), .gsd/ files live outside
1421
- // the repo by design. smartStage() must NOT force-stage them into git — the
1422
- // .gitignore exclusion is correct and intentional.
1423
- const repo = initTempRepo();
1424
-
1425
- // Create an external .gsd directory and symlink it into the repo
1426
- const externalGsd = mkdtempSync(join(tmpdir(), "gsd-external-symlink-"));
1427
- mkdirSync(join(externalGsd, "milestones", "M009"), { recursive: true });
1428
- mkdirSync(join(externalGsd, "activity"), { recursive: true });
1429
- mkdirSync(join(externalGsd, "runtime"), { recursive: true });
1430
-
1431
- symlinkSync(externalGsd, join(repo, ".gsd"));
1432
-
1433
- // .gitignore blocks .gsd (as ensureGitignore would do for symlink projects)
1434
- writeFileSync(join(repo, ".gitignore"), ".gsd\n");
1435
- run('git add .gitignore', repo);
1436
- run('git commit -m "add gitignore"', repo);
1437
-
1438
- // Simulate new milestone artifacts created during execution
1439
- writeFileSync(join(externalGsd, "milestones", "M009", "M009-SUMMARY.md"), "# M009 Summary");
1440
- writeFileSync(join(externalGsd, "milestones", "M009", "S01-SUMMARY.md"), "# S01 Summary");
1441
- writeFileSync(join(externalGsd, "milestones", "M009", "T01-VERIFY.json"), '{"passed":true}');
1442
-
1443
- // Also create a normal source file change
1444
- createFile(repo, "src/feature.ts", "export const feature = true;");
1445
-
1446
- const svc = new GitServiceImpl(repo);
1447
- const msg = svc.autoCommit("complete-milestone", "M009");
1448
- assert.ok(msg !== null, "symlink autoCommit: commit succeeds");
1449
-
1450
- const committed = run("git show --name-only HEAD", repo);
1451
- assert.ok(committed.includes("src/feature.ts"), "symlink autoCommit: source file committed");
1452
- assert.ok(!committed.includes(".gsd/milestones/"),
1453
- "symlink autoCommit: .gsd/milestones/ files are NOT staged (external state stays external)");
1454
-
1455
- try { rmSync(repo, { recursive: true, force: true }); } catch {}
1456
- try { rmSync(externalGsd, { recursive: true, force: true }); } catch {}
1457
- });
1458
- });