@camaradesuk/git-worktree-tools 1.10.0 → 1.11.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 (426) hide show
  1. package/README.md +4 -4
  2. package/package.json +12 -3
  3. package/dist/api/list.test.d.ts +0 -5
  4. package/dist/api/list.test.d.ts.map +0 -1
  5. package/dist/api/list.test.js +0 -390
  6. package/dist/api/list.test.js.map +0 -1
  7. package/dist/cli/cleanpr.test.d.ts +0 -2
  8. package/dist/cli/cleanpr.test.d.ts.map +0 -1
  9. package/dist/cli/cleanpr.test.js +0 -954
  10. package/dist/cli/cleanpr.test.js.map +0 -1
  11. package/dist/cli/lswt.test.d.ts +0 -2
  12. package/dist/cli/lswt.test.d.ts.map +0 -1
  13. package/dist/cli/lswt.test.js +0 -376
  14. package/dist/cli/lswt.test.js.map +0 -1
  15. package/dist/cli/newpr.test.d.ts +0 -2
  16. package/dist/cli/newpr.test.d.ts.map +0 -1
  17. package/dist/cli/newpr.test.js +0 -1182
  18. package/dist/cli/newpr.test.js.map +0 -1
  19. package/dist/cli/prs.test.d.ts +0 -8
  20. package/dist/cli/prs.test.d.ts.map +0 -1
  21. package/dist/cli/prs.test.js +0 -463
  22. package/dist/cli/prs.test.js.map +0 -1
  23. package/dist/cli/wt/clean.test.d.ts +0 -8
  24. package/dist/cli/wt/clean.test.d.ts.map +0 -1
  25. package/dist/cli/wt/clean.test.js +0 -624
  26. package/dist/cli/wt/clean.test.js.map +0 -1
  27. package/dist/cli/wt/completion.test.d.ts +0 -5
  28. package/dist/cli/wt/completion.test.d.ts.map +0 -1
  29. package/dist/cli/wt/completion.test.js +0 -275
  30. package/dist/cli/wt/completion.test.js.map +0 -1
  31. package/dist/cli/wt/config.test.d.ts +0 -7
  32. package/dist/cli/wt/config.test.d.ts.map +0 -1
  33. package/dist/cli/wt/config.test.js +0 -440
  34. package/dist/cli/wt/config.test.js.map +0 -1
  35. package/dist/cli/wt/entry.test.d.ts +0 -8
  36. package/dist/cli/wt/entry.test.d.ts.map +0 -1
  37. package/dist/cli/wt/entry.test.js +0 -201
  38. package/dist/cli/wt/entry.test.js.map +0 -1
  39. package/dist/cli/wt/init.test.d.ts +0 -5
  40. package/dist/cli/wt/init.test.d.ts.map +0 -1
  41. package/dist/cli/wt/init.test.js +0 -165
  42. package/dist/cli/wt/init.test.js.map +0 -1
  43. package/dist/cli/wt/init.unit.test.d.ts +0 -5
  44. package/dist/cli/wt/init.unit.test.d.ts.map +0 -1
  45. package/dist/cli/wt/init.unit.test.js +0 -432
  46. package/dist/cli/wt/init.unit.test.js.map +0 -1
  47. package/dist/cli/wt/interactive-menu.test.d.ts +0 -12
  48. package/dist/cli/wt/interactive-menu.test.d.ts.map +0 -1
  49. package/dist/cli/wt/interactive-menu.test.js +0 -796
  50. package/dist/cli/wt/interactive-menu.test.js.map +0 -1
  51. package/dist/cli/wt/list.test.d.ts +0 -10
  52. package/dist/cli/wt/list.test.d.ts.map +0 -1
  53. package/dist/cli/wt/list.test.js +0 -157
  54. package/dist/cli/wt/list.test.js.map +0 -1
  55. package/dist/cli/wt/prs.test.d.ts +0 -5
  56. package/dist/cli/wt/prs.test.d.ts.map +0 -1
  57. package/dist/cli/wt/prs.test.js +0 -410
  58. package/dist/cli/wt/prs.test.js.map +0 -1
  59. package/dist/cli/wt/run-command.test.d.ts +0 -5
  60. package/dist/cli/wt/run-command.test.d.ts.map +0 -1
  61. package/dist/cli/wt/run-command.test.js +0 -88
  62. package/dist/cli/wt/run-command.test.js.map +0 -1
  63. package/dist/cli/wt/state.test.d.ts +0 -9
  64. package/dist/cli/wt/state.test.d.ts.map +0 -1
  65. package/dist/cli/wt/state.test.js +0 -127
  66. package/dist/cli/wt/state.test.js.map +0 -1
  67. package/dist/cli/wt/wt.test.d.ts +0 -8
  68. package/dist/cli/wt/wt.test.d.ts.map +0 -1
  69. package/dist/cli/wt/wt.test.js +0 -739
  70. package/dist/cli/wt/wt.test.js.map +0 -1
  71. package/dist/cli/wt.unit.test.d.ts +0 -7
  72. package/dist/cli/wt.unit.test.d.ts.map +0 -1
  73. package/dist/cli/wt.unit.test.js +0 -160
  74. package/dist/cli/wt.unit.test.js.map +0 -1
  75. package/dist/cli/wtconfig.test.d.ts +0 -5
  76. package/dist/cli/wtconfig.test.d.ts.map +0 -1
  77. package/dist/cli/wtconfig.test.js +0 -1289
  78. package/dist/cli/wtconfig.test.js.map +0 -1
  79. package/dist/cli/wtlink.test.d.ts +0 -2
  80. package/dist/cli/wtlink.test.d.ts.map +0 -1
  81. package/dist/cli/wtlink.test.js +0 -249
  82. package/dist/cli/wtlink.test.js.map +0 -1
  83. package/dist/cli/wtstate.test.d.ts +0 -5
  84. package/dist/cli/wtstate.test.d.ts.map +0 -1
  85. package/dist/cli/wtstate.test.js +0 -193
  86. package/dist/cli/wtstate.test.js.map +0 -1
  87. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +0 -2
  88. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +0 -1
  89. package/dist/e2e/cleanpr/cleanpr.e2e.test.js +0 -326
  90. package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +0 -1
  91. package/dist/e2e/cli.e2e.test.d.ts +0 -2
  92. package/dist/e2e/cli.e2e.test.d.ts.map +0 -1
  93. package/dist/e2e/cli.e2e.test.js +0 -417
  94. package/dist/e2e/cli.e2e.test.js.map +0 -1
  95. package/dist/e2e/lswt/lswt.e2e.test.d.ts +0 -2
  96. package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +0 -1
  97. package/dist/e2e/lswt/lswt.e2e.test.js +0 -361
  98. package/dist/e2e/lswt/lswt.e2e.test.js.map +0 -1
  99. package/dist/e2e/newpr/newpr.e2e.test.d.ts +0 -2
  100. package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +0 -1
  101. package/dist/e2e/newpr/newpr.e2e.test.js +0 -286
  102. package/dist/e2e/newpr/newpr.e2e.test.js.map +0 -1
  103. package/dist/e2e/newpr/scenarios.e2e.test.d.ts +0 -2
  104. package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +0 -1
  105. package/dist/e2e/newpr/scenarios.e2e.test.js +0 -426
  106. package/dist/e2e/newpr/scenarios.e2e.test.js.map +0 -1
  107. package/dist/e2e/newpr-full-flow.e2e.test.d.ts +0 -2
  108. package/dist/e2e/newpr-full-flow.e2e.test.d.ts.map +0 -1
  109. package/dist/e2e/newpr-full-flow.e2e.test.js +0 -280
  110. package/dist/e2e/newpr-full-flow.e2e.test.js.map +0 -1
  111. package/dist/e2e/prs/prs.e2e.test.d.ts +0 -7
  112. package/dist/e2e/prs/prs.e2e.test.d.ts.map +0 -1
  113. package/dist/e2e/prs/prs.e2e.test.js +0 -606
  114. package/dist/e2e/prs/prs.e2e.test.js.map +0 -1
  115. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +0 -2
  116. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +0 -1
  117. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +0 -298
  118. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +0 -1
  119. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts +0 -8
  120. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts.map +0 -1
  121. package/dist/e2e/wt/interactive-menu.e2e.test.js +0 -583
  122. package/dist/e2e/wt/interactive-menu.e2e.test.js.map +0 -1
  123. package/dist/e2e/wt/wt.e2e.test.d.ts +0 -9
  124. package/dist/e2e/wt/wt.e2e.test.d.ts.map +0 -1
  125. package/dist/e2e/wt/wt.e2e.test.js +0 -597
  126. package/dist/e2e/wt/wt.e2e.test.js.map +0 -1
  127. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +0 -2
  128. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +0 -1
  129. package/dist/e2e/wtlink/wtlink.e2e.test.js +0 -416
  130. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +0 -1
  131. package/dist/integration/git.integration.test.d.ts +0 -2
  132. package/dist/integration/git.integration.test.d.ts.map +0 -1
  133. package/dist/integration/git.integration.test.js +0 -336
  134. package/dist/integration/git.integration.test.js.map +0 -1
  135. package/dist/integration/lswt-remote-pr.integration.test.d.ts +0 -2
  136. package/dist/integration/lswt-remote-pr.integration.test.d.ts.map +0 -1
  137. package/dist/integration/lswt-remote-pr.integration.test.js +0 -222
  138. package/dist/integration/lswt-remote-pr.integration.test.js.map +0 -1
  139. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts +0 -2
  140. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts.map +0 -1
  141. package/dist/integration/newpr-branchfrom-head.integration.test.js +0 -498
  142. package/dist/integration/newpr-branchfrom-head.integration.test.js.map +0 -1
  143. package/dist/integration/newpr.integration.test.d.ts +0 -2
  144. package/dist/integration/newpr.integration.test.d.ts.map +0 -1
  145. package/dist/integration/newpr.integration.test.js +0 -460
  146. package/dist/integration/newpr.integration.test.js.map +0 -1
  147. package/dist/integration/prs.integration.test.d.ts +0 -8
  148. package/dist/integration/prs.integration.test.d.ts.map +0 -1
  149. package/dist/integration/prs.integration.test.js +0 -478
  150. package/dist/integration/prs.integration.test.js.map +0 -1
  151. package/dist/lib/ai/base-provider.test.d.ts +0 -7
  152. package/dist/lib/ai/base-provider.test.d.ts.map +0 -1
  153. package/dist/lib/ai/base-provider.test.js +0 -319
  154. package/dist/lib/ai/base-provider.test.js.map +0 -1
  155. package/dist/lib/ai/cli-provider.test.d.ts +0 -5
  156. package/dist/lib/ai/cli-provider.test.d.ts.map +0 -1
  157. package/dist/lib/ai/cli-provider.test.js +0 -460
  158. package/dist/lib/ai/cli-provider.test.js.map +0 -1
  159. package/dist/lib/ai/fallback-provider.test.d.ts +0 -7
  160. package/dist/lib/ai/fallback-provider.test.d.ts.map +0 -1
  161. package/dist/lib/ai/fallback-provider.test.js +0 -165
  162. package/dist/lib/ai/fallback-provider.test.js.map +0 -1
  163. package/dist/lib/ai/generation-service.test.d.ts +0 -7
  164. package/dist/lib/ai/generation-service.test.d.ts.map +0 -1
  165. package/dist/lib/ai/generation-service.test.js +0 -213
  166. package/dist/lib/ai/generation-service.test.js.map +0 -1
  167. package/dist/lib/ai/provider-manager.test.d.ts +0 -5
  168. package/dist/lib/ai/provider-manager.test.d.ts.map +0 -1
  169. package/dist/lib/ai/provider-manager.test.js +0 -312
  170. package/dist/lib/ai/provider-manager.test.js.map +0 -1
  171. package/dist/lib/ai/repo-docs.test.d.ts +0 -5
  172. package/dist/lib/ai/repo-docs.test.d.ts.map +0 -1
  173. package/dist/lib/ai/repo-docs.test.js +0 -357
  174. package/dist/lib/ai/repo-docs.test.js.map +0 -1
  175. package/dist/lib/cleanpr/args.test.d.ts +0 -2
  176. package/dist/lib/cleanpr/args.test.d.ts.map +0 -1
  177. package/dist/lib/cleanpr/args.test.js +0 -269
  178. package/dist/lib/cleanpr/args.test.js.map +0 -1
  179. package/dist/lib/cleanpr/cleanup.test.d.ts +0 -2
  180. package/dist/lib/cleanpr/cleanup.test.d.ts.map +0 -1
  181. package/dist/lib/cleanpr/cleanup.test.js +0 -296
  182. package/dist/lib/cleanpr/cleanup.test.js.map +0 -1
  183. package/dist/lib/cleanpr/worktree-info.test.d.ts +0 -2
  184. package/dist/lib/cleanpr/worktree-info.test.d.ts.map +0 -1
  185. package/dist/lib/cleanpr/worktree-info.test.js +0 -228
  186. package/dist/lib/cleanpr/worktree-info.test.js.map +0 -1
  187. package/dist/lib/colors.test.d.ts +0 -2
  188. package/dist/lib/colors.test.d.ts.map +0 -1
  189. package/dist/lib/colors.test.js +0 -142
  190. package/dist/lib/colors.test.js.map +0 -1
  191. package/dist/lib/config-editor.test.d.ts +0 -11
  192. package/dist/lib/config-editor.test.d.ts.map +0 -1
  193. package/dist/lib/config-editor.test.js +0 -526
  194. package/dist/lib/config-editor.test.js.map +0 -1
  195. package/dist/lib/config-migration/detector.test.d.ts +0 -5
  196. package/dist/lib/config-migration/detector.test.d.ts.map +0 -1
  197. package/dist/lib/config-migration/detector.test.js +0 -201
  198. package/dist/lib/config-migration/detector.test.js.map +0 -1
  199. package/dist/lib/config-migration/reporter.test.d.ts +0 -5
  200. package/dist/lib/config-migration/reporter.test.d.ts.map +0 -1
  201. package/dist/lib/config-migration/reporter.test.js +0 -305
  202. package/dist/lib/config-migration/reporter.test.js.map +0 -1
  203. package/dist/lib/config-migration/runner.test.d.ts +0 -5
  204. package/dist/lib/config-migration/runner.test.d.ts.map +0 -1
  205. package/dist/lib/config-migration/runner.test.js +0 -235
  206. package/dist/lib/config-migration/runner.test.js.map +0 -1
  207. package/dist/lib/config-validation.test.d.ts +0 -5
  208. package/dist/lib/config-validation.test.d.ts.map +0 -1
  209. package/dist/lib/config-validation.test.js +0 -423
  210. package/dist/lib/config-validation.test.js.map +0 -1
  211. package/dist/lib/config.test.d.ts +0 -2
  212. package/dist/lib/config.test.d.ts.map +0 -1
  213. package/dist/lib/config.test.js +0 -554
  214. package/dist/lib/config.test.js.map +0 -1
  215. package/dist/lib/constants.test.d.ts +0 -5
  216. package/dist/lib/constants.test.d.ts.map +0 -1
  217. package/dist/lib/constants.test.js +0 -180
  218. package/dist/lib/constants.test.js.map +0 -1
  219. package/dist/lib/deprecation.test.d.ts +0 -2
  220. package/dist/lib/deprecation.test.d.ts.map +0 -1
  221. package/dist/lib/deprecation.test.js +0 -71
  222. package/dist/lib/deprecation.test.js.map +0 -1
  223. package/dist/lib/errors.test.d.ts +0 -2
  224. package/dist/lib/errors.test.d.ts.map +0 -1
  225. package/dist/lib/errors.test.js +0 -117
  226. package/dist/lib/errors.test.js.map +0 -1
  227. package/dist/lib/git.test.d.ts +0 -2
  228. package/dist/lib/git.test.d.ts.map +0 -1
  229. package/dist/lib/git.test.js +0 -608
  230. package/dist/lib/git.test.js.map +0 -1
  231. package/dist/lib/github.test.d.ts +0 -2
  232. package/dist/lib/github.test.d.ts.map +0 -1
  233. package/dist/lib/github.test.js +0 -441
  234. package/dist/lib/github.test.js.map +0 -1
  235. package/dist/lib/global-check.test.d.ts +0 -5
  236. package/dist/lib/global-check.test.d.ts.map +0 -1
  237. package/dist/lib/global-check.test.js +0 -150
  238. package/dist/lib/global-check.test.js.map +0 -1
  239. package/dist/lib/global-config.test.d.ts +0 -5
  240. package/dist/lib/global-config.test.d.ts.map +0 -1
  241. package/dist/lib/global-config.test.js +0 -282
  242. package/dist/lib/global-config.test.js.map +0 -1
  243. package/dist/lib/hooks/confirmation.test.d.ts +0 -7
  244. package/dist/lib/hooks/confirmation.test.d.ts.map +0 -1
  245. package/dist/lib/hooks/confirmation.test.js +0 -300
  246. package/dist/lib/hooks/confirmation.test.js.map +0 -1
  247. package/dist/lib/hooks/executor.test.d.ts +0 -5
  248. package/dist/lib/hooks/executor.test.d.ts.map +0 -1
  249. package/dist/lib/hooks/executor.test.js +0 -648
  250. package/dist/lib/hooks/executor.test.js.map +0 -1
  251. package/dist/lib/hooks/templates.test.d.ts +0 -5
  252. package/dist/lib/hooks/templates.test.d.ts.map +0 -1
  253. package/dist/lib/hooks/templates.test.js +0 -163
  254. package/dist/lib/hooks/templates.test.js.map +0 -1
  255. package/dist/lib/hooks/types.test.d.ts +0 -5
  256. package/dist/lib/hooks/types.test.d.ts.map +0 -1
  257. package/dist/lib/hooks/types.test.js +0 -132
  258. package/dist/lib/hooks/types.test.js.map +0 -1
  259. package/dist/lib/json-output.test.d.ts +0 -5
  260. package/dist/lib/json-output.test.d.ts.map +0 -1
  261. package/dist/lib/json-output.test.js +0 -261
  262. package/dist/lib/json-output.test.js.map +0 -1
  263. package/dist/lib/logger.test.d.ts +0 -14
  264. package/dist/lib/logger.test.d.ts.map +0 -1
  265. package/dist/lib/logger.test.js +0 -692
  266. package/dist/lib/logger.test.js.map +0 -1
  267. package/dist/lib/lswt/action-executors.test.d.ts +0 -2
  268. package/dist/lib/lswt/action-executors.test.d.ts.map +0 -1
  269. package/dist/lib/lswt/action-executors.test.js +0 -1127
  270. package/dist/lib/lswt/action-executors.test.js.map +0 -1
  271. package/dist/lib/lswt/actions.test.d.ts +0 -2
  272. package/dist/lib/lswt/actions.test.d.ts.map +0 -1
  273. package/dist/lib/lswt/actions.test.js +0 -497
  274. package/dist/lib/lswt/actions.test.js.map +0 -1
  275. package/dist/lib/lswt/args.test.d.ts +0 -2
  276. package/dist/lib/lswt/args.test.d.ts.map +0 -1
  277. package/dist/lib/lswt/args.test.js +0 -195
  278. package/dist/lib/lswt/args.test.js.map +0 -1
  279. package/dist/lib/lswt/environment.test.d.ts +0 -2
  280. package/dist/lib/lswt/environment.test.d.ts.map +0 -1
  281. package/dist/lib/lswt/environment.test.js +0 -544
  282. package/dist/lib/lswt/environment.test.js.map +0 -1
  283. package/dist/lib/lswt/formatters.test.d.ts +0 -2
  284. package/dist/lib/lswt/formatters.test.d.ts.map +0 -1
  285. package/dist/lib/lswt/formatters.test.js +0 -323
  286. package/dist/lib/lswt/formatters.test.js.map +0 -1
  287. package/dist/lib/lswt/fuzzy-search.test.d.ts +0 -5
  288. package/dist/lib/lswt/fuzzy-search.test.d.ts.map +0 -1
  289. package/dist/lib/lswt/fuzzy-search.test.js +0 -207
  290. package/dist/lib/lswt/fuzzy-search.test.js.map +0 -1
  291. package/dist/lib/lswt/interactive.test.d.ts +0 -2
  292. package/dist/lib/lswt/interactive.test.d.ts.map +0 -1
  293. package/dist/lib/lswt/interactive.test.js +0 -771
  294. package/dist/lib/lswt/interactive.test.js.map +0 -1
  295. package/dist/lib/lswt/table.test.d.ts +0 -5
  296. package/dist/lib/lswt/table.test.d.ts.map +0 -1
  297. package/dist/lib/lswt/table.test.js +0 -262
  298. package/dist/lib/lswt/table.test.js.map +0 -1
  299. package/dist/lib/lswt/worktree-info.test.d.ts +0 -2
  300. package/dist/lib/lswt/worktree-info.test.d.ts.map +0 -1
  301. package/dist/lib/lswt/worktree-info.test.js +0 -484
  302. package/dist/lib/lswt/worktree-info.test.js.map +0 -1
  303. package/dist/lib/newpr/action-deps.test.d.ts +0 -5
  304. package/dist/lib/newpr/action-deps.test.d.ts.map +0 -1
  305. package/dist/lib/newpr/action-deps.test.js +0 -111
  306. package/dist/lib/newpr/action-deps.test.js.map +0 -1
  307. package/dist/lib/newpr/actions.test.d.ts +0 -2
  308. package/dist/lib/newpr/actions.test.d.ts.map +0 -1
  309. package/dist/lib/newpr/actions.test.js +0 -254
  310. package/dist/lib/newpr/actions.test.js.map +0 -1
  311. package/dist/lib/newpr/args.test.d.ts +0 -2
  312. package/dist/lib/newpr/args.test.d.ts.map +0 -1
  313. package/dist/lib/newpr/args.test.js +0 -479
  314. package/dist/lib/newpr/args.test.js.map +0 -1
  315. package/dist/lib/newpr/hook-runner.test.d.ts +0 -7
  316. package/dist/lib/newpr/hook-runner.test.d.ts.map +0 -1
  317. package/dist/lib/newpr/hook-runner.test.js +0 -422
  318. package/dist/lib/newpr/hook-runner.test.js.map +0 -1
  319. package/dist/lib/newpr/plan-generator.test.d.ts +0 -7
  320. package/dist/lib/newpr/plan-generator.test.d.ts.map +0 -1
  321. package/dist/lib/newpr/plan-generator.test.js +0 -387
  322. package/dist/lib/newpr/plan-generator.test.js.map +0 -1
  323. package/dist/lib/newpr/scenario-handler.test.d.ts +0 -2
  324. package/dist/lib/newpr/scenario-handler.test.d.ts.map +0 -1
  325. package/dist/lib/newpr/scenario-handler.test.js +0 -256
  326. package/dist/lib/newpr/scenario-handler.test.js.map +0 -1
  327. package/dist/lib/prompts.test.d.ts +0 -2
  328. package/dist/lib/prompts.test.d.ts.map +0 -1
  329. package/dist/lib/prompts.test.js +0 -807
  330. package/dist/lib/prompts.test.js.map +0 -1
  331. package/dist/lib/prs/actions.test.d.ts +0 -5
  332. package/dist/lib/prs/actions.test.d.ts.map +0 -1
  333. package/dist/lib/prs/actions.test.js +0 -356
  334. package/dist/lib/prs/actions.test.js.map +0 -1
  335. package/dist/lib/prs/command.test.d.ts +0 -11
  336. package/dist/lib/prs/command.test.d.ts.map +0 -1
  337. package/dist/lib/prs/command.test.js +0 -409
  338. package/dist/lib/prs/command.test.js.map +0 -1
  339. package/dist/lib/prs/data.test.d.ts +0 -5
  340. package/dist/lib/prs/data.test.d.ts.map +0 -1
  341. package/dist/lib/prs/data.test.js +0 -417
  342. package/dist/lib/prs/data.test.js.map +0 -1
  343. package/dist/lib/prs/details.test.d.ts +0 -5
  344. package/dist/lib/prs/details.test.d.ts.map +0 -1
  345. package/dist/lib/prs/details.test.js +0 -325
  346. package/dist/lib/prs/details.test.js.map +0 -1
  347. package/dist/lib/prs/filters.test.d.ts +0 -5
  348. package/dist/lib/prs/filters.test.d.ts.map +0 -1
  349. package/dist/lib/prs/filters.test.js +0 -312
  350. package/dist/lib/prs/filters.test.js.map +0 -1
  351. package/dist/lib/prs/formatters.test.d.ts +0 -2
  352. package/dist/lib/prs/formatters.test.d.ts.map +0 -1
  353. package/dist/lib/prs/formatters.test.js +0 -387
  354. package/dist/lib/prs/formatters.test.js.map +0 -1
  355. package/dist/lib/prs/interactive.test.d.ts +0 -5
  356. package/dist/lib/prs/interactive.test.d.ts.map +0 -1
  357. package/dist/lib/prs/interactive.test.js +0 -517
  358. package/dist/lib/prs/interactive.test.js.map +0 -1
  359. package/dist/lib/schema.test.d.ts +0 -10
  360. package/dist/lib/schema.test.d.ts.map +0 -1
  361. package/dist/lib/schema.test.js +0 -309
  362. package/dist/lib/schema.test.js.map +0 -1
  363. package/dist/lib/state-detection.test.d.ts +0 -2
  364. package/dist/lib/state-detection.test.d.ts.map +0 -1
  365. package/dist/lib/state-detection.test.js +0 -451
  366. package/dist/lib/state-detection.test.js.map +0 -1
  367. package/dist/lib/ui/error.test.d.ts +0 -2
  368. package/dist/lib/ui/error.test.d.ts.map +0 -1
  369. package/dist/lib/ui/error.test.js +0 -143
  370. package/dist/lib/ui/error.test.js.map +0 -1
  371. package/dist/lib/ui/output.test.d.ts +0 -2
  372. package/dist/lib/ui/output.test.d.ts.map +0 -1
  373. package/dist/lib/ui/output.test.js +0 -59
  374. package/dist/lib/ui/output.test.js.map +0 -1
  375. package/dist/lib/ui/status.test.d.ts +0 -2
  376. package/dist/lib/ui/status.test.d.ts.map +0 -1
  377. package/dist/lib/ui/status.test.js +0 -158
  378. package/dist/lib/ui/status.test.js.map +0 -1
  379. package/dist/lib/ui/table.test.d.ts +0 -2
  380. package/dist/lib/ui/table.test.d.ts.map +0 -1
  381. package/dist/lib/ui/table.test.js +0 -115
  382. package/dist/lib/ui/table.test.js.map +0 -1
  383. package/dist/lib/ui/theme.test.d.ts +0 -2
  384. package/dist/lib/ui/theme.test.d.ts.map +0 -1
  385. package/dist/lib/ui/theme.test.js +0 -76
  386. package/dist/lib/ui/theme.test.js.map +0 -1
  387. package/dist/lib/wtconfig/config-manager.test.d.ts +0 -5
  388. package/dist/lib/wtconfig/config-manager.test.d.ts.map +0 -1
  389. package/dist/lib/wtconfig/config-manager.test.js +0 -501
  390. package/dist/lib/wtconfig/config-manager.test.js.map +0 -1
  391. package/dist/lib/wtconfig/environment.test.d.ts +0 -5
  392. package/dist/lib/wtconfig/environment.test.d.ts.map +0 -1
  393. package/dist/lib/wtconfig/environment.test.js +0 -285
  394. package/dist/lib/wtconfig/environment.test.js.map +0 -1
  395. package/dist/lib/wtlink/config-manifest.test.d.ts +0 -2
  396. package/dist/lib/wtlink/config-manifest.test.d.ts.map +0 -1
  397. package/dist/lib/wtlink/config-manifest.test.js +0 -486
  398. package/dist/lib/wtlink/config-manifest.test.js.map +0 -1
  399. package/dist/lib/wtlink/link-configs.test.d.ts +0 -2
  400. package/dist/lib/wtlink/link-configs.test.d.ts.map +0 -1
  401. package/dist/lib/wtlink/link-configs.test.js +0 -612
  402. package/dist/lib/wtlink/link-configs.test.js.map +0 -1
  403. package/dist/lib/wtlink/main-menu.test.d.ts +0 -5
  404. package/dist/lib/wtlink/main-menu.test.d.ts.map +0 -1
  405. package/dist/lib/wtlink/main-menu.test.js +0 -126
  406. package/dist/lib/wtlink/main-menu.test.js.map +0 -1
  407. package/dist/lib/wtlink/manage-manifest.test.d.ts +0 -2
  408. package/dist/lib/wtlink/manage-manifest.test.d.ts.map +0 -1
  409. package/dist/lib/wtlink/manage-manifest.test.js +0 -714
  410. package/dist/lib/wtlink/manage-manifest.test.js.map +0 -1
  411. package/dist/lib/wtlink/validate-manifest.test.d.ts +0 -2
  412. package/dist/lib/wtlink/validate-manifest.test.d.ts.map +0 -1
  413. package/dist/lib/wtlink/validate-manifest.test.js +0 -220
  414. package/dist/lib/wtlink/validate-manifest.test.js.map +0 -1
  415. package/dist/lib/wtstate/analyze.test.d.ts +0 -5
  416. package/dist/lib/wtstate/analyze.test.d.ts.map +0 -1
  417. package/dist/lib/wtstate/analyze.test.js +0 -282
  418. package/dist/lib/wtstate/analyze.test.js.map +0 -1
  419. package/dist/lib/wtstate/args.test.d.ts +0 -5
  420. package/dist/lib/wtstate/args.test.d.ts.map +0 -1
  421. package/dist/lib/wtstate/args.test.js +0 -120
  422. package/dist/lib/wtstate/args.test.js.map +0 -1
  423. package/dist/mcp/server.test.d.ts +0 -9
  424. package/dist/mcp/server.test.d.ts.map +0 -1
  425. package/dist/mcp/server.test.js +0 -550
  426. 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