gsd-pi 2.33.1 → 2.34.0-dev.bbb5216

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 (828) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/cli.js +16 -0
  4. package/dist/headless-query.js +6 -6
  5. package/dist/resource-loader.d.ts +2 -0
  6. package/dist/resource-loader.js +39 -4
  7. package/dist/resources/extensions/ask-user-questions.js +217 -0
  8. package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
  9. package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
  10. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
  11. package/dist/resources/extensions/async-jobs/index.js +119 -0
  12. package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
  13. package/dist/resources/extensions/aws-auth/index.js +138 -0
  14. package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
  15. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
  17. package/dist/resources/extensions/bg-shell/index.js +41 -0
  18. package/dist/resources/extensions/bg-shell/interaction.js +160 -0
  19. package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
  20. package/dist/resources/extensions/bg-shell/overlay.js +378 -0
  21. package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
  23. package/dist/resources/extensions/bg-shell/types.js +96 -0
  24. package/dist/resources/extensions/bg-shell/utilities.js +50 -0
  25. package/dist/resources/extensions/browser-tools/capture.js +179 -0
  26. package/dist/resources/extensions/browser-tools/core.js +899 -0
  27. package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
  28. package/dist/resources/extensions/browser-tools/index.js +123 -0
  29. package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
  30. package/dist/resources/extensions/browser-tools/refs.js +254 -0
  31. package/dist/resources/extensions/browser-tools/settle.js +173 -0
  32. package/dist/resources/extensions/browser-tools/state.js +126 -0
  33. package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
  34. package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
  35. package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
  36. package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
  37. package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
  38. package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
  39. package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
  40. package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
  41. package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
  42. package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
  43. package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
  44. package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
  45. package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
  46. package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
  47. package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
  48. package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
  49. package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
  50. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
  51. package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
  52. package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
  53. package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
  54. package/dist/resources/extensions/browser-tools/utils.js +490 -0
  55. package/dist/resources/extensions/context7/index.js +337 -0
  56. package/dist/resources/extensions/get-secrets-from-user.js +492 -0
  57. package/dist/resources/extensions/google-search/index.js +373 -0
  58. package/dist/resources/extensions/gsd/activity-log.js +146 -0
  59. package/dist/resources/extensions/gsd/atomic-write.js +38 -0
  60. package/dist/resources/extensions/gsd/auto/session.js +182 -0
  61. package/dist/resources/extensions/gsd/auto-budget.js +30 -0
  62. package/dist/resources/extensions/gsd/auto-dashboard.js +429 -0
  63. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +185 -0
  64. package/dist/resources/extensions/gsd/auto-dispatch.js +353 -0
  65. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  66. package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
  67. package/dist/resources/extensions/gsd/auto-observability.js +56 -0
  68. package/dist/resources/extensions/gsd/auto-post-unit.js +385 -0
  69. package/dist/resources/extensions/gsd/auto-prompts.js +1153 -0
  70. package/dist/resources/extensions/gsd/auto-recovery.js +512 -0
  71. package/dist/resources/extensions/gsd/auto-start.js +414 -0
  72. package/dist/resources/extensions/gsd/auto-supervisor.js +47 -0
  73. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
  74. package/dist/resources/extensions/gsd/auto-timers.js +180 -0
  75. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  76. package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
  77. package/dist/resources/extensions/gsd/auto-verification.js +171 -0
  78. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  79. package/dist/resources/extensions/gsd/auto-worktree.js +830 -0
  80. package/dist/resources/extensions/gsd/auto.js +765 -0
  81. package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
  82. package/dist/resources/extensions/gsd/captures.js +354 -0
  83. package/dist/resources/extensions/gsd/claude-import.js +540 -0
  84. package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
  85. package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
  86. package/dist/resources/extensions/gsd/commands-config.js +89 -0
  87. package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
  88. package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
  89. package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
  90. package/dist/resources/extensions/gsd/commands-logs.js +468 -0
  91. package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
  92. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
  93. package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
  94. package/dist/resources/extensions/gsd/commands.js +1024 -0
  95. package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
  96. package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
  97. package/dist/resources/extensions/gsd/context-budget.js +187 -0
  98. package/dist/resources/extensions/gsd/context-store.js +165 -0
  99. package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
  100. package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
  101. package/dist/resources/extensions/gsd/db-writer.js +298 -0
  102. package/dist/resources/extensions/gsd/debug-logger.js +161 -0
  103. package/dist/resources/extensions/gsd/detection.js +373 -0
  104. package/dist/resources/extensions/gsd/diff-context.js +168 -0
  105. package/dist/resources/extensions/gsd/dispatch-guard.js +75 -0
  106. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  107. package/dist/resources/extensions/gsd/doctor-checks.js +562 -0
  108. package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
  109. package/dist/resources/extensions/gsd/doctor-format.js +71 -0
  110. package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
  111. package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
  112. package/dist/resources/extensions/gsd/doctor-types.js +12 -0
  113. package/dist/resources/extensions/gsd/doctor.js +672 -0
  114. package/dist/resources/extensions/gsd/error-utils.js +6 -0
  115. package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
  116. package/dist/resources/extensions/gsd/exit-command.js +11 -0
  117. package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
  118. package/dist/resources/extensions/gsd/export.js +268 -0
  119. package/dist/resources/extensions/gsd/file-watcher.js +76 -0
  120. package/dist/resources/extensions/gsd/files.js +937 -0
  121. package/dist/resources/extensions/gsd/forensics.js +511 -0
  122. package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
  123. package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
  124. package/dist/resources/extensions/gsd/git-service.js +460 -0
  125. package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
  126. package/dist/resources/extensions/gsd/gsd-db.js +735 -0
  127. package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
  128. package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
  129. package/dist/resources/extensions/gsd/health-widget.js +141 -0
  130. package/dist/resources/extensions/gsd/history.js +118 -0
  131. package/dist/resources/extensions/gsd/index.js +1114 -0
  132. package/dist/resources/extensions/gsd/init-wizard.js +479 -0
  133. package/dist/resources/extensions/gsd/json-persistence.js +62 -0
  134. package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
  135. package/dist/resources/extensions/gsd/key-manager.js +829 -0
  136. package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
  137. package/dist/resources/extensions/gsd/md-importer.js +440 -0
  138. package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
  139. package/dist/resources/extensions/gsd/memory-store.js +351 -0
  140. package/dist/resources/extensions/gsd/metrics.js +377 -0
  141. package/dist/resources/extensions/gsd/migrate/command.js +157 -0
  142. package/dist/resources/extensions/gsd/migrate/index.js +7 -0
  143. package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
  144. package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
  145. package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
  146. package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
  147. package/dist/resources/extensions/gsd/migrate/types.js +4 -0
  148. package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
  149. package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
  150. package/dist/resources/extensions/gsd/migrate-external.js +130 -0
  151. package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
  152. package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
  153. package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
  154. package/dist/resources/extensions/gsd/model-router.js +187 -0
  155. package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
  156. package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
  157. package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
  158. package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
  159. package/dist/resources/extensions/gsd/notifications.js +58 -0
  160. package/dist/resources/extensions/gsd/observability-validator.js +398 -0
  161. package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
  162. package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
  163. package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
  164. package/dist/resources/extensions/gsd/paths.js +414 -0
  165. package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
  166. package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
  167. package/dist/resources/extensions/gsd/preferences-models.js +294 -0
  168. package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
  169. package/dist/resources/extensions/gsd/preferences-types.js +73 -0
  170. package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
  171. package/dist/resources/extensions/gsd/preferences.js +325 -0
  172. package/dist/resources/extensions/gsd/progress-score.js +102 -0
  173. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
  174. package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
  175. package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
  176. package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
  177. package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
  178. package/dist/resources/extensions/gsd/queue-order.js +178 -0
  179. package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
  180. package/dist/resources/extensions/gsd/quick.js +206 -0
  181. package/dist/resources/extensions/gsd/repo-identity.js +187 -0
  182. package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
  183. package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
  184. package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
  185. package/dist/resources/extensions/gsd/routing-history.js +210 -0
  186. package/dist/resources/extensions/gsd/safe-fs.js +52 -0
  187. package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
  188. package/dist/resources/extensions/gsd/session-forensics.js +427 -0
  189. package/dist/resources/extensions/gsd/session-lock.js +397 -0
  190. package/dist/resources/extensions/gsd/session-status-io.js +134 -0
  191. package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
  192. package/dist/resources/extensions/gsd/skill-health.js +324 -0
  193. package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
  194. package/dist/resources/extensions/gsd/state.js +653 -0
  195. package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
  196. package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
  197. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  198. package/dist/resources/extensions/gsd/token-counter.js +54 -0
  199. package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
  200. package/dist/resources/extensions/gsd/triage-ui.js +125 -0
  201. package/dist/resources/extensions/gsd/types.js +4 -0
  202. package/dist/resources/extensions/gsd/undo.js +205 -0
  203. package/dist/resources/extensions/gsd/unit-id.js +7 -0
  204. package/dist/resources/extensions/gsd/unit-runtime.js +131 -0
  205. package/dist/resources/extensions/gsd/validate-directory.js +143 -0
  206. package/dist/resources/extensions/gsd/verification-evidence.js +122 -0
  207. package/dist/resources/extensions/gsd/verification-gate.js +514 -0
  208. package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
  209. package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
  210. package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
  211. package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
  212. package/dist/resources/extensions/gsd/workspace-index.js +139 -0
  213. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
  214. package/dist/resources/extensions/gsd/worktree-command.js +682 -0
  215. package/dist/resources/extensions/gsd/worktree-manager.js +358 -0
  216. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  217. package/dist/resources/extensions/gsd/worktree.js +199 -0
  218. package/dist/resources/extensions/mac-tools/index.js +768 -0
  219. package/dist/resources/extensions/mcp-client/index.js +363 -0
  220. package/dist/resources/extensions/package.json +3 -0
  221. package/dist/resources/extensions/remote-questions/config.js +70 -0
  222. package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
  223. package/dist/resources/extensions/remote-questions/format.js +234 -0
  224. package/dist/resources/extensions/remote-questions/http-client.js +43 -0
  225. package/dist/resources/extensions/remote-questions/manager.js +156 -0
  226. package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
  227. package/dist/resources/extensions/remote-questions/notify.js +89 -0
  228. package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
  229. package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
  230. package/dist/resources/extensions/remote-questions/status.js +25 -0
  231. package/dist/resources/extensions/remote-questions/store.js +70 -0
  232. package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
  233. package/dist/resources/extensions/remote-questions/types.js +5 -0
  234. package/dist/resources/extensions/search-the-web/cache.js +74 -0
  235. package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
  236. package/dist/resources/extensions/search-the-web/format.js +161 -0
  237. package/dist/resources/extensions/search-the-web/http.js +178 -0
  238. package/dist/resources/extensions/search-the-web/index.js +41 -0
  239. package/dist/resources/extensions/search-the-web/native-search.js +166 -0
  240. package/dist/resources/extensions/search-the-web/provider.js +143 -0
  241. package/dist/resources/extensions/search-the-web/tavily.js +82 -0
  242. package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
  243. package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
  244. package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
  245. package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
  246. package/dist/resources/extensions/shared/confirm-ui.js +96 -0
  247. package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
  248. package/dist/resources/extensions/shared/frontmatter.js +109 -0
  249. package/dist/resources/extensions/shared/interview-ui.js +569 -0
  250. package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
  251. package/dist/resources/extensions/shared/next-action-ui.js +168 -0
  252. package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
  253. package/dist/resources/extensions/shared/sanitize.js +17 -0
  254. package/dist/resources/extensions/shared/terminal.js +21 -0
  255. package/dist/resources/extensions/shared/ui.js +245 -0
  256. package/dist/resources/extensions/shared/wizard-ui.js +478 -0
  257. package/dist/resources/extensions/slash-commands/audit.js +72 -0
  258. package/dist/resources/extensions/slash-commands/clear.js +8 -0
  259. package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
  260. package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
  261. package/dist/resources/extensions/slash-commands/index.js +10 -0
  262. package/dist/resources/extensions/subagent/agents.js +103 -0
  263. package/dist/resources/extensions/subagent/index.js +905 -0
  264. package/dist/resources/extensions/subagent/isolation.js +384 -0
  265. package/dist/resources/extensions/subagent/worker-registry.js +73 -0
  266. package/dist/resources/extensions/ttsr/index.js +144 -0
  267. package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
  268. package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
  269. package/dist/resources/extensions/universal-config/discovery.js +94 -0
  270. package/dist/resources/extensions/universal-config/format.js +178 -0
  271. package/dist/resources/extensions/universal-config/index.js +99 -0
  272. package/dist/resources/extensions/universal-config/scanners.js +574 -0
  273. package/dist/resources/extensions/universal-config/tools.js +57 -0
  274. package/dist/resources/extensions/universal-config/types.js +8 -0
  275. package/dist/resources/extensions/voice/index.js +247 -0
  276. package/dist/startup-timings.d.ts +2 -0
  277. package/dist/startup-timings.js +22 -0
  278. package/dist/tool-bootstrap.js +59 -11
  279. package/dist/worktree-cli.js +7 -7
  280. package/package.json +1 -1
  281. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/agent-session.js +9 -0
  283. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  285. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  287. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  289. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  291. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  293. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/index.js +1 -1
  295. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  296. package/packages/pi-coding-agent/package.json +1 -1
  297. package/packages/pi-coding-agent/src/core/agent-session.ts +9 -0
  298. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
  299. package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
  300. package/packages/pi-coding-agent/src/index.ts +1 -0
  301. package/pkg/package.json +1 -1
  302. package/src/resources/extensions/bg-shell/index.ts +41 -46
  303. package/src/resources/extensions/browser-tools/index.ts +156 -67
  304. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  305. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  306. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  307. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  308. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  309. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  310. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  311. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  312. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  313. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  314. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  315. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  316. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  317. package/src/resources/extensions/gsd/auto-verification.ts +76 -72
  318. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  319. package/src/resources/extensions/gsd/auto-worktree.ts +453 -133
  320. package/src/resources/extensions/gsd/auto.ts +516 -1189
  321. package/src/resources/extensions/gsd/captures.ts +10 -4
  322. package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
  323. package/src/resources/extensions/gsd/commands.ts +39 -31
  324. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  325. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  326. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  327. package/src/resources/extensions/gsd/git-service.ts +32 -12
  328. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  329. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  330. package/src/resources/extensions/gsd/guided-flow.ts +22 -11
  331. package/src/resources/extensions/gsd/index.ts +76 -163
  332. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  333. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  334. package/src/resources/extensions/gsd/quick.ts +121 -76
  335. package/src/resources/extensions/gsd/repo-identity.ts +56 -22
  336. package/src/resources/extensions/gsd/session-lock.ts +17 -0
  337. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  338. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  339. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  340. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  341. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  342. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  343. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  344. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  345. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  346. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  347. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  348. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  349. package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
  350. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  351. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  352. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  353. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
  354. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
  355. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  356. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  357. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  358. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  359. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  360. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  361. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  362. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  363. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -136
  364. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  365. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  366. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  367. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  368. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  369. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  370. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  371. package/src/resources/extensions/gsd/types.ts +90 -77
  372. package/src/resources/extensions/gsd/undo.ts +42 -46
  373. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  374. package/src/resources/extensions/gsd/verification-evidence.ts +0 -2
  375. package/src/resources/extensions/gsd/verification-gate.ts +4 -16
  376. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  377. package/src/resources/extensions/gsd/worktree-command.ts +29 -11
  378. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  379. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  380. package/src/resources/extensions/gsd/worktree.ts +7 -44
  381. package/src/resources/extensions/package.json +3 -0
  382. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  383. package/src/resources/extensions/search-the-web/index.ts +35 -52
  384. package/src/resources/extensions/search-the-web/tavily.ts +1 -1
  385. package/dist/resources/extensions/ask-user-questions.ts +0 -290
  386. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
  387. package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
  388. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
  389. package/dist/resources/extensions/async-jobs/index.ts +0 -141
  390. package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
  391. package/dist/resources/extensions/aws-auth/index.ts +0 -144
  392. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
  393. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
  394. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
  395. package/dist/resources/extensions/bg-shell/index.ts +0 -59
  396. package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
  397. package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
  398. package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
  399. package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
  400. package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
  401. package/dist/resources/extensions/bg-shell/types.ts +0 -303
  402. package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
  403. package/dist/resources/extensions/browser-tools/capture.ts +0 -199
  404. package/dist/resources/extensions/browser-tools/core.ts +0 -1196
  405. package/dist/resources/extensions/browser-tools/index.ts +0 -71
  406. package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
  407. package/dist/resources/extensions/browser-tools/refs.ts +0 -264
  408. package/dist/resources/extensions/browser-tools/settle.ts +0 -197
  409. package/dist/resources/extensions/browser-tools/state.ts +0 -408
  410. package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
  411. package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
  412. package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
  413. package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
  414. package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
  415. package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
  416. package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
  417. package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
  418. package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
  419. package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
  420. package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
  421. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
  422. package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
  423. package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
  424. package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
  425. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
  426. package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
  427. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
  428. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
  429. package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
  430. package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
  431. package/dist/resources/extensions/browser-tools/utils.ts +0 -660
  432. package/dist/resources/extensions/context7/index.ts +0 -428
  433. package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
  434. package/dist/resources/extensions/google-search/index.ts +0 -466
  435. package/dist/resources/extensions/gsd/activity-log.ts +0 -162
  436. package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
  437. package/dist/resources/extensions/gsd/auto/session.ts +0 -236
  438. package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
  439. package/dist/resources/extensions/gsd/auto-constants.ts +0 -6
  440. package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
  441. package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
  442. package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
  443. package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
  444. package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
  445. package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
  446. package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
  447. package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
  448. package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
  449. package/dist/resources/extensions/gsd/auto-start.ts +0 -483
  450. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  451. package/dist/resources/extensions/gsd/auto-supervisor.ts +0 -61
  452. package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
  453. package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
  454. package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
  455. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  456. package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
  457. package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
  458. package/dist/resources/extensions/gsd/auto.ts +0 -1834
  459. package/dist/resources/extensions/gsd/captures.ts +0 -427
  460. package/dist/resources/extensions/gsd/claude-import.ts +0 -656
  461. package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  462. package/dist/resources/extensions/gsd/commands-config.ts +0 -102
  463. package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
  464. package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
  465. package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
  466. package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
  467. package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
  468. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
  469. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  470. package/dist/resources/extensions/gsd/commands.ts +0 -1149
  471. package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
  472. package/dist/resources/extensions/gsd/context-budget.ts +0 -266
  473. package/dist/resources/extensions/gsd/context-store.ts +0 -195
  474. package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
  475. package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
  476. package/dist/resources/extensions/gsd/db-writer.ts +0 -360
  477. package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
  478. package/dist/resources/extensions/gsd/detection.ts +0 -470
  479. package/dist/resources/extensions/gsd/diff-context.ts +0 -214
  480. package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
  481. package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
  482. package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
  483. package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
  484. package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
  485. package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
  486. package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
  487. package/dist/resources/extensions/gsd/doctor.ts +0 -722
  488. package/dist/resources/extensions/gsd/error-utils.ts +0 -6
  489. package/dist/resources/extensions/gsd/exit-command.ts +0 -18
  490. package/dist/resources/extensions/gsd/export.ts +0 -317
  491. package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
  492. package/dist/resources/extensions/gsd/files.ts +0 -1058
  493. package/dist/resources/extensions/gsd/forensics.ts +0 -629
  494. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
  495. package/dist/resources/extensions/gsd/git-service.ts +0 -580
  496. package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
  497. package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
  498. package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
  499. package/dist/resources/extensions/gsd/health-widget.ts +0 -167
  500. package/dist/resources/extensions/gsd/history.ts +0 -143
  501. package/dist/resources/extensions/gsd/index.ts +0 -1390
  502. package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
  503. package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
  504. package/dist/resources/extensions/gsd/key-manager.ts +0 -996
  505. package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  506. package/dist/resources/extensions/gsd/md-importer.ts +0 -527
  507. package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
  508. package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
  509. package/dist/resources/extensions/gsd/memory-store.ts +0 -441
  510. package/dist/resources/extensions/gsd/metrics.ts +0 -532
  511. package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
  512. package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
  513. package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
  514. package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
  515. package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
  516. package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
  517. package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
  518. package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
  519. package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
  520. package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
  521. package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
  522. package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
  523. package/dist/resources/extensions/gsd/model-router.ts +0 -256
  524. package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
  525. package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  526. package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
  527. package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  528. package/dist/resources/extensions/gsd/notifications.ts +0 -87
  529. package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
  530. package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
  531. package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
  532. package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
  533. package/dist/resources/extensions/gsd/paths.ts +0 -449
  534. package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
  535. package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
  536. package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
  537. package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
  538. package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
  539. package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
  540. package/dist/resources/extensions/gsd/preferences.ts +0 -416
  541. package/dist/resources/extensions/gsd/progress-score.ts +0 -273
  542. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  543. package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
  544. package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
  545. package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
  546. package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
  547. package/dist/resources/extensions/gsd/queue-order.ts +0 -230
  548. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
  549. package/dist/resources/extensions/gsd/quick.ts +0 -212
  550. package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
  551. package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
  552. package/dist/resources/extensions/gsd/routing-history.ts +0 -286
  553. package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
  554. package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
  555. package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
  556. package/dist/resources/extensions/gsd/session-lock.ts +0 -426
  557. package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
  558. package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
  559. package/dist/resources/extensions/gsd/skill-health.ts +0 -417
  560. package/dist/resources/extensions/gsd/state.ts +0 -727
  561. package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
  562. package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
  563. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
  564. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
  565. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
  566. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  567. package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
  568. package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  569. package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
  570. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
  571. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
  572. package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  573. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
  574. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
  575. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  576. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
  577. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
  578. package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  579. package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
  580. package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
  581. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
  582. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
  583. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  584. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  585. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
  586. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  587. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  588. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  589. package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
  590. package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
  591. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
  592. package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
  593. package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
  594. package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
  595. package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  596. package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
  597. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
  598. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
  599. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
  600. package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
  601. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  602. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  603. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
  604. package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
  605. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  606. package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
  607. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
  608. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
  609. package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
  610. package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
  611. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
  612. package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
  613. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  614. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
  615. package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  616. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
  617. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  618. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
  619. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
  620. package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
  621. package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
  622. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
  623. package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
  624. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  625. package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
  626. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
  627. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  628. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
  629. package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  630. package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
  631. package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
  632. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
  633. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
  634. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
  635. package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  636. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
  637. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  638. package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
  639. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  640. package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
  641. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  642. package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
  643. package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
  644. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
  645. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
  646. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
  647. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
  648. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
  649. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
  650. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
  651. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
  652. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  653. package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
  654. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
  655. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  656. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  657. package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  658. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  659. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
  660. package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
  661. package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
  662. package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
  663. package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
  664. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
  665. package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
  666. package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
  667. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
  668. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
  669. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
  670. package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
  671. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
  672. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
  673. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
  674. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
  675. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  676. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
  677. package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
  678. package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  679. package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  680. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  681. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  682. package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
  683. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  684. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
  685. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
  686. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
  687. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
  688. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  689. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
  690. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  691. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
  692. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  693. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
  694. package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
  695. package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
  696. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
  697. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
  698. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
  699. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
  700. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  701. package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
  702. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
  703. package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  704. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  705. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
  706. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
  707. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
  708. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  709. package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
  710. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  711. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  712. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
  713. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  714. package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
  715. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
  716. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
  717. package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
  718. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
  719. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
  720. package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  721. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
  722. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
  723. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
  724. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
  725. package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
  726. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
  727. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
  728. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
  729. package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
  730. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
  731. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  732. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
  733. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
  734. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
  735. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
  736. package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  737. package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
  738. package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
  739. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
  740. package/dist/resources/extensions/gsd/token-counter.ts +0 -65
  741. package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
  742. package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
  743. package/dist/resources/extensions/gsd/types.ts +0 -425
  744. package/dist/resources/extensions/gsd/undo.ts +0 -223
  745. package/dist/resources/extensions/gsd/unit-id.ts +0 -14
  746. package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
  747. package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
  748. package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
  749. package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
  750. package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
  751. package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  752. package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
  753. package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
  754. package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
  755. package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
  756. package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
  757. package/dist/resources/extensions/gsd/worktree.ts +0 -257
  758. package/dist/resources/extensions/mac-tools/index.ts +0 -852
  759. package/dist/resources/extensions/mcp-client/index.ts +0 -459
  760. package/dist/resources/extensions/remote-questions/config.ts +0 -83
  761. package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
  762. package/dist/resources/extensions/remote-questions/format.ts +0 -315
  763. package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
  764. package/dist/resources/extensions/remote-questions/manager.ts +0 -184
  765. package/dist/resources/extensions/remote-questions/notify.ts +0 -90
  766. package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
  767. package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
  768. package/dist/resources/extensions/remote-questions/status.ts +0 -31
  769. package/dist/resources/extensions/remote-questions/store.ts +0 -81
  770. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
  771. package/dist/resources/extensions/remote-questions/types.ts +0 -102
  772. package/dist/resources/extensions/search-the-web/cache.ts +0 -78
  773. package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
  774. package/dist/resources/extensions/search-the-web/format.ts +0 -258
  775. package/dist/resources/extensions/search-the-web/http.ts +0 -238
  776. package/dist/resources/extensions/search-the-web/index.ts +0 -65
  777. package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
  778. package/dist/resources/extensions/search-the-web/provider.ts +0 -148
  779. package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
  780. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
  781. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
  782. package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
  783. package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
  784. package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
  785. package/dist/resources/extensions/shared/frontmatter.ts +0 -117
  786. package/dist/resources/extensions/shared/interview-ui.ts +0 -613
  787. package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
  788. package/dist/resources/extensions/shared/sanitize.ts +0 -19
  789. package/dist/resources/extensions/shared/terminal.ts +0 -23
  790. package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
  791. package/dist/resources/extensions/shared/ui.ts +0 -400
  792. package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
  793. package/dist/resources/extensions/slash-commands/audit.ts +0 -88
  794. package/dist/resources/extensions/slash-commands/clear.ts +0 -10
  795. package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
  796. package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  797. package/dist/resources/extensions/slash-commands/index.ts +0 -12
  798. package/dist/resources/extensions/subagent/agents.ts +0 -126
  799. package/dist/resources/extensions/subagent/index.ts +0 -1121
  800. package/dist/resources/extensions/subagent/isolation.ts +0 -501
  801. package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
  802. package/dist/resources/extensions/ttsr/index.ts +0 -168
  803. package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
  804. package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
  805. package/dist/resources/extensions/universal-config/discovery.ts +0 -104
  806. package/dist/resources/extensions/universal-config/format.ts +0 -191
  807. package/dist/resources/extensions/universal-config/index.ts +0 -120
  808. package/dist/resources/extensions/universal-config/scanners.ts +0 -642
  809. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
  810. package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
  811. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
  812. package/dist/resources/extensions/universal-config/tools.ts +0 -60
  813. package/dist/resources/extensions/universal-config/types.ts +0 -135
  814. package/dist/resources/extensions/voice/index.ts +0 -272
  815. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
  816. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
  817. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  818. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  819. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  820. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  821. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  822. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  823. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  824. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  825. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  826. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  827. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  828. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -1,1172 +0,0 @@
1
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync } from "node:fs";
2
- import { join, dirname } from "node:path";
3
- import { tmpdir } from "node:os";
4
- import { execSync } from "node:child_process";
5
-
6
- import {
7
- inferCommitType,
8
- buildTaskCommitMessage,
9
- GitServiceImpl,
10
- RUNTIME_EXCLUSION_PATHS,
11
- VALID_BRANCH_NAME,
12
- runGit,
13
- readIntegrationBranch,
14
- writeIntegrationBranch,
15
- type GitPreferences,
16
- type CommitOptions,
17
- type PreMergeCheckResult,
18
- type TaskCommitContext,
19
- } from "../git-service.ts";
20
- import { createTestContext } from './test-helpers.ts';
21
-
22
- const { assertEq, assertTrue, report } = createTestContext();
23
- function run(command: string, cwd: string): string {
24
- return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
25
- }
26
-
27
- async function main(): Promise<void> {
28
- // ─── inferCommitType ───────────────────────────────────────────────────
29
-
30
- console.log("\n=== inferCommitType ===");
31
-
32
- assertEq(
33
- inferCommitType("Implement user authentication"),
34
- "feat",
35
- "generic feature title → feat"
36
- );
37
-
38
- assertEq(
39
- inferCommitType("Add dashboard page"),
40
- "feat",
41
- "add-style title → feat"
42
- );
43
-
44
- assertEq(
45
- inferCommitType("Fix login redirect bug"),
46
- "fix",
47
- "title with 'fix' → fix"
48
- );
49
-
50
- assertEq(
51
- inferCommitType("Bug in session handling"),
52
- "fix",
53
- "title with 'bug' → fix"
54
- );
55
-
56
- assertEq(
57
- inferCommitType("Hotfix for production crash"),
58
- "fix",
59
- "title with 'hotfix' → fix"
60
- );
61
-
62
- assertEq(
63
- inferCommitType("Patch memory leak"),
64
- "fix",
65
- "title with 'patch' → fix"
66
- );
67
-
68
- assertEq(
69
- inferCommitType("Refactor state management"),
70
- "refactor",
71
- "title with 'refactor' → refactor"
72
- );
73
-
74
- assertEq(
75
- inferCommitType("Restructure project layout"),
76
- "refactor",
77
- "title with 'restructure' → refactor"
78
- );
79
-
80
- assertEq(
81
- inferCommitType("Reorganize module imports"),
82
- "refactor",
83
- "title with 'reorganize' → refactor"
84
- );
85
-
86
- assertEq(
87
- inferCommitType("Update API documentation"),
88
- "docs",
89
- "title with 'documentation' → docs"
90
- );
91
-
92
- assertEq(
93
- inferCommitType("Add doc for setup guide"),
94
- "docs",
95
- "title with 'doc' → docs"
96
- );
97
-
98
- assertEq(
99
- inferCommitType("Add unit tests for auth"),
100
- "test",
101
- "title with 'tests' → test"
102
- );
103
-
104
- assertEq(
105
- inferCommitType("Testing infrastructure setup"),
106
- "test",
107
- "title with 'testing' → test"
108
- );
109
-
110
- assertEq(
111
- inferCommitType("Chore: update dependencies"),
112
- "chore",
113
- "title with 'chore' → chore"
114
- );
115
-
116
- assertEq(
117
- inferCommitType("Cleanup unused imports"),
118
- "chore",
119
- "title with 'cleanup' → chore"
120
- );
121
-
122
- assertEq(
123
- inferCommitType("Clean up stale branches"),
124
- "chore",
125
- "title with 'clean up' → chore"
126
- );
127
-
128
- assertEq(
129
- inferCommitType("Archive old milestones"),
130
- "chore",
131
- "title with 'archive' → chore"
132
- );
133
-
134
- assertEq(
135
- inferCommitType("Remove deprecated endpoints"),
136
- "chore",
137
- "title with 'remove' → chore"
138
- );
139
-
140
- assertEq(
141
- inferCommitType("Delete temp files"),
142
- "chore",
143
- "title with 'delete' → chore"
144
- );
145
-
146
- // Mixed keywords — first match wins
147
- assertEq(
148
- inferCommitType("Fix and refactor the login module"),
149
- "fix",
150
- "mixed keywords → first match wins (fix before refactor)"
151
- );
152
-
153
- assertEq(
154
- inferCommitType("Refactor test utilities"),
155
- "refactor",
156
- "mixed keywords → first match wins (refactor before test)"
157
- );
158
-
159
- // Unknown / unrecognized title → feat
160
- assertEq(
161
- inferCommitType("Build the new pipeline"),
162
- "feat",
163
- "unrecognized title → feat"
164
- );
165
-
166
- assertEq(
167
- inferCommitType(""),
168
- "feat",
169
- "empty title → feat"
170
- );
171
-
172
- // Word boundary: "testify" should NOT match "test"
173
- assertEq(
174
- inferCommitType("Testify integration"),
175
- "feat",
176
- "'testify' does not match 'test' — word boundary prevents partial match"
177
- );
178
-
179
- // "documentary" should NOT match "doc" (word boundary)
180
- assertEq(
181
- inferCommitType("Documentary style UI"),
182
- "feat",
183
- "'documentary' does not match 'doc' — word boundary prevents partial match"
184
- );
185
-
186
- // "prefix" should NOT match "fix" (word boundary)
187
- assertEq(
188
- inferCommitType("Add prefix to all IDs"),
189
- "feat",
190
- "'prefix' does not match 'fix' — word boundary prevents partial match"
191
- );
192
-
193
- // ─── inferCommitType with oneLiner ──────────────────────────────────────
194
-
195
- console.log("\n=== inferCommitType with oneLiner ===");
196
-
197
- assertEq(
198
- inferCommitType("implement dashboard", "Fixed rendering bug in sidebar"),
199
- "fix",
200
- "one-liner with 'fixed' overrides generic title → fix"
201
- );
202
-
203
- assertEq(
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
- console.log("\n=== buildTaskCommitMessage ===");
212
-
213
- {
214
- const msg = buildTaskCommitMessage({
215
- taskId: "S01/T02",
216
- taskTitle: "implement user authentication",
217
- oneLiner: "Added JWT-based auth with refresh token rotation",
218
- keyFiles: ["src/auth.ts", "src/middleware/jwt.ts"],
219
- });
220
- assertTrue(msg.startsWith("feat(S01/T02):"), "message starts with type(scope)");
221
- assertTrue(msg.includes("JWT-based auth"), "message includes one-liner content");
222
- assertTrue(msg.includes("- src/auth.ts"), "message body includes key files");
223
- assertTrue(msg.includes("- src/middleware/jwt.ts"), "message body includes second key file");
224
- }
225
-
226
- {
227
- const msg = buildTaskCommitMessage({
228
- taskId: "S02/T01",
229
- taskTitle: "fix login redirect bug",
230
- });
231
- assertTrue(msg.startsWith("fix(S02/T01):"), "infers fix type from title");
232
- assertTrue(msg.includes("fix login redirect bug"), "uses task title when no one-liner");
233
- assertTrue(!msg.includes("\n"), "no body when no key files");
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
- assertTrue(msg.startsWith("test(S01/T03):"), "infers test type");
243
- }
244
-
245
- // ─── RUNTIME_EXCLUSION_PATHS ───────────────────────────────────────────
246
-
247
- console.log("\n=== RUNTIME_EXCLUSION_PATHS ===");
248
-
249
- assertEq(
250
- RUNTIME_EXCLUSION_PATHS.length,
251
- 9,
252
- "exactly 9 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/DISCUSSION-MANIFEST.json",
265
- ];
266
-
267
- assertEq(
268
- [...RUNTIME_EXCLUSION_PATHS],
269
- expectedPaths,
270
- "paths match expected set in order"
271
- );
272
-
273
- assertTrue(
274
- RUNTIME_EXCLUSION_PATHS.includes(".gsd/activity/"),
275
- "includes .gsd/activity/"
276
- );
277
- assertTrue(
278
- RUNTIME_EXCLUSION_PATHS.includes(".gsd/STATE.md"),
279
- "includes .gsd/STATE.md"
280
- );
281
-
282
- // ─── runGit ────────────────────────────────────────────────────────────
283
-
284
- console.log("\n=== runGit ===");
285
-
286
- const tempDir = mkdtempSync(join(tmpdir(), "gsd-git-service-test-"));
287
- run("git init -b main", tempDir);
288
- run('git config user.name "Pi Test"', tempDir);
289
- run('git config user.email "pi@example.com"', tempDir);
290
-
291
- // runGit should work on a valid repo
292
- const branch = runGit(tempDir, ["branch", "--show-current"]);
293
- assertEq(branch, "main", "runGit returns current branch");
294
-
295
- // runGit allowFailure returns empty string on failure
296
- const result = runGit(tempDir, ["log", "--oneline"], { allowFailure: true });
297
- assertEq(result, "", "runGit allowFailure returns empty on error (no commits yet)");
298
-
299
- // runGit throws on failure without allowFailure
300
- let threw = false;
301
- try {
302
- runGit(tempDir, ["log", "--oneline"]);
303
- } catch (e) {
304
- threw = true;
305
- assertTrue(
306
- (e as Error).message.includes("git log --oneline failed"),
307
- "error message includes command and path"
308
- );
309
- }
310
- assertTrue(threw, "runGit throws without allowFailure on error");
311
-
312
- // ─── Type exports compile check ────────────────────────────────────────
313
-
314
- console.log("\n=== Type exports ===");
315
-
316
- // These are compile-time checks — if we got here, the types import fine
317
- const _prefs: GitPreferences = { auto_push: true, remote: "origin" };
318
- const _opts: CommitOptions = { message: "test" };
319
- assertTrue(true, "GitPreferences type exported and usable");
320
- assertTrue(true, "CommitOptions type exported and usable");
321
-
322
- // Cleanup T01 temp dir
323
- rmSync(tempDir, { recursive: true, force: true });
324
-
325
- // ─── Helper: create file with intermediate dirs ────────────────────────
326
-
327
- function createFile(base: string, relativePath: string, content: string = "x"): void {
328
- const full = join(base, relativePath);
329
- mkdirSync(dirname(full), { recursive: true });
330
- writeFileSync(full, content, "utf-8");
331
- }
332
-
333
- function initTempRepo(): string {
334
- const dir = mkdtempSync(join(tmpdir(), "gsd-git-t02-"));
335
- run("git init -b main", dir);
336
- run('git config user.name "Pi Test"', dir);
337
- run('git config user.email "pi@example.com"', dir);
338
- // Need an initial commit so HEAD exists
339
- createFile(dir, ".gitkeep", "");
340
- run("git add -A", dir);
341
- run('git commit -m "init"', dir);
342
- return dir;
343
- }
344
-
345
- // ─── GitServiceImpl: smart staging ─────────────────────────────────────
346
-
347
- console.log("\n=== GitServiceImpl: smart staging ===");
348
-
349
- {
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
- assertEq(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
- assertTrue(showStat.includes("src/code.ts"), "src/code.ts is in the commit");
371
- assertTrue(!showStat.includes(".gsd/activity"), ".gsd/activity/ excluded from commit");
372
- assertTrue(!showStat.includes(".gsd/runtime"), ".gsd/runtime/ excluded from commit");
373
- assertTrue(!showStat.includes("STATE.md"), ".gsd/STATE.md excluded from commit");
374
- assertTrue(!showStat.includes("auto.lock"), ".gsd/auto.lock excluded from commit");
375
- assertTrue(!showStat.includes("metrics.json"), ".gsd/metrics.json excluded from commit");
376
- assertTrue(!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
- assertTrue(statusOut.includes(".gsd/activity/"), "activity still untracked after commit");
383
- assertTrue(statusOut.includes(".gsd/runtime/"), "runtime still untracked after commit");
384
- assertTrue(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
- console.log("\n=== GitServiceImpl: smart staging excludes tracked runtime files ===");
392
-
393
- {
394
- // Reproduces the real bug: .gsd/ runtime files that are already tracked
395
- // (in the git index) must be excluded from staging even when .gsd/ is
396
- // in .gitignore. The old pathspec-exclude approach failed silently in
397
- // this case and fell back to `git add -A`, staging everything.
398
- //
399
- // The fix has three layers:
400
- // 1. Auto-cleanup: git rm --cached removes tracked runtime files from index
401
- // 2. Stage-then-unstage: git add -A + git reset HEAD replaces pathspec excludes
402
- // 3. Pre-checkout discard: git checkout -- .gsd/ clears dirty runtime files
403
-
404
- const repo = initTempRepo();
405
- const svc = new GitServiceImpl(repo);
406
-
407
- // Simulate a repo where .gsd/ files were previously force-added
408
- createFile(repo, ".gsd/metrics.json", '{"version":1}');
409
- createFile(repo, ".gsd/completed-units.json", '["unit1"]');
410
- createFile(repo, ".gsd/activity/log.jsonl", '{"ts":1}');
411
- createFile(repo, "src/real.ts", "real code");
412
- // Force-add .gsd/ files to simulate historical tracking
413
- runGit(repo, ["add", "-f", ".gsd/metrics.json", ".gsd/completed-units.json", ".gsd/activity/log.jsonl", "src/real.ts"]);
414
- runGit(repo, ["commit", "-F", "-"], { input: "init with tracked runtime files" });
415
-
416
- // Add .gitignore with .gsd/ (matches real-world setup from ensureGitignore)
417
- createFile(repo, ".gitignore", ".gsd/\n");
418
- runGit(repo, ["add", ".gitignore"]);
419
- runGit(repo, ["commit", "-F", "-"], { input: "add gitignore" });
420
-
421
- // Verify runtime files are tracked (precondition)
422
- const tracked = run("git ls-files .gsd/", repo);
423
- assertTrue(tracked.includes("metrics.json"), "precondition: metrics.json tracked");
424
- assertTrue(tracked.includes("completed-units.json"), "precondition: completed-units.json tracked");
425
- assertTrue(tracked.includes("activity/log.jsonl"), "precondition: activity log tracked");
426
-
427
- // Now modify both runtime and real files
428
- createFile(repo, ".gsd/metrics.json", '{"version":2}');
429
- createFile(repo, ".gsd/completed-units.json", '["unit1","unit2"]');
430
- createFile(repo, ".gsd/activity/log.jsonl", '{"ts":2}');
431
- createFile(repo, "src/real.ts", "updated code");
432
-
433
- // autoCommit should commit real.ts. The first call also runs auto-cleanup
434
- // which removes runtime files from the index via a dedicated commit.
435
- const msg = svc.autoCommit("execute-task", "M001/S01/T01");
436
- assertTrue(msg !== null, "autoCommit produces a commit");
437
-
438
- const show = run("git show --stat HEAD", repo);
439
- assertTrue(show.includes("src/real.ts"), "real files are committed");
440
-
441
- // After the commit, runtime files must no longer be in the git index.
442
- // They remain on disk but are untracked (protected by .gitignore).
443
- const trackedAfter = run("git ls-files .gsd/", repo);
444
- assertEq(trackedAfter, "", "no .gsd/ runtime files remain in the index");
445
-
446
- // Verify a second autoCommit with changed runtime files does NOT stage them
447
- createFile(repo, ".gsd/metrics.json", '{"version":3}');
448
- createFile(repo, ".gsd/completed-units.json", '["unit1","unit2","unit3"]');
449
- createFile(repo, "src/real.ts", "third version");
450
-
451
- const msg2 = svc.autoCommit("execute-task", "M001/S01/T02");
452
- assertTrue(msg2 !== null, "second autoCommit produces a commit");
453
-
454
- const show2 = run("git show --stat HEAD", repo);
455
- assertTrue(show2.includes("src/real.ts"), "real files committed in second commit");
456
- assertTrue(!show2.includes("metrics"), "metrics.json not in second commit");
457
- assertTrue(!show2.includes("completed-units"), "completed-units.json not in second commit");
458
- assertTrue(!show2.includes("activity"), "activity not in second commit");
459
-
460
- rmSync(repo, { recursive: true, force: true });
461
- }
462
-
463
- // ─── GitServiceImpl: autoCommit on clean repo ──────────────────────────
464
-
465
- console.log("\n=== GitServiceImpl: autoCommit ===");
466
-
467
- {
468
- const repo = initTempRepo();
469
- const svc = new GitServiceImpl(repo);
470
-
471
- // Clean repo — autoCommit should return null
472
- const cleanResult = svc.autoCommit("task", "T01");
473
- assertEq(cleanResult, null, "autoCommit on clean repo returns null");
474
-
475
- rmSync(repo, { recursive: true, force: true });
476
- }
477
-
478
- // ─── GitServiceImpl: autoCommit on dirty repo ──────────────────────────
479
-
480
- console.log("\n=== GitServiceImpl: autoCommit on dirty repo ===");
481
-
482
- {
483
- const repo = initTempRepo();
484
- const svc = new GitServiceImpl(repo);
485
-
486
- createFile(repo, "src/new-feature.ts", "export const x = 1;");
487
-
488
- // Without task context, autoCommit uses generic chore message
489
- const msg = svc.autoCommit("task", "T01");
490
- assertEq(msg, "chore(T01): auto-commit after task", "autoCommit returns generic format without task context");
491
-
492
- const log = run("git log --oneline -1", repo);
493
- assertTrue(log.includes("chore(T01): auto-commit after task"), "generic commit message is in git log");
494
-
495
- // With task context, autoCommit uses meaningful message
496
- createFile(repo, "src/auth.ts", "export function login() {}");
497
- const msg2 = svc.autoCommit("task", "S01/T02", [], {
498
- taskId: "S01/T02",
499
- taskTitle: "implement user authentication endpoint",
500
- oneLiner: "Added JWT-based auth with refresh token rotation",
501
- keyFiles: ["src/auth.ts"],
502
- });
503
- assertTrue(msg2 !== null, "autoCommit with task context returns a message");
504
- assertTrue(msg2!.startsWith("feat(S01/T02):"), "meaningful commit uses feat type and scope");
505
- assertTrue(msg2!.includes("JWT-based auth"), "meaningful commit includes one-liner content");
506
-
507
- rmSync(repo, { recursive: true, force: true });
508
- }
509
-
510
- // ─── GitServiceImpl: empty-after-staging guard ─────────────────────────
511
-
512
- console.log("\n=== GitServiceImpl: empty-after-staging guard ===");
513
-
514
- {
515
- const repo = initTempRepo();
516
- const svc = new GitServiceImpl(repo);
517
-
518
- // Create only runtime files
519
- createFile(repo, ".gsd/activity/x.jsonl", "data");
520
-
521
- const result = svc.autoCommit("task", "T02");
522
- assertEq(result, null, "autoCommit returns null when only runtime files are dirty");
523
-
524
- // Verify no new commit was created (should still be at init commit)
525
- const logCount = run("git rev-list --count HEAD", repo);
526
- assertEq(logCount, "1", "no new commit created when only runtime files changed");
527
-
528
- rmSync(repo, { recursive: true, force: true });
529
- }
530
-
531
- // ─── GitServiceImpl: autoCommit with extraExclusions ───────────────────
532
-
533
- console.log("\n=== GitServiceImpl: autoCommit with extraExclusions ===");
534
-
535
- {
536
- const repo = initTempRepo();
537
- const svc = new GitServiceImpl(repo);
538
-
539
- // Create both a .gsd/ planning file and a regular source file
540
- createFile(repo, ".gsd/milestones/M001/M001-ROADMAP.md", "- [x] S01");
541
- createFile(repo, "src/feature.ts", "export const y = 2;");
542
-
543
- // Auto-commit with .gsd/ excluded (simulates pre-switch)
544
- const msg = svc.autoCommit("pre-switch", "main", [".gsd/"]);
545
- assertEq(msg, "chore(main): auto-commit after pre-switch", "pre-switch autoCommit with .gsd/ exclusion commits");
546
-
547
- // Verify .gsd/ file was NOT committed
548
- const show = run("git show --stat HEAD", repo);
549
- assertTrue(!show.includes("ROADMAP"), ".gsd/ files excluded from pre-switch auto-commit");
550
- assertTrue(show.includes("feature.ts"), "non-.gsd/ files included in pre-switch auto-commit");
551
-
552
- rmSync(repo, { recursive: true, force: true });
553
- }
554
-
555
- // ─── GitServiceImpl: autoCommit extraExclusions — only .gsd/ dirty ────
556
-
557
- console.log("\n=== GitServiceImpl: autoCommit extraExclusions — only .gsd/ dirty ===");
558
-
559
- {
560
- const repo = initTempRepo();
561
- const svc = new GitServiceImpl(repo);
562
-
563
- // Create only .gsd/ planning files
564
- createFile(repo, ".gsd/milestones/M001/M001-ROADMAP.md", "- [x] S01");
565
- createFile(repo, ".gsd/STATE.md", "state content");
566
-
567
- // Auto-commit with .gsd/ excluded — nothing else to commit
568
- const result = svc.autoCommit("pre-switch", "main", [".gsd/"]);
569
- assertEq(result, null, "autoCommit returns null when only .gsd/ files are dirty and excluded");
570
-
571
- rmSync(repo, { recursive: true, force: true });
572
- }
573
-
574
- // ─── GitServiceImpl: commit returns null when nothing staged ───────────
575
-
576
- console.log("\n=== GitServiceImpl: commit empty ===");
577
-
578
- {
579
- const repo = initTempRepo();
580
- const svc = new GitServiceImpl(repo);
581
-
582
- // Nothing dirty, commit should return null
583
- const result = svc.commit({ message: "should not commit" });
584
- assertEq(result, null, "commit returns null when nothing to stage");
585
-
586
- rmSync(repo, { recursive: true, force: true });
587
- }
588
-
589
- // ─── Helper: create repo for branch tests ────────────────────────────
590
-
591
- function initBranchTestRepo(): string {
592
- const dir = mkdtempSync(join(tmpdir(), "gsd-git-t03-"));
593
- run("git init -b main", dir);
594
- run('git config user.name "Pi Test"', dir);
595
- run('git config user.email "pi@example.com"', dir);
596
- createFile(dir, ".gitkeep", "");
597
- run("git add -A", dir);
598
- run('git commit -m "init"', dir);
599
- return dir;
600
- }
601
-
602
- // ─── getCurrentBranch ────────────────────────────────────────────────
603
-
604
- console.log("\n=== Branch queries ===");
605
-
606
- {
607
- const repo = initBranchTestRepo();
608
- const svc = new GitServiceImpl(repo);
609
-
610
- assertEq(svc.getCurrentBranch(), "main", "getCurrentBranch returns main on main branch");
611
-
612
- run("git checkout -b gsd/M001/S01", repo);
613
- assertEq(svc.getCurrentBranch(), "gsd/M001/S01", "getCurrentBranch returns slice branch name");
614
-
615
- run("git checkout -b feature/foo", repo);
616
- assertEq(svc.getCurrentBranch(), "feature/foo", "getCurrentBranch returns feature branch name");
617
-
618
- rmSync(repo, { recursive: true, force: true });
619
- }
620
-
621
- // ─── getMainBranch ────────────────────────────────────────────────────
622
-
623
- console.log("\n=== getMainBranch ===");
624
-
625
- {
626
- const repo = initBranchTestRepo();
627
- const svc = new GitServiceImpl(repo);
628
-
629
- // Basic case: repo has "main" branch
630
- assertEq(svc.getMainBranch(), "main", "getMainBranch returns main when main exists");
631
-
632
- rmSync(repo, { recursive: true, force: true });
633
- }
634
-
635
- {
636
- // master-only repo
637
- const repo = mkdtempSync(join(tmpdir(), "gsd-git-t03-master-"));
638
- run("git init -b master", repo);
639
- run('git config user.name "Pi Test"', repo);
640
- run('git config user.email "pi@example.com"', repo);
641
- createFile(repo, ".gitkeep", "");
642
- run("git add -A", repo);
643
- run('git commit -m "init"', repo);
644
-
645
- const svc = new GitServiceImpl(repo);
646
- assertEq(svc.getMainBranch(), "master", "getMainBranch returns master when only master exists");
647
-
648
- rmSync(repo, { recursive: true, force: true });
649
- }
650
-
651
- // ═══════════════════════════════════════════════════════════════════════
652
- // S05: Enhanced features — snapshots, pre-merge checks
653
- // ═══════════════════════════════════════════════════════════════════════
654
-
655
- // ─── createSnapshot: prefs enabled ─────────────────────────────────────
656
-
657
- console.log("\n=== createSnapshot: enabled ===");
658
-
659
- {
660
- const repo = initBranchTestRepo();
661
- const svc = new GitServiceImpl(repo, { snapshots: true });
662
-
663
- // Create a branch with a commit
664
- run("git checkout -b gsd/M001/S01", repo);
665
- createFile(repo, "src/snap.ts", "snapshot me");
666
- svc.commit({ message: "snapshot test commit" });
667
-
668
- // Create snapshot ref for this branch
669
- svc.createSnapshot("gsd/M001/S01");
670
-
671
- // Verify ref exists under refs/gsd/snapshots/
672
- const refs = run("git for-each-ref refs/gsd/snapshots/", repo);
673
- assertTrue(refs.includes("refs/gsd/snapshots/gsd/M001/S01/"), "snapshot ref created under refs/gsd/snapshots/");
674
-
675
- rmSync(repo, { recursive: true, force: true });
676
- }
677
-
678
- // ─── createSnapshot: prefs disabled ────────────────────────────────────
679
-
680
- console.log("\n=== createSnapshot: disabled ===");
681
-
682
- {
683
- const repo = initBranchTestRepo();
684
- const svc = new GitServiceImpl(repo, { snapshots: false });
685
-
686
- run("git checkout -b gsd/M001/S01", repo);
687
- createFile(repo, "src/no-snap.ts", "no snapshot");
688
- svc.commit({ message: "no snapshot commit" });
689
-
690
- // createSnapshot should be a no-op when disabled
691
- svc.createSnapshot("gsd/M001/S01");
692
-
693
- const refs = run("git for-each-ref refs/gsd/snapshots/", repo);
694
- assertEq(refs, "", "no snapshot ref created when prefs.snapshots is false");
695
-
696
- rmSync(repo, { recursive: true, force: true });
697
- }
698
-
699
- // ─── runPreMergeCheck: pass ────────────────────────────────────────────
700
-
701
- console.log("\n=== runPreMergeCheck: pass ===");
702
-
703
- {
704
- const repo = initBranchTestRepo();
705
- // Create package.json with passing test script
706
- createFile(repo, "package.json", JSON.stringify({
707
- name: "test-pass",
708
- scripts: { test: 'node -e "process.exit(0)"' },
709
- }));
710
- run("git add -A", repo);
711
- run('git commit -m "add package.json"', repo);
712
-
713
- const svc = new GitServiceImpl(repo, { pre_merge_check: true });
714
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
715
-
716
- assertEq(result.passed, true, "runPreMergeCheck returns passed:true when tests pass");
717
- assertTrue(!result.skipped, "runPreMergeCheck is not skipped when enabled");
718
-
719
- rmSync(repo, { recursive: true, force: true });
720
- }
721
-
722
- // ─── runPreMergeCheck: fail ────────────────────────────────────────────
723
-
724
- console.log("\n=== runPreMergeCheck: fail ===");
725
-
726
- {
727
- const repo = initBranchTestRepo();
728
- // Create package.json with failing test script
729
- createFile(repo, "package.json", JSON.stringify({
730
- name: "test-fail",
731
- scripts: { test: 'node -e "process.exit(1)"' },
732
- }));
733
- run("git add -A", repo);
734
- run('git commit -m "add failing package.json"', repo);
735
-
736
- const svc = new GitServiceImpl(repo, { pre_merge_check: true });
737
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
738
-
739
- assertEq(result.passed, false, "runPreMergeCheck returns passed:false when tests fail");
740
- assertTrue(!result.skipped, "runPreMergeCheck is not skipped when enabled");
741
-
742
- rmSync(repo, { recursive: true, force: true });
743
- }
744
-
745
- // ─── runPreMergeCheck: disabled ────────────────────────────────────────
746
-
747
- console.log("\n=== runPreMergeCheck: disabled ===");
748
-
749
- {
750
- const repo = initBranchTestRepo();
751
- createFile(repo, "package.json", JSON.stringify({
752
- name: "test-disabled",
753
- scripts: { test: 'node -e "process.exit(1)"' },
754
- }));
755
- run("git add -A", repo);
756
- run('git commit -m "add package.json"', repo);
757
-
758
- const svc = new GitServiceImpl(repo, { pre_merge_check: false });
759
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
760
-
761
- assertEq(result.skipped, true, "runPreMergeCheck skipped when pre_merge_check is false");
762
- assertEq(result.passed, true, "runPreMergeCheck returns passed:true when skipped (no block)");
763
-
764
- rmSync(repo, { recursive: true, force: true });
765
- }
766
-
767
- // ─── runPreMergeCheck: custom command ──────────────────────────────────
768
-
769
- console.log("\n=== runPreMergeCheck: custom command ===");
770
-
771
- {
772
- const repo = initBranchTestRepo();
773
- // Custom command string overrides auto-detection
774
- const svc = new GitServiceImpl(repo, { pre_merge_check: 'node -e "process.exit(0)"' });
775
- const result: PreMergeCheckResult = svc.runPreMergeCheck();
776
-
777
- assertEq(result.passed, true, "runPreMergeCheck passes with custom command that exits 0");
778
- assertTrue(!result.skipped, "custom command is not skipped");
779
-
780
- rmSync(repo, { recursive: true, force: true });
781
- }
782
-
783
- // ─── VALID_BRANCH_NAME regex ──────────────────────────────────────────
784
-
785
- console.log("\n=== VALID_BRANCH_NAME regex ===");
786
-
787
- {
788
- // Valid branch names
789
- assertTrue(VALID_BRANCH_NAME.test("main"), "VALID_BRANCH_NAME accepts 'main'");
790
- assertTrue(VALID_BRANCH_NAME.test("master"), "VALID_BRANCH_NAME accepts 'master'");
791
- assertTrue(VALID_BRANCH_NAME.test("develop"), "VALID_BRANCH_NAME accepts 'develop'");
792
- assertTrue(VALID_BRANCH_NAME.test("feature/foo"), "VALID_BRANCH_NAME accepts 'feature/foo'");
793
- assertTrue(VALID_BRANCH_NAME.test("release-1.0"), "VALID_BRANCH_NAME accepts 'release-1.0'");
794
- assertTrue(VALID_BRANCH_NAME.test("my_branch"), "VALID_BRANCH_NAME accepts 'my_branch'");
795
- assertTrue(VALID_BRANCH_NAME.test("v2.0.1"), "VALID_BRANCH_NAME accepts 'v2.0.1'");
796
-
797
- // Invalid / injection attempts
798
- assertTrue(!VALID_BRANCH_NAME.test("main; rm -rf /"), "VALID_BRANCH_NAME rejects shell injection");
799
- assertTrue(!VALID_BRANCH_NAME.test("main && echo pwned"), "VALID_BRANCH_NAME rejects && injection");
800
- assertTrue(!VALID_BRANCH_NAME.test(""), "VALID_BRANCH_NAME rejects empty string");
801
- assertTrue(!VALID_BRANCH_NAME.test("branch name"), "VALID_BRANCH_NAME rejects spaces");
802
- assertTrue(!VALID_BRANCH_NAME.test("branch`cmd`"), "VALID_BRANCH_NAME rejects backticks");
803
- assertTrue(!VALID_BRANCH_NAME.test("branch$(cmd)"), "VALID_BRANCH_NAME rejects $() subshell");
804
- }
805
-
806
- // ─── getMainBranch: configured main_branch preference ──────────────────
807
-
808
- console.log("\n=== getMainBranch: configured main_branch ===");
809
-
810
- {
811
- const repo = initBranchTestRepo();
812
- const svc = new GitServiceImpl(repo, { main_branch: "trunk" });
813
-
814
- assertEq(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
- console.log("\n=== getMainBranch: fallback to auto-detection ===");
822
-
823
- {
824
- const repo = initBranchTestRepo();
825
- const svc = new GitServiceImpl(repo, {});
826
-
827
- assertEq(svc.getMainBranch(), "main", "getMainBranch falls back to auto-detection when main_branch not set");
828
-
829
- rmSync(repo, { recursive: true, force: true });
830
- }
831
-
832
- // ─── getMainBranch: ignores invalid branch names ───────────────────────
833
-
834
- console.log("\n=== getMainBranch: ignores invalid branch name ===");
835
-
836
- {
837
- const repo = initBranchTestRepo();
838
- const svc = new GitServiceImpl(repo, { main_branch: "main; rm -rf /" });
839
-
840
- assertEq(svc.getMainBranch(), "main", "getMainBranch ignores invalid branch name and falls back to auto-detection");
841
-
842
- rmSync(repo, { recursive: true, force: true });
843
- }
844
-
845
- // ─── PreMergeCheckResult type export compile check ─────────────────────
846
-
847
- console.log("\n=== PreMergeCheckResult type export ===");
848
-
849
- {
850
- const _checkResult: PreMergeCheckResult = { passed: true, skipped: false };
851
- assertTrue(true, "PreMergeCheckResult type exported and usable");
852
- }
853
-
854
- // ═══════════════════════════════════════════════════════════════════════
855
- // Integration branch — feature-branch workflow support
856
- // ═══════════════════════════════════════════════════════════════════════
857
-
858
- // ─── writeIntegrationBranch / readIntegrationBranch: round-trip ────────
859
-
860
- console.log("\n=== Integration branch: write and read ===");
861
-
862
- {
863
- const repo = initBranchTestRepo();
864
-
865
- // Initially no integration branch
866
- assertEq(readIntegrationBranch(repo, "M001"), null, "readIntegrationBranch returns null when no metadata");
867
-
868
- // Write integration branch
869
- writeIntegrationBranch(repo, "M001", "f-123-new-thing");
870
- assertEq(readIntegrationBranch(repo, "M001"), "f-123-new-thing", "readIntegrationBranch returns written branch");
871
-
872
- rmSync(repo, { recursive: true, force: true });
873
- }
874
-
875
- // ─── writeIntegrationBranch: updates when branch changes (#300) ──────
876
-
877
- console.log("\n=== Integration branch: updates on branch change ===");
878
-
879
- {
880
- const repo = initBranchTestRepo();
881
-
882
- writeIntegrationBranch(repo, "M001", "f-123-first");
883
- writeIntegrationBranch(repo, "M001", "f-456-second"); // updates to new branch (#300)
884
-
885
- assertEq(readIntegrationBranch(repo, "M001"), "f-456-second", "second write updates integration branch to new value");
886
-
887
- rmSync(repo, { recursive: true, force: true });
888
- }
889
-
890
- // ─── writeIntegrationBranch: same branch is idempotent ─────────────────
891
-
892
- console.log("\n=== Integration branch: same branch is idempotent ===");
893
-
894
- {
895
- const repo = initBranchTestRepo();
896
-
897
- writeIntegrationBranch(repo, "M001", "f-123-first");
898
- writeIntegrationBranch(repo, "M001", "f-123-first"); // same branch — no-op
899
-
900
- assertEq(readIntegrationBranch(repo, "M001"), "f-123-first", "same branch write is idempotent");
901
-
902
- rmSync(repo, { recursive: true, force: true });
903
- }
904
-
905
- // ─── writeIntegrationBranch: rejects slice branches ───────────────────
906
-
907
- console.log("\n=== Integration branch: rejects slice branches ===");
908
-
909
- {
910
- const repo = initBranchTestRepo();
911
-
912
- writeIntegrationBranch(repo, "M001", "gsd/M001/S01");
913
- assertEq(readIntegrationBranch(repo, "M001"), null, "slice branches are not recorded as integration branch");
914
-
915
- rmSync(repo, { recursive: true, force: true });
916
- }
917
-
918
- // ─── writeIntegrationBranch: rejects invalid branch names ─────────────
919
-
920
- console.log("\n=== Integration branch: rejects invalid names ===");
921
-
922
- {
923
- const repo = initBranchTestRepo();
924
-
925
- writeIntegrationBranch(repo, "M001", "bad; rm -rf /");
926
- assertEq(readIntegrationBranch(repo, "M001"), null, "invalid branch name is not recorded");
927
-
928
- rmSync(repo, { recursive: true, force: true });
929
- }
930
-
931
- // ─── getMainBranch: uses integration branch when milestone set ────────
932
-
933
- console.log("\n=== getMainBranch: integration branch from milestone metadata ===");
934
-
935
- {
936
- const repo = initBranchTestRepo();
937
-
938
- // Create a feature branch
939
- run("git checkout -b f-123-feature", repo);
940
- run("git checkout main", repo);
941
-
942
- // Write integration branch metadata
943
- writeIntegrationBranch(repo, "M001", "f-123-feature");
944
-
945
- // Without milestone set, getMainBranch returns "main"
946
- const svc = new GitServiceImpl(repo);
947
- assertEq(svc.getMainBranch(), "main", "getMainBranch returns main when no milestone set");
948
-
949
- // With milestone set, getMainBranch returns the integration branch
950
- svc.setMilestoneId("M001");
951
- assertEq(svc.getMainBranch(), "f-123-feature", "getMainBranch returns integration branch when milestone set");
952
-
953
- rmSync(repo, { recursive: true, force: true });
954
- }
955
-
956
- // ─── getMainBranch: main_branch pref still takes priority ─────────────
957
-
958
- console.log("\n=== getMainBranch: main_branch pref overrides integration branch ===");
959
-
960
- {
961
- const repo = initBranchTestRepo();
962
-
963
- run("git checkout -b f-123-feature", repo);
964
- run("git checkout -b trunk", repo);
965
- run("git checkout main", repo);
966
-
967
- writeIntegrationBranch(repo, "M001", "f-123-feature");
968
-
969
- // Explicit preference still wins
970
- const svc = new GitServiceImpl(repo, { main_branch: "trunk" });
971
- svc.setMilestoneId("M001");
972
- assertEq(svc.getMainBranch(), "trunk", "main_branch preference overrides integration branch");
973
-
974
- rmSync(repo, { recursive: true, force: true });
975
- }
976
-
977
- // ─── getMainBranch: falls back when integration branch deleted ────────
978
-
979
- console.log("\n=== getMainBranch: fallback when integration branch deleted ===");
980
-
981
- {
982
- const repo = initBranchTestRepo();
983
-
984
- // Write metadata pointing to a branch that doesn't exist
985
- writeIntegrationBranch(repo, "M001", "deleted-branch");
986
-
987
- const svc = new GitServiceImpl(repo);
988
- svc.setMilestoneId("M001");
989
- assertEq(svc.getMainBranch(), "main", "getMainBranch falls back to main when integration branch no longer exists");
990
-
991
- rmSync(repo, { recursive: true, force: true });
992
- }
993
-
994
- // ─── Per-milestone isolation: different milestones, different targets ──
995
-
996
- console.log("\n=== Integration branch: per-milestone isolation ===");
997
-
998
- {
999
- const repo = initBranchTestRepo();
1000
-
1001
- run("git checkout -b feature-a", repo);
1002
- run("git checkout -b feature-b", repo);
1003
- run("git checkout main", repo);
1004
-
1005
- writeIntegrationBranch(repo, "M001", "feature-a");
1006
- writeIntegrationBranch(repo, "M002", "feature-b");
1007
-
1008
- const svc = new GitServiceImpl(repo);
1009
-
1010
- svc.setMilestoneId("M001");
1011
- assertEq(svc.getMainBranch(), "feature-a", "M001 integration branch is feature-a");
1012
-
1013
- svc.setMilestoneId("M002");
1014
- assertEq(svc.getMainBranch(), "feature-b", "M002 integration branch is feature-b");
1015
-
1016
- svc.setMilestoneId(null);
1017
- assertEq(svc.getMainBranch(), "main", "no milestone set → falls back to main");
1018
-
1019
- rmSync(repo, { recursive: true, force: true });
1020
- }
1021
-
1022
- // ─── Backward compatibility: no metadata → existing behavior ──────────
1023
-
1024
- console.log("\n=== Integration branch: backward compat ===");
1025
-
1026
- {
1027
- const repo = initBranchTestRepo();
1028
- const svc = new GitServiceImpl(repo);
1029
-
1030
- // Set milestone but no metadata file exists
1031
- svc.setMilestoneId("M001");
1032
- assertEq(svc.getMainBranch(), "main", "backward compat: no metadata file → falls back to main");
1033
-
1034
- rmSync(repo, { recursive: true, force: true });
1035
- }
1036
-
1037
- // ─── untrackRuntimeFiles: removes tracked runtime files from index ───
1038
-
1039
- console.log("\n=== untrackRuntimeFiles ===");
1040
-
1041
- {
1042
- const { untrackRuntimeFiles } = await import("../gitignore.ts");
1043
- const repo = mkdtempSync(join(tmpdir(), "gsd-untrack-"));
1044
- run("git init -b main", repo);
1045
- run("git config user.email test@test.com", repo);
1046
- run("git config user.name Test", repo);
1047
-
1048
- // Create and track runtime files (simulates pre-.gitignore state)
1049
- mkdirSync(join(repo, ".gsd", "activity"), { recursive: true });
1050
- mkdirSync(join(repo, ".gsd", "runtime"), { recursive: true });
1051
- writeFileSync(join(repo, ".gsd", "completed-units.json"), '["u1"]');
1052
- writeFileSync(join(repo, ".gsd", "metrics.json"), '{}');
1053
- writeFileSync(join(repo, ".gsd", "STATE.md"), "# State");
1054
- writeFileSync(join(repo, ".gsd", "activity", "log.jsonl"), "{}");
1055
- writeFileSync(join(repo, ".gsd", "runtime", "data.json"), "{}");
1056
- writeFileSync(join(repo, "src.ts"), "code");
1057
- run("git add -A", repo);
1058
- run("git commit -m init", repo);
1059
-
1060
- // Precondition: runtime files are tracked
1061
- const trackedBefore = run("git ls-files .gsd/", repo);
1062
- assertTrue(trackedBefore.includes("completed-units.json"), "untrack: precondition — completed-units tracked");
1063
- assertTrue(trackedBefore.includes("metrics.json"), "untrack: precondition — metrics tracked");
1064
-
1065
- // Run untrackRuntimeFiles
1066
- untrackRuntimeFiles(repo);
1067
-
1068
- // Runtime files should be removed from the index
1069
- const trackedAfter = run("git ls-files .gsd/", repo);
1070
- assertEq(trackedAfter, "", "untrack: all runtime files removed from index");
1071
-
1072
- // Non-runtime files remain tracked
1073
- const srcTracked = run("git ls-files src.ts", repo);
1074
- assertTrue(srcTracked.includes("src.ts"), "untrack: non-runtime files remain tracked");
1075
-
1076
- // Files still exist on disk
1077
- assertTrue(existsSync(join(repo, ".gsd", "completed-units.json")),
1078
- "untrack: completed-units.json still on disk");
1079
- assertTrue(existsSync(join(repo, ".gsd", "metrics.json")),
1080
- "untrack: metrics.json still on disk");
1081
-
1082
- // Idempotent — running again doesn't error
1083
- untrackRuntimeFiles(repo);
1084
- assertTrue(true, "untrack: second call is idempotent (no error)");
1085
-
1086
- rmSync(repo, { recursive: true, force: true });
1087
- }
1088
-
1089
- // ─── smartStage always excludes .gsd/ ──────────────────────────────
1090
-
1091
- console.log("\n=== smartStage always excludes .gsd/ ===");
1092
-
1093
- {
1094
- const repo = mkdtempSync(join(tmpdir(), "gsd-smart-stage-excludes-"));
1095
- run("git init -b main", repo);
1096
- run("git config user.email test@test.com", repo);
1097
- run("git config user.name Test", repo);
1098
- writeFileSync(join(repo, "README.md"), "init");
1099
- run("git add -A && git commit -m init", repo);
1100
-
1101
- // Create .gsd/ planning files + a normal source file
1102
- mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
1103
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "ROADMAP.md"), "# Roadmap");
1104
- writeFileSync(join(repo, ".gsd", "preferences.md"), "---\nversion: 1\n---");
1105
- writeFileSync(join(repo, "src.ts"), "const x = 1;");
1106
-
1107
- // smartStage always excludes .gsd/ — state is managed externally
1108
- const svc = new GitServiceImpl(repo);
1109
- const msg = svc.commit({ message: "test commit" });
1110
- assertTrue(msg !== null, "smartStage: commit succeeds with non-.gsd files");
1111
-
1112
- // .gsd/ files should NOT be in the commit
1113
- const committed = run("git show --name-only HEAD", repo);
1114
- assertTrue(!committed.includes(".gsd/"), "smartStage: .gsd/ files not in commit");
1115
- assertTrue(committed.includes("src.ts"), "smartStage: source files ARE in commit");
1116
-
1117
- rmSync(repo, { recursive: true, force: true });
1118
- }
1119
-
1120
- // ─── writeIntegrationBranch: no commit (metadata in external storage) ──
1121
-
1122
- console.log("\n=== writeIntegrationBranch: no commit ===");
1123
-
1124
- {
1125
- const repo = initBranchTestRepo();
1126
- const commitsBefore = run("git rev-list --count HEAD", repo);
1127
-
1128
- writeIntegrationBranch(repo, "M001", "f-123-new-thing");
1129
-
1130
- // File should still be written to disk
1131
- assertEq(readIntegrationBranch(repo, "M001"), "f-123-new-thing",
1132
- "writeIntegrationBranch: metadata file exists on disk");
1133
-
1134
- // No commit — .gsd/ is managed externally
1135
- const commitsAfter = run("git rev-list --count HEAD", repo);
1136
- assertEq(commitsBefore, commitsAfter,
1137
- "writeIntegrationBranch: no git commit created for integration branch");
1138
-
1139
- rmSync(repo, { recursive: true, force: true });
1140
- }
1141
-
1142
- // ─── ensureGitignore: always adds .gsd to gitignore ──────────────────
1143
-
1144
- console.log("\n=== ensureGitignore: adds .gsd entry ===");
1145
-
1146
- {
1147
- const { ensureGitignore } = await import("../gitignore.ts");
1148
- const repo = mkdtempSync(join(tmpdir(), "gsd-gitignore-external-state-"));
1149
-
1150
- // Should add .gsd to gitignore (external state dir is a symlink)
1151
- const modified = ensureGitignore(repo);
1152
- assertTrue(modified, "ensureGitignore: gitignore was modified");
1153
-
1154
- const { readFileSync } = await import("node:fs");
1155
- const content = readFileSync(join(repo, ".gitignore"), "utf-8");
1156
- const lines = content.split("\n").map(l => l.trim()).filter(l => l && !l.startsWith("#"));
1157
- assertTrue(lines.includes(".gsd"), "ensureGitignore: .gitignore contains .gsd");
1158
-
1159
- // Idempotent — calling again doesn't add duplicates
1160
- const modified2 = ensureGitignore(repo);
1161
- assertTrue(!modified2, "ensureGitignore: second call is idempotent");
1162
-
1163
- rmSync(repo, { recursive: true, force: true });
1164
- }
1165
-
1166
- report();
1167
- }
1168
-
1169
- main().catch((error) => {
1170
- console.error(error);
1171
- process.exit(1);
1172
- });