@camaradesuk/git-worktree-tools 1.9.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 (531) hide show
  1. package/README.md +52 -31
  2. package/dist/cli/cleanpr.js +74 -53
  3. package/dist/cli/cleanpr.js.map +1 -1
  4. package/dist/cli/lswt.js +32 -56
  5. package/dist/cli/lswt.js.map +1 -1
  6. package/dist/cli/newpr.d.ts +13 -1
  7. package/dist/cli/newpr.d.ts.map +1 -1
  8. package/dist/cli/newpr.js +159 -153
  9. package/dist/cli/newpr.js.map +1 -1
  10. package/dist/cli/prs.d.ts +3 -10
  11. package/dist/cli/prs.d.ts.map +1 -1
  12. package/dist/cli/prs.js +6 -168
  13. package/dist/cli/prs.js.map +1 -1
  14. package/dist/cli/wt/clean.d.ts +6 -2
  15. package/dist/cli/wt/clean.d.ts.map +1 -1
  16. package/dist/cli/wt/clean.js +401 -20
  17. package/dist/cli/wt/clean.js.map +1 -1
  18. package/dist/cli/wt/completion.d.ts +3 -0
  19. package/dist/cli/wt/completion.d.ts.map +1 -1
  20. package/dist/cli/wt/completion.js +80 -9
  21. package/dist/cli/wt/completion.js.map +1 -1
  22. package/dist/cli/wt/config.d.ts +3 -1
  23. package/dist/cli/wt/config.d.ts.map +1 -1
  24. package/dist/cli/wt/config.js +323 -32
  25. package/dist/cli/wt/config.js.map +1 -1
  26. package/dist/cli/wt/interactive-menu.d.ts +2 -0
  27. package/dist/cli/wt/interactive-menu.d.ts.map +1 -1
  28. package/dist/cli/wt/interactive-menu.js +346 -73
  29. package/dist/cli/wt/interactive-menu.js.map +1 -1
  30. package/dist/cli/wt/link.d.ts +3 -1
  31. package/dist/cli/wt/link.d.ts.map +1 -1
  32. package/dist/cli/wt/link.js +125 -38
  33. package/dist/cli/wt/link.js.map +1 -1
  34. package/dist/cli/wt/list.d.ts +4 -1
  35. package/dist/cli/wt/list.d.ts.map +1 -1
  36. package/dist/cli/wt/list.js +85 -16
  37. package/dist/cli/wt/list.js.map +1 -1
  38. package/dist/cli/wt/new.d.ts +8 -2
  39. package/dist/cli/wt/new.d.ts.map +1 -1
  40. package/dist/cli/wt/new.js +91 -46
  41. package/dist/cli/wt/new.js.map +1 -1
  42. package/dist/cli/wt/prs.d.ts +2 -1
  43. package/dist/cli/wt/prs.d.ts.map +1 -1
  44. package/dist/cli/wt/prs.js +3 -164
  45. package/dist/cli/wt/prs.js.map +1 -1
  46. package/dist/cli/wt/run-command.d.ts +4 -2
  47. package/dist/cli/wt/run-command.d.ts.map +1 -1
  48. package/dist/cli/wt/run-command.js +6 -4
  49. package/dist/cli/wt/run-command.js.map +1 -1
  50. package/dist/cli/wt/state.d.ts +3 -1
  51. package/dist/cli/wt/state.d.ts.map +1 -1
  52. package/dist/cli/wt/state.js +74 -10
  53. package/dist/cli/wt/state.js.map +1 -1
  54. package/dist/cli/wt.d.ts.map +1 -1
  55. package/dist/cli/wt.js +50 -36
  56. package/dist/cli/wt.js.map +1 -1
  57. package/dist/cli/wtconfig.js +99 -22
  58. package/dist/cli/wtconfig.js.map +1 -1
  59. package/dist/cli/wtlink.js +85 -61
  60. package/dist/cli/wtlink.js.map +1 -1
  61. package/dist/cli/wtstate.js +21 -2
  62. package/dist/cli/wtstate.js.map +1 -1
  63. package/dist/lib/cleanpr/args.d.ts.map +1 -1
  64. package/dist/lib/cleanpr/args.js +20 -0
  65. package/dist/lib/cleanpr/args.js.map +1 -1
  66. package/dist/lib/cleanpr/types.d.ts +6 -0
  67. package/dist/lib/cleanpr/types.d.ts.map +1 -1
  68. package/dist/lib/colors.d.ts +5 -0
  69. package/dist/lib/colors.d.ts.map +1 -1
  70. package/dist/lib/colors.js +13 -6
  71. package/dist/lib/colors.js.map +1 -1
  72. package/dist/lib/constants.d.ts +12 -4
  73. package/dist/lib/constants.d.ts.map +1 -1
  74. package/dist/lib/constants.js +24 -5
  75. package/dist/lib/constants.js.map +1 -1
  76. package/dist/lib/deprecation.d.ts +18 -0
  77. package/dist/lib/deprecation.d.ts.map +1 -0
  78. package/dist/lib/deprecation.js +28 -0
  79. package/dist/lib/deprecation.js.map +1 -0
  80. package/dist/lib/logger.d.ts +40 -155
  81. package/dist/lib/logger.d.ts.map +1 -1
  82. package/dist/lib/logger.js +349 -420
  83. package/dist/lib/logger.js.map +1 -1
  84. package/dist/lib/lswt/args.d.ts.map +1 -1
  85. package/dist/lib/lswt/args.js +15 -1
  86. package/dist/lib/lswt/args.js.map +1 -1
  87. package/dist/lib/lswt/index.d.ts +1 -0
  88. package/dist/lib/lswt/index.d.ts.map +1 -1
  89. package/dist/lib/lswt/index.js +2 -0
  90. package/dist/lib/lswt/index.js.map +1 -1
  91. package/dist/lib/lswt/table.d.ts +15 -0
  92. package/dist/lib/lswt/table.d.ts.map +1 -0
  93. package/dist/lib/lswt/table.js +61 -0
  94. package/dist/lib/lswt/table.js.map +1 -0
  95. package/dist/lib/lswt/types.d.ts +4 -0
  96. package/dist/lib/lswt/types.d.ts.map +1 -1
  97. package/dist/lib/newpr/args.d.ts.map +1 -1
  98. package/dist/lib/newpr/args.js +21 -0
  99. package/dist/lib/newpr/args.js.map +1 -1
  100. package/dist/lib/newpr/types.d.ts +6 -0
  101. package/dist/lib/newpr/types.d.ts.map +1 -1
  102. package/dist/lib/prs/command.d.ts +21 -0
  103. package/dist/lib/prs/command.d.ts.map +1 -0
  104. package/dist/lib/prs/command.js +175 -0
  105. package/dist/lib/prs/command.js.map +1 -0
  106. package/dist/lib/prs/interactive.d.ts.map +1 -1
  107. package/dist/lib/prs/interactive.js +15 -2
  108. package/dist/lib/prs/interactive.js.map +1 -1
  109. package/dist/lib/prs/types.d.ts +15 -0
  110. package/dist/lib/prs/types.d.ts.map +1 -1
  111. package/dist/lib/ui/error.d.ts +31 -0
  112. package/dist/lib/ui/error.d.ts.map +1 -0
  113. package/dist/lib/ui/error.js +47 -0
  114. package/dist/lib/ui/error.js.map +1 -0
  115. package/dist/lib/ui/index.d.ts +15 -0
  116. package/dist/lib/ui/index.d.ts.map +1 -0
  117. package/dist/lib/ui/index.js +19 -0
  118. package/dist/lib/ui/index.js.map +1 -0
  119. package/dist/lib/ui/output.d.ts +18 -0
  120. package/dist/lib/ui/output.d.ts.map +1 -0
  121. package/dist/lib/ui/output.js +31 -0
  122. package/dist/lib/ui/output.js.map +1 -0
  123. package/dist/lib/ui/spinner.d.ts +10 -0
  124. package/dist/lib/ui/spinner.d.ts.map +1 -0
  125. package/dist/lib/ui/spinner.js +10 -0
  126. package/dist/lib/ui/spinner.js.map +1 -0
  127. package/dist/lib/ui/status.d.ts +65 -0
  128. package/dist/lib/ui/status.d.ts.map +1 -0
  129. package/dist/lib/ui/status.js +100 -0
  130. package/dist/lib/ui/status.js.map +1 -0
  131. package/dist/lib/ui/table.d.ts +39 -0
  132. package/dist/lib/ui/table.d.ts.map +1 -0
  133. package/dist/lib/ui/table.js +45 -0
  134. package/dist/lib/ui/table.js.map +1 -0
  135. package/dist/lib/ui/theme.d.ts +34 -0
  136. package/dist/lib/ui/theme.d.ts.map +1 -0
  137. package/dist/lib/ui/theme.js +37 -0
  138. package/dist/lib/ui/theme.js.map +1 -0
  139. package/dist/lib/wtlink/link-configs.js +7 -7
  140. package/dist/lib/wtlink/link-configs.js.map +1 -1
  141. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
  142. package/dist/lib/wtlink/validate-manifest.js +5 -5
  143. package/dist/lib/wtlink/validate-manifest.js.map +1 -1
  144. package/dist/lib/wtstate/args.d.ts.map +1 -1
  145. package/dist/lib/wtstate/args.js +2 -0
  146. package/dist/lib/wtstate/args.js.map +1 -1
  147. package/dist/mcp/server.d.ts +2 -1
  148. package/dist/mcp/server.d.ts.map +1 -1
  149. package/dist/mcp/server.js +264 -44
  150. package/dist/mcp/server.js.map +1 -1
  151. package/package.json +13 -3
  152. package/dist/api/list.test.d.ts +0 -5
  153. package/dist/api/list.test.d.ts.map +0 -1
  154. package/dist/api/list.test.js +0 -390
  155. package/dist/api/list.test.js.map +0 -1
  156. package/dist/cli/cleanpr.test.d.ts +0 -2
  157. package/dist/cli/cleanpr.test.d.ts.map +0 -1
  158. package/dist/cli/cleanpr.test.js +0 -954
  159. package/dist/cli/cleanpr.test.js.map +0 -1
  160. package/dist/cli/lswt.test.d.ts +0 -2
  161. package/dist/cli/lswt.test.d.ts.map +0 -1
  162. package/dist/cli/lswt.test.js +0 -386
  163. package/dist/cli/lswt.test.js.map +0 -1
  164. package/dist/cli/newpr.test.d.ts +0 -2
  165. package/dist/cli/newpr.test.d.ts.map +0 -1
  166. package/dist/cli/newpr.test.js +0 -1182
  167. package/dist/cli/newpr.test.js.map +0 -1
  168. package/dist/cli/prs.test.d.ts +0 -8
  169. package/dist/cli/prs.test.d.ts.map +0 -1
  170. package/dist/cli/prs.test.js +0 -410
  171. package/dist/cli/prs.test.js.map +0 -1
  172. package/dist/cli/wt/completion.test.d.ts +0 -5
  173. package/dist/cli/wt/completion.test.d.ts.map +0 -1
  174. package/dist/cli/wt/completion.test.js +0 -173
  175. package/dist/cli/wt/completion.test.js.map +0 -1
  176. package/dist/cli/wt/config.test.d.ts +0 -5
  177. package/dist/cli/wt/config.test.d.ts.map +0 -1
  178. package/dist/cli/wt/config.test.js +0 -260
  179. package/dist/cli/wt/config.test.js.map +0 -1
  180. package/dist/cli/wt/entry.test.d.ts +0 -8
  181. package/dist/cli/wt/entry.test.d.ts.map +0 -1
  182. package/dist/cli/wt/entry.test.js +0 -201
  183. package/dist/cli/wt/entry.test.js.map +0 -1
  184. package/dist/cli/wt/init.test.d.ts +0 -5
  185. package/dist/cli/wt/init.test.d.ts.map +0 -1
  186. package/dist/cli/wt/init.test.js +0 -165
  187. package/dist/cli/wt/init.test.js.map +0 -1
  188. package/dist/cli/wt/init.unit.test.d.ts +0 -5
  189. package/dist/cli/wt/init.unit.test.d.ts.map +0 -1
  190. package/dist/cli/wt/init.unit.test.js +0 -432
  191. package/dist/cli/wt/init.unit.test.js.map +0 -1
  192. package/dist/cli/wt/interactive-menu.test.d.ts +0 -10
  193. package/dist/cli/wt/interactive-menu.test.d.ts.map +0 -1
  194. package/dist/cli/wt/interactive-menu.test.js +0 -739
  195. package/dist/cli/wt/interactive-menu.test.js.map +0 -1
  196. package/dist/cli/wt/prs.test.d.ts +0 -5
  197. package/dist/cli/wt/prs.test.d.ts.map +0 -1
  198. package/dist/cli/wt/prs.test.js +0 -410
  199. package/dist/cli/wt/prs.test.js.map +0 -1
  200. package/dist/cli/wt/run-command.test.d.ts +0 -5
  201. package/dist/cli/wt/run-command.test.d.ts.map +0 -1
  202. package/dist/cli/wt/run-command.test.js +0 -88
  203. package/dist/cli/wt/run-command.test.js.map +0 -1
  204. package/dist/cli/wt/wt.test.d.ts +0 -8
  205. package/dist/cli/wt/wt.test.d.ts.map +0 -1
  206. package/dist/cli/wt/wt.test.js +0 -521
  207. package/dist/cli/wt/wt.test.js.map +0 -1
  208. package/dist/cli/wt.unit.test.d.ts +0 -7
  209. package/dist/cli/wt.unit.test.d.ts.map +0 -1
  210. package/dist/cli/wt.unit.test.js +0 -182
  211. package/dist/cli/wt.unit.test.js.map +0 -1
  212. package/dist/cli/wtconfig.test.d.ts +0 -5
  213. package/dist/cli/wtconfig.test.d.ts.map +0 -1
  214. package/dist/cli/wtconfig.test.js +0 -1289
  215. package/dist/cli/wtconfig.test.js.map +0 -1
  216. package/dist/cli/wtlink.test.d.ts +0 -2
  217. package/dist/cli/wtlink.test.d.ts.map +0 -1
  218. package/dist/cli/wtlink.test.js +0 -249
  219. package/dist/cli/wtlink.test.js.map +0 -1
  220. package/dist/cli/wtstate.test.d.ts +0 -5
  221. package/dist/cli/wtstate.test.d.ts.map +0 -1
  222. package/dist/cli/wtstate.test.js +0 -193
  223. package/dist/cli/wtstate.test.js.map +0 -1
  224. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +0 -2
  225. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +0 -1
  226. package/dist/e2e/cleanpr/cleanpr.e2e.test.js +0 -326
  227. package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +0 -1
  228. package/dist/e2e/cli.e2e.test.d.ts +0 -2
  229. package/dist/e2e/cli.e2e.test.d.ts.map +0 -1
  230. package/dist/e2e/cli.e2e.test.js +0 -417
  231. package/dist/e2e/cli.e2e.test.js.map +0 -1
  232. package/dist/e2e/lswt/lswt.e2e.test.d.ts +0 -2
  233. package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +0 -1
  234. package/dist/e2e/lswt/lswt.e2e.test.js +0 -361
  235. package/dist/e2e/lswt/lswt.e2e.test.js.map +0 -1
  236. package/dist/e2e/newpr/newpr.e2e.test.d.ts +0 -2
  237. package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +0 -1
  238. package/dist/e2e/newpr/newpr.e2e.test.js +0 -286
  239. package/dist/e2e/newpr/newpr.e2e.test.js.map +0 -1
  240. package/dist/e2e/newpr/scenarios.e2e.test.d.ts +0 -2
  241. package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +0 -1
  242. package/dist/e2e/newpr/scenarios.e2e.test.js +0 -426
  243. package/dist/e2e/newpr/scenarios.e2e.test.js.map +0 -1
  244. package/dist/e2e/newpr-full-flow.e2e.test.d.ts +0 -2
  245. package/dist/e2e/newpr-full-flow.e2e.test.d.ts.map +0 -1
  246. package/dist/e2e/newpr-full-flow.e2e.test.js +0 -280
  247. package/dist/e2e/newpr-full-flow.e2e.test.js.map +0 -1
  248. package/dist/e2e/prs/prs.e2e.test.d.ts +0 -7
  249. package/dist/e2e/prs/prs.e2e.test.d.ts.map +0 -1
  250. package/dist/e2e/prs/prs.e2e.test.js +0 -606
  251. package/dist/e2e/prs/prs.e2e.test.js.map +0 -1
  252. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +0 -2
  253. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +0 -1
  254. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +0 -298
  255. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +0 -1
  256. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts +0 -8
  257. package/dist/e2e/wt/interactive-menu.e2e.test.d.ts.map +0 -1
  258. package/dist/e2e/wt/interactive-menu.e2e.test.js +0 -583
  259. package/dist/e2e/wt/interactive-menu.e2e.test.js.map +0 -1
  260. package/dist/e2e/wt/wt.e2e.test.d.ts +0 -9
  261. package/dist/e2e/wt/wt.e2e.test.d.ts.map +0 -1
  262. package/dist/e2e/wt/wt.e2e.test.js +0 -597
  263. package/dist/e2e/wt/wt.e2e.test.js.map +0 -1
  264. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +0 -2
  265. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +0 -1
  266. package/dist/e2e/wtlink/wtlink.e2e.test.js +0 -416
  267. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +0 -1
  268. package/dist/integration/git.integration.test.d.ts +0 -2
  269. package/dist/integration/git.integration.test.d.ts.map +0 -1
  270. package/dist/integration/git.integration.test.js +0 -336
  271. package/dist/integration/git.integration.test.js.map +0 -1
  272. package/dist/integration/lswt-remote-pr.integration.test.d.ts +0 -2
  273. package/dist/integration/lswt-remote-pr.integration.test.d.ts.map +0 -1
  274. package/dist/integration/lswt-remote-pr.integration.test.js +0 -222
  275. package/dist/integration/lswt-remote-pr.integration.test.js.map +0 -1
  276. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts +0 -2
  277. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts.map +0 -1
  278. package/dist/integration/newpr-branchfrom-head.integration.test.js +0 -498
  279. package/dist/integration/newpr-branchfrom-head.integration.test.js.map +0 -1
  280. package/dist/integration/newpr.integration.test.d.ts +0 -2
  281. package/dist/integration/newpr.integration.test.d.ts.map +0 -1
  282. package/dist/integration/newpr.integration.test.js +0 -460
  283. package/dist/integration/newpr.integration.test.js.map +0 -1
  284. package/dist/integration/prs.integration.test.d.ts +0 -8
  285. package/dist/integration/prs.integration.test.d.ts.map +0 -1
  286. package/dist/integration/prs.integration.test.js +0 -478
  287. package/dist/integration/prs.integration.test.js.map +0 -1
  288. package/dist/lib/ai/base-provider.test.d.ts +0 -7
  289. package/dist/lib/ai/base-provider.test.d.ts.map +0 -1
  290. package/dist/lib/ai/base-provider.test.js +0 -319
  291. package/dist/lib/ai/base-provider.test.js.map +0 -1
  292. package/dist/lib/ai/cli-provider.test.d.ts +0 -5
  293. package/dist/lib/ai/cli-provider.test.d.ts.map +0 -1
  294. package/dist/lib/ai/cli-provider.test.js +0 -460
  295. package/dist/lib/ai/cli-provider.test.js.map +0 -1
  296. package/dist/lib/ai/fallback-provider.test.d.ts +0 -7
  297. package/dist/lib/ai/fallback-provider.test.d.ts.map +0 -1
  298. package/dist/lib/ai/fallback-provider.test.js +0 -165
  299. package/dist/lib/ai/fallback-provider.test.js.map +0 -1
  300. package/dist/lib/ai/generation-service.test.d.ts +0 -7
  301. package/dist/lib/ai/generation-service.test.d.ts.map +0 -1
  302. package/dist/lib/ai/generation-service.test.js +0 -213
  303. package/dist/lib/ai/generation-service.test.js.map +0 -1
  304. package/dist/lib/ai/provider-manager.test.d.ts +0 -5
  305. package/dist/lib/ai/provider-manager.test.d.ts.map +0 -1
  306. package/dist/lib/ai/provider-manager.test.js +0 -312
  307. package/dist/lib/ai/provider-manager.test.js.map +0 -1
  308. package/dist/lib/ai/repo-docs.test.d.ts +0 -5
  309. package/dist/lib/ai/repo-docs.test.d.ts.map +0 -1
  310. package/dist/lib/ai/repo-docs.test.js +0 -357
  311. package/dist/lib/ai/repo-docs.test.js.map +0 -1
  312. package/dist/lib/cleanpr/args.test.d.ts +0 -2
  313. package/dist/lib/cleanpr/args.test.d.ts.map +0 -1
  314. package/dist/lib/cleanpr/args.test.js +0 -269
  315. package/dist/lib/cleanpr/args.test.js.map +0 -1
  316. package/dist/lib/cleanpr/cleanup.test.d.ts +0 -2
  317. package/dist/lib/cleanpr/cleanup.test.d.ts.map +0 -1
  318. package/dist/lib/cleanpr/cleanup.test.js +0 -296
  319. package/dist/lib/cleanpr/cleanup.test.js.map +0 -1
  320. package/dist/lib/cleanpr/worktree-info.test.d.ts +0 -2
  321. package/dist/lib/cleanpr/worktree-info.test.d.ts.map +0 -1
  322. package/dist/lib/cleanpr/worktree-info.test.js +0 -228
  323. package/dist/lib/cleanpr/worktree-info.test.js.map +0 -1
  324. package/dist/lib/colors.test.d.ts +0 -2
  325. package/dist/lib/colors.test.d.ts.map +0 -1
  326. package/dist/lib/colors.test.js +0 -142
  327. package/dist/lib/colors.test.js.map +0 -1
  328. package/dist/lib/config-editor.test.d.ts +0 -11
  329. package/dist/lib/config-editor.test.d.ts.map +0 -1
  330. package/dist/lib/config-editor.test.js +0 -526
  331. package/dist/lib/config-editor.test.js.map +0 -1
  332. package/dist/lib/config-migration/detector.test.d.ts +0 -5
  333. package/dist/lib/config-migration/detector.test.d.ts.map +0 -1
  334. package/dist/lib/config-migration/detector.test.js +0 -201
  335. package/dist/lib/config-migration/detector.test.js.map +0 -1
  336. package/dist/lib/config-migration/reporter.test.d.ts +0 -5
  337. package/dist/lib/config-migration/reporter.test.d.ts.map +0 -1
  338. package/dist/lib/config-migration/reporter.test.js +0 -305
  339. package/dist/lib/config-migration/reporter.test.js.map +0 -1
  340. package/dist/lib/config-migration/runner.test.d.ts +0 -5
  341. package/dist/lib/config-migration/runner.test.d.ts.map +0 -1
  342. package/dist/lib/config-migration/runner.test.js +0 -235
  343. package/dist/lib/config-migration/runner.test.js.map +0 -1
  344. package/dist/lib/config-validation.test.d.ts +0 -5
  345. package/dist/lib/config-validation.test.d.ts.map +0 -1
  346. package/dist/lib/config-validation.test.js +0 -423
  347. package/dist/lib/config-validation.test.js.map +0 -1
  348. package/dist/lib/config.test.d.ts +0 -2
  349. package/dist/lib/config.test.d.ts.map +0 -1
  350. package/dist/lib/config.test.js +0 -566
  351. package/dist/lib/config.test.js.map +0 -1
  352. package/dist/lib/constants.test.d.ts +0 -5
  353. package/dist/lib/constants.test.d.ts.map +0 -1
  354. package/dist/lib/constants.test.js +0 -121
  355. package/dist/lib/constants.test.js.map +0 -1
  356. package/dist/lib/errors.test.d.ts +0 -2
  357. package/dist/lib/errors.test.d.ts.map +0 -1
  358. package/dist/lib/errors.test.js +0 -117
  359. package/dist/lib/errors.test.js.map +0 -1
  360. package/dist/lib/git.test.d.ts +0 -2
  361. package/dist/lib/git.test.d.ts.map +0 -1
  362. package/dist/lib/git.test.js +0 -608
  363. package/dist/lib/git.test.js.map +0 -1
  364. package/dist/lib/github.test.d.ts +0 -2
  365. package/dist/lib/github.test.d.ts.map +0 -1
  366. package/dist/lib/github.test.js +0 -441
  367. package/dist/lib/github.test.js.map +0 -1
  368. package/dist/lib/global-check.test.d.ts +0 -5
  369. package/dist/lib/global-check.test.d.ts.map +0 -1
  370. package/dist/lib/global-check.test.js +0 -150
  371. package/dist/lib/global-check.test.js.map +0 -1
  372. package/dist/lib/global-config.test.d.ts +0 -5
  373. package/dist/lib/global-config.test.d.ts.map +0 -1
  374. package/dist/lib/global-config.test.js +0 -282
  375. package/dist/lib/global-config.test.js.map +0 -1
  376. package/dist/lib/hooks/confirmation.test.d.ts +0 -7
  377. package/dist/lib/hooks/confirmation.test.d.ts.map +0 -1
  378. package/dist/lib/hooks/confirmation.test.js +0 -300
  379. package/dist/lib/hooks/confirmation.test.js.map +0 -1
  380. package/dist/lib/hooks/executor.test.d.ts +0 -5
  381. package/dist/lib/hooks/executor.test.d.ts.map +0 -1
  382. package/dist/lib/hooks/executor.test.js +0 -648
  383. package/dist/lib/hooks/executor.test.js.map +0 -1
  384. package/dist/lib/hooks/templates.test.d.ts +0 -5
  385. package/dist/lib/hooks/templates.test.d.ts.map +0 -1
  386. package/dist/lib/hooks/templates.test.js +0 -163
  387. package/dist/lib/hooks/templates.test.js.map +0 -1
  388. package/dist/lib/hooks/types.test.d.ts +0 -5
  389. package/dist/lib/hooks/types.test.d.ts.map +0 -1
  390. package/dist/lib/hooks/types.test.js +0 -132
  391. package/dist/lib/hooks/types.test.js.map +0 -1
  392. package/dist/lib/json-output.test.d.ts +0 -5
  393. package/dist/lib/json-output.test.d.ts.map +0 -1
  394. package/dist/lib/json-output.test.js +0 -261
  395. package/dist/lib/json-output.test.js.map +0 -1
  396. package/dist/lib/logger.test.d.ts +0 -5
  397. package/dist/lib/logger.test.d.ts.map +0 -1
  398. package/dist/lib/logger.test.js +0 -292
  399. package/dist/lib/logger.test.js.map +0 -1
  400. package/dist/lib/lswt/action-executors.test.d.ts +0 -2
  401. package/dist/lib/lswt/action-executors.test.d.ts.map +0 -1
  402. package/dist/lib/lswt/action-executors.test.js +0 -1127
  403. package/dist/lib/lswt/action-executors.test.js.map +0 -1
  404. package/dist/lib/lswt/actions.test.d.ts +0 -2
  405. package/dist/lib/lswt/actions.test.d.ts.map +0 -1
  406. package/dist/lib/lswt/actions.test.js +0 -497
  407. package/dist/lib/lswt/actions.test.js.map +0 -1
  408. package/dist/lib/lswt/args.test.d.ts +0 -2
  409. package/dist/lib/lswt/args.test.d.ts.map +0 -1
  410. package/dist/lib/lswt/args.test.js +0 -195
  411. package/dist/lib/lswt/args.test.js.map +0 -1
  412. package/dist/lib/lswt/environment.test.d.ts +0 -2
  413. package/dist/lib/lswt/environment.test.d.ts.map +0 -1
  414. package/dist/lib/lswt/environment.test.js +0 -544
  415. package/dist/lib/lswt/environment.test.js.map +0 -1
  416. package/dist/lib/lswt/formatters.test.d.ts +0 -2
  417. package/dist/lib/lswt/formatters.test.d.ts.map +0 -1
  418. package/dist/lib/lswt/formatters.test.js +0 -323
  419. package/dist/lib/lswt/formatters.test.js.map +0 -1
  420. package/dist/lib/lswt/fuzzy-search.test.d.ts +0 -5
  421. package/dist/lib/lswt/fuzzy-search.test.d.ts.map +0 -1
  422. package/dist/lib/lswt/fuzzy-search.test.js +0 -207
  423. package/dist/lib/lswt/fuzzy-search.test.js.map +0 -1
  424. package/dist/lib/lswt/interactive.test.d.ts +0 -2
  425. package/dist/lib/lswt/interactive.test.d.ts.map +0 -1
  426. package/dist/lib/lswt/interactive.test.js +0 -771
  427. package/dist/lib/lswt/interactive.test.js.map +0 -1
  428. package/dist/lib/lswt/worktree-info.test.d.ts +0 -2
  429. package/dist/lib/lswt/worktree-info.test.d.ts.map +0 -1
  430. package/dist/lib/lswt/worktree-info.test.js +0 -484
  431. package/dist/lib/lswt/worktree-info.test.js.map +0 -1
  432. package/dist/lib/newpr/action-deps.test.d.ts +0 -5
  433. package/dist/lib/newpr/action-deps.test.d.ts.map +0 -1
  434. package/dist/lib/newpr/action-deps.test.js +0 -111
  435. package/dist/lib/newpr/action-deps.test.js.map +0 -1
  436. package/dist/lib/newpr/actions.test.d.ts +0 -2
  437. package/dist/lib/newpr/actions.test.d.ts.map +0 -1
  438. package/dist/lib/newpr/actions.test.js +0 -254
  439. package/dist/lib/newpr/actions.test.js.map +0 -1
  440. package/dist/lib/newpr/args.test.d.ts +0 -2
  441. package/dist/lib/newpr/args.test.d.ts.map +0 -1
  442. package/dist/lib/newpr/args.test.js +0 -479
  443. package/dist/lib/newpr/args.test.js.map +0 -1
  444. package/dist/lib/newpr/hook-runner.test.d.ts +0 -7
  445. package/dist/lib/newpr/hook-runner.test.d.ts.map +0 -1
  446. package/dist/lib/newpr/hook-runner.test.js +0 -422
  447. package/dist/lib/newpr/hook-runner.test.js.map +0 -1
  448. package/dist/lib/newpr/plan-generator.test.d.ts +0 -7
  449. package/dist/lib/newpr/plan-generator.test.d.ts.map +0 -1
  450. package/dist/lib/newpr/plan-generator.test.js +0 -387
  451. package/dist/lib/newpr/plan-generator.test.js.map +0 -1
  452. package/dist/lib/newpr/scenario-handler.test.d.ts +0 -2
  453. package/dist/lib/newpr/scenario-handler.test.d.ts.map +0 -1
  454. package/dist/lib/newpr/scenario-handler.test.js +0 -256
  455. package/dist/lib/newpr/scenario-handler.test.js.map +0 -1
  456. package/dist/lib/prompts.test.d.ts +0 -2
  457. package/dist/lib/prompts.test.d.ts.map +0 -1
  458. package/dist/lib/prompts.test.js +0 -807
  459. package/dist/lib/prompts.test.js.map +0 -1
  460. package/dist/lib/prs/actions.test.d.ts +0 -5
  461. package/dist/lib/prs/actions.test.d.ts.map +0 -1
  462. package/dist/lib/prs/actions.test.js +0 -356
  463. package/dist/lib/prs/actions.test.js.map +0 -1
  464. package/dist/lib/prs/data.test.d.ts +0 -5
  465. package/dist/lib/prs/data.test.d.ts.map +0 -1
  466. package/dist/lib/prs/data.test.js +0 -417
  467. package/dist/lib/prs/data.test.js.map +0 -1
  468. package/dist/lib/prs/details.test.d.ts +0 -5
  469. package/dist/lib/prs/details.test.d.ts.map +0 -1
  470. package/dist/lib/prs/details.test.js +0 -325
  471. package/dist/lib/prs/details.test.js.map +0 -1
  472. package/dist/lib/prs/filters.test.d.ts +0 -5
  473. package/dist/lib/prs/filters.test.d.ts.map +0 -1
  474. package/dist/lib/prs/filters.test.js +0 -312
  475. package/dist/lib/prs/filters.test.js.map +0 -1
  476. package/dist/lib/prs/formatters.test.d.ts +0 -2
  477. package/dist/lib/prs/formatters.test.d.ts.map +0 -1
  478. package/dist/lib/prs/formatters.test.js +0 -387
  479. package/dist/lib/prs/formatters.test.js.map +0 -1
  480. package/dist/lib/prs/interactive.test.d.ts +0 -5
  481. package/dist/lib/prs/interactive.test.d.ts.map +0 -1
  482. package/dist/lib/prs/interactive.test.js +0 -364
  483. package/dist/lib/prs/interactive.test.js.map +0 -1
  484. package/dist/lib/schema.test.d.ts +0 -10
  485. package/dist/lib/schema.test.d.ts.map +0 -1
  486. package/dist/lib/schema.test.js +0 -309
  487. package/dist/lib/schema.test.js.map +0 -1
  488. package/dist/lib/state-detection.test.d.ts +0 -2
  489. package/dist/lib/state-detection.test.d.ts.map +0 -1
  490. package/dist/lib/state-detection.test.js +0 -451
  491. package/dist/lib/state-detection.test.js.map +0 -1
  492. package/dist/lib/wtconfig/config-manager.test.d.ts +0 -5
  493. package/dist/lib/wtconfig/config-manager.test.d.ts.map +0 -1
  494. package/dist/lib/wtconfig/config-manager.test.js +0 -501
  495. package/dist/lib/wtconfig/config-manager.test.js.map +0 -1
  496. package/dist/lib/wtconfig/environment.test.d.ts +0 -5
  497. package/dist/lib/wtconfig/environment.test.d.ts.map +0 -1
  498. package/dist/lib/wtconfig/environment.test.js +0 -285
  499. package/dist/lib/wtconfig/environment.test.js.map +0 -1
  500. package/dist/lib/wtlink/config-manifest.test.d.ts +0 -2
  501. package/dist/lib/wtlink/config-manifest.test.d.ts.map +0 -1
  502. package/dist/lib/wtlink/config-manifest.test.js +0 -486
  503. package/dist/lib/wtlink/config-manifest.test.js.map +0 -1
  504. package/dist/lib/wtlink/link-configs.test.d.ts +0 -2
  505. package/dist/lib/wtlink/link-configs.test.d.ts.map +0 -1
  506. package/dist/lib/wtlink/link-configs.test.js +0 -612
  507. package/dist/lib/wtlink/link-configs.test.js.map +0 -1
  508. package/dist/lib/wtlink/main-menu.test.d.ts +0 -5
  509. package/dist/lib/wtlink/main-menu.test.d.ts.map +0 -1
  510. package/dist/lib/wtlink/main-menu.test.js +0 -126
  511. package/dist/lib/wtlink/main-menu.test.js.map +0 -1
  512. package/dist/lib/wtlink/manage-manifest.test.d.ts +0 -2
  513. package/dist/lib/wtlink/manage-manifest.test.d.ts.map +0 -1
  514. package/dist/lib/wtlink/manage-manifest.test.js +0 -714
  515. package/dist/lib/wtlink/manage-manifest.test.js.map +0 -1
  516. package/dist/lib/wtlink/validate-manifest.test.d.ts +0 -2
  517. package/dist/lib/wtlink/validate-manifest.test.d.ts.map +0 -1
  518. package/dist/lib/wtlink/validate-manifest.test.js +0 -220
  519. package/dist/lib/wtlink/validate-manifest.test.js.map +0 -1
  520. package/dist/lib/wtstate/analyze.test.d.ts +0 -5
  521. package/dist/lib/wtstate/analyze.test.d.ts.map +0 -1
  522. package/dist/lib/wtstate/analyze.test.js +0 -282
  523. package/dist/lib/wtstate/analyze.test.js.map +0 -1
  524. package/dist/lib/wtstate/args.test.d.ts +0 -5
  525. package/dist/lib/wtstate/args.test.d.ts.map +0 -1
  526. package/dist/lib/wtstate/args.test.js +0 -120
  527. package/dist/lib/wtstate/args.test.js.map +0 -1
  528. package/dist/mcp/server.test.d.ts +0 -9
  529. package/dist/mcp/server.test.d.ts.map +0 -1
  530. package/dist/mcp/server.test.js +0 -439
  531. package/dist/mcp/server.test.js.map +0 -1
package/dist/cli/newpr.js CHANGED
@@ -6,9 +6,11 @@
6
6
  */
7
7
  import path from 'path';
8
8
  import fs from 'fs';
9
+ import { printDeprecationNotice } from '../lib/deprecation.js';
9
10
  import * as git from '../lib/git.js';
10
11
  import * as github from '../lib/github.js';
11
- import * as colors from '../lib/colors.js';
12
+ import { setColorEnabled } from '../lib/colors.js';
13
+ import { logger, initializeLogger, setAuditContext } from '../lib/logger.js';
12
14
  import { promptChoiceIndex, promptConfirm, withSpinner } from '../lib/prompts.js';
13
15
  import { getEnabledFiles } from '../lib/wtlink/config-manifest.js';
14
16
  import { run as runWtlink } from '../lib/wtlink/link-configs.js';
@@ -17,10 +19,7 @@ import { analyzeGitState, detectScenario } from '../lib/state-detection.js';
17
19
  import { parseArgs, getHelpText, getScenarioContext, isPrWorktreeScenario, isExistingBranchAction, executeStateAction, getBranchPoint, getScenarioMessageLevel, createHookRunner, createActionDeps, } from '../lib/newpr/index.js';
18
20
  import { createSuccessResult, createErrorResult, formatJsonResult, ErrorCode, getErrorCodeFromError, getErrorSuggestion, } from '../lib/json-output.js';
19
21
  import { shouldGeneratePlan, resolvePlanPath, buildPathTemplateVars, generatePlanDocument, } from '../lib/newpr/plan-generator.js';
20
- /**
21
- * Debug logging - enabled with DEBUG=newpr or DEBUG=*
22
- */
23
- const DEBUG_ENABLED = process.env.DEBUG === 'newpr' || process.env.DEBUG === '*' || process.env.DEBUG === '1';
22
+ import { printStatus, printDim, printSummaryBox, printNextSteps, printError, errorToDisplay, setJsonMode, } from '../lib/ui/index.js';
24
23
  /**
25
24
  * Error class for non-interactive mode failures
26
25
  */
@@ -32,47 +31,26 @@ class NonInteractiveError extends Error {
32
31
  this.name = 'NonInteractiveError';
33
32
  }
34
33
  }
35
- function debug(message, data) {
36
- if (!DEBUG_ENABLED)
37
- return;
38
- const timestamp = new Date().toISOString();
39
- console.error(colors.dim(`[DEBUG ${timestamp}] ${message}`));
40
- if (data) {
41
- for (const [key, value] of Object.entries(data)) {
42
- console.error(colors.dim(` ${key}: ${JSON.stringify(value)}`));
43
- }
44
- }
45
- }
46
- /**
47
- * Progress logging - suppressed in JSON mode for clean output
48
- */
49
- function progress(options, ...args) {
50
- if (!options.json) {
51
- console.log(...args);
52
- }
53
- }
54
- /**
55
- * Progress error logging - suppressed in JSON mode
56
- */
57
- function progressError(options, ...args) {
58
- if (!options.json) {
59
- console.error(...args);
60
- }
61
- }
62
34
  /**
63
35
  * Check prerequisites
64
36
  */
65
37
  function checkPrerequisites() {
66
- console.log(colors.info('Checking prerequisites...'));
38
+ printStatus('info', 'Checking prerequisites...');
67
39
  if (!github.isGhInstalled()) {
68
- console.error(colors.error('GitHub CLI (gh) is required. See: https://cli.github.com'));
40
+ printError({
41
+ title: 'GitHub CLI (gh) is required.',
42
+ hint: 'Install: https://cli.github.com',
43
+ });
69
44
  process.exit(1);
70
45
  }
71
46
  if (!github.isAuthenticated()) {
72
- console.error(colors.error('GitHub CLI not authenticated. Run: gh auth login'));
47
+ printError({
48
+ title: 'GitHub CLI not authenticated.',
49
+ hint: 'Run: gh auth login',
50
+ });
73
51
  process.exit(1);
74
52
  }
75
- console.log(colors.success('Prerequisites OK'));
53
+ printStatus('success', 'Prerequisites OK');
76
54
  }
77
55
  /**
78
56
  * Show local commits not in base branch
@@ -136,7 +114,7 @@ async function handleScenario(state, baseBranch, options) {
136
114
  // In non-interactive mode, cannot proceed from PR worktree
137
115
  throw new NonInteractiveError('Cannot create PR from a PR worktree in non-interactive mode. Switch to the main worktree first.', ErrorCode.INVALID_ARGUMENT);
138
116
  }
139
- console.log(colors.warning('You are in a PR worktree, not the main worktree.'));
117
+ printStatus('warning', 'You are in a PR worktree, not the main worktree.');
140
118
  console.log();
141
119
  console.log('Creating a new PR is best done from the main worktree.');
142
120
  const choice = await promptChoiceIndex('How would you like to proceed?', [
@@ -181,10 +159,10 @@ async function handleScenario(state, baseBranch, options) {
181
159
  // Interactive mode: display info and prompt
182
160
  const level = getScenarioMessageLevel(scenario);
183
161
  if (level === 'warning') {
184
- console.log(colors.warning(context.message));
162
+ printStatus('warning', context.message);
185
163
  }
186
164
  else {
187
- console.log(colors.info(context.message));
165
+ printStatus('info', context.message);
188
166
  }
189
167
  if (context.subMessage) {
190
168
  console.log();
@@ -243,7 +221,7 @@ async function setupWorktree(worktreePath, config, options, repoRoot) {
243
221
  const parentDir = path.dirname(repoRoot);
244
222
  // Create symlinks for shared repos
245
223
  if (config.sharedRepos.length > 0) {
246
- progress(options, colors.info('Creating symlinks for shared repositories...'));
224
+ printStatus('info', 'Creating symlinks for shared repositories...');
247
225
  for (const repo of config.sharedRepos) {
248
226
  const target = path.join(parentDir, repo);
249
227
  const link = path.join(worktreePath, repo);
@@ -251,18 +229,18 @@ async function setupWorktree(worktreePath, config, options, repoRoot) {
251
229
  if (!fs.existsSync(link)) {
252
230
  try {
253
231
  fs.symlinkSync(target, link, 'dir');
254
- progress(options, colors.success(`Linked ${repo}`));
232
+ printStatus('success', `Linked ${repo}`);
255
233
  }
256
234
  catch (error) {
257
- progress(options, colors.warning(`Failed to link ${repo}: ${error}`));
235
+ printStatus('warning', `Failed to link ${repo}: ${error}`);
258
236
  }
259
237
  }
260
238
  else {
261
- progress(options, colors.warning(`${repo} already exists in worktree`));
239
+ printStatus('warning', `${repo} already exists in worktree`);
262
240
  }
263
241
  }
264
242
  else {
265
- progress(options, colors.warning(`${repo} not found at ${target}`));
243
+ printStatus('warning', `${repo} not found at ${target}`);
266
244
  }
267
245
  }
268
246
  }
@@ -273,7 +251,7 @@ async function setupWorktree(worktreePath, config, options, repoRoot) {
273
251
  }
274
252
  catch {
275
253
  // If we can't determine main worktree, skip linking
276
- debug('Could not determine main worktree root, skipping config file linking');
254
+ logger.debug('Could not determine main worktree root, skipping config file linking');
277
255
  return;
278
256
  }
279
257
  const enabledFiles = getEnabledFiles(mainWorktreeRoot);
@@ -281,29 +259,28 @@ async function setupWorktree(worktreePath, config, options, repoRoot) {
281
259
  let shouldLink = false;
282
260
  if (config.linkConfigFiles === false) {
283
261
  // Explicitly disabled - skip
284
- debug('linkConfigFiles is false, skipping auto-link');
262
+ logger.debug('linkConfigFiles is false, skipping auto-link');
285
263
  }
286
264
  else if (config.linkConfigFiles === true) {
287
265
  // Explicitly enabled - auto-link
288
266
  shouldLink = true;
289
- debug('linkConfigFiles is true, auto-linking');
267
+ logger.debug('linkConfigFiles is true, auto-linking');
290
268
  }
291
269
  else if (!options.nonInteractive && !options.json) {
292
270
  // Not configured - prompt user
293
- progress(options, '');
294
- progress(options, colors.info(`Found ${enabledFiles.length} config file(s) to link:`));
271
+ printStatus('info', `Found ${enabledFiles.length} config file(s) to link:`);
295
272
  for (const file of enabledFiles.slice(0, 5)) {
296
- progress(options, colors.dim(` - ${file}`));
273
+ printDim(` - ${file}`);
297
274
  }
298
275
  if (enabledFiles.length > 5) {
299
- progress(options, colors.dim(` ... and ${enabledFiles.length - 5} more`));
276
+ printDim(` ... and ${enabledFiles.length - 5} more`);
300
277
  }
301
278
  shouldLink = await promptConfirm('Link these config files from the main worktree?', true);
302
279
  }
303
280
  else {
304
281
  // Non-interactive/JSON mode - default to linking
305
282
  shouldLink = true;
306
- debug('Non-interactive mode, defaulting to auto-link');
283
+ logger.debug('Non-interactive mode, defaulting to auto-link');
307
284
  }
308
285
  if (shouldLink) {
309
286
  try {
@@ -315,11 +292,11 @@ async function setupWorktree(worktreePath, config, options, repoRoot) {
315
292
  type: 'hard',
316
293
  yes: true,
317
294
  });
318
- progress(options, colors.success(`Linked ${enabledFiles.length} config file(s)`));
295
+ printStatus('success', `Linked ${enabledFiles.length} config file(s)`);
319
296
  }
320
297
  catch (error) {
321
298
  const errorMessage = error instanceof Error ? error.message : String(error);
322
- progress(options, colors.warning(`Failed to link config files: ${errorMessage}`));
299
+ printStatus('warning', `Failed to link config files: ${errorMessage}`);
323
300
  }
324
301
  }
325
302
  }
@@ -341,20 +318,16 @@ function printSummary(prNumber, branchName, worktreePath, prUrl, options, extra)
341
318
  console.log(formatJsonResult(createSuccessResult('newpr', data)));
342
319
  return;
343
320
  }
344
- console.log();
345
- console.log(colors.green('════════════════════════════════════════════════════════════'));
346
- console.log(colors.green(` PR #${prNumber} worktree ready!`));
347
- console.log(colors.green('════════════════════════════════════════════════════════════'));
348
- console.log();
349
- console.log(` Branch: ${branchName}`);
350
- console.log(` Worktree: ${worktreePath}`);
351
- console.log(` PR URL: ${prUrl}`);
352
- console.log();
353
- console.log(colors.dim(' Next steps:'));
354
- console.log(colors.dim(` cd ${worktreePath}`));
355
- console.log(colors.dim(` gh pr view ${prNumber} --web # Open PR in browser`));
356
- console.log(colors.dim(` wtlink link # Link config files from main worktree`));
357
- console.log();
321
+ printSummaryBox(`PR #${prNumber} worktree ready!`, [
322
+ { label: 'Branch', value: branchName },
323
+ { label: 'Worktree', value: worktreePath },
324
+ { label: 'PR URL', value: prUrl },
325
+ ]);
326
+ printNextSteps([
327
+ { command: `cd ${worktreePath}` },
328
+ { command: `gh pr view ${prNumber} --web`, description: 'Open PR in browser' },
329
+ { command: 'wtlink link', description: 'Link config files from main worktree' },
330
+ ]);
358
331
  }
359
332
  /**
360
333
  * Handle plan generation based on options and config
@@ -379,10 +352,10 @@ async function handlePlanGeneration(options, config, context) {
379
352
  shouldGenerate = await promptConfirm('Generate AI implementation plan document?', false);
380
353
  }
381
354
  if (!shouldGenerate) {
382
- debug('Plan generation skipped', { reason: decision.reason });
355
+ logger.debug('Plan generation skipped', { reason: decision.reason });
383
356
  return undefined;
384
357
  }
385
- progress(options, colors.info('Generating AI implementation plan...'));
358
+ printStatus('info', 'Generating AI implementation plan...');
386
359
  // Build path template variables
387
360
  const vars = buildPathTemplateVars({
388
361
  prNumber: context.prNumber,
@@ -400,10 +373,10 @@ async function handlePlanGeneration(options, config, context) {
400
373
  baseBranch: options.baseBranch,
401
374
  });
402
375
  if (result.generated) {
403
- progress(options, colors.success(`Created plan: ${result.path}`));
376
+ printStatus('success', `Created plan: ${result.path}`);
404
377
  }
405
378
  else if (result.error) {
406
- progress(options, colors.warning(`Plan generation failed: ${result.error}`));
379
+ printStatus('warning', `Plan generation failed: ${result.error}`);
407
380
  }
408
381
  return result;
409
382
  }
@@ -432,7 +405,7 @@ async function executePostWorktreeSequence(worktreePath, config, options, contex
432
405
  * Mode: Setup worktree for existing PR
433
406
  */
434
407
  async function modeExistingPr(prNumber, options) {
435
- progress(options, colors.info(`Setting up worktree for existing PR #${prNumber}...`));
408
+ printStatus('info', `Setting up worktree for existing PR #${prNumber}...`);
436
409
  const repoRoot = git.getRepoRoot();
437
410
  const repoName = git.getRepoName(repoRoot);
438
411
  const config = loadConfig(repoRoot);
@@ -441,7 +414,7 @@ async function modeExistingPr(prNumber, options) {
441
414
  repoRoot,
442
415
  baseBranch: options.baseBranch,
443
416
  }, {
444
- verbose: DEBUG_ENABLED,
417
+ verbose: options.verbose ?? false,
445
418
  showOutput: true,
446
419
  defaultTimeout: config.hookDefaults?.timeout,
447
420
  maxTimeout: config.hookDefaults?.maxTimeout,
@@ -452,9 +425,9 @@ async function modeExistingPr(prNumber, options) {
452
425
  exitWithError(`Could not find PR #${prNumber}`, ErrorCode.PR_NOT_FOUND, options.json);
453
426
  }
454
427
  if (pr.state !== 'OPEN') {
455
- progress(options, colors.warning(`PR #${prNumber} is ${pr.state}`));
428
+ printStatus('warning', `PR #${prNumber} is ${pr.state}`);
456
429
  }
457
- progress(options, colors.info(`PR branch: ${pr.headBranch}`));
430
+ printStatus('info', `PR branch: ${pr.headBranch}`);
458
431
  const worktreePath = generateWorktreePath(config, repoRoot, repoName, prNumber);
459
432
  if (fs.existsSync(worktreePath)) {
460
433
  exitWithError(`Worktree already exists: ${worktreePath}`, ErrorCode.WORKTREE_EXISTS, options.json);
@@ -500,7 +473,7 @@ async function modeExistingPr(prNumber, options) {
500
473
  }
501
474
  });
502
475
  }
503
- progress(options, colors.success(`Created worktree: ${worktreePath}`));
476
+ printStatus('success', `Created worktree: ${worktreePath}`);
504
477
  await setupWorktree(worktreePath, config, options, repoRoot);
505
478
  // Generate description from branch name for plan context
506
479
  const descriptionFromBranch = pr.headBranch
@@ -513,13 +486,14 @@ async function modeExistingPr(prNumber, options) {
513
486
  branchName: pr.headBranch,
514
487
  description: descriptionFromBranch,
515
488
  }, hookRunner);
489
+ setAuditContext({ prNumber, worktreePath, gitBranch: pr.headBranch });
516
490
  printSummary(prNumber, pr.headBranch, worktreePath, pr.url, options, { draft: pr.isDraft });
517
491
  }
518
492
  /**
519
493
  * Mode: Create PR for existing branch
520
494
  */
521
495
  async function modeExistingBranch(branchName, options) {
522
- progress(options, colors.info(`Creating PR for existing branch: ${branchName}...`));
496
+ printStatus('info', `Creating PR for existing branch: ${branchName}...`);
523
497
  const repoRoot = git.getRepoRoot();
524
498
  const repoName = git.getRepoName(repoRoot);
525
499
  const config = loadConfig(repoRoot);
@@ -528,7 +502,7 @@ async function modeExistingBranch(branchName, options) {
528
502
  repoRoot,
529
503
  baseBranch: options.baseBranch,
530
504
  }, {
531
- verbose: DEBUG_ENABLED,
505
+ verbose: options.verbose ?? false,
532
506
  showOutput: true,
533
507
  defaultTimeout: config.hookDefaults?.timeout,
534
508
  maxTimeout: config.hookDefaults?.maxTimeout,
@@ -561,11 +535,11 @@ async function modeExistingBranch(branchName, options) {
561
535
  }
562
536
  const existingPr = github.getPrByBranch(branchName);
563
537
  if (existingPr) {
564
- progress(options, colors.info(`PR #${existingPr.number} already exists for branch ${branchName}`));
538
+ printStatus('info', `PR #${existingPr.number} already exists for branch ${branchName}`);
565
539
  await modeExistingPr(existingPr.number, options);
566
540
  return;
567
541
  }
568
- progress(options, colors.info('Creating pull request...'));
542
+ printStatus('info', 'Creating pull request...');
569
543
  // Generate description from branch name for AI context
570
544
  const descriptionFromBranch = branchName
571
545
  .replace(/^(feat|fix|chore)\//, '')
@@ -580,7 +554,7 @@ async function modeExistingBranch(branchName, options) {
580
554
  commitMessages: git.getCommitMessages(`origin/${options.baseBranch}`, branchName),
581
555
  });
582
556
  if (prContent.aiGenerated) {
583
- progress(options, colors.info('✨ AI-generated PR content'));
557
+ printStatus('info', '✨ AI-generated PR content');
584
558
  }
585
559
  const defaultBody = `## Summary
586
560
 
@@ -603,7 +577,7 @@ PR created from existing branch: \`${branchName}\`
603
577
  head: branchName,
604
578
  draft: options.draft,
605
579
  });
606
- progress(options, colors.success(`Created PR #${pr.number}: ${pr.url}`));
580
+ printStatus('success', `Created PR #${pr.number}: ${pr.url}`);
607
581
  // Update hook context
608
582
  hookRunner.updateContext({
609
583
  branchName,
@@ -636,7 +610,7 @@ PR created from existing branch: \`${branchName}\`
636
610
  }
637
611
  });
638
612
  }
639
- progress(options, colors.success(`Created worktree: ${worktreePath}`));
613
+ printStatus('success', `Created worktree: ${worktreePath}`);
640
614
  await setupWorktree(worktreePath, config, options, repoRoot);
641
615
  // Execute unified post-worktree sequence (plan generation + hook)
642
616
  await executePostWorktreeSequence(worktreePath, config, options, {
@@ -644,6 +618,7 @@ PR created from existing branch: \`${branchName}\`
644
618
  branchName,
645
619
  description: descriptionFromBranch,
646
620
  }, hookRunner);
621
+ setAuditContext({ prNumber: pr.number, worktreePath, gitBranch: branchName });
647
622
  printSummary(pr.number, branchName, worktreePath, pr.url, options);
648
623
  }
649
624
  /**
@@ -660,7 +635,7 @@ async function modeNewFeature(description, options) {
660
635
  baseBranch: options.baseBranch,
661
636
  description,
662
637
  }, {
663
- verbose: DEBUG_ENABLED,
638
+ verbose: options.verbose ?? false,
664
639
  showOutput: true,
665
640
  defaultTimeout: config.hookDefaults?.timeout,
666
641
  maxTimeout: config.hookDefaults?.maxTimeout,
@@ -682,7 +657,7 @@ async function modeNewFeature(description, options) {
682
657
  }
683
658
  }
684
659
  catch {
685
- progress(options, colors.warning('Could not fetch from origin (network unavailable?)'));
660
+ printStatus('warning', 'Could not fetch from origin (network unavailable?)');
686
661
  }
687
662
  const state = analyzeGitState(options.baseBranch);
688
663
  const scenario = detectScenario(state);
@@ -696,7 +671,7 @@ async function modeNewFeature(description, options) {
696
671
  if (!(await hookRunner.runHook('post-analyze'))) {
697
672
  exitWithError('Aborted by post-analyze hook.', ErrorCode.HOOK_FAILED, options.json);
698
673
  }
699
- debug('State analysis complete', {
674
+ logger.debug('State analysis complete', {
700
675
  scenario,
701
676
  branchType: state.branchType,
702
677
  currentBranch: state.currentBranch,
@@ -712,10 +687,10 @@ async function modeNewFeature(description, options) {
712
687
  console.log(formatJsonResult(createErrorResult('newpr', ErrorCode.USER_CANCELLED, 'User cancelled')));
713
688
  process.exit(1);
714
689
  }
715
- console.log(colors.error('Aborted by user.'));
690
+ printStatus('error', 'Aborted by user.');
716
691
  process.exit(1);
717
692
  }
718
- debug('User selected action', {
693
+ logger.debug('User selected action', {
719
694
  action: action.action,
720
695
  branchFrom: action.branchFrom,
721
696
  stashUnstaged: action.stashUnstaged,
@@ -734,36 +709,36 @@ async function modeNewFeature(description, options) {
734
709
  const deps = createActionDeps(repoRoot);
735
710
  executeStateAction(action, description, currentBranch, deps, repoRoot);
736
711
  if (!git.remoteBranchExists(currentBranch)) {
737
- progress(options, colors.info('Pushing branch to origin...'));
712
+ printStatus('info', 'Pushing branch to origin...');
738
713
  git.push({ setUpstream: true, remote: 'origin', branch: currentBranch });
739
714
  }
740
715
  await modeExistingBranch(currentBranch, options);
741
716
  return;
742
717
  }
743
- progress(options, colors.info(`Creating feature branch: ${branchName}`));
718
+ printStatus('info', `Creating feature branch: ${branchName}`);
744
719
  if (git.remoteBranchExists(branchName)) {
745
- progress(options, colors.warning(`Branch ${branchName} already exists on remote`));
720
+ printStatus('warning', `Branch ${branchName} already exists on remote`);
746
721
  const existingPr = github.getPrByBranch(branchName);
747
722
  if (existingPr) {
748
- progress(options, colors.info(`PR #${existingPr.number} already exists, setting up worktree...`));
723
+ printStatus('info', `PR #${existingPr.number} already exists, setting up worktree...`);
749
724
  await modeExistingPr(existingPr.number, options);
750
725
  }
751
726
  else {
752
- progress(options, colors.info('No PR exists, creating one...'));
727
+ printStatus('info', 'No PR exists, creating one...');
753
728
  await modeExistingBranch(branchName, options);
754
729
  }
755
730
  return;
756
731
  }
757
732
  const originalBranch = git.getCurrentBranch() || 'main';
758
733
  const deps = createActionDeps(repoRoot);
759
- debug('Before executeStateAction', {
734
+ logger.debug('Before executeStateAction', {
760
735
  originalBranch,
761
736
  branchName,
762
737
  stagedFilesBefore: git.getStagedFiles(),
763
738
  unstagedFilesBefore: git.getUnstagedFiles(),
764
739
  });
765
740
  const actionResult = executeStateAction(action, description, branchName, deps, repoRoot);
766
- debug('After executeStateAction', {
741
+ logger.debug('After executeStateAction', {
767
742
  success: actionResult.success,
768
743
  stashRef: actionResult.stashRef,
769
744
  stagedFilesAfter: git.getStagedFiles(),
@@ -775,7 +750,7 @@ async function modeNewFeature(description, options) {
775
750
  // Stash unstaged changes if needed
776
751
  let unstagedStashRef = null;
777
752
  if (action.stashUnstaged) {
778
- progress(options, colors.info('Stashing unstaged changes (will move to worktree)...'));
753
+ printStatus('info', 'Stashing unstaged changes (will move to worktree)...');
779
754
  unstagedStashRef = git.stash({
780
755
  keepIndex: true,
781
756
  message: 'newpr: unstaged changes for worktree',
@@ -787,8 +762,8 @@ async function modeNewFeature(description, options) {
787
762
  if (!(await hookRunner.runHook('pre-branch'))) {
788
763
  exitWithError('Aborted by pre-branch hook.', ErrorCode.HOOK_FAILED, options.json);
789
764
  }
790
- progress(options, colors.info(`Creating branch from ${branchFrom}...`));
791
- debug('Before checkout', {
765
+ printStatus('info', `Creating branch from ${branchFrom}...`);
766
+ logger.debug('Before checkout', {
792
767
  branchFrom,
793
768
  branchName,
794
769
  currentBranch: git.getCurrentBranch(),
@@ -802,16 +777,19 @@ async function modeNewFeature(description, options) {
802
777
  // the staged files in the index - no data is lost. Provide a helpful message.
803
778
  const errorMessage = checkoutError instanceof Error ? checkoutError.message : String(checkoutError);
804
779
  if (errorMessage.includes('overwritten') || errorMessage.includes('conflict')) {
805
- progressError(options, colors.error('Checkout failed due to conflicting changes.'));
806
- progressError(options, colors.info('Your staged changes are preserved. To resolve this, either:'));
807
- progressError(options, colors.info(' 1. Commit your changes first, then run newpr again'));
808
- progressError(options, colors.info(' 2. Stash your changes: git stash push'));
809
- progressError(options, colors.info(' 3. Use a different branch point (e.g., HEAD instead of origin/main)'));
780
+ printError({
781
+ title: 'Checkout failed due to conflicting changes.',
782
+ detail: 'Your staged changes are preserved in the index.',
783
+ hint: 'To resolve this, either:\n' +
784
+ ' 1. Commit your changes first, then run newpr again\n' +
785
+ ' 2. Stash your changes: git stash push\n' +
786
+ ' 3. Use a different branch point (e.g., HEAD instead of origin/main)',
787
+ });
810
788
  }
811
789
  throw checkoutError;
812
790
  }
813
791
  const stagedFiles = git.getStagedFiles();
814
- debug('After checkout', {
792
+ logger.debug('After checkout', {
815
793
  newBranch: git.getCurrentBranch(),
816
794
  stagedFilesAfterCheckout: stagedFiles,
817
795
  stagedFilesCount: stagedFiles.length,
@@ -825,9 +803,9 @@ async function modeNewFeature(description, options) {
825
803
  if (!(await hookRunner.runHook('pre-commit'))) {
826
804
  exitWithError('Aborted by pre-commit hook.', ErrorCode.HOOK_FAILED, options.json);
827
805
  }
828
- progress(options, colors.info('Committing staged changes...'));
806
+ printStatus('info', 'Committing staged changes...');
829
807
  git.commit({ message: `feat: ${description}\n\n🤖 Created with newpr` });
830
- debug('Committed staged changes');
808
+ logger.debug('Committed staged changes');
831
809
  // Run post-commit hook
832
810
  await hookRunner.runHook('post-commit');
833
811
  }
@@ -836,12 +814,12 @@ async function modeNewFeature(description, options) {
836
814
  if (!(await hookRunner.runHook('pre-commit'))) {
837
815
  exitWithError('Aborted by pre-commit hook.', ErrorCode.HOOK_FAILED, options.json);
838
816
  }
839
- progress(options, colors.info('Creating initial commit (required for PR creation)...'));
817
+ printStatus('info', 'Creating initial commit (required for PR creation)...');
840
818
  git.commit({
841
819
  message: `chore: initialize ${branchName}\n\nBranch created for: ${description}\n\n🤖 Created with newpr`,
842
820
  allowEmpty: true,
843
821
  });
844
- debug('Created empty commit (no staged files found)');
822
+ logger.debug('Created empty commit (no staged files found)');
845
823
  // Run post-commit hook
846
824
  await hookRunner.runHook('post-commit');
847
825
  }
@@ -865,7 +843,7 @@ async function modeNewFeature(description, options) {
865
843
  if (!(await hookRunner.runHook('pre-pr'))) {
866
844
  exitWithError('Aborted by pre-pr hook.', ErrorCode.HOOK_FAILED, options.json);
867
845
  }
868
- progress(options, colors.info('Creating pull request...'));
846
+ printStatus('info', 'Creating pull request...');
869
847
  // Generate AI-enhanced PR content if enabled
870
848
  // Use origin/baseBranch to compare against remote, not potentially stale local branch
871
849
  const prContent = await generatePRContentAsync(config, {
@@ -876,7 +854,7 @@ async function modeNewFeature(description, options) {
876
854
  commitMessages: git.getCommitMessages(`origin/${options.baseBranch}`, branchName),
877
855
  });
878
856
  if (prContent.aiGenerated) {
879
- progress(options, colors.info('✨ AI-generated PR content'));
857
+ printStatus('info', '✨ AI-generated PR content');
880
858
  }
881
859
  const defaultBody = `## Summary
882
860
 
@@ -899,7 +877,7 @@ ${description}
899
877
  head: branchName,
900
878
  draft: options.draft,
901
879
  });
902
- progress(options, colors.success(`Created PR #${pr.number}: ${pr.url}`));
880
+ printStatus('success', `Created PR #${pr.number}: ${pr.url}`);
903
881
  // Update context with PR info
904
882
  hookRunner.updateContext({
905
883
  prNumber: pr.number,
@@ -923,17 +901,17 @@ ${description}
923
901
  await git.addWorktreeAsync(worktreePath, branchName, { cwd: repoRoot });
924
902
  });
925
903
  }
926
- progress(options, colors.success(`Created worktree: ${worktreePath}`));
904
+ printStatus('success', `Created worktree: ${worktreePath}`);
927
905
  if (unstagedStashRef) {
928
- progress(options, colors.info('Moving unstaged changes to worktree...'));
906
+ printStatus('info', 'Moving unstaged changes to worktree...');
929
907
  try {
930
908
  git.stashApply(unstagedStashRef, worktreePath);
931
- progress(options, colors.success('Unstaged changes applied to worktree'));
909
+ printStatus('success', 'Unstaged changes applied to worktree');
932
910
  git.stashDrop(unstagedStashRef);
933
911
  }
934
912
  catch {
935
- progress(options, colors.warning('Failed to apply unstaged changes to worktree.'));
936
- progress(options, colors.warning("Run 'git stash pop' in main worktree to recover them."));
913
+ printStatus('warning', 'Failed to apply unstaged changes to worktree.');
914
+ printStatus('warning', "Run 'git stash pop' in main worktree to recover them.");
937
915
  }
938
916
  }
939
917
  await setupWorktree(worktreePath, config, options, repoRoot);
@@ -943,6 +921,7 @@ ${description}
943
921
  branchName,
944
922
  description,
945
923
  }, hookRunner);
924
+ setAuditContext({ prNumber: pr.number, worktreePath, gitBranch: branchName });
946
925
  printSummary(pr.number, branchName, worktreePath, pr.url, options, {
947
926
  scenario,
948
927
  actionTaken: action.action,
@@ -952,12 +931,12 @@ ${description}
952
931
  // Run cleanup hook
953
932
  await hookRunner.runCleanup(error instanceof Error ? error : undefined);
954
933
  if (actionResult.stashRef) {
955
- progress(options, colors.info('Restoring stashed changes...'));
934
+ printStatus('info', 'Restoring stashed changes...');
956
935
  try {
957
936
  git.stashPop(actionResult.stashRef);
958
937
  }
959
938
  catch {
960
- progress(options, colors.warning("Failed to restore stash. Run 'git stash pop' manually."));
939
+ printStatus('warning', "Failed to restore stash. Run 'git stash pop' manually.");
961
940
  }
962
941
  }
963
942
  throw error;
@@ -977,25 +956,23 @@ function exitWithError(message, code, useJson) {
977
956
  console.log(formatJsonResult(createErrorResult('newpr', code, message)));
978
957
  }
979
958
  else {
980
- console.error(colors.error(message));
959
+ const hint = getErrorSuggestion(code);
960
+ printError({ title: message, hint });
981
961
  }
982
962
  process.exit(1);
983
963
  }
984
964
  /**
985
- * Main entry point
965
+ * Run the newpr handler with already-parsed options.
966
+ *
967
+ * This is the core newpr workflow, callable both from the standalone CLI
968
+ * entry point and from the `wt new` handler (in-process delegation).
969
+ *
970
+ * Callers are responsible for:
971
+ * - Initializing the logger (initializeLogger)
972
+ * - Setting JSON mode (setJsonMode)
973
+ * - Setting color enabled state (setColorEnabled)
986
974
  */
987
- async function main() {
988
- const rawArgs = process.argv.slice(2);
989
- const useJson = hasJsonFlag(rawArgs);
990
- const result = parseArgs(rawArgs);
991
- if (result.kind === 'help') {
992
- console.log(getHelpText());
993
- process.exit(0);
994
- }
995
- if (result.kind === 'error') {
996
- exitWithError(result.message, ErrorCode.INVALID_ARGUMENT, useJson);
997
- }
998
- const { options } = result;
975
+ export async function runNewprHandler(options) {
999
976
  // Apply config.draftPr if user didn't explicitly set --draft or --ready
1000
977
  try {
1001
978
  const repoRoot = git.getRepoRoot();
@@ -1032,26 +1009,55 @@ async function main() {
1032
1009
  break;
1033
1010
  }
1034
1011
  }
1035
- main().catch((error) => {
1036
- // Determine if JSON output is expected
1037
- const useJson = hasJsonFlag(process.argv.slice(2));
1038
- if (error instanceof NonInteractiveError) {
1039
- exitWithError(error.message, error.code, useJson);
1040
- }
1041
- const message = error instanceof Error ? error.message : String(error);
1042
- const code = getErrorCodeFromError(error);
1043
- const suggestion = getErrorSuggestion(code);
1044
- if (useJson) {
1045
- exitWithError(message, code, useJson);
1012
+ /**
1013
+ * Main entry point (standalone CLI)
1014
+ */
1015
+ async function main() {
1016
+ printDeprecationNotice('newpr', 'wt new');
1017
+ const rawArgs = process.argv.slice(2);
1018
+ const useJson = hasJsonFlag(rawArgs);
1019
+ const result = parseArgs(rawArgs);
1020
+ if (result.kind === 'help') {
1021
+ console.log(getHelpText());
1022
+ process.exit(0);
1046
1023
  }
1047
- else {
1048
- // Show friendly error with suggestion for non-JSON mode
1049
- console.error(colors.error(`Error: ${message}`));
1050
- if (suggestion) {
1051
- console.error('');
1052
- console.error(colors.dim(suggestion));
1053
- }
1054
- process.exit(1);
1024
+ if (result.kind === 'error') {
1025
+ exitWithError(result.message, ErrorCode.INVALID_ARGUMENT, useJson);
1055
1026
  }
1056
- });
1027
+ const { options } = result;
1028
+ // Initialize logger (only when run as standalone CLI)
1029
+ initializeLogger({
1030
+ verbose: options.verbose,
1031
+ quiet: options.quiet,
1032
+ noColor: options.noColor,
1033
+ json: options.json,
1034
+ commandName: 'newpr',
1035
+ });
1036
+ setJsonMode(options.json);
1037
+ if (options.noColor) {
1038
+ setColorEnabled(false);
1039
+ }
1040
+ await runNewprHandler(options);
1041
+ }
1042
+ // Only run main() when this file is executed directly (not when imported)
1043
+ const isMain = import.meta.url.endsWith(process.argv[1]?.replace(/\\/g, '/') || '');
1044
+ if (isMain || process.argv[1]?.endsWith('newpr.js')) {
1045
+ main().catch((error) => {
1046
+ // Determine if JSON output is expected
1047
+ const useJson = hasJsonFlag(process.argv.slice(2));
1048
+ if (error instanceof NonInteractiveError) {
1049
+ exitWithError(error.message, error.code, useJson);
1050
+ }
1051
+ if (useJson) {
1052
+ const message = error instanceof Error ? error.message : String(error);
1053
+ const code = getErrorCodeFromError(error);
1054
+ exitWithError(message, code, useJson);
1055
+ }
1056
+ else {
1057
+ const display = errorToDisplay(error);
1058
+ printError(display);
1059
+ process.exit(1);
1060
+ }
1061
+ });
1062
+ }
1057
1063
  //# sourceMappingURL=newpr.js.map