@camaradesuk/git-worktree-tools 1.10.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +4 -4
  2. package/dist/lib/config.d.ts +2 -1
  3. package/dist/lib/config.d.ts.map +1 -1
  4. package/dist/lib/config.js +11 -0
  5. package/dist/lib/config.js.map +1 -1
  6. package/package.json +12 -3
  7. package/schemas/worktreerc.schema.json +1 -1
  8. package/dist/api/list.test.d.ts +0 -5
  9. package/dist/api/list.test.d.ts.map +0 -1
  10. package/dist/api/list.test.js +0 -390
  11. package/dist/api/list.test.js.map +0 -1
  12. package/dist/cli/cleanpr.test.d.ts +0 -2
  13. package/dist/cli/cleanpr.test.d.ts.map +0 -1
  14. package/dist/cli/cleanpr.test.js +0 -954
  15. package/dist/cli/cleanpr.test.js.map +0 -1
  16. package/dist/cli/lswt.test.d.ts +0 -2
  17. package/dist/cli/lswt.test.d.ts.map +0 -1
  18. package/dist/cli/lswt.test.js +0 -376
  19. package/dist/cli/lswt.test.js.map +0 -1
  20. package/dist/cli/newpr.test.d.ts +0 -2
  21. package/dist/cli/newpr.test.d.ts.map +0 -1
  22. package/dist/cli/newpr.test.js +0 -1182
  23. package/dist/cli/newpr.test.js.map +0 -1
  24. package/dist/cli/prs.test.d.ts +0 -8
  25. package/dist/cli/prs.test.d.ts.map +0 -1
  26. package/dist/cli/prs.test.js +0 -463
  27. package/dist/cli/prs.test.js.map +0 -1
  28. package/dist/cli/wt/clean.test.d.ts +0 -8
  29. package/dist/cli/wt/clean.test.d.ts.map +0 -1
  30. package/dist/cli/wt/clean.test.js +0 -624
  31. package/dist/cli/wt/clean.test.js.map +0 -1
  32. package/dist/cli/wt/completion.test.d.ts +0 -5
  33. package/dist/cli/wt/completion.test.d.ts.map +0 -1
  34. package/dist/cli/wt/completion.test.js +0 -275
  35. package/dist/cli/wt/completion.test.js.map +0 -1
  36. package/dist/cli/wt/config.test.d.ts +0 -7
  37. package/dist/cli/wt/config.test.d.ts.map +0 -1
  38. package/dist/cli/wt/config.test.js +0 -440
  39. package/dist/cli/wt/config.test.js.map +0 -1
  40. package/dist/cli/wt/entry.test.d.ts +0 -8
  41. package/dist/cli/wt/entry.test.d.ts.map +0 -1
  42. package/dist/cli/wt/entry.test.js +0 -201
  43. package/dist/cli/wt/entry.test.js.map +0 -1
  44. package/dist/cli/wt/init.test.d.ts +0 -5
  45. package/dist/cli/wt/init.test.d.ts.map +0 -1
  46. package/dist/cli/wt/init.test.js +0 -165
  47. package/dist/cli/wt/init.test.js.map +0 -1
  48. package/dist/cli/wt/init.unit.test.d.ts +0 -5
  49. package/dist/cli/wt/init.unit.test.d.ts.map +0 -1
  50. package/dist/cli/wt/init.unit.test.js +0 -432
  51. package/dist/cli/wt/init.unit.test.js.map +0 -1
  52. package/dist/cli/wt/interactive-menu.test.d.ts +0 -12
  53. package/dist/cli/wt/interactive-menu.test.d.ts.map +0 -1
  54. package/dist/cli/wt/interactive-menu.test.js +0 -796
  55. package/dist/cli/wt/interactive-menu.test.js.map +0 -1
  56. package/dist/cli/wt/list.test.d.ts +0 -10
  57. package/dist/cli/wt/list.test.d.ts.map +0 -1
  58. package/dist/cli/wt/list.test.js +0 -157
  59. package/dist/cli/wt/list.test.js.map +0 -1
  60. package/dist/cli/wt/prs.test.d.ts +0 -5
  61. package/dist/cli/wt/prs.test.d.ts.map +0 -1
  62. package/dist/cli/wt/prs.test.js +0 -410
  63. package/dist/cli/wt/prs.test.js.map +0 -1
  64. package/dist/cli/wt/run-command.test.d.ts +0 -5
  65. package/dist/cli/wt/run-command.test.d.ts.map +0 -1
  66. package/dist/cli/wt/run-command.test.js +0 -88
  67. package/dist/cli/wt/run-command.test.js.map +0 -1
  68. package/dist/cli/wt/state.test.d.ts +0 -9
  69. package/dist/cli/wt/state.test.d.ts.map +0 -1
  70. package/dist/cli/wt/state.test.js +0 -127
  71. package/dist/cli/wt/state.test.js.map +0 -1
  72. package/dist/cli/wt/wt.test.d.ts +0 -8
  73. package/dist/cli/wt/wt.test.d.ts.map +0 -1
  74. package/dist/cli/wt/wt.test.js +0 -739
  75. package/dist/cli/wt/wt.test.js.map +0 -1
  76. package/dist/cli/wt.unit.test.d.ts +0 -7
  77. package/dist/cli/wt.unit.test.d.ts.map +0 -1
  78. package/dist/cli/wt.unit.test.js +0 -160
  79. package/dist/cli/wt.unit.test.js.map +0 -1
  80. package/dist/cli/wtconfig.test.d.ts +0 -5
  81. package/dist/cli/wtconfig.test.d.ts.map +0 -1
  82. package/dist/cli/wtconfig.test.js +0 -1289
  83. package/dist/cli/wtconfig.test.js.map +0 -1
  84. package/dist/cli/wtlink.test.d.ts +0 -2
  85. package/dist/cli/wtlink.test.d.ts.map +0 -1
  86. package/dist/cli/wtlink.test.js +0 -249
  87. package/dist/cli/wtlink.test.js.map +0 -1
  88. package/dist/cli/wtstate.test.d.ts +0 -5
  89. package/dist/cli/wtstate.test.d.ts.map +0 -1
  90. package/dist/cli/wtstate.test.js +0 -193
  91. package/dist/cli/wtstate.test.js.map +0 -1
  92. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +0 -2
  93. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +0 -1
  94. package/dist/e2e/cleanpr/cleanpr.e2e.test.js +0 -326
  95. package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +0 -1
  96. package/dist/e2e/cli.e2e.test.d.ts +0 -2
  97. package/dist/e2e/cli.e2e.test.d.ts.map +0 -1
  98. package/dist/e2e/cli.e2e.test.js +0 -417
  99. package/dist/e2e/cli.e2e.test.js.map +0 -1
  100. package/dist/e2e/lswt/lswt.e2e.test.d.ts +0 -2
  101. package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +0 -1
  102. package/dist/e2e/lswt/lswt.e2e.test.js +0 -361
  103. package/dist/e2e/lswt/lswt.e2e.test.js.map +0 -1
  104. package/dist/e2e/newpr/newpr.e2e.test.d.ts +0 -2
  105. package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +0 -1
  106. package/dist/e2e/newpr/newpr.e2e.test.js +0 -286
  107. package/dist/e2e/newpr/newpr.e2e.test.js.map +0 -1
  108. package/dist/e2e/newpr/scenarios.e2e.test.d.ts +0 -2
  109. package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +0 -1
  110. package/dist/e2e/newpr/scenarios.e2e.test.js +0 -426
  111. package/dist/e2e/newpr/scenarios.e2e.test.js.map +0 -1
  112. package/dist/e2e/newpr-full-flow.e2e.test.d.ts +0 -2
  113. package/dist/e2e/newpr-full-flow.e2e.test.d.ts.map +0 -1
  114. package/dist/e2e/newpr-full-flow.e2e.test.js +0 -280
  115. package/dist/e2e/newpr-full-flow.e2e.test.js.map +0 -1
  116. package/dist/e2e/prs/prs.e2e.test.d.ts +0 -7
  117. package/dist/e2e/prs/prs.e2e.test.d.ts.map +0 -1
  118. package/dist/e2e/prs/prs.e2e.test.js +0 -606
  119. package/dist/e2e/prs/prs.e2e.test.js.map +0 -1
  120. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +0 -2
  121. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +0 -1
  122. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +0 -298
  123. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +0 -1
  124. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts +0 -8
  125. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts.map +0 -1
  126. package/dist/e2e/wt/interactive-menu.e2e.test.js +0 -583
  127. package/dist/e2e/wt/interactive-menu.e2e.test.js.map +0 -1
  128. package/dist/e2e/wt/wt.e2e.test.d.ts +0 -9
  129. package/dist/e2e/wt/wt.e2e.test.d.ts.map +0 -1
  130. package/dist/e2e/wt/wt.e2e.test.js +0 -597
  131. package/dist/e2e/wt/wt.e2e.test.js.map +0 -1
  132. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +0 -2
  133. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +0 -1
  134. package/dist/e2e/wtlink/wtlink.e2e.test.js +0 -416
  135. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +0 -1
  136. package/dist/integration/git.integration.test.d.ts +0 -2
  137. package/dist/integration/git.integration.test.d.ts.map +0 -1
  138. package/dist/integration/git.integration.test.js +0 -336
  139. package/dist/integration/git.integration.test.js.map +0 -1
  140. package/dist/integration/lswt-remote-pr.integration.test.d.ts +0 -2
  141. package/dist/integration/lswt-remote-pr.integration.test.d.ts.map +0 -1
  142. package/dist/integration/lswt-remote-pr.integration.test.js +0 -222
  143. package/dist/integration/lswt-remote-pr.integration.test.js.map +0 -1
  144. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts +0 -2
  145. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts.map +0 -1
  146. package/dist/integration/newpr-branchfrom-head.integration.test.js +0 -498
  147. package/dist/integration/newpr-branchfrom-head.integration.test.js.map +0 -1
  148. package/dist/integration/newpr.integration.test.d.ts +0 -2
  149. package/dist/integration/newpr.integration.test.d.ts.map +0 -1
  150. package/dist/integration/newpr.integration.test.js +0 -460
  151. package/dist/integration/newpr.integration.test.js.map +0 -1
  152. package/dist/integration/prs.integration.test.d.ts +0 -8
  153. package/dist/integration/prs.integration.test.d.ts.map +0 -1
  154. package/dist/integration/prs.integration.test.js +0 -478
  155. package/dist/integration/prs.integration.test.js.map +0 -1
  156. package/dist/lib/ai/base-provider.test.d.ts +0 -7
  157. package/dist/lib/ai/base-provider.test.d.ts.map +0 -1
  158. package/dist/lib/ai/base-provider.test.js +0 -319
  159. package/dist/lib/ai/base-provider.test.js.map +0 -1
  160. package/dist/lib/ai/cli-provider.test.d.ts +0 -5
  161. package/dist/lib/ai/cli-provider.test.d.ts.map +0 -1
  162. package/dist/lib/ai/cli-provider.test.js +0 -460
  163. package/dist/lib/ai/cli-provider.test.js.map +0 -1
  164. package/dist/lib/ai/fallback-provider.test.d.ts +0 -7
  165. package/dist/lib/ai/fallback-provider.test.d.ts.map +0 -1
  166. package/dist/lib/ai/fallback-provider.test.js +0 -165
  167. package/dist/lib/ai/fallback-provider.test.js.map +0 -1
  168. package/dist/lib/ai/generation-service.test.d.ts +0 -7
  169. package/dist/lib/ai/generation-service.test.d.ts.map +0 -1
  170. package/dist/lib/ai/generation-service.test.js +0 -213
  171. package/dist/lib/ai/generation-service.test.js.map +0 -1
  172. package/dist/lib/ai/provider-manager.test.d.ts +0 -5
  173. package/dist/lib/ai/provider-manager.test.d.ts.map +0 -1
  174. package/dist/lib/ai/provider-manager.test.js +0 -312
  175. package/dist/lib/ai/provider-manager.test.js.map +0 -1
  176. package/dist/lib/ai/repo-docs.test.d.ts +0 -5
  177. package/dist/lib/ai/repo-docs.test.d.ts.map +0 -1
  178. package/dist/lib/ai/repo-docs.test.js +0 -357
  179. package/dist/lib/ai/repo-docs.test.js.map +0 -1
  180. package/dist/lib/cleanpr/args.test.d.ts +0 -2
  181. package/dist/lib/cleanpr/args.test.d.ts.map +0 -1
  182. package/dist/lib/cleanpr/args.test.js +0 -269
  183. package/dist/lib/cleanpr/args.test.js.map +0 -1
  184. package/dist/lib/cleanpr/cleanup.test.d.ts +0 -2
  185. package/dist/lib/cleanpr/cleanup.test.d.ts.map +0 -1
  186. package/dist/lib/cleanpr/cleanup.test.js +0 -296
  187. package/dist/lib/cleanpr/cleanup.test.js.map +0 -1
  188. package/dist/lib/cleanpr/worktree-info.test.d.ts +0 -2
  189. package/dist/lib/cleanpr/worktree-info.test.d.ts.map +0 -1
  190. package/dist/lib/cleanpr/worktree-info.test.js +0 -228
  191. package/dist/lib/cleanpr/worktree-info.test.js.map +0 -1
  192. package/dist/lib/colors.test.d.ts +0 -2
  193. package/dist/lib/colors.test.d.ts.map +0 -1
  194. package/dist/lib/colors.test.js +0 -142
  195. package/dist/lib/colors.test.js.map +0 -1
  196. package/dist/lib/config-editor.test.d.ts +0 -11
  197. package/dist/lib/config-editor.test.d.ts.map +0 -1
  198. package/dist/lib/config-editor.test.js +0 -526
  199. package/dist/lib/config-editor.test.js.map +0 -1
  200. package/dist/lib/config-migration/detector.test.d.ts +0 -5
  201. package/dist/lib/config-migration/detector.test.d.ts.map +0 -1
  202. package/dist/lib/config-migration/detector.test.js +0 -201
  203. package/dist/lib/config-migration/detector.test.js.map +0 -1
  204. package/dist/lib/config-migration/reporter.test.d.ts +0 -5
  205. package/dist/lib/config-migration/reporter.test.d.ts.map +0 -1
  206. package/dist/lib/config-migration/reporter.test.js +0 -305
  207. package/dist/lib/config-migration/reporter.test.js.map +0 -1
  208. package/dist/lib/config-migration/runner.test.d.ts +0 -5
  209. package/dist/lib/config-migration/runner.test.d.ts.map +0 -1
  210. package/dist/lib/config-migration/runner.test.js +0 -235
  211. package/dist/lib/config-migration/runner.test.js.map +0 -1
  212. package/dist/lib/config-validation.test.d.ts +0 -5
  213. package/dist/lib/config-validation.test.d.ts.map +0 -1
  214. package/dist/lib/config-validation.test.js +0 -423
  215. package/dist/lib/config-validation.test.js.map +0 -1
  216. package/dist/lib/config.test.d.ts +0 -2
  217. package/dist/lib/config.test.d.ts.map +0 -1
  218. package/dist/lib/config.test.js +0 -554
  219. package/dist/lib/config.test.js.map +0 -1
  220. package/dist/lib/constants.test.d.ts +0 -5
  221. package/dist/lib/constants.test.d.ts.map +0 -1
  222. package/dist/lib/constants.test.js +0 -180
  223. package/dist/lib/constants.test.js.map +0 -1
  224. package/dist/lib/deprecation.test.d.ts +0 -2
  225. package/dist/lib/deprecation.test.d.ts.map +0 -1
  226. package/dist/lib/deprecation.test.js +0 -71
  227. package/dist/lib/deprecation.test.js.map +0 -1
  228. package/dist/lib/errors.test.d.ts +0 -2
  229. package/dist/lib/errors.test.d.ts.map +0 -1
  230. package/dist/lib/errors.test.js +0 -117
  231. package/dist/lib/errors.test.js.map +0 -1
  232. package/dist/lib/git.test.d.ts +0 -2
  233. package/dist/lib/git.test.d.ts.map +0 -1
  234. package/dist/lib/git.test.js +0 -608
  235. package/dist/lib/git.test.js.map +0 -1
  236. package/dist/lib/github.test.d.ts +0 -2
  237. package/dist/lib/github.test.d.ts.map +0 -1
  238. package/dist/lib/github.test.js +0 -441
  239. package/dist/lib/github.test.js.map +0 -1
  240. package/dist/lib/global-check.test.d.ts +0 -5
  241. package/dist/lib/global-check.test.d.ts.map +0 -1
  242. package/dist/lib/global-check.test.js +0 -150
  243. package/dist/lib/global-check.test.js.map +0 -1
  244. package/dist/lib/global-config.test.d.ts +0 -5
  245. package/dist/lib/global-config.test.d.ts.map +0 -1
  246. package/dist/lib/global-config.test.js +0 -282
  247. package/dist/lib/global-config.test.js.map +0 -1
  248. package/dist/lib/hooks/confirmation.test.d.ts +0 -7
  249. package/dist/lib/hooks/confirmation.test.d.ts.map +0 -1
  250. package/dist/lib/hooks/confirmation.test.js +0 -300
  251. package/dist/lib/hooks/confirmation.test.js.map +0 -1
  252. package/dist/lib/hooks/executor.test.d.ts +0 -5
  253. package/dist/lib/hooks/executor.test.d.ts.map +0 -1
  254. package/dist/lib/hooks/executor.test.js +0 -648
  255. package/dist/lib/hooks/executor.test.js.map +0 -1
  256. package/dist/lib/hooks/templates.test.d.ts +0 -5
  257. package/dist/lib/hooks/templates.test.d.ts.map +0 -1
  258. package/dist/lib/hooks/templates.test.js +0 -163
  259. package/dist/lib/hooks/templates.test.js.map +0 -1
  260. package/dist/lib/hooks/types.test.d.ts +0 -5
  261. package/dist/lib/hooks/types.test.d.ts.map +0 -1
  262. package/dist/lib/hooks/types.test.js +0 -132
  263. package/dist/lib/hooks/types.test.js.map +0 -1
  264. package/dist/lib/json-output.test.d.ts +0 -5
  265. package/dist/lib/json-output.test.d.ts.map +0 -1
  266. package/dist/lib/json-output.test.js +0 -261
  267. package/dist/lib/json-output.test.js.map +0 -1
  268. package/dist/lib/logger.test.d.ts +0 -14
  269. package/dist/lib/logger.test.d.ts.map +0 -1
  270. package/dist/lib/logger.test.js +0 -692
  271. package/dist/lib/logger.test.js.map +0 -1
  272. package/dist/lib/lswt/action-executors.test.d.ts +0 -2
  273. package/dist/lib/lswt/action-executors.test.d.ts.map +0 -1
  274. package/dist/lib/lswt/action-executors.test.js +0 -1127
  275. package/dist/lib/lswt/action-executors.test.js.map +0 -1
  276. package/dist/lib/lswt/actions.test.d.ts +0 -2
  277. package/dist/lib/lswt/actions.test.d.ts.map +0 -1
  278. package/dist/lib/lswt/actions.test.js +0 -497
  279. package/dist/lib/lswt/actions.test.js.map +0 -1
  280. package/dist/lib/lswt/args.test.d.ts +0 -2
  281. package/dist/lib/lswt/args.test.d.ts.map +0 -1
  282. package/dist/lib/lswt/args.test.js +0 -195
  283. package/dist/lib/lswt/args.test.js.map +0 -1
  284. package/dist/lib/lswt/environment.test.d.ts +0 -2
  285. package/dist/lib/lswt/environment.test.d.ts.map +0 -1
  286. package/dist/lib/lswt/environment.test.js +0 -544
  287. package/dist/lib/lswt/environment.test.js.map +0 -1
  288. package/dist/lib/lswt/formatters.test.d.ts +0 -2
  289. package/dist/lib/lswt/formatters.test.d.ts.map +0 -1
  290. package/dist/lib/lswt/formatters.test.js +0 -323
  291. package/dist/lib/lswt/formatters.test.js.map +0 -1
  292. package/dist/lib/lswt/fuzzy-search.test.d.ts +0 -5
  293. package/dist/lib/lswt/fuzzy-search.test.d.ts.map +0 -1
  294. package/dist/lib/lswt/fuzzy-search.test.js +0 -207
  295. package/dist/lib/lswt/fuzzy-search.test.js.map +0 -1
  296. package/dist/lib/lswt/interactive.test.d.ts +0 -2
  297. package/dist/lib/lswt/interactive.test.d.ts.map +0 -1
  298. package/dist/lib/lswt/interactive.test.js +0 -771
  299. package/dist/lib/lswt/interactive.test.js.map +0 -1
  300. package/dist/lib/lswt/table.test.d.ts +0 -5
  301. package/dist/lib/lswt/table.test.d.ts.map +0 -1
  302. package/dist/lib/lswt/table.test.js +0 -262
  303. package/dist/lib/lswt/table.test.js.map +0 -1
  304. package/dist/lib/lswt/worktree-info.test.d.ts +0 -2
  305. package/dist/lib/lswt/worktree-info.test.d.ts.map +0 -1
  306. package/dist/lib/lswt/worktree-info.test.js +0 -484
  307. package/dist/lib/lswt/worktree-info.test.js.map +0 -1
  308. package/dist/lib/newpr/action-deps.test.d.ts +0 -5
  309. package/dist/lib/newpr/action-deps.test.d.ts.map +0 -1
  310. package/dist/lib/newpr/action-deps.test.js +0 -111
  311. package/dist/lib/newpr/action-deps.test.js.map +0 -1
  312. package/dist/lib/newpr/actions.test.d.ts +0 -2
  313. package/dist/lib/newpr/actions.test.d.ts.map +0 -1
  314. package/dist/lib/newpr/actions.test.js +0 -254
  315. package/dist/lib/newpr/actions.test.js.map +0 -1
  316. package/dist/lib/newpr/args.test.d.ts +0 -2
  317. package/dist/lib/newpr/args.test.d.ts.map +0 -1
  318. package/dist/lib/newpr/args.test.js +0 -479
  319. package/dist/lib/newpr/args.test.js.map +0 -1
  320. package/dist/lib/newpr/hook-runner.test.d.ts +0 -7
  321. package/dist/lib/newpr/hook-runner.test.d.ts.map +0 -1
  322. package/dist/lib/newpr/hook-runner.test.js +0 -422
  323. package/dist/lib/newpr/hook-runner.test.js.map +0 -1
  324. package/dist/lib/newpr/plan-generator.test.d.ts +0 -7
  325. package/dist/lib/newpr/plan-generator.test.d.ts.map +0 -1
  326. package/dist/lib/newpr/plan-generator.test.js +0 -387
  327. package/dist/lib/newpr/plan-generator.test.js.map +0 -1
  328. package/dist/lib/newpr/scenario-handler.test.d.ts +0 -2
  329. package/dist/lib/newpr/scenario-handler.test.d.ts.map +0 -1
  330. package/dist/lib/newpr/scenario-handler.test.js +0 -256
  331. package/dist/lib/newpr/scenario-handler.test.js.map +0 -1
  332. package/dist/lib/prompts.test.d.ts +0 -2
  333. package/dist/lib/prompts.test.d.ts.map +0 -1
  334. package/dist/lib/prompts.test.js +0 -807
  335. package/dist/lib/prompts.test.js.map +0 -1
  336. package/dist/lib/prs/actions.test.d.ts +0 -5
  337. package/dist/lib/prs/actions.test.d.ts.map +0 -1
  338. package/dist/lib/prs/actions.test.js +0 -356
  339. package/dist/lib/prs/actions.test.js.map +0 -1
  340. package/dist/lib/prs/command.test.d.ts +0 -11
  341. package/dist/lib/prs/command.test.d.ts.map +0 -1
  342. package/dist/lib/prs/command.test.js +0 -409
  343. package/dist/lib/prs/command.test.js.map +0 -1
  344. package/dist/lib/prs/data.test.d.ts +0 -5
  345. package/dist/lib/prs/data.test.d.ts.map +0 -1
  346. package/dist/lib/prs/data.test.js +0 -417
  347. package/dist/lib/prs/data.test.js.map +0 -1
  348. package/dist/lib/prs/details.test.d.ts +0 -5
  349. package/dist/lib/prs/details.test.d.ts.map +0 -1
  350. package/dist/lib/prs/details.test.js +0 -325
  351. package/dist/lib/prs/details.test.js.map +0 -1
  352. package/dist/lib/prs/filters.test.d.ts +0 -5
  353. package/dist/lib/prs/filters.test.d.ts.map +0 -1
  354. package/dist/lib/prs/filters.test.js +0 -312
  355. package/dist/lib/prs/filters.test.js.map +0 -1
  356. package/dist/lib/prs/formatters.test.d.ts +0 -2
  357. package/dist/lib/prs/formatters.test.d.ts.map +0 -1
  358. package/dist/lib/prs/formatters.test.js +0 -387
  359. package/dist/lib/prs/formatters.test.js.map +0 -1
  360. package/dist/lib/prs/interactive.test.d.ts +0 -5
  361. package/dist/lib/prs/interactive.test.d.ts.map +0 -1
  362. package/dist/lib/prs/interactive.test.js +0 -517
  363. package/dist/lib/prs/interactive.test.js.map +0 -1
  364. package/dist/lib/schema.test.d.ts +0 -10
  365. package/dist/lib/schema.test.d.ts.map +0 -1
  366. package/dist/lib/schema.test.js +0 -309
  367. package/dist/lib/schema.test.js.map +0 -1
  368. package/dist/lib/state-detection.test.d.ts +0 -2
  369. package/dist/lib/state-detection.test.d.ts.map +0 -1
  370. package/dist/lib/state-detection.test.js +0 -451
  371. package/dist/lib/state-detection.test.js.map +0 -1
  372. package/dist/lib/ui/error.test.d.ts +0 -2
  373. package/dist/lib/ui/error.test.d.ts.map +0 -1
  374. package/dist/lib/ui/error.test.js +0 -143
  375. package/dist/lib/ui/error.test.js.map +0 -1
  376. package/dist/lib/ui/output.test.d.ts +0 -2
  377. package/dist/lib/ui/output.test.d.ts.map +0 -1
  378. package/dist/lib/ui/output.test.js +0 -59
  379. package/dist/lib/ui/output.test.js.map +0 -1
  380. package/dist/lib/ui/status.test.d.ts +0 -2
  381. package/dist/lib/ui/status.test.d.ts.map +0 -1
  382. package/dist/lib/ui/status.test.js +0 -158
  383. package/dist/lib/ui/status.test.js.map +0 -1
  384. package/dist/lib/ui/table.test.d.ts +0 -2
  385. package/dist/lib/ui/table.test.d.ts.map +0 -1
  386. package/dist/lib/ui/table.test.js +0 -115
  387. package/dist/lib/ui/table.test.js.map +0 -1
  388. package/dist/lib/ui/theme.test.d.ts +0 -2
  389. package/dist/lib/ui/theme.test.d.ts.map +0 -1
  390. package/dist/lib/ui/theme.test.js +0 -76
  391. package/dist/lib/ui/theme.test.js.map +0 -1
  392. package/dist/lib/wtconfig/config-manager.test.d.ts +0 -5
  393. package/dist/lib/wtconfig/config-manager.test.d.ts.map +0 -1
  394. package/dist/lib/wtconfig/config-manager.test.js +0 -501
  395. package/dist/lib/wtconfig/config-manager.test.js.map +0 -1
  396. package/dist/lib/wtconfig/environment.test.d.ts +0 -5
  397. package/dist/lib/wtconfig/environment.test.d.ts.map +0 -1
  398. package/dist/lib/wtconfig/environment.test.js +0 -285
  399. package/dist/lib/wtconfig/environment.test.js.map +0 -1
  400. package/dist/lib/wtlink/config-manifest.test.d.ts +0 -2
  401. package/dist/lib/wtlink/config-manifest.test.d.ts.map +0 -1
  402. package/dist/lib/wtlink/config-manifest.test.js +0 -486
  403. package/dist/lib/wtlink/config-manifest.test.js.map +0 -1
  404. package/dist/lib/wtlink/link-configs.test.d.ts +0 -2
  405. package/dist/lib/wtlink/link-configs.test.d.ts.map +0 -1
  406. package/dist/lib/wtlink/link-configs.test.js +0 -612
  407. package/dist/lib/wtlink/link-configs.test.js.map +0 -1
  408. package/dist/lib/wtlink/main-menu.test.d.ts +0 -5
  409. package/dist/lib/wtlink/main-menu.test.d.ts.map +0 -1
  410. package/dist/lib/wtlink/main-menu.test.js +0 -126
  411. package/dist/lib/wtlink/main-menu.test.js.map +0 -1
  412. package/dist/lib/wtlink/manage-manifest.test.d.ts +0 -2
  413. package/dist/lib/wtlink/manage-manifest.test.d.ts.map +0 -1
  414. package/dist/lib/wtlink/manage-manifest.test.js +0 -714
  415. package/dist/lib/wtlink/manage-manifest.test.js.map +0 -1
  416. package/dist/lib/wtlink/validate-manifest.test.d.ts +0 -2
  417. package/dist/lib/wtlink/validate-manifest.test.d.ts.map +0 -1
  418. package/dist/lib/wtlink/validate-manifest.test.js +0 -220
  419. package/dist/lib/wtlink/validate-manifest.test.js.map +0 -1
  420. package/dist/lib/wtstate/analyze.test.d.ts +0 -5
  421. package/dist/lib/wtstate/analyze.test.d.ts.map +0 -1
  422. package/dist/lib/wtstate/analyze.test.js +0 -282
  423. package/dist/lib/wtstate/analyze.test.js.map +0 -1
  424. package/dist/lib/wtstate/args.test.d.ts +0 -5
  425. package/dist/lib/wtstate/args.test.d.ts.map +0 -1
  426. package/dist/lib/wtstate/args.test.js +0 -120
  427. package/dist/lib/wtstate/args.test.js.map +0 -1
  428. package/dist/mcp/server.test.d.ts +0 -9
  429. package/dist/mcp/server.test.d.ts.map +0 -1
  430. package/dist/mcp/server.test.js +0 -550
  431. package/dist/mcp/server.test.js.map +0 -1
@@ -1,739 +0,0 @@
1
- /**
2
- * Tests for wt unified command handlers
3
- *
4
- * All commands are migrated to direct library calls (list, state, clean, new, link)
5
- * and tested by mocking the library modules they call.
6
- */
7
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
8
- import { spawnSync } from 'child_process';
9
- import yargs from 'yargs';
10
- vi.mock('child_process', () => ({
11
- spawnSync: vi.fn(() => ({ status: 0 })),
12
- execSync: vi.fn(),
13
- }));
14
- // Mock newpr.ts for new command (direct library call)
15
- vi.mock('../newpr.js', () => ({
16
- runNewprHandler: vi.fn().mockResolvedValue(undefined),
17
- }));
18
- // Mock library dependencies for list command (direct library calls)
19
- vi.mock('../../lib/lswt/index.js', () => ({
20
- gatherWorktreeInfo: vi.fn().mockResolvedValue([]),
21
- createDefaultDeps: vi.fn().mockReturnValue({}),
22
- formatJsonOutput: vi.fn().mockReturnValue('[]'),
23
- runInteractiveMode: vi.fn().mockResolvedValue(undefined),
24
- printWorktreeTable: vi.fn(),
25
- parseArgs: vi.fn(),
26
- getHelpText: vi.fn(),
27
- formatTypeLabel: vi.fn(),
28
- getDisplayPath: vi.fn(),
29
- sortWorktrees: vi.fn(),
30
- extractPrNumber: vi.fn(),
31
- isMainWorktree: vi.fn(),
32
- }));
33
- // Mock library dependencies for state command (direct library calls)
34
- vi.mock('../../lib/wtstate/index.js', () => ({
35
- analyzeState: vi.fn().mockReturnValue({
36
- scenario: 'main_clean_same',
37
- scenarioDescription: 'On main branch, same as origin/main, no changes',
38
- currentBranch: 'main',
39
- baseBranch: 'main',
40
- worktreeType: 'main_worktree',
41
- hasChanges: false,
42
- hasStagedChanges: false,
43
- hasUnstagedChanges: false,
44
- localCommits: [],
45
- stagedFiles: [],
46
- unstagedFiles: [],
47
- availableActions: [],
48
- recommendedAction: null,
49
- }),
50
- formatText: vi.fn().mockReturnValue('State: main_clean_same'),
51
- parseArgs: vi.fn(),
52
- getHelpText: vi.fn(),
53
- getDefaultOptions: vi.fn(),
54
- }));
55
- // Mock library dependencies for clean command (direct library calls)
56
- vi.mock('../../lib/cleanpr/index.js', () => ({
57
- gatherPrWorktreeInfo: vi.fn().mockResolvedValue([]),
58
- createDefaultDeps: vi.fn().mockReturnValue({}),
59
- groupWorktreesByState: vi.fn().mockReturnValue({ merged: [], closed: [], open: [], unknown: [] }),
60
- getCleanableWorktrees: vi.fn().mockReturnValue([]),
61
- findWorktreeByPrNumber: vi.fn().mockReturnValue(null),
62
- cleanWorktree: vi.fn().mockReturnValue({
63
- success: true,
64
- prNumber: 42,
65
- message: 'Cleaned',
66
- localBranchDeleted: true,
67
- remoteBranchDeleted: false,
68
- }),
69
- summarizeResults: vi.fn().mockReturnValue({ cleaned: 0, total: 0, failed: 0 }),
70
- }));
71
- // Mock config module for clean command
72
- vi.mock('../../lib/config.js', () => ({
73
- loadConfig: vi.fn().mockReturnValue({ worktreePattern: '{repo}.pr{number}', baseBranch: 'main' }),
74
- loadConfigWithValidation: vi.fn().mockReturnValue({ config: {}, validation: null }),
75
- getDefaultConfig: vi.fn().mockReturnValue({}),
76
- getConfigPath: vi.fn().mockReturnValue(null),
77
- }));
78
- // Mock logger for clean command
79
- vi.mock('../../lib/logger.js', () => ({
80
- logger: { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() },
81
- }));
82
- // Mock prompts module for clean command
83
- vi.mock('../../lib/prompts.js', () => ({
84
- withSpinner: vi.fn((_msg, fn) => fn()),
85
- promptChoice: vi.fn(),
86
- promptConfirm: vi.fn(),
87
- }));
88
- // Mock colors module for clean command
89
- vi.mock('../../lib/colors.js', () => ({
90
- error: vi.fn((s) => s),
91
- dim: vi.fn((s) => s),
92
- success: vi.fn((s) => s),
93
- info: vi.fn((s) => s),
94
- cyan: vi.fn((s) => s),
95
- yellow: vi.fn((s) => s),
96
- red: vi.fn((s) => s),
97
- green: vi.fn((s) => s),
98
- bold: vi.fn((s) => s),
99
- warning: vi.fn((s) => s),
100
- }));
101
- // Mock config-editor for config command
102
- vi.mock('../../lib/config-editor.js', () => ({
103
- runConfigEditor: vi.fn().mockResolvedValue({ saved: false }),
104
- quickEditConfig: vi.fn().mockResolvedValue({ saved: false }),
105
- }));
106
- // Mock config-validation for config command
107
- vi.mock('../../lib/config-validation.js', () => ({
108
- formatValidationErrors: vi.fn().mockReturnValue('formatted errors'),
109
- }));
110
- // Mock global-config for config command
111
- vi.mock('../../lib/global-config.js', () => ({
112
- getSchemaUrl: vi.fn().mockReturnValue('https://example.com/schema.json'),
113
- }));
114
- // Mock library dependencies for link command (direct library calls)
115
- vi.mock('../../lib/wtlink/manage-manifest.js', () => ({
116
- run: vi.fn().mockResolvedValue(undefined),
117
- }));
118
- vi.mock('../../lib/wtlink/link-configs.js', () => ({
119
- run: vi.fn().mockResolvedValue(undefined),
120
- }));
121
- vi.mock('../../lib/wtlink/validate-manifest.js', () => ({
122
- run: vi.fn(),
123
- }));
124
- vi.mock('../../lib/wtlink/main-menu.js', () => ({
125
- showMainMenu: vi.fn().mockResolvedValue(undefined),
126
- }));
127
- vi.mock('../../lib/wtlink/config-manifest.js', () => ({
128
- hasLegacyManifest: vi.fn().mockReturnValue(false),
129
- }));
130
- vi.mock('../../lib/config-migration/index.js', () => ({
131
- detectMigrationIssues: vi.fn().mockReturnValue({ issues: [] }),
132
- runMigration: vi.fn().mockResolvedValue({ success: true, errors: [] }),
133
- formatMigrationReport: vi.fn().mockReturnValue(''),
134
- }));
135
- vi.mock('../../lib/errors.js', () => ({
136
- ManifestError: class ManifestError extends Error {
137
- issues;
138
- constructor(message, issues) {
139
- super(message);
140
- this.name = 'ManifestError';
141
- this.issues = issues;
142
- }
143
- },
144
- }));
145
- // Mock git module for list/state/clean/link handlers
146
- vi.mock('../../lib/git.js', () => ({
147
- getRepoRoot: vi.fn().mockReturnValue('/fake/repo'),
148
- getMainWorktreeRoot: vi.fn().mockReturnValue('/fake/repo'),
149
- removeWorktree: vi.fn(),
150
- pruneWorktrees: vi.fn(),
151
- }));
152
- // Mock github module for list/clean handlers
153
- vi.mock('../../lib/github.js', () => ({
154
- isGhInstalled: vi.fn().mockReturnValue(true),
155
- }));
156
- // Mock UI module for all handlers
157
- vi.mock('../../lib/ui/index.js', () => ({
158
- setJsonMode: vi.fn(),
159
- isJsonMode: vi.fn().mockReturnValue(false),
160
- printStatus: vi.fn(),
161
- printDim: vi.fn(),
162
- printError: vi.fn(),
163
- printHeader: vi.fn(),
164
- printNextSteps: vi.fn(),
165
- changeIndicator: vi.fn().mockReturnValue(''),
166
- errorToDisplay: vi.fn().mockReturnValue({ title: 'error' }),
167
- }));
168
- // Mock json-output module (partial mock to preserve exports for all command handlers)
169
- vi.mock('../../lib/json-output.js', async (importOriginal) => {
170
- const actual = await importOriginal();
171
- return {
172
- ...actual,
173
- createSuccessResult: vi.fn().mockReturnValue({ success: true }),
174
- createErrorResult: vi.fn().mockReturnValue({ success: false }),
175
- formatJsonResult: vi.fn().mockReturnValue('{}'),
176
- };
177
- });
178
- // Import all commands statically so coverage is tracked
179
- import { newCommand } from './new.js';
180
- import { listCommand } from './list.js';
181
- import { cleanCommand } from './clean.js';
182
- import { stateCommand } from './state.js';
183
- import { configCommand } from './config.js';
184
- import { linkCommand } from './link.js';
185
- // Import mocked modules for assertions
186
- import { gatherWorktreeInfo, printWorktreeTable, formatJsonOutput } from '../../lib/lswt/index.js';
187
- import { analyzeState, formatText } from '../../lib/wtstate/index.js';
188
- import { gatherPrWorktreeInfo, getCleanableWorktrees } from '../../lib/cleanpr/index.js';
189
- import { setJsonMode, printError } from '../../lib/ui/index.js';
190
- import { createSuccessResult, formatJsonResult } from '../../lib/json-output.js';
191
- import { runNewprHandler } from '../newpr.js';
192
- import { run as manageRun } from '../../lib/wtlink/manage-manifest.js';
193
- import { run as linkRun } from '../../lib/wtlink/link-configs.js';
194
- import { run as validateRun } from '../../lib/wtlink/validate-manifest.js';
195
- import { showMainMenu } from '../../lib/wtlink/main-menu.js';
196
- import * as git from '../../lib/git.js';
197
- import * as github from '../../lib/github.js';
198
- // Mock process.exit to prevent test from exiting
199
- const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => undefined);
200
- // Helper to invoke builder for coverage
201
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
202
- function invokeBuilder(command, args) {
203
- const parser = yargs(args);
204
- if (typeof command.builder === 'function') {
205
- command.builder(parser);
206
- }
207
- }
208
- describe('wt subcommand handlers', () => {
209
- beforeEach(() => {
210
- vi.clearAllMocks();
211
- });
212
- afterEach(() => {
213
- mockExit.mockClear();
214
- });
215
- describe('newCommand', () => {
216
- it('has correct command structure', () => {
217
- expect(newCommand.command).toEqual(['new [description]', 'n']);
218
- expect(newCommand.describe).toContain('PR');
219
- });
220
- it('builder registers all expected options', () => {
221
- invokeBuilder(newCommand, []);
222
- expect(true).toBe(true);
223
- });
224
- it('calls runNewprHandler with description', async () => {
225
- await newCommand.handler({
226
- description: 'Add dark mode',
227
- json: false,
228
- 'non-interactive': false,
229
- draft: false,
230
- });
231
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({
232
- mode: 'new',
233
- description: 'Add dark mode',
234
- }));
235
- });
236
- it('calls runNewprHandler with pr mode for --pr flag', async () => {
237
- await newCommand.handler({
238
- pr: 42,
239
- json: false,
240
- 'non-interactive': false,
241
- draft: false,
242
- });
243
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({
244
- mode: 'pr',
245
- prNumber: 42,
246
- }));
247
- });
248
- it('maps --ready flag to draft=false and draftExplicitlySet=true', async () => {
249
- await newCommand.handler({
250
- ready: true,
251
- json: false,
252
- 'non-interactive': false,
253
- draft: false,
254
- install: false,
255
- code: false,
256
- 'no-wtlink': false,
257
- 'no-hooks': false,
258
- });
259
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({
260
- draft: false,
261
- draftExplicitlySet: true,
262
- }));
263
- });
264
- it('maps --base flag to baseBranch option', async () => {
265
- await newCommand.handler({
266
- base: 'develop',
267
- json: false,
268
- 'non-interactive': false,
269
- draft: false,
270
- install: false,
271
- code: false,
272
- ready: false,
273
- 'no-wtlink': false,
274
- 'no-hooks': false,
275
- });
276
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ baseBranch: 'develop' }));
277
- });
278
- it('maps --branch flag to branch mode', async () => {
279
- await newCommand.handler({
280
- branch: 'feat/my-feature',
281
- json: false,
282
- 'non-interactive': false,
283
- draft: false,
284
- install: false,
285
- code: false,
286
- ready: false,
287
- 'no-wtlink': false,
288
- 'no-hooks': false,
289
- });
290
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({
291
- mode: 'branch',
292
- branchName: 'feat/my-feature',
293
- }));
294
- });
295
- it('maps --install flag to installDeps option', async () => {
296
- await newCommand.handler({
297
- install: true,
298
- json: false,
299
- 'non-interactive': false,
300
- draft: false,
301
- code: false,
302
- ready: false,
303
- 'no-wtlink': false,
304
- 'no-hooks': false,
305
- });
306
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ installDeps: true }));
307
- });
308
- it('maps --code flag to openEditor option', async () => {
309
- await newCommand.handler({
310
- code: true,
311
- json: false,
312
- 'non-interactive': false,
313
- draft: false,
314
- install: false,
315
- ready: false,
316
- 'no-wtlink': false,
317
- 'no-hooks': false,
318
- });
319
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ openEditor: true }));
320
- });
321
- it('maps --no-wtlink flag to runWtlink=false option', async () => {
322
- await newCommand.handler({
323
- 'no-wtlink': true,
324
- json: false,
325
- 'non-interactive': false,
326
- draft: false,
327
- install: false,
328
- code: false,
329
- ready: false,
330
- 'no-hooks': false,
331
- });
332
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ runWtlink: false }));
333
- });
334
- it('maps --no-hooks flag to noHooks option', async () => {
335
- await newCommand.handler({
336
- 'no-hooks': true,
337
- json: false,
338
- 'non-interactive': false,
339
- draft: false,
340
- install: false,
341
- code: false,
342
- ready: false,
343
- 'no-wtlink': false,
344
- });
345
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ noHooks: true }));
346
- });
347
- it('maps --json flag to json option', async () => {
348
- await newCommand.handler({
349
- json: true,
350
- 'non-interactive': false,
351
- draft: false,
352
- });
353
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ json: true }));
354
- expect(setJsonMode).toHaveBeenCalledWith(true);
355
- });
356
- it('maps --non-interactive flag to nonInteractive option', async () => {
357
- await newCommand.handler({
358
- json: false,
359
- 'non-interactive': true,
360
- draft: false,
361
- });
362
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ nonInteractive: true }));
363
- });
364
- it('maps --action flag to action option', async () => {
365
- await newCommand.handler({
366
- action: 'commit_all',
367
- json: false,
368
- 'non-interactive': false,
369
- draft: false,
370
- });
371
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ action: 'commit_all' }));
372
- });
373
- it('maps --draft flag to draft=true and draftExplicitlySet=true', async () => {
374
- await newCommand.handler({
375
- json: false,
376
- 'non-interactive': false,
377
- draft: true,
378
- });
379
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({
380
- draft: true,
381
- draftExplicitlySet: true,
382
- }));
383
- });
384
- it('maps --plan flag to generatePlan option', async () => {
385
- await newCommand.handler({
386
- json: false,
387
- 'non-interactive': false,
388
- draft: false,
389
- plan: true,
390
- });
391
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ generatePlan: true }));
392
- });
393
- it('maps --confirm-hooks flag to confirmHooks option', async () => {
394
- await newCommand.handler({
395
- json: false,
396
- 'non-interactive': false,
397
- draft: false,
398
- 'confirm-hooks': true,
399
- });
400
- expect(runNewprHandler).toHaveBeenCalledWith(expect.objectContaining({ confirmHooks: true }));
401
- });
402
- it('does not spawn a child process', async () => {
403
- vi.mocked(spawnSync).mockClear();
404
- await newCommand.handler({
405
- description: 'Test',
406
- json: false,
407
- 'non-interactive': false,
408
- draft: false,
409
- });
410
- expect(spawnSync).not.toHaveBeenCalled();
411
- });
412
- });
413
- describe('listCommand', () => {
414
- it('has correct command structure', () => {
415
- expect(listCommand.command).toEqual(['list', 'ls']);
416
- expect(listCommand.describe).toContain('worktrees');
417
- });
418
- it('builder registers all expected options', () => {
419
- invokeBuilder(listCommand, []);
420
- expect(true).toBe(true);
421
- });
422
- it('calls gatherWorktreeInfo with verbose option', async () => {
423
- await listCommand.handler({ verbose: true, json: false, status: false });
424
- expect(gatherWorktreeInfo).toHaveBeenCalledWith('/fake/repo', expect.objectContaining({ verbose: true }), expect.any(Object));
425
- });
426
- it('calls setJsonMode and formatJsonOutput for --json', async () => {
427
- await listCommand.handler({ json: true, verbose: false, status: false });
428
- expect(setJsonMode).toHaveBeenCalledWith(true);
429
- expect(formatJsonOutput).toHaveBeenCalled();
430
- });
431
- it('calls printWorktreeTable for non-interactive non-json output', async () => {
432
- await listCommand.handler({
433
- json: false,
434
- verbose: false,
435
- status: false,
436
- interactive: false,
437
- });
438
- expect(printWorktreeTable).toHaveBeenCalled();
439
- });
440
- it('passes status option to gatherWorktreeInfo', async () => {
441
- await listCommand.handler({ status: true, json: false, verbose: false });
442
- expect(gatherWorktreeInfo).toHaveBeenCalledWith('/fake/repo', expect.objectContaining({ showStatus: true }), expect.any(Object));
443
- });
444
- it('does not spawn a child process', async () => {
445
- vi.mocked(spawnSync).mockClear();
446
- await listCommand.handler({
447
- json: false,
448
- verbose: false,
449
- status: false,
450
- interactive: false,
451
- });
452
- expect(spawnSync).not.toHaveBeenCalled();
453
- });
454
- });
455
- describe('cleanCommand', () => {
456
- it('has correct command structure', () => {
457
- expect(cleanCommand.command).toEqual(['clean [pr-number]', 'c']);
458
- expect(cleanCommand.describe).toContain('Clean');
459
- });
460
- it('builder registers all expected options', () => {
461
- invokeBuilder(cleanCommand, []);
462
- expect(true).toBe(true);
463
- });
464
- it('calls gatherPrWorktreeInfo for --all mode', async () => {
465
- await cleanCommand.handler({
466
- all: true,
467
- 'dry-run': false,
468
- force: false,
469
- json: false,
470
- });
471
- expect(gatherPrWorktreeInfo).toHaveBeenCalledWith('/fake/repo', '{repo}.pr{number}', expect.any(Object));
472
- expect(getCleanableWorktrees).toHaveBeenCalled();
473
- });
474
- it('calls setJsonMode when --json is passed', async () => {
475
- await cleanCommand.handler({
476
- all: true,
477
- 'dry-run': false,
478
- force: false,
479
- json: true,
480
- });
481
- expect(setJsonMode).toHaveBeenCalledWith(true);
482
- });
483
- it('handles gh not installed error', async () => {
484
- vi.mocked(github.isGhInstalled).mockReturnValueOnce(false);
485
- await cleanCommand.handler({
486
- all: false,
487
- 'dry-run': false,
488
- force: false,
489
- json: false,
490
- });
491
- expect(printError).toHaveBeenCalledWith(expect.objectContaining({ title: expect.stringContaining('GitHub CLI') }));
492
- expect(mockExit).toHaveBeenCalledWith(1);
493
- });
494
- it('handles not in git repo error', async () => {
495
- vi.mocked(git.getRepoRoot).mockReturnValueOnce(null);
496
- await cleanCommand.handler({
497
- all: false,
498
- 'dry-run': false,
499
- force: false,
500
- json: false,
501
- });
502
- expect(printError).toHaveBeenCalledWith(expect.objectContaining({ title: expect.stringContaining('git repository') }));
503
- expect(mockExit).toHaveBeenCalledWith(1);
504
- });
505
- it('does not spawn a child process', async () => {
506
- vi.mocked(spawnSync).mockClear();
507
- await cleanCommand.handler({
508
- all: true,
509
- 'dry-run': false,
510
- force: false,
511
- json: false,
512
- });
513
- expect(spawnSync).not.toHaveBeenCalled();
514
- });
515
- });
516
- describe('stateCommand', () => {
517
- it('has correct command structure', () => {
518
- expect(stateCommand.command).toEqual(['state', 's']);
519
- expect(stateCommand.describe).toContain('state');
520
- });
521
- it('builder registers all expected options', () => {
522
- invokeBuilder(stateCommand, []);
523
- expect(true).toBe(true);
524
- });
525
- it('calls analyzeState and formatJsonResult for --json', async () => {
526
- await stateCommand.handler({ json: true, verbose: false });
527
- expect(analyzeState).toHaveBeenCalledWith(expect.objectContaining({ json: true, verbose: false }));
528
- expect(createSuccessResult).toHaveBeenCalledWith('wtstate', expect.any(Object));
529
- expect(formatJsonResult).toHaveBeenCalled();
530
- });
531
- it('calls analyzeState and formatText for text output', async () => {
532
- await stateCommand.handler({ verbose: true, json: false });
533
- expect(analyzeState).toHaveBeenCalledWith(expect.objectContaining({ verbose: true, json: false }));
534
- expect(formatText).toHaveBeenCalled();
535
- });
536
- it('passes base-branch option to analyzeState', async () => {
537
- await stateCommand.handler({
538
- verbose: false,
539
- json: false,
540
- 'base-branch': 'develop',
541
- });
542
- expect(analyzeState).toHaveBeenCalledWith(expect.objectContaining({ baseBranch: 'develop' }));
543
- });
544
- it('does not spawn a child process', async () => {
545
- vi.mocked(spawnSync).mockClear();
546
- await stateCommand.handler({ json: false, verbose: false });
547
- expect(spawnSync).not.toHaveBeenCalled();
548
- });
549
- });
550
- describe('configCommand', () => {
551
- it('has correct command structure', () => {
552
- expect(configCommand.command).toEqual(['config [subcommand] [args..]', 'cfg']);
553
- expect(configCommand.describe).toContain('Configuration');
554
- });
555
- it('builder registers positional args', () => {
556
- invokeBuilder(configCommand, []);
557
- expect(true).toBe(true);
558
- });
559
- it('handles no subcommand (defaults to interactive)', async () => {
560
- const handler = configCommand.handler({ subcommand: undefined, args: [] });
561
- expect(handler).toBeInstanceOf(Promise);
562
- });
563
- });
564
- describe('linkCommand', () => {
565
- it('has correct command structure', () => {
566
- expect(linkCommand.command).toEqual(['link [subcommand] [args..]', 'l']);
567
- expect(linkCommand.describe).toContain('config');
568
- });
569
- it('builder registers all expected options', () => {
570
- invokeBuilder(linkCommand, []);
571
- expect(true).toBe(true);
572
- });
573
- it('calls link.run with source and destination for link subcommand', async () => {
574
- await linkCommand.handler({
575
- subcommand: 'link',
576
- args: ['source', 'dest'],
577
- 'dry-run': false,
578
- yes: false,
579
- 'non-interactive': false,
580
- json: false,
581
- verbose: false,
582
- });
583
- expect(linkRun).toHaveBeenCalledWith(expect.objectContaining({
584
- source: 'source',
585
- destination: 'dest',
586
- dryRun: false,
587
- yes: false,
588
- }));
589
- });
590
- it('passes --dry-run to link.run', async () => {
591
- await linkCommand.handler({
592
- subcommand: 'link',
593
- args: [],
594
- 'dry-run': true,
595
- yes: false,
596
- 'non-interactive': false,
597
- json: false,
598
- verbose: false,
599
- });
600
- expect(linkRun).toHaveBeenCalledWith(expect.objectContaining({ dryRun: true }));
601
- });
602
- it('passes --yes to link.run', async () => {
603
- await linkCommand.handler({
604
- subcommand: 'link',
605
- args: [],
606
- 'dry-run': false,
607
- yes: true,
608
- 'non-interactive': false,
609
- json: false,
610
- verbose: false,
611
- });
612
- expect(linkRun).toHaveBeenCalledWith(expect.objectContaining({ yes: true }));
613
- });
614
- it('calls setJsonMode when --json is passed', async () => {
615
- await linkCommand.handler({
616
- subcommand: 'link',
617
- args: [],
618
- 'dry-run': false,
619
- yes: false,
620
- 'non-interactive': false,
621
- json: true,
622
- verbose: false,
623
- });
624
- expect(setJsonMode).toHaveBeenCalledWith(true);
625
- });
626
- it('calls manage.run with verbose option for manage subcommand', async () => {
627
- await linkCommand.handler({
628
- subcommand: 'manage',
629
- args: [],
630
- 'dry-run': false,
631
- yes: false,
632
- 'non-interactive': false,
633
- json: false,
634
- verbose: true,
635
- clean: false,
636
- backup: false,
637
- });
638
- expect(manageRun).toHaveBeenCalledWith(expect.objectContaining({ verbose: true }));
639
- });
640
- it('passes --manifest-file to manage.run', async () => {
641
- await linkCommand.handler({
642
- subcommand: 'manage',
643
- 'manifest-file': '.custom-manifest',
644
- args: [],
645
- 'dry-run': false,
646
- yes: false,
647
- 'non-interactive': false,
648
- json: false,
649
- verbose: false,
650
- clean: false,
651
- backup: false,
652
- });
653
- expect(manageRun).toHaveBeenCalledWith(expect.objectContaining({ manifestFile: '.custom-manifest' }));
654
- });
655
- it('shows interactive menu when no subcommand provided', async () => {
656
- await linkCommand.handler({
657
- args: [],
658
- 'dry-run': false,
659
- yes: false,
660
- 'non-interactive': false,
661
- json: false,
662
- verbose: false,
663
- clean: false,
664
- backup: false,
665
- });
666
- expect(showMainMenu).toHaveBeenCalled();
667
- });
668
- it('passes --clean to manage.run', async () => {
669
- await linkCommand.handler({
670
- subcommand: 'manage',
671
- clean: true,
672
- args: [],
673
- 'dry-run': false,
674
- yes: false,
675
- 'non-interactive': false,
676
- json: false,
677
- verbose: false,
678
- backup: false,
679
- });
680
- expect(manageRun).toHaveBeenCalledWith(expect.objectContaining({ clean: true }));
681
- });
682
- it('passes --backup to manage.run', async () => {
683
- await linkCommand.handler({
684
- subcommand: 'manage',
685
- backup: true,
686
- args: [],
687
- 'dry-run': false,
688
- yes: false,
689
- 'non-interactive': false,
690
- json: false,
691
- verbose: false,
692
- clean: false,
693
- });
694
- expect(manageRun).toHaveBeenCalledWith(expect.objectContaining({ backup: true }));
695
- });
696
- it('passes --type to link.run', async () => {
697
- await linkCommand.handler({
698
- subcommand: 'link',
699
- type: 'symbolic',
700
- args: [],
701
- 'dry-run': false,
702
- yes: false,
703
- 'non-interactive': false,
704
- json: false,
705
- verbose: false,
706
- clean: false,
707
- backup: false,
708
- });
709
- expect(linkRun).toHaveBeenCalledWith(expect.objectContaining({ type: 'symbolic' }));
710
- });
711
- it('calls validate.run for validate subcommand', async () => {
712
- await linkCommand.handler({
713
- subcommand: 'validate',
714
- args: [],
715
- 'dry-run': false,
716
- yes: false,
717
- 'non-interactive': false,
718
- json: false,
719
- verbose: false,
720
- });
721
- expect(validateRun).toHaveBeenCalled();
722
- });
723
- it('does not spawn a child process', async () => {
724
- vi.mocked(spawnSync).mockClear();
725
- await linkCommand.handler({
726
- args: [],
727
- 'dry-run': false,
728
- yes: false,
729
- 'non-interactive': false,
730
- json: false,
731
- verbose: false,
732
- clean: false,
733
- backup: false,
734
- });
735
- expect(spawnSync).not.toHaveBeenCalled();
736
- });
737
- });
738
- });
739
- //# sourceMappingURL=wt.test.js.map