@camaradesuk/git-worktree-tools 1.8.0 → 1.10.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 (353) hide show
  1. package/README.md +48 -27
  2. package/dist/cli/cleanpr.js +74 -53
  3. package/dist/cli/cleanpr.js.map +1 -1
  4. package/dist/cli/cleanpr.test.js +2 -0
  5. package/dist/cli/cleanpr.test.js.map +1 -1
  6. package/dist/cli/lswt.js +32 -56
  7. package/dist/cli/lswt.js.map +1 -1
  8. package/dist/cli/lswt.test.js +17 -27
  9. package/dist/cli/lswt.test.js.map +1 -1
  10. package/dist/cli/newpr.d.ts +13 -1
  11. package/dist/cli/newpr.d.ts.map +1 -1
  12. package/dist/cli/newpr.js +350 -151
  13. package/dist/cli/newpr.js.map +1 -1
  14. package/dist/cli/newpr.test.js +314 -5
  15. package/dist/cli/newpr.test.js.map +1 -1
  16. package/dist/cli/prs.d.ts +3 -10
  17. package/dist/cli/prs.d.ts.map +1 -1
  18. package/dist/cli/prs.js +6 -168
  19. package/dist/cli/prs.js.map +1 -1
  20. package/dist/cli/prs.test.js +55 -0
  21. package/dist/cli/prs.test.js.map +1 -1
  22. package/dist/cli/wt/clean.d.ts +6 -2
  23. package/dist/cli/wt/clean.d.ts.map +1 -1
  24. package/dist/cli/wt/clean.js +401 -20
  25. package/dist/cli/wt/clean.js.map +1 -1
  26. package/dist/cli/wt/clean.test.d.ts +8 -0
  27. package/dist/cli/wt/clean.test.d.ts.map +1 -0
  28. package/dist/cli/wt/clean.test.js +624 -0
  29. package/dist/cli/wt/clean.test.js.map +1 -0
  30. package/dist/cli/wt/completion.d.ts +3 -0
  31. package/dist/cli/wt/completion.d.ts.map +1 -1
  32. package/dist/cli/wt/completion.js +80 -9
  33. package/dist/cli/wt/completion.js.map +1 -1
  34. package/dist/cli/wt/completion.test.js +102 -0
  35. package/dist/cli/wt/completion.test.js.map +1 -1
  36. package/dist/cli/wt/config.d.ts +3 -1
  37. package/dist/cli/wt/config.d.ts.map +1 -1
  38. package/dist/cli/wt/config.js +323 -32
  39. package/dist/cli/wt/config.js.map +1 -1
  40. package/dist/cli/wt/config.test.d.ts +2 -0
  41. package/dist/cli/wt/config.test.d.ts.map +1 -1
  42. package/dist/cli/wt/config.test.js +206 -26
  43. package/dist/cli/wt/config.test.js.map +1 -1
  44. package/dist/cli/wt/interactive-menu.d.ts +2 -0
  45. package/dist/cli/wt/interactive-menu.d.ts.map +1 -1
  46. package/dist/cli/wt/interactive-menu.js +346 -73
  47. package/dist/cli/wt/interactive-menu.js.map +1 -1
  48. package/dist/cli/wt/interactive-menu.test.d.ts +4 -2
  49. package/dist/cli/wt/interactive-menu.test.d.ts.map +1 -1
  50. package/dist/cli/wt/interactive-menu.test.js +383 -323
  51. package/dist/cli/wt/interactive-menu.test.js.map +1 -1
  52. package/dist/cli/wt/link.d.ts +3 -1
  53. package/dist/cli/wt/link.d.ts.map +1 -1
  54. package/dist/cli/wt/link.js +125 -38
  55. package/dist/cli/wt/link.js.map +1 -1
  56. package/dist/cli/wt/list.d.ts +4 -1
  57. package/dist/cli/wt/list.d.ts.map +1 -1
  58. package/dist/cli/wt/list.js +85 -16
  59. package/dist/cli/wt/list.js.map +1 -1
  60. package/dist/cli/wt/list.test.d.ts +10 -0
  61. package/dist/cli/wt/list.test.d.ts.map +1 -0
  62. package/dist/cli/wt/list.test.js +157 -0
  63. package/dist/cli/wt/list.test.js.map +1 -0
  64. package/dist/cli/wt/new.d.ts +8 -2
  65. package/dist/cli/wt/new.d.ts.map +1 -1
  66. package/dist/cli/wt/new.js +91 -46
  67. package/dist/cli/wt/new.js.map +1 -1
  68. package/dist/cli/wt/prs.d.ts +2 -1
  69. package/dist/cli/wt/prs.d.ts.map +1 -1
  70. package/dist/cli/wt/prs.js +3 -164
  71. package/dist/cli/wt/prs.js.map +1 -1
  72. package/dist/cli/wt/run-command.d.ts +4 -2
  73. package/dist/cli/wt/run-command.d.ts.map +1 -1
  74. package/dist/cli/wt/run-command.js +6 -4
  75. package/dist/cli/wt/run-command.js.map +1 -1
  76. package/dist/cli/wt/state.d.ts +3 -1
  77. package/dist/cli/wt/state.d.ts.map +1 -1
  78. package/dist/cli/wt/state.js +74 -10
  79. package/dist/cli/wt/state.js.map +1 -1
  80. package/dist/cli/wt/state.test.d.ts +9 -0
  81. package/dist/cli/wt/state.test.d.ts.map +1 -0
  82. package/dist/cli/wt/state.test.js +127 -0
  83. package/dist/cli/wt/state.test.js.map +1 -0
  84. package/dist/cli/wt/wt.test.d.ts +2 -2
  85. package/dist/cli/wt/wt.test.js +430 -212
  86. package/dist/cli/wt/wt.test.js.map +1 -1
  87. package/dist/cli/wt.d.ts.map +1 -1
  88. package/dist/cli/wt.js +50 -36
  89. package/dist/cli/wt.js.map +1 -1
  90. package/dist/cli/wt.unit.test.js +16 -38
  91. package/dist/cli/wt.unit.test.js.map +1 -1
  92. package/dist/cli/wtconfig.d.ts +1 -0
  93. package/dist/cli/wtconfig.d.ts.map +1 -1
  94. package/dist/cli/wtconfig.js +213 -21
  95. package/dist/cli/wtconfig.js.map +1 -1
  96. package/dist/cli/wtconfig.test.js +3 -0
  97. package/dist/cli/wtconfig.test.js.map +1 -1
  98. package/dist/cli/wtlink.js +116 -73
  99. package/dist/cli/wtlink.js.map +1 -1
  100. package/dist/cli/wtstate.js +21 -2
  101. package/dist/cli/wtstate.js.map +1 -1
  102. package/dist/e2e/wt/interactive-menu.e2e.test.js +17 -17
  103. package/dist/e2e/wt/interactive-menu.e2e.test.js.map +1 -1
  104. package/dist/lib/ai/types.d.ts +12 -0
  105. package/dist/lib/ai/types.d.ts.map +1 -1
  106. package/dist/lib/ai/types.js.map +1 -1
  107. package/dist/lib/cleanpr/args.d.ts.map +1 -1
  108. package/dist/lib/cleanpr/args.js +20 -0
  109. package/dist/lib/cleanpr/args.js.map +1 -1
  110. package/dist/lib/cleanpr/types.d.ts +6 -0
  111. package/dist/lib/cleanpr/types.d.ts.map +1 -1
  112. package/dist/lib/cleanpr/worktree-info.d.ts.map +1 -1
  113. package/dist/lib/cleanpr/worktree-info.js +1 -6
  114. package/dist/lib/cleanpr/worktree-info.js.map +1 -1
  115. package/dist/lib/cleanpr/worktree-info.test.js +10 -13
  116. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
  117. package/dist/lib/colors.d.ts +5 -0
  118. package/dist/lib/colors.d.ts.map +1 -1
  119. package/dist/lib/colors.js +13 -6
  120. package/dist/lib/colors.js.map +1 -1
  121. package/dist/lib/config-editor.d.ts.map +1 -1
  122. package/dist/lib/config-editor.js.map +1 -1
  123. package/dist/lib/config-migration/detector.d.ts +25 -0
  124. package/dist/lib/config-migration/detector.d.ts.map +1 -0
  125. package/dist/lib/config-migration/detector.js +372 -0
  126. package/dist/lib/config-migration/detector.js.map +1 -0
  127. package/dist/lib/config-migration/detector.test.d.ts +5 -0
  128. package/dist/lib/config-migration/detector.test.d.ts.map +1 -0
  129. package/dist/lib/config-migration/detector.test.js +201 -0
  130. package/dist/lib/config-migration/detector.test.js.map +1 -0
  131. package/dist/lib/config-migration/index.d.ts +29 -0
  132. package/dist/lib/config-migration/index.d.ts.map +1 -0
  133. package/dist/lib/config-migration/index.js +33 -0
  134. package/dist/lib/config-migration/index.js.map +1 -0
  135. package/dist/lib/config-migration/reporter.d.ts +53 -0
  136. package/dist/lib/config-migration/reporter.d.ts.map +1 -0
  137. package/dist/lib/config-migration/reporter.js +257 -0
  138. package/dist/lib/config-migration/reporter.js.map +1 -0
  139. package/dist/lib/config-migration/reporter.test.d.ts +5 -0
  140. package/dist/lib/config-migration/reporter.test.d.ts.map +1 -0
  141. package/dist/lib/config-migration/reporter.test.js +305 -0
  142. package/dist/lib/config-migration/reporter.test.js.map +1 -0
  143. package/dist/lib/config-migration/runner.d.ts +46 -0
  144. package/dist/lib/config-migration/runner.d.ts.map +1 -0
  145. package/dist/lib/config-migration/runner.js +364 -0
  146. package/dist/lib/config-migration/runner.js.map +1 -0
  147. package/dist/lib/config-migration/runner.test.d.ts +5 -0
  148. package/dist/lib/config-migration/runner.test.d.ts.map +1 -0
  149. package/dist/lib/config-migration/runner.test.js +235 -0
  150. package/dist/lib/config-migration/runner.test.js.map +1 -0
  151. package/dist/lib/config-migration/types.d.ts +120 -0
  152. package/dist/lib/config-migration/types.d.ts.map +1 -0
  153. package/dist/lib/config-migration/types.js +70 -0
  154. package/dist/lib/config-migration/types.js.map +1 -0
  155. package/dist/lib/config-validation.d.ts.map +1 -1
  156. package/dist/lib/config-validation.js +6 -0
  157. package/dist/lib/config-validation.js.map +1 -1
  158. package/dist/lib/config-validation.test.js +25 -0
  159. package/dist/lib/config-validation.test.js.map +1 -1
  160. package/dist/lib/config.d.ts +31 -7
  161. package/dist/lib/config.d.ts.map +1 -1
  162. package/dist/lib/config.js +2 -0
  163. package/dist/lib/config.js.map +1 -1
  164. package/dist/lib/config.test.js +3 -15
  165. package/dist/lib/config.test.js.map +1 -1
  166. package/dist/lib/constants.d.ts +12 -4
  167. package/dist/lib/constants.d.ts.map +1 -1
  168. package/dist/lib/constants.js +24 -5
  169. package/dist/lib/constants.js.map +1 -1
  170. package/dist/lib/constants.test.js +88 -29
  171. package/dist/lib/constants.test.js.map +1 -1
  172. package/dist/lib/deprecation.d.ts +18 -0
  173. package/dist/lib/deprecation.d.ts.map +1 -0
  174. package/dist/lib/deprecation.js +28 -0
  175. package/dist/lib/deprecation.js.map +1 -0
  176. package/dist/lib/deprecation.test.d.ts +2 -0
  177. package/dist/lib/deprecation.test.d.ts.map +1 -0
  178. package/dist/lib/deprecation.test.js +71 -0
  179. package/dist/lib/deprecation.test.js.map +1 -0
  180. package/dist/lib/hooks/confirmation.d.ts +49 -0
  181. package/dist/lib/hooks/confirmation.d.ts.map +1 -0
  182. package/dist/lib/hooks/confirmation.js +147 -0
  183. package/dist/lib/hooks/confirmation.js.map +1 -0
  184. package/dist/lib/hooks/confirmation.test.d.ts +7 -0
  185. package/dist/lib/hooks/confirmation.test.d.ts.map +1 -0
  186. package/dist/lib/hooks/confirmation.test.js +300 -0
  187. package/dist/lib/hooks/confirmation.test.js.map +1 -0
  188. package/dist/lib/hooks/executor.d.ts +16 -1
  189. package/dist/lib/hooks/executor.d.ts.map +1 -1
  190. package/dist/lib/hooks/executor.js +53 -4
  191. package/dist/lib/hooks/executor.js.map +1 -1
  192. package/dist/lib/hooks/index.d.ts +4 -2
  193. package/dist/lib/hooks/index.d.ts.map +1 -1
  194. package/dist/lib/hooks/index.js +3 -2
  195. package/dist/lib/hooks/index.js.map +1 -1
  196. package/dist/lib/hooks/types.d.ts +16 -0
  197. package/dist/lib/hooks/types.d.ts.map +1 -1
  198. package/dist/lib/hooks/types.js +12 -0
  199. package/dist/lib/hooks/types.js.map +1 -1
  200. package/dist/lib/logger.d.ts +40 -155
  201. package/dist/lib/logger.d.ts.map +1 -1
  202. package/dist/lib/logger.js +349 -420
  203. package/dist/lib/logger.js.map +1 -1
  204. package/dist/lib/logger.test.d.ts +10 -1
  205. package/dist/lib/logger.test.d.ts.map +1 -1
  206. package/dist/lib/logger.test.js +658 -258
  207. package/dist/lib/logger.test.js.map +1 -1
  208. package/dist/lib/lswt/action-executors.d.ts +2 -0
  209. package/dist/lib/lswt/action-executors.d.ts.map +1 -1
  210. package/dist/lib/lswt/action-executors.js +4 -3
  211. package/dist/lib/lswt/action-executors.js.map +1 -1
  212. package/dist/lib/lswt/action-executors.test.js +7 -0
  213. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  214. package/dist/lib/lswt/args.d.ts.map +1 -1
  215. package/dist/lib/lswt/args.js +15 -1
  216. package/dist/lib/lswt/args.js.map +1 -1
  217. package/dist/lib/lswt/environment.d.ts +21 -2
  218. package/dist/lib/lswt/environment.d.ts.map +1 -1
  219. package/dist/lib/lswt/environment.js +73 -32
  220. package/dist/lib/lswt/environment.js.map +1 -1
  221. package/dist/lib/lswt/environment.test.js +79 -1
  222. package/dist/lib/lswt/environment.test.js.map +1 -1
  223. package/dist/lib/lswt/index.d.ts +1 -0
  224. package/dist/lib/lswt/index.d.ts.map +1 -1
  225. package/dist/lib/lswt/index.js +2 -0
  226. package/dist/lib/lswt/index.js.map +1 -1
  227. package/dist/lib/lswt/table.d.ts +15 -0
  228. package/dist/lib/lswt/table.d.ts.map +1 -0
  229. package/dist/lib/lswt/table.js +61 -0
  230. package/dist/lib/lswt/table.js.map +1 -0
  231. package/dist/lib/lswt/table.test.d.ts +5 -0
  232. package/dist/lib/lswt/table.test.d.ts.map +1 -0
  233. package/dist/lib/lswt/table.test.js +262 -0
  234. package/dist/lib/lswt/table.test.js.map +1 -0
  235. package/dist/lib/lswt/types.d.ts +4 -0
  236. package/dist/lib/lswt/types.d.ts.map +1 -1
  237. package/dist/lib/lswt/worktree-info.d.ts.map +1 -1
  238. package/dist/lib/lswt/worktree-info.js +1 -6
  239. package/dist/lib/lswt/worktree-info.js.map +1 -1
  240. package/dist/lib/lswt/worktree-info.test.js +5 -17
  241. package/dist/lib/lswt/worktree-info.test.js.map +1 -1
  242. package/dist/lib/newpr/args.d.ts.map +1 -1
  243. package/dist/lib/newpr/args.js +36 -1
  244. package/dist/lib/newpr/args.js.map +1 -1
  245. package/dist/lib/newpr/hook-runner.d.ts +11 -0
  246. package/dist/lib/newpr/hook-runner.d.ts.map +1 -1
  247. package/dist/lib/newpr/hook-runner.js +49 -1
  248. package/dist/lib/newpr/hook-runner.js.map +1 -1
  249. package/dist/lib/newpr/hook-runner.test.js +121 -0
  250. package/dist/lib/newpr/hook-runner.test.js.map +1 -1
  251. package/dist/lib/newpr/plan-generator.d.ts +121 -0
  252. package/dist/lib/newpr/plan-generator.d.ts.map +1 -0
  253. package/dist/lib/newpr/plan-generator.js +185 -0
  254. package/dist/lib/newpr/plan-generator.js.map +1 -0
  255. package/dist/lib/newpr/plan-generator.test.d.ts +7 -0
  256. package/dist/lib/newpr/plan-generator.test.d.ts.map +1 -0
  257. package/dist/lib/newpr/plan-generator.test.js +387 -0
  258. package/dist/lib/newpr/plan-generator.test.js.map +1 -0
  259. package/dist/lib/newpr/types.d.ts +12 -0
  260. package/dist/lib/newpr/types.d.ts.map +1 -1
  261. package/dist/lib/prs/actions.d.ts +5 -1
  262. package/dist/lib/prs/actions.d.ts.map +1 -1
  263. package/dist/lib/prs/actions.js +12 -10
  264. package/dist/lib/prs/actions.js.map +1 -1
  265. package/dist/lib/prs/actions.test.js +48 -5
  266. package/dist/lib/prs/actions.test.js.map +1 -1
  267. package/dist/lib/prs/command.d.ts +21 -0
  268. package/dist/lib/prs/command.d.ts.map +1 -0
  269. package/dist/lib/prs/command.js +175 -0
  270. package/dist/lib/prs/command.js.map +1 -0
  271. package/dist/lib/prs/command.test.d.ts +11 -0
  272. package/dist/lib/prs/command.test.d.ts.map +1 -0
  273. package/dist/lib/prs/command.test.js +409 -0
  274. package/dist/lib/prs/command.test.js.map +1 -0
  275. package/dist/lib/prs/interactive.d.ts.map +1 -1
  276. package/dist/lib/prs/interactive.js +15 -2
  277. package/dist/lib/prs/interactive.js.map +1 -1
  278. package/dist/lib/prs/interactive.test.js +153 -0
  279. package/dist/lib/prs/interactive.test.js.map +1 -1
  280. package/dist/lib/prs/types.d.ts +15 -0
  281. package/dist/lib/prs/types.d.ts.map +1 -1
  282. package/dist/lib/ui/error.d.ts +31 -0
  283. package/dist/lib/ui/error.d.ts.map +1 -0
  284. package/dist/lib/ui/error.js +47 -0
  285. package/dist/lib/ui/error.js.map +1 -0
  286. package/dist/lib/ui/error.test.d.ts +2 -0
  287. package/dist/lib/ui/error.test.d.ts.map +1 -0
  288. package/dist/lib/ui/error.test.js +143 -0
  289. package/dist/lib/ui/error.test.js.map +1 -0
  290. package/dist/lib/ui/index.d.ts +15 -0
  291. package/dist/lib/ui/index.d.ts.map +1 -0
  292. package/dist/lib/ui/index.js +19 -0
  293. package/dist/lib/ui/index.js.map +1 -0
  294. package/dist/lib/ui/output.d.ts +18 -0
  295. package/dist/lib/ui/output.d.ts.map +1 -0
  296. package/dist/lib/ui/output.js +31 -0
  297. package/dist/lib/ui/output.js.map +1 -0
  298. package/dist/lib/ui/output.test.d.ts +2 -0
  299. package/dist/lib/ui/output.test.d.ts.map +1 -0
  300. package/dist/lib/ui/output.test.js +59 -0
  301. package/dist/lib/ui/output.test.js.map +1 -0
  302. package/dist/lib/ui/spinner.d.ts +10 -0
  303. package/dist/lib/ui/spinner.d.ts.map +1 -0
  304. package/dist/lib/ui/spinner.js +10 -0
  305. package/dist/lib/ui/spinner.js.map +1 -0
  306. package/dist/lib/ui/status.d.ts +65 -0
  307. package/dist/lib/ui/status.d.ts.map +1 -0
  308. package/dist/lib/ui/status.js +100 -0
  309. package/dist/lib/ui/status.js.map +1 -0
  310. package/dist/lib/ui/status.test.d.ts +2 -0
  311. package/dist/lib/ui/status.test.d.ts.map +1 -0
  312. package/dist/lib/ui/status.test.js +158 -0
  313. package/dist/lib/ui/status.test.js.map +1 -0
  314. package/dist/lib/ui/table.d.ts +39 -0
  315. package/dist/lib/ui/table.d.ts.map +1 -0
  316. package/dist/lib/ui/table.js +45 -0
  317. package/dist/lib/ui/table.js.map +1 -0
  318. package/dist/lib/ui/table.test.d.ts +2 -0
  319. package/dist/lib/ui/table.test.d.ts.map +1 -0
  320. package/dist/lib/ui/table.test.js +115 -0
  321. package/dist/lib/ui/table.test.js.map +1 -0
  322. package/dist/lib/ui/theme.d.ts +34 -0
  323. package/dist/lib/ui/theme.d.ts.map +1 -0
  324. package/dist/lib/ui/theme.js +37 -0
  325. package/dist/lib/ui/theme.js.map +1 -0
  326. package/dist/lib/ui/theme.test.d.ts +2 -0
  327. package/dist/lib/ui/theme.test.d.ts.map +1 -0
  328. package/dist/lib/ui/theme.test.js +76 -0
  329. package/dist/lib/ui/theme.test.js.map +1 -0
  330. package/dist/lib/wtconfig/environment.d.ts +18 -1
  331. package/dist/lib/wtconfig/environment.d.ts.map +1 -1
  332. package/dist/lib/wtconfig/environment.js +60 -24
  333. package/dist/lib/wtconfig/environment.js.map +1 -1
  334. package/dist/lib/wtconfig/environment.test.js +45 -1
  335. package/dist/lib/wtconfig/environment.test.js.map +1 -1
  336. package/dist/lib/wtlink/config-manifest.test.js +26 -0
  337. package/dist/lib/wtlink/config-manifest.test.js.map +1 -1
  338. package/dist/lib/wtlink/link-configs.js +7 -7
  339. package/dist/lib/wtlink/link-configs.js.map +1 -1
  340. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
  341. package/dist/lib/wtlink/validate-manifest.js +5 -5
  342. package/dist/lib/wtlink/validate-manifest.js.map +1 -1
  343. package/dist/lib/wtstate/args.d.ts.map +1 -1
  344. package/dist/lib/wtstate/args.js +2 -0
  345. package/dist/lib/wtstate/args.js.map +1 -1
  346. package/dist/mcp/server.d.ts +2 -1
  347. package/dist/mcp/server.d.ts.map +1 -1
  348. package/dist/mcp/server.js +264 -44
  349. package/dist/mcp/server.js.map +1 -1
  350. package/dist/mcp/server.test.js +111 -0
  351. package/dist/mcp/server.test.js.map +1 -1
  352. package/package.json +3 -1
  353. package/schemas/worktreerc.schema.json +23 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Hook Confirmation Module
3
+ *
4
+ * Provides interactive confirmation prompts for hook execution,
5
+ * allowing users to review, skip, or edit hooks before they run.
6
+ */
7
+ import type { HookName, HookDefinition } from './types.js';
8
+ /**
9
+ * Action to take for a hook
10
+ */
11
+ export type HookConfirmAction = 'run' | 'skip' | 'edit';
12
+ /**
13
+ * Result from hook confirmation prompt
14
+ */
15
+ export interface HookConfirmResult {
16
+ /** Action user selected */
17
+ action: HookConfirmAction;
18
+ /** Modified command if user chose to edit */
19
+ editedCommand?: string;
20
+ }
21
+ /**
22
+ * Extract commands from a hook definition for display
23
+ */
24
+ export declare function getHookCommands(definition: HookDefinition): string[];
25
+ /**
26
+ * Check if hook can be edited (simple command or complex with command property)
27
+ * Script-based hooks and multiple command hooks cannot be edited inline
28
+ */
29
+ export declare function isHookEditable(definition: HookDefinition): boolean;
30
+ /**
31
+ * Check if running in an interactive environment
32
+ * Returns false in CI, non-TTY, or when common CI environment variables are set
33
+ */
34
+ export declare function isInteractiveEnvironment(): boolean;
35
+ /**
36
+ * Display hook details and prompt for confirmation
37
+ *
38
+ * Shows the user what the hook will do and lets them choose to:
39
+ * - Run the hook as-is
40
+ * - Skip the hook
41
+ * - Edit the command (if editable)
42
+ */
43
+ export declare function promptHookConfirmation(hookName: HookName, definition: HookDefinition, cwd: string): Promise<HookConfirmResult>;
44
+ /**
45
+ * Create a temporary hook definition with an edited command
46
+ * Used when user edits a command inline
47
+ */
48
+ export declare function createEditedHookDefinition(original: HookDefinition, editedCommand: string): HookDefinition;
49
+ //# sourceMappingURL=confirmation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAqB3E;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,EAAE,CAYpE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CASlE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAclD;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,cAAc,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,CAAC,CAwD5B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,MAAM,GACpB,cAAc,CAahB"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Hook Confirmation Module
3
+ *
4
+ * Provides interactive confirmation prompts for hook execution,
5
+ * allowing users to review, skip, or edit hooks before they run.
6
+ */
7
+ import * as colors from '../colors.js';
8
+ import { promptChoice, promptInput } from '../prompts.js';
9
+ import { isSimpleHook, isMultipleHook, isComplexHook } from './types.js';
10
+ /**
11
+ * Environment variables that indicate a CI/CD environment.
12
+ * When any of these are set, interactive prompts are skipped.
13
+ */
14
+ const CI_ENVIRONMENT_VARIABLES = [
15
+ 'CI',
16
+ 'GITHUB_ACTIONS',
17
+ 'GITLAB_CI',
18
+ 'JENKINS_URL',
19
+ 'CIRCLECI',
20
+ 'TRAVIS',
21
+ 'BUILDKITE',
22
+ 'TEAMCITY_VERSION',
23
+ 'TF_BUILD', // Azure DevOps
24
+ 'CODEBUILD_BUILD_ID', // AWS CodeBuild
25
+ 'BITBUCKET_BUILD_NUMBER', // Bitbucket Pipelines
26
+ ];
27
+ /**
28
+ * Extract commands from a hook definition for display
29
+ */
30
+ export function getHookCommands(definition) {
31
+ if (isSimpleHook(definition)) {
32
+ return [definition];
33
+ }
34
+ if (isMultipleHook(definition)) {
35
+ return definition;
36
+ }
37
+ if (isComplexHook(definition)) {
38
+ if (definition.command)
39
+ return [definition.command];
40
+ if (definition.script)
41
+ return [`[script: ${definition.script}]`];
42
+ }
43
+ return [];
44
+ }
45
+ /**
46
+ * Check if hook can be edited (simple command or complex with command property)
47
+ * Script-based hooks and multiple command hooks cannot be edited inline
48
+ */
49
+ export function isHookEditable(definition) {
50
+ if (isSimpleHook(definition)) {
51
+ return true;
52
+ }
53
+ if (isComplexHook(definition)) {
54
+ return !!definition.command && !definition.script;
55
+ }
56
+ // Multiple commands cannot be edited inline
57
+ return false;
58
+ }
59
+ /**
60
+ * Check if running in an interactive environment
61
+ * Returns false in CI, non-TTY, or when common CI environment variables are set
62
+ */
63
+ export function isInteractiveEnvironment() {
64
+ // Check if stdin is a TTY
65
+ if (!process.stdin.isTTY) {
66
+ return false;
67
+ }
68
+ // Check for CI environment variables
69
+ for (const envVar of CI_ENVIRONMENT_VARIABLES) {
70
+ if (process.env[envVar]) {
71
+ return false;
72
+ }
73
+ }
74
+ return true;
75
+ }
76
+ /**
77
+ * Display hook details and prompt for confirmation
78
+ *
79
+ * Shows the user what the hook will do and lets them choose to:
80
+ * - Run the hook as-is
81
+ * - Skip the hook
82
+ * - Edit the command (if editable)
83
+ */
84
+ export async function promptHookConfirmation(hookName, definition, cwd) {
85
+ const commands = getHookCommands(definition);
86
+ const canEdit = isHookEditable(definition);
87
+ // Display hook information
88
+ console.log();
89
+ console.log(colors.bold(`Hook: ${hookName}`));
90
+ console.log(colors.dim(`Working directory: ${cwd}`));
91
+ console.log(colors.dim('Command(s):'));
92
+ for (const cmd of commands) {
93
+ console.log(` ${colors.cyan(cmd)}`);
94
+ }
95
+ // Show additional info for complex hooks
96
+ if (isComplexHook(definition)) {
97
+ const complex = definition;
98
+ if (complex.timeout) {
99
+ console.log(colors.dim(`Timeout: ${complex.timeout}ms`));
100
+ }
101
+ if (complex.failOnError === false) {
102
+ console.log(colors.dim('Non-fatal: continues on error'));
103
+ }
104
+ if (complex.if) {
105
+ console.log(colors.dim(`Condition: ${complex.if}`));
106
+ }
107
+ }
108
+ console.log();
109
+ const choices = [
110
+ { label: 'Run hook', value: 'run' },
111
+ { label: 'Skip hook', value: 'skip' },
112
+ ];
113
+ if (canEdit) {
114
+ choices.push({ label: 'Edit command', value: 'edit' });
115
+ }
116
+ const action = await promptChoice('How would you like to proceed?', choices);
117
+ // Handle edit action
118
+ if (action === 'edit') {
119
+ const originalCommand = commands[0] || '';
120
+ const editedCommand = await promptInput('Enter modified command:', originalCommand);
121
+ // Empty edit treated as skip
122
+ if (!editedCommand.trim()) {
123
+ return { action: 'skip' };
124
+ }
125
+ return { action: 'run', editedCommand: editedCommand.trim() };
126
+ }
127
+ return { action };
128
+ }
129
+ /**
130
+ * Create a temporary hook definition with an edited command
131
+ * Used when user edits a command inline
132
+ */
133
+ export function createEditedHookDefinition(original, editedCommand) {
134
+ if (isSimpleHook(original)) {
135
+ return editedCommand;
136
+ }
137
+ if (isComplexHook(original)) {
138
+ return {
139
+ ...original,
140
+ command: editedCommand,
141
+ script: undefined, // Clear script if present
142
+ };
143
+ }
144
+ // For multiple hooks, replace with single edited command
145
+ return editedCommand;
146
+ }
147
+ //# sourceMappingURL=confirmation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hook Confirmation Module Tests
3
+ *
4
+ * Tests for the hook confirmation prompts and utilities.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=confirmation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.test.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Hook Confirmation Module Tests
3
+ *
4
+ * Tests for the hook confirmation prompts and utilities.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { getHookCommands, isHookEditable, isInteractiveEnvironment, createEditedHookDefinition, promptHookConfirmation, } from './confirmation.js';
8
+ // Mock colors to avoid ANSI codes in tests
9
+ vi.mock('../colors.js', () => ({
10
+ dim: (s) => s,
11
+ bold: (s) => s,
12
+ cyan: (s) => s,
13
+ error: (s) => s,
14
+ warning: (s) => s,
15
+ info: (s) => s,
16
+ success: (s) => s,
17
+ }));
18
+ // Mock prompts module
19
+ const mockPromptChoice = vi.fn();
20
+ const mockPromptInput = vi.fn();
21
+ vi.mock('../prompts.js', () => ({
22
+ promptChoice: (...args) => mockPromptChoice(...args),
23
+ promptInput: (...args) => mockPromptInput(...args),
24
+ }));
25
+ describe('getHookCommands', () => {
26
+ it('extracts command from simple string hook', () => {
27
+ const definition = 'npm install';
28
+ const commands = getHookCommands(definition);
29
+ expect(commands).toEqual(['npm install']);
30
+ });
31
+ it('extracts commands from array hook', () => {
32
+ const definition = ['npm install', 'npm run build'];
33
+ const commands = getHookCommands(definition);
34
+ expect(commands).toEqual(['npm install', 'npm run build']);
35
+ });
36
+ it('extracts command from complex hook with command property', () => {
37
+ const definition = {
38
+ command: 'npm test',
39
+ timeout: 60000,
40
+ };
41
+ const commands = getHookCommands(definition);
42
+ expect(commands).toEqual(['npm test']);
43
+ });
44
+ it('extracts script from complex hook with script property', () => {
45
+ const definition = {
46
+ script: './scripts/setup.sh',
47
+ };
48
+ const commands = getHookCommands(definition);
49
+ expect(commands).toEqual(['[script: ./scripts/setup.sh]']);
50
+ });
51
+ it('returns empty array for complex hook without command or script', () => {
52
+ const definition = {
53
+ timeout: 30000,
54
+ };
55
+ const commands = getHookCommands(definition);
56
+ expect(commands).toEqual([]);
57
+ });
58
+ it('returns empty array for empty object', () => {
59
+ const definition = {};
60
+ const commands = getHookCommands(definition);
61
+ expect(commands).toEqual([]);
62
+ });
63
+ });
64
+ describe('isHookEditable', () => {
65
+ it('returns true for simple string hook', () => {
66
+ const definition = 'npm install';
67
+ expect(isHookEditable(definition)).toBe(true);
68
+ });
69
+ it('returns false for array hook', () => {
70
+ const definition = ['npm install', 'npm run build'];
71
+ expect(isHookEditable(definition)).toBe(false);
72
+ });
73
+ it('returns true for complex hook with command only', () => {
74
+ const definition = {
75
+ command: 'npm test',
76
+ };
77
+ expect(isHookEditable(definition)).toBe(true);
78
+ });
79
+ it('returns false for complex hook with script', () => {
80
+ const definition = {
81
+ script: './scripts/setup.sh',
82
+ };
83
+ expect(isHookEditable(definition)).toBe(false);
84
+ });
85
+ it('returns false for complex hook with both command and script', () => {
86
+ const definition = {
87
+ command: 'npm test',
88
+ script: './scripts/setup.sh',
89
+ };
90
+ expect(isHookEditable(definition)).toBe(false);
91
+ });
92
+ it('returns false for empty complex hook', () => {
93
+ const definition = {};
94
+ expect(isHookEditable(definition)).toBe(false);
95
+ });
96
+ });
97
+ describe('isInteractiveEnvironment', () => {
98
+ const originalIsTTY = process.stdin.isTTY;
99
+ const originalEnv = { ...process.env };
100
+ beforeEach(() => {
101
+ // Reset environment variables
102
+ delete process.env.CI;
103
+ delete process.env.GITHUB_ACTIONS;
104
+ delete process.env.GITLAB_CI;
105
+ delete process.env.JENKINS_URL;
106
+ delete process.env.CIRCLECI;
107
+ delete process.env.TRAVIS;
108
+ delete process.env.BUILDKITE;
109
+ delete process.env.TEAMCITY_VERSION;
110
+ delete process.env.TF_BUILD;
111
+ });
112
+ afterEach(() => {
113
+ // Restore original state
114
+ Object.defineProperty(process.stdin, 'isTTY', {
115
+ value: originalIsTTY,
116
+ writable: true,
117
+ });
118
+ process.env = { ...originalEnv };
119
+ });
120
+ it('returns false when stdin is not a TTY', () => {
121
+ Object.defineProperty(process.stdin, 'isTTY', { value: false, writable: true });
122
+ expect(isInteractiveEnvironment()).toBe(false);
123
+ });
124
+ it('returns false when CI environment variable is set', () => {
125
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
126
+ process.env.CI = 'true';
127
+ expect(isInteractiveEnvironment()).toBe(false);
128
+ });
129
+ it('returns false when GITHUB_ACTIONS is set', () => {
130
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
131
+ process.env.GITHUB_ACTIONS = 'true';
132
+ expect(isInteractiveEnvironment()).toBe(false);
133
+ });
134
+ it('returns false when GITLAB_CI is set', () => {
135
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
136
+ process.env.GITLAB_CI = 'true';
137
+ expect(isInteractiveEnvironment()).toBe(false);
138
+ });
139
+ it('returns false when JENKINS_URL is set', () => {
140
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
141
+ process.env.JENKINS_URL = 'http://jenkins.example.com';
142
+ expect(isInteractiveEnvironment()).toBe(false);
143
+ });
144
+ it('returns false when CIRCLECI is set', () => {
145
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
146
+ process.env.CIRCLECI = 'true';
147
+ expect(isInteractiveEnvironment()).toBe(false);
148
+ });
149
+ it('returns false when TRAVIS is set', () => {
150
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
151
+ process.env.TRAVIS = 'true';
152
+ expect(isInteractiveEnvironment()).toBe(false);
153
+ });
154
+ it('returns false when BUILDKITE is set', () => {
155
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
156
+ process.env.BUILDKITE = 'true';
157
+ expect(isInteractiveEnvironment()).toBe(false);
158
+ });
159
+ it('returns false when TEAMCITY_VERSION is set', () => {
160
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
161
+ process.env.TEAMCITY_VERSION = '2023.1';
162
+ expect(isInteractiveEnvironment()).toBe(false);
163
+ });
164
+ it('returns false when TF_BUILD is set (Azure DevOps)', () => {
165
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
166
+ process.env.TF_BUILD = 'True';
167
+ expect(isInteractiveEnvironment()).toBe(false);
168
+ });
169
+ it('returns true when TTY is available and no CI variables set', () => {
170
+ Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
171
+ // All CI env vars should be cleared by beforeEach
172
+ expect(isInteractiveEnvironment()).toBe(true);
173
+ });
174
+ });
175
+ describe('createEditedHookDefinition', () => {
176
+ it('replaces simple string hook with edited command', () => {
177
+ const original = 'npm install';
178
+ const result = createEditedHookDefinition(original, 'npm ci');
179
+ expect(result).toBe('npm ci');
180
+ });
181
+ it('replaces command in complex hook', () => {
182
+ const original = {
183
+ command: 'npm install',
184
+ timeout: 60000,
185
+ failOnError: false,
186
+ };
187
+ const result = createEditedHookDefinition(original, 'npm ci');
188
+ expect(result).toEqual({
189
+ command: 'npm ci',
190
+ timeout: 60000,
191
+ failOnError: false,
192
+ script: undefined,
193
+ });
194
+ });
195
+ it('clears script property when editing complex hook', () => {
196
+ const original = {
197
+ script: './setup.sh',
198
+ timeout: 30000,
199
+ };
200
+ const result = createEditedHookDefinition(original, 'bash ./setup.sh --force');
201
+ expect(result).toEqual({
202
+ script: undefined,
203
+ timeout: 30000,
204
+ command: 'bash ./setup.sh --force',
205
+ });
206
+ });
207
+ it('replaces array hook with single edited command', () => {
208
+ const original = ['npm install', 'npm run build'];
209
+ const result = createEditedHookDefinition(original, 'npm ci && npm run build');
210
+ expect(result).toBe('npm ci && npm run build');
211
+ });
212
+ });
213
+ describe('promptHookConfirmation', () => {
214
+ let consoleSpy;
215
+ beforeEach(() => {
216
+ vi.clearAllMocks();
217
+ consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
218
+ });
219
+ afterEach(() => {
220
+ consoleSpy.mockRestore();
221
+ });
222
+ it('returns run action when user selects Run hook', async () => {
223
+ mockPromptChoice.mockResolvedValue('run');
224
+ const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
225
+ expect(result).toEqual({ action: 'run' });
226
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Hook: post-worktree'));
227
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Working directory:'));
228
+ });
229
+ it('returns skip action when user selects Skip hook', async () => {
230
+ mockPromptChoice.mockResolvedValue('skip');
231
+ const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
232
+ expect(result).toEqual({ action: 'skip' });
233
+ });
234
+ it('returns run with edited command when user edits', async () => {
235
+ mockPromptChoice.mockResolvedValue('edit');
236
+ mockPromptInput.mockResolvedValue('npm ci --legacy-peer-deps');
237
+ const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
238
+ expect(result).toEqual({
239
+ action: 'run',
240
+ editedCommand: 'npm ci --legacy-peer-deps',
241
+ });
242
+ });
243
+ it('returns skip when edited command is empty', async () => {
244
+ mockPromptChoice.mockResolvedValue('edit');
245
+ mockPromptInput.mockResolvedValue(' ');
246
+ const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
247
+ expect(result).toEqual({ action: 'skip' });
248
+ });
249
+ it('trims edited command whitespace', async () => {
250
+ mockPromptChoice.mockResolvedValue('edit');
251
+ mockPromptInput.mockResolvedValue(' npm ci ');
252
+ const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
253
+ expect(result).toEqual({
254
+ action: 'run',
255
+ editedCommand: 'npm ci',
256
+ });
257
+ });
258
+ it('displays complex hook details', async () => {
259
+ mockPromptChoice.mockResolvedValue('run');
260
+ const complexHook = {
261
+ command: 'npm install',
262
+ timeout: 120000,
263
+ failOnError: false,
264
+ if: 'exists:package.json',
265
+ };
266
+ await promptHookConfirmation('post-worktree', complexHook, '/path/to/worktree');
267
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Timeout:'));
268
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Non-fatal:'));
269
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Condition:'));
270
+ });
271
+ it('does not offer edit option for non-editable hooks', async () => {
272
+ mockPromptChoice.mockResolvedValue('run');
273
+ const scriptHook = {
274
+ script: './setup.sh',
275
+ };
276
+ await promptHookConfirmation('post-worktree', scriptHook, '/path/to/worktree');
277
+ // Check that promptChoice was called with only run and skip options
278
+ expect(mockPromptChoice).toHaveBeenCalledWith(expect.any(String), expect.arrayContaining([
279
+ expect.objectContaining({ value: 'run' }),
280
+ expect.objectContaining({ value: 'skip' }),
281
+ ]));
282
+ // Verify no edit option was included
283
+ const choices = mockPromptChoice.mock.calls[0][1];
284
+ expect(choices.find((c) => c.value === 'edit')).toBeUndefined();
285
+ });
286
+ it('offers edit option for editable hooks', async () => {
287
+ mockPromptChoice.mockResolvedValue('run');
288
+ await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
289
+ // Verify edit option was included
290
+ const choices = mockPromptChoice.mock.calls[0][1];
291
+ expect(choices.find((c) => c.value === 'edit')).toBeDefined();
292
+ });
293
+ it('displays array of commands', async () => {
294
+ mockPromptChoice.mockResolvedValue('skip');
295
+ await promptHookConfirmation('post-worktree', ['npm install', 'npm run build'], '/path');
296
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('npm install'));
297
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('npm run build'));
298
+ });
299
+ });
300
+ //# sourceMappingURL=confirmation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.test.js","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.test.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,22 @@
3
3
  *
4
4
  * Executes lifecycle hooks with proper context and error handling.
5
5
  */
6
- import type { HookName, HookContext, HookResult, HookExecutorOptions, HooksConfig } from './types.js';
6
+ import type { HookName, HookDefinition, HookContext, HookResult, HookExecutorOptions, HooksConfig } from './types.js';
7
+ /**
8
+ * Resolve the working directory for a hook
9
+ *
10
+ * Priority:
11
+ * 1. Explicit cwd in complex hook definition (with template expansion)
12
+ * 2. Smart default for WORKTREE_CWD_HOOKS when worktreePath is available
13
+ * 3. Fallback to executor options cwd or context repoRoot
14
+ *
15
+ * @param hookName - The hook being executed
16
+ * @param definition - The hook definition
17
+ * @param context - The hook execution context
18
+ * @param options - The executor options
19
+ * @returns The resolved working directory path
20
+ */
21
+ export declare function resolveHookCwd(hookName: HookName, definition: HookDefinition, context: HookContext, options: HookExecutorOptions): string;
7
22
  /**
8
23
  * Hook executor class for managing hook execution
9
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,QAAQ,EAER,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,WAAW,EAEZ,MAAM,YAAY,CAAC;AA2XpB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAsB;gBAEzB,MAAM,GAAE,WAAgB,EAAE,OAAO,GAAE,mBAAwB;IAKvE;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIpC;;OAEG;IACH,kBAAkB,IAAI,QAAQ,EAAE;IAIhC;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA8BhF;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAevF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,GAAE,WAAgB,EACxB,OAAO,GAAE,mBAAwB,GAChC,YAAY,CAEd"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,WAAW,EAEZ,MAAM,YAAY,CAAC;AAiKpB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,mBAAmB,GAC3B,MAAM,CAiBR;AAuPD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAsB;gBAEzB,MAAM,GAAE,WAAgB,EAAE,OAAO,GAAE,mBAAwB;IAKvE;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIpC;;OAEG;IACH,kBAAkB,IAAI,QAAQ,EAAE;IAIhC;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA8BhF;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAevF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,GAAE,WAAgB,EACxB,OAAO,GAAE,mBAAwB,GAChC,YAAY,CAEd"}