@camaradesuk/git-worktree-tools 1.2.1 → 1.4.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 (346) hide show
  1. package/README.md +323 -16
  2. package/dist/api/clean.d.ts +65 -0
  3. package/dist/api/clean.d.ts.map +1 -0
  4. package/dist/api/clean.js +209 -0
  5. package/dist/api/clean.js.map +1 -0
  6. package/dist/api/create.d.ts +88 -0
  7. package/dist/api/create.d.ts.map +1 -0
  8. package/dist/api/create.js +370 -0
  9. package/dist/api/create.js.map +1 -0
  10. package/dist/api/index.d.ts +15 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/index.js +19 -0
  13. package/dist/api/index.js.map +1 -0
  14. package/dist/api/list.d.ts +74 -0
  15. package/dist/api/list.d.ts.map +1 -0
  16. package/dist/api/list.js +80 -0
  17. package/dist/api/list.js.map +1 -0
  18. package/dist/api/state.d.ts +43 -0
  19. package/dist/api/state.d.ts.map +1 -0
  20. package/dist/api/state.js +70 -0
  21. package/dist/api/state.js.map +1 -0
  22. package/dist/cli/cleanpr.js +171 -28
  23. package/dist/cli/cleanpr.js.map +1 -1
  24. package/dist/cli/cleanpr.test.js +460 -7
  25. package/dist/cli/cleanpr.test.js.map +1 -1
  26. package/dist/cli/lswt.js +8 -1
  27. package/dist/cli/lswt.js.map +1 -1
  28. package/dist/cli/lswt.test.js +2 -0
  29. package/dist/cli/lswt.test.js.map +1 -1
  30. package/dist/cli/newpr.js +189 -28
  31. package/dist/cli/newpr.js.map +1 -1
  32. package/dist/cli/newpr.test.js +350 -0
  33. package/dist/cli/newpr.test.js.map +1 -1
  34. package/dist/cli/wtconfig.d.ts +14 -0
  35. package/dist/cli/wtconfig.d.ts.map +1 -0
  36. package/dist/cli/wtconfig.js +948 -0
  37. package/dist/cli/wtconfig.js.map +1 -0
  38. package/dist/cli/wtconfig.test.d.ts +5 -0
  39. package/dist/cli/wtconfig.test.d.ts.map +1 -0
  40. package/dist/cli/wtconfig.test.js +1281 -0
  41. package/dist/cli/wtconfig.test.js.map +1 -0
  42. package/dist/cli/wtlink.js +5 -0
  43. package/dist/cli/wtlink.js.map +1 -1
  44. package/dist/cli/wtstate.d.ts +8 -0
  45. package/dist/cli/wtstate.d.ts.map +1 -0
  46. package/dist/cli/wtstate.js +83 -0
  47. package/dist/cli/wtstate.js.map +1 -0
  48. package/dist/cli/wtstate.test.d.ts +5 -0
  49. package/dist/cli/wtstate.test.d.ts.map +1 -0
  50. package/dist/cli/wtstate.test.js +193 -0
  51. package/dist/cli/wtstate.test.js.map +1 -0
  52. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +2 -0
  53. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +1 -0
  54. package/dist/e2e/cleanpr/cleanpr.e2e.test.js +326 -0
  55. package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +1 -0
  56. package/dist/e2e/helpers/cli-runner.d.ts +103 -0
  57. package/dist/e2e/helpers/cli-runner.d.ts.map +1 -0
  58. package/dist/e2e/helpers/cli-runner.js +200 -0
  59. package/dist/e2e/helpers/cli-runner.js.map +1 -0
  60. package/dist/e2e/helpers/gh-mock.d.ts +87 -0
  61. package/dist/e2e/helpers/gh-mock.d.ts.map +1 -0
  62. package/dist/e2e/helpers/gh-mock.js +384 -0
  63. package/dist/e2e/helpers/gh-mock.js.map +1 -0
  64. package/dist/e2e/helpers/index.d.ts +12 -0
  65. package/dist/e2e/helpers/index.d.ts.map +1 -0
  66. package/dist/e2e/helpers/index.js +16 -0
  67. package/dist/e2e/helpers/index.js.map +1 -0
  68. package/dist/e2e/helpers/pty-wrapper.d.ts +118 -0
  69. package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -0
  70. package/dist/e2e/helpers/pty-wrapper.js +276 -0
  71. package/dist/e2e/helpers/pty-wrapper.js.map +1 -0
  72. package/dist/e2e/helpers/scenario-harness.d.ts +55 -0
  73. package/dist/e2e/helpers/scenario-harness.d.ts.map +1 -0
  74. package/dist/e2e/helpers/scenario-harness.js +360 -0
  75. package/dist/e2e/helpers/scenario-harness.js.map +1 -0
  76. package/dist/e2e/helpers/test-context.d.ts +120 -0
  77. package/dist/e2e/helpers/test-context.d.ts.map +1 -0
  78. package/dist/e2e/helpers/test-context.js +263 -0
  79. package/dist/e2e/helpers/test-context.js.map +1 -0
  80. package/dist/e2e/lswt/lswt.e2e.test.d.ts +2 -0
  81. package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +1 -0
  82. package/dist/e2e/lswt/lswt.e2e.test.js +328 -0
  83. package/dist/e2e/lswt/lswt.e2e.test.js.map +1 -0
  84. package/dist/e2e/newpr/newpr.e2e.test.d.ts +2 -0
  85. package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +1 -0
  86. package/dist/e2e/newpr/newpr.e2e.test.js +286 -0
  87. package/dist/e2e/newpr/newpr.e2e.test.js.map +1 -0
  88. package/dist/e2e/newpr/scenarios.e2e.test.d.ts +2 -0
  89. package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +1 -0
  90. package/dist/e2e/newpr/scenarios.e2e.test.js +426 -0
  91. package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -0
  92. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +2 -0
  93. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +1 -0
  94. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +298 -0
  95. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +1 -0
  96. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +2 -0
  97. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +1 -0
  98. package/dist/e2e/wtlink/wtlink.e2e.test.js +364 -0
  99. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +1 -0
  100. package/dist/index.d.ts +15 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +14 -0
  103. package/dist/index.js.map +1 -1
  104. package/dist/lib/ai/base-provider.d.ts +58 -0
  105. package/dist/lib/ai/base-provider.d.ts.map +1 -0
  106. package/dist/lib/ai/base-provider.js +246 -0
  107. package/dist/lib/ai/base-provider.js.map +1 -0
  108. package/dist/lib/ai/base-provider.test.d.ts +7 -0
  109. package/dist/lib/ai/base-provider.test.d.ts.map +1 -0
  110. package/dist/lib/ai/base-provider.test.js +320 -0
  111. package/dist/lib/ai/base-provider.test.js.map +1 -0
  112. package/dist/lib/ai/cli-provider.d.ts +87 -0
  113. package/dist/lib/ai/cli-provider.d.ts.map +1 -0
  114. package/dist/lib/ai/cli-provider.js +280 -0
  115. package/dist/lib/ai/cli-provider.js.map +1 -0
  116. package/dist/lib/ai/cli-provider.test.d.ts +5 -0
  117. package/dist/lib/ai/cli-provider.test.d.ts.map +1 -0
  118. package/dist/lib/ai/cli-provider.test.js +462 -0
  119. package/dist/lib/ai/cli-provider.test.js.map +1 -0
  120. package/dist/lib/ai/fallback-provider.d.ts +20 -0
  121. package/dist/lib/ai/fallback-provider.d.ts.map +1 -0
  122. package/dist/lib/ai/fallback-provider.js +125 -0
  123. package/dist/lib/ai/fallback-provider.js.map +1 -0
  124. package/dist/lib/ai/fallback-provider.test.d.ts +7 -0
  125. package/dist/lib/ai/fallback-provider.test.d.ts.map +1 -0
  126. package/dist/lib/ai/fallback-provider.test.js +165 -0
  127. package/dist/lib/ai/fallback-provider.test.js.map +1 -0
  128. package/dist/lib/ai/generation-service.d.ts +44 -0
  129. package/dist/lib/ai/generation-service.d.ts.map +1 -0
  130. package/dist/lib/ai/generation-service.js +107 -0
  131. package/dist/lib/ai/generation-service.js.map +1 -0
  132. package/dist/lib/ai/generation-service.test.d.ts +7 -0
  133. package/dist/lib/ai/generation-service.test.d.ts.map +1 -0
  134. package/dist/lib/ai/generation-service.test.js +213 -0
  135. package/dist/lib/ai/generation-service.test.js.map +1 -0
  136. package/dist/lib/ai/index.d.ts +19 -0
  137. package/dist/lib/ai/index.d.ts.map +1 -0
  138. package/dist/lib/ai/index.js +22 -0
  139. package/dist/lib/ai/index.js.map +1 -0
  140. package/dist/lib/ai/provider-manager.d.ts +109 -0
  141. package/dist/lib/ai/provider-manager.d.ts.map +1 -0
  142. package/dist/lib/ai/provider-manager.js +270 -0
  143. package/dist/lib/ai/provider-manager.js.map +1 -0
  144. package/dist/lib/ai/provider-manager.test.d.ts +5 -0
  145. package/dist/lib/ai/provider-manager.test.d.ts.map +1 -0
  146. package/dist/lib/ai/provider-manager.test.js +312 -0
  147. package/dist/lib/ai/provider-manager.test.js.map +1 -0
  148. package/dist/lib/ai/types.d.ts +166 -0
  149. package/dist/lib/ai/types.d.ts.map +1 -0
  150. package/dist/lib/ai/types.js +19 -0
  151. package/dist/lib/ai/types.js.map +1 -0
  152. package/dist/lib/cleanpr/args.d.ts.map +1 -1
  153. package/dist/lib/cleanpr/args.js +18 -0
  154. package/dist/lib/cleanpr/args.js.map +1 -1
  155. package/dist/lib/cleanpr/args.test.js +88 -11
  156. package/dist/lib/cleanpr/args.test.js.map +1 -1
  157. package/dist/lib/cleanpr/cleanup.d.ts +2 -0
  158. package/dist/lib/cleanpr/cleanup.d.ts.map +1 -1
  159. package/dist/lib/cleanpr/cleanup.js +30 -2
  160. package/dist/lib/cleanpr/cleanup.js.map +1 -1
  161. package/dist/lib/cleanpr/cleanup.test.js +37 -5
  162. package/dist/lib/cleanpr/cleanup.test.js.map +1 -1
  163. package/dist/lib/cleanpr/types.d.ts +10 -0
  164. package/dist/lib/cleanpr/types.d.ts.map +1 -1
  165. package/dist/lib/cleanpr/worktree-info.test.js +72 -1
  166. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
  167. package/dist/lib/config.d.ts +176 -1
  168. package/dist/lib/config.d.ts.map +1 -1
  169. package/dist/lib/config.js +130 -2
  170. package/dist/lib/config.js.map +1 -1
  171. package/dist/lib/config.test.js +406 -2
  172. package/dist/lib/config.test.js.map +1 -1
  173. package/dist/lib/git.test.js +58 -0
  174. package/dist/lib/git.test.js.map +1 -1
  175. package/dist/lib/github.test.js +20 -0
  176. package/dist/lib/github.test.js.map +1 -1
  177. package/dist/lib/hooks/executor.d.ts +35 -0
  178. package/dist/lib/hooks/executor.d.ts.map +1 -0
  179. package/dist/lib/hooks/executor.js +401 -0
  180. package/dist/lib/hooks/executor.js.map +1 -0
  181. package/dist/lib/hooks/executor.test.d.ts +5 -0
  182. package/dist/lib/hooks/executor.test.d.ts.map +1 -0
  183. package/dist/lib/hooks/executor.test.js +648 -0
  184. package/dist/lib/hooks/executor.test.js.map +1 -0
  185. package/dist/lib/hooks/index.d.ts +25 -0
  186. package/dist/lib/hooks/index.d.ts.map +1 -0
  187. package/dist/lib/hooks/index.js +26 -0
  188. package/dist/lib/hooks/index.js.map +1 -0
  189. package/dist/lib/hooks/templates.d.ts +74 -0
  190. package/dist/lib/hooks/templates.d.ts.map +1 -0
  191. package/dist/lib/hooks/templates.js +270 -0
  192. package/dist/lib/hooks/templates.js.map +1 -0
  193. package/dist/lib/hooks/templates.test.d.ts +5 -0
  194. package/dist/lib/hooks/templates.test.d.ts.map +1 -0
  195. package/dist/lib/hooks/templates.test.js +163 -0
  196. package/dist/lib/hooks/templates.test.js.map +1 -0
  197. package/dist/lib/hooks/types.d.ts +161 -0
  198. package/dist/lib/hooks/types.d.ts.map +1 -0
  199. package/dist/lib/hooks/types.js +73 -0
  200. package/dist/lib/hooks/types.js.map +1 -0
  201. package/dist/lib/hooks/types.test.d.ts +5 -0
  202. package/dist/lib/hooks/types.test.d.ts.map +1 -0
  203. package/dist/lib/hooks/types.test.js +132 -0
  204. package/dist/lib/hooks/types.test.js.map +1 -0
  205. package/dist/lib/json-output.d.ts +172 -0
  206. package/dist/lib/json-output.d.ts.map +1 -0
  207. package/dist/lib/json-output.js +134 -0
  208. package/dist/lib/json-output.js.map +1 -0
  209. package/dist/lib/json-output.test.d.ts +5 -0
  210. package/dist/lib/json-output.test.d.ts.map +1 -0
  211. package/dist/lib/json-output.test.js +259 -0
  212. package/dist/lib/json-output.test.js.map +1 -0
  213. package/dist/lib/lswt/action-executors.d.ts +32 -0
  214. package/dist/lib/lswt/action-executors.d.ts.map +1 -0
  215. package/dist/lib/lswt/action-executors.js +489 -0
  216. package/dist/lib/lswt/action-executors.js.map +1 -0
  217. package/dist/lib/lswt/action-executors.test.d.ts +2 -0
  218. package/dist/lib/lswt/action-executors.test.d.ts.map +1 -0
  219. package/dist/lib/lswt/action-executors.test.js +755 -0
  220. package/dist/lib/lswt/action-executors.test.js.map +1 -0
  221. package/dist/lib/lswt/actions.d.ts +25 -0
  222. package/dist/lib/lswt/actions.d.ts.map +1 -0
  223. package/dist/lib/lswt/actions.js +187 -0
  224. package/dist/lib/lswt/actions.js.map +1 -0
  225. package/dist/lib/lswt/actions.test.d.ts +2 -0
  226. package/dist/lib/lswt/actions.test.d.ts.map +1 -0
  227. package/dist/lib/lswt/actions.test.js +359 -0
  228. package/dist/lib/lswt/actions.test.js.map +1 -0
  229. package/dist/lib/lswt/args.d.ts.map +1 -1
  230. package/dist/lib/lswt/args.js +44 -8
  231. package/dist/lib/lswt/args.js.map +1 -1
  232. package/dist/lib/lswt/args.test.js +70 -10
  233. package/dist/lib/lswt/args.test.js.map +1 -1
  234. package/dist/lib/lswt/environment.d.ts +43 -0
  235. package/dist/lib/lswt/environment.d.ts.map +1 -0
  236. package/dist/lib/lswt/environment.js +143 -0
  237. package/dist/lib/lswt/environment.js.map +1 -0
  238. package/dist/lib/lswt/environment.test.d.ts +2 -0
  239. package/dist/lib/lswt/environment.test.d.ts.map +1 -0
  240. package/dist/lib/lswt/environment.test.js +339 -0
  241. package/dist/lib/lswt/environment.test.js.map +1 -0
  242. package/dist/lib/lswt/formatters.d.ts.map +1 -1
  243. package/dist/lib/lswt/formatters.js +1 -0
  244. package/dist/lib/lswt/formatters.js.map +1 -1
  245. package/dist/lib/lswt/formatters.test.js +26 -0
  246. package/dist/lib/lswt/formatters.test.js.map +1 -1
  247. package/dist/lib/lswt/index.d.ts +7 -2
  248. package/dist/lib/lswt/index.d.ts.map +1 -1
  249. package/dist/lib/lswt/index.js +7 -0
  250. package/dist/lib/lswt/index.js.map +1 -1
  251. package/dist/lib/lswt/interactive.d.ts +24 -0
  252. package/dist/lib/lswt/interactive.d.ts.map +1 -0
  253. package/dist/lib/lswt/interactive.js +245 -0
  254. package/dist/lib/lswt/interactive.js.map +1 -0
  255. package/dist/lib/lswt/interactive.test.d.ts +2 -0
  256. package/dist/lib/lswt/interactive.test.d.ts.map +1 -0
  257. package/dist/lib/lswt/interactive.test.js +383 -0
  258. package/dist/lib/lswt/interactive.test.js.map +1 -0
  259. package/dist/lib/lswt/types.d.ts +52 -1
  260. package/dist/lib/lswt/types.d.ts.map +1 -1
  261. package/dist/lib/lswt/worktree-info.d.ts +8 -1
  262. package/dist/lib/lswt/worktree-info.d.ts.map +1 -1
  263. package/dist/lib/lswt/worktree-info.js +14 -4
  264. package/dist/lib/lswt/worktree-info.js.map +1 -1
  265. package/dist/lib/lswt/worktree-info.test.js +153 -16
  266. package/dist/lib/lswt/worktree-info.test.js.map +1 -1
  267. package/dist/lib/newpr/action-deps.d.ts +15 -0
  268. package/dist/lib/newpr/action-deps.d.ts.map +1 -0
  269. package/dist/lib/newpr/action-deps.js +22 -0
  270. package/dist/lib/newpr/action-deps.js.map +1 -0
  271. package/dist/lib/newpr/args.d.ts.map +1 -1
  272. package/dist/lib/newpr/args.js +56 -0
  273. package/dist/lib/newpr/args.js.map +1 -1
  274. package/dist/lib/newpr/hook-runner.d.ts +80 -0
  275. package/dist/lib/newpr/hook-runner.d.ts.map +1 -0
  276. package/dist/lib/newpr/hook-runner.js +182 -0
  277. package/dist/lib/newpr/hook-runner.js.map +1 -0
  278. package/dist/lib/newpr/hook-runner.test.d.ts +7 -0
  279. package/dist/lib/newpr/hook-runner.test.d.ts.map +1 -0
  280. package/dist/lib/newpr/hook-runner.test.js +301 -0
  281. package/dist/lib/newpr/hook-runner.test.js.map +1 -0
  282. package/dist/lib/newpr/index.d.ts +3 -0
  283. package/dist/lib/newpr/index.d.ts.map +1 -1
  284. package/dist/lib/newpr/index.js +3 -0
  285. package/dist/lib/newpr/index.js.map +1 -1
  286. package/dist/lib/newpr/types.d.ts +9 -0
  287. package/dist/lib/newpr/types.d.ts.map +1 -1
  288. package/dist/lib/prompts.test.js +208 -1
  289. package/dist/lib/prompts.test.js.map +1 -1
  290. package/dist/lib/wtconfig/config-manager.d.ts +72 -0
  291. package/dist/lib/wtconfig/config-manager.d.ts.map +1 -0
  292. package/dist/lib/wtconfig/config-manager.js +408 -0
  293. package/dist/lib/wtconfig/config-manager.js.map +1 -0
  294. package/dist/lib/wtconfig/config-manager.test.d.ts +5 -0
  295. package/dist/lib/wtconfig/config-manager.test.d.ts.map +1 -0
  296. package/dist/lib/wtconfig/config-manager.test.js +501 -0
  297. package/dist/lib/wtconfig/config-manager.test.js.map +1 -0
  298. package/dist/lib/wtconfig/environment.d.ts +23 -0
  299. package/dist/lib/wtconfig/environment.d.ts.map +1 -0
  300. package/dist/lib/wtconfig/environment.js +238 -0
  301. package/dist/lib/wtconfig/environment.js.map +1 -0
  302. package/dist/lib/wtconfig/environment.test.d.ts +5 -0
  303. package/dist/lib/wtconfig/environment.test.d.ts.map +1 -0
  304. package/dist/lib/wtconfig/environment.test.js +246 -0
  305. package/dist/lib/wtconfig/environment.test.js.map +1 -0
  306. package/dist/lib/wtconfig/index.d.ts +7 -0
  307. package/dist/lib/wtconfig/index.d.ts.map +1 -0
  308. package/dist/lib/wtconfig/index.js +8 -0
  309. package/dist/lib/wtconfig/index.js.map +1 -0
  310. package/dist/lib/wtconfig/types.d.ts +97 -0
  311. package/dist/lib/wtconfig/types.d.ts.map +1 -0
  312. package/dist/lib/wtconfig/types.js +5 -0
  313. package/dist/lib/wtconfig/types.js.map +1 -0
  314. package/dist/lib/wtstate/analyze.d.ts +13 -0
  315. package/dist/lib/wtstate/analyze.d.ts.map +1 -0
  316. package/dist/lib/wtstate/analyze.js +165 -0
  317. package/dist/lib/wtstate/analyze.js.map +1 -0
  318. package/dist/lib/wtstate/analyze.test.d.ts +5 -0
  319. package/dist/lib/wtstate/analyze.test.d.ts.map +1 -0
  320. package/dist/lib/wtstate/analyze.test.js +282 -0
  321. package/dist/lib/wtstate/analyze.test.js.map +1 -0
  322. package/dist/lib/wtstate/args.d.ts +17 -0
  323. package/dist/lib/wtstate/args.d.ts.map +1 -0
  324. package/dist/lib/wtstate/args.js +91 -0
  325. package/dist/lib/wtstate/args.js.map +1 -0
  326. package/dist/lib/wtstate/args.test.d.ts +5 -0
  327. package/dist/lib/wtstate/args.test.d.ts.map +1 -0
  328. package/dist/lib/wtstate/args.test.js +120 -0
  329. package/dist/lib/wtstate/args.test.js.map +1 -0
  330. package/dist/lib/wtstate/index.d.ts +7 -0
  331. package/dist/lib/wtstate/index.d.ts.map +1 -0
  332. package/dist/lib/wtstate/index.js +8 -0
  333. package/dist/lib/wtstate/index.js.map +1 -0
  334. package/dist/lib/wtstate/types.d.ts +64 -0
  335. package/dist/lib/wtstate/types.d.ts.map +1 -0
  336. package/dist/lib/wtstate/types.js +5 -0
  337. package/dist/lib/wtstate/types.js.map +1 -0
  338. package/dist/mcp/server.d.ts +14 -0
  339. package/dist/mcp/server.d.ts.map +1 -0
  340. package/dist/mcp/server.js +339 -0
  341. package/dist/mcp/server.js.map +1 -0
  342. package/dist/mcp/server.test.d.ts +9 -0
  343. package/dist/mcp/server.test.d.ts.map +1 -0
  344. package/dist/mcp/server.test.js +390 -0
  345. package/dist/mcp/server.test.js.map +1 -0
  346. package/package.json +8 -2
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Environment Detection
3
+ *
4
+ * Detects installed tools and environment configuration for the setup wizard.
5
+ */
6
+ import { spawnSync } from 'child_process';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ /**
10
+ * Check if a command exists in PATH
11
+ */
12
+ function commandExists(command) {
13
+ try {
14
+ const isWindows = process.platform === 'win32';
15
+ if (isWindows) {
16
+ const result = spawnSync('where', [command], {
17
+ encoding: 'utf8',
18
+ stdio: ['pipe', 'pipe', 'pipe'],
19
+ });
20
+ return result.status === 0;
21
+ }
22
+ else {
23
+ const result = spawnSync('which', [command], {
24
+ encoding: 'utf8',
25
+ stdio: ['pipe', 'pipe', 'pipe'],
26
+ });
27
+ return result.status === 0;
28
+ }
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ /**
35
+ * Run a command and return output, or null on error
36
+ */
37
+ function runCommand(command, args) {
38
+ try {
39
+ const result = spawnSync(command, args, {
40
+ encoding: 'utf8',
41
+ stdio: ['pipe', 'pipe', 'pipe'],
42
+ timeout: 5000,
43
+ });
44
+ if (result.status === 0) {
45
+ return result.stdout.trim();
46
+ }
47
+ return null;
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ /**
54
+ * Detect operating system
55
+ */
56
+ function detectOS() {
57
+ switch (process.platform) {
58
+ case 'win32':
59
+ return 'windows';
60
+ case 'darwin':
61
+ return 'macos';
62
+ default:
63
+ return 'linux';
64
+ }
65
+ }
66
+ /**
67
+ * Detect git installation and configuration
68
+ */
69
+ function detectGit() {
70
+ const version = runCommand('git', ['--version']);
71
+ if (!version) {
72
+ return {
73
+ version: null,
74
+ configured: false,
75
+ user: null,
76
+ email: null,
77
+ };
78
+ }
79
+ // Extract version number (e.g., "git version 2.43.0" -> "2.43.0")
80
+ const versionMatch = version.match(/git version (\d+\.\d+\.\d+)/);
81
+ const versionNumber = versionMatch ? versionMatch[1] : version;
82
+ const user = runCommand('git', ['config', '--global', 'user.name']);
83
+ const email = runCommand('git', ['config', '--global', 'user.email']);
84
+ return {
85
+ version: versionNumber,
86
+ configured: !!(user && email),
87
+ user,
88
+ email,
89
+ };
90
+ }
91
+ /**
92
+ * Detect GitHub CLI installation and authentication
93
+ */
94
+ function detectGitHub() {
95
+ const installed = commandExists('gh');
96
+ if (!installed) {
97
+ return {
98
+ installed: false,
99
+ authenticated: false,
100
+ user: null,
101
+ };
102
+ }
103
+ // Check authentication status
104
+ const authStatus = runCommand('gh', ['auth', 'status']);
105
+ const authenticated = authStatus !== null;
106
+ // Get authenticated user
107
+ let user = null;
108
+ if (authenticated) {
109
+ try {
110
+ const userJson = runCommand('gh', ['api', 'user', '-q', '.login']);
111
+ user = userJson;
112
+ }
113
+ catch {
114
+ // Ignore
115
+ }
116
+ }
117
+ return {
118
+ installed,
119
+ authenticated,
120
+ user,
121
+ };
122
+ }
123
+ /**
124
+ * Detect AI tool availability
125
+ */
126
+ function detectAI() {
127
+ return {
128
+ claudeCode: commandExists('claude'),
129
+ geminiCLI: commandExists('gemini'),
130
+ ollama: commandExists('ollama'),
131
+ openaiKey: !!process.env.OPENAI_API_KEY,
132
+ };
133
+ }
134
+ /**
135
+ * Detect package manager
136
+ */
137
+ function detectPackageManager(cwd) {
138
+ const workDir = cwd || process.cwd();
139
+ // Check for lock files
140
+ if (fs.existsSync(path.join(workDir, 'pnpm-lock.yaml'))) {
141
+ return 'pnpm';
142
+ }
143
+ if (fs.existsSync(path.join(workDir, 'yarn.lock'))) {
144
+ return 'yarn';
145
+ }
146
+ if (fs.existsSync(path.join(workDir, 'bun.lockb'))) {
147
+ return 'bun';
148
+ }
149
+ if (fs.existsSync(path.join(workDir, 'package-lock.json'))) {
150
+ return 'npm';
151
+ }
152
+ // Check for installed package managers
153
+ if (commandExists('pnpm'))
154
+ return 'pnpm';
155
+ if (commandExists('yarn'))
156
+ return 'yarn';
157
+ if (commandExists('bun'))
158
+ return 'bun';
159
+ if (commandExists('npm'))
160
+ return 'npm';
161
+ return null;
162
+ }
163
+ /**
164
+ * Detect IDE availability
165
+ */
166
+ function detectIDE() {
167
+ return {
168
+ vscode: commandExists('code'),
169
+ cursor: commandExists('cursor'),
170
+ };
171
+ }
172
+ /**
173
+ * Detect default branch from git config or common conventions
174
+ */
175
+ export function detectDefaultBranch(repoRoot) {
176
+ // Try to get from git config
177
+ const initDefaultBranch = runCommand('git', ['config', '--global', 'init.defaultBranch']);
178
+ if (initDefaultBranch) {
179
+ return initDefaultBranch;
180
+ }
181
+ // If in a repo, check what exists
182
+ if (repoRoot) {
183
+ const mainExists = runCommand('git', ['-C', repoRoot, 'rev-parse', '--verify', 'main']);
184
+ if (mainExists !== null)
185
+ return 'main';
186
+ const masterExists = runCommand('git', ['-C', repoRoot, 'rev-parse', '--verify', 'master']);
187
+ if (masterExists !== null)
188
+ return 'master';
189
+ }
190
+ // Default to main (modern convention)
191
+ return 'main';
192
+ }
193
+ /**
194
+ * Detect full environment information
195
+ */
196
+ export function detectEnvironment(cwd) {
197
+ return {
198
+ os: detectOS(),
199
+ git: detectGit(),
200
+ github: detectGitHub(),
201
+ ai: detectAI(),
202
+ packageManager: detectPackageManager(cwd),
203
+ ide: detectIDE(),
204
+ };
205
+ }
206
+ /**
207
+ * Get install command for detected package manager
208
+ */
209
+ export function getInstallCommand(packageManager) {
210
+ switch (packageManager) {
211
+ case 'pnpm':
212
+ return 'pnpm install';
213
+ case 'yarn':
214
+ return 'yarn install';
215
+ case 'bun':
216
+ return 'bun install';
217
+ case 'npm':
218
+ default:
219
+ return 'npm install';
220
+ }
221
+ }
222
+ /**
223
+ * Get editor open command
224
+ */
225
+ export function getEditorCommand(ide, preferred) {
226
+ if (preferred === 'cursor' && ide.cursor)
227
+ return 'cursor .';
228
+ if (preferred === 'vscode' && ide.vscode)
229
+ return 'code .';
230
+ if (preferred === 'auto') {
231
+ if (ide.cursor)
232
+ return 'cursor .';
233
+ if (ide.vscode)
234
+ return 'code .';
235
+ }
236
+ return null;
237
+ }
238
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/lib/wtconfig/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Environment Detection Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=environment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.test.d.ts","sourceRoot":"","sources":["../../../src/lib/wtconfig/environment.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Environment Detection Tests
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { spawnSync } from 'child_process';
6
+ import fs from 'fs';
7
+ import { detectEnvironment, detectDefaultBranch, getInstallCommand, getEditorCommand, } from './environment.js';
8
+ vi.mock('child_process');
9
+ vi.mock('fs');
10
+ describe('environment', () => {
11
+ const originalEnv = process.env;
12
+ const originalPlatform = process.platform;
13
+ beforeEach(() => {
14
+ vi.clearAllMocks();
15
+ process.env = { ...originalEnv };
16
+ // Mock spawnSync to return not found by default
17
+ vi.mocked(spawnSync).mockReturnValue({
18
+ status: 1,
19
+ stdout: '',
20
+ stderr: '',
21
+ pid: 0,
22
+ output: ['', '', ''],
23
+ signal: null,
24
+ });
25
+ });
26
+ afterEach(() => {
27
+ process.env = originalEnv;
28
+ Object.defineProperty(process, 'platform', { value: originalPlatform });
29
+ });
30
+ describe('detectEnvironment', () => {
31
+ it('returns environment info object', () => {
32
+ const result = detectEnvironment();
33
+ expect(result).toHaveProperty('os');
34
+ expect(result).toHaveProperty('git');
35
+ expect(result).toHaveProperty('github');
36
+ expect(result).toHaveProperty('ai');
37
+ expect(result).toHaveProperty('packageManager');
38
+ expect(result).toHaveProperty('ide');
39
+ });
40
+ it('detects linux OS', () => {
41
+ Object.defineProperty(process, 'platform', { value: 'linux' });
42
+ const result = detectEnvironment();
43
+ expect(result.os).toBe('linux');
44
+ });
45
+ it('detects macOS', () => {
46
+ Object.defineProperty(process, 'platform', { value: 'darwin' });
47
+ const result = detectEnvironment();
48
+ expect(result.os).toBe('macos');
49
+ });
50
+ it('detects Windows', () => {
51
+ Object.defineProperty(process, 'platform', { value: 'win32' });
52
+ const result = detectEnvironment();
53
+ expect(result.os).toBe('windows');
54
+ });
55
+ it('detects git version when installed', () => {
56
+ vi.mocked(spawnSync).mockImplementation((cmd, args) => {
57
+ if (cmd === 'which' && args?.[0] === 'git') {
58
+ return {
59
+ status: 0,
60
+ stdout: '/usr/bin/git',
61
+ stderr: '',
62
+ pid: 0,
63
+ output: [],
64
+ signal: null,
65
+ };
66
+ }
67
+ if (cmd === 'git') {
68
+ if (args?.[0] === '--version') {
69
+ return {
70
+ status: 0,
71
+ stdout: 'git version 2.43.0',
72
+ stderr: '',
73
+ pid: 0,
74
+ output: [],
75
+ signal: null,
76
+ };
77
+ }
78
+ if (args?.[0] === 'config' && args?.[2] === 'user.name') {
79
+ return { status: 0, stdout: 'Test User', stderr: '', pid: 0, output: [], signal: null };
80
+ }
81
+ if (args?.[0] === 'config' && args?.[2] === 'user.email') {
82
+ return {
83
+ status: 0,
84
+ stdout: 'test@example.com',
85
+ stderr: '',
86
+ pid: 0,
87
+ output: [],
88
+ signal: null,
89
+ };
90
+ }
91
+ }
92
+ return { status: 1, stdout: '', stderr: '', pid: 0, output: [], signal: null };
93
+ });
94
+ const result = detectEnvironment();
95
+ expect(result.git.version).toBe('2.43.0');
96
+ expect(result.git.configured).toBe(true);
97
+ expect(result.git.user).toBe('Test User');
98
+ expect(result.git.email).toBe('test@example.com');
99
+ });
100
+ it('detects GitHub CLI when installed and authenticated', () => {
101
+ vi.mocked(spawnSync).mockImplementation((cmd, args) => {
102
+ // Handle both 'which' (Unix) and 'where' (Windows)
103
+ if (cmd === 'which' || cmd === 'where') {
104
+ if (args?.[0] === 'gh') {
105
+ return {
106
+ status: 0,
107
+ stdout: '/usr/bin/gh',
108
+ stderr: '',
109
+ pid: 0,
110
+ output: [],
111
+ signal: null,
112
+ };
113
+ }
114
+ }
115
+ if (cmd === 'gh') {
116
+ if (args?.[0] === 'auth' && args?.[1] === 'status') {
117
+ return { status: 0, stdout: 'Logged in', stderr: '', pid: 0, output: [], signal: null };
118
+ }
119
+ if (args?.[0] === 'api') {
120
+ return { status: 0, stdout: 'testuser', stderr: '', pid: 0, output: [], signal: null };
121
+ }
122
+ }
123
+ return { status: 1, stdout: '', stderr: '', pid: 0, output: [], signal: null };
124
+ });
125
+ const result = detectEnvironment();
126
+ expect(result.github.installed).toBe(true);
127
+ expect(result.github.authenticated).toBe(true);
128
+ expect(result.github.user).toBe('testuser');
129
+ });
130
+ it('detects AI tools', () => {
131
+ vi.mocked(spawnSync).mockImplementation((cmd, args) => {
132
+ // Handle both 'which' (Unix) and 'where' (Windows)
133
+ if (cmd === 'which' || cmd === 'where') {
134
+ if (args?.[0] === 'claude' || args?.[0] === 'ollama') {
135
+ return {
136
+ status: 0,
137
+ stdout: '/path/to/' + args[0],
138
+ stderr: '',
139
+ pid: 0,
140
+ output: [],
141
+ signal: null,
142
+ };
143
+ }
144
+ }
145
+ return { status: 1, stdout: '', stderr: '', pid: 0, output: [], signal: null };
146
+ });
147
+ const result = detectEnvironment();
148
+ expect(result.ai.claudeCode).toBe(true);
149
+ expect(result.ai.ollama).toBe(true);
150
+ expect(result.ai.geminiCLI).toBe(false);
151
+ });
152
+ it('detects OpenAI API key from environment', () => {
153
+ process.env.OPENAI_API_KEY = 'sk-test123';
154
+ const result = detectEnvironment();
155
+ expect(result.ai.openaiKey).toBe(true);
156
+ });
157
+ it('detects package manager from lock files', () => {
158
+ vi.mocked(fs.existsSync).mockImplementation((p) => {
159
+ return p.endsWith('pnpm-lock.yaml');
160
+ });
161
+ const result = detectEnvironment('/test/project');
162
+ expect(result.packageManager).toBe('pnpm');
163
+ });
164
+ it('detects IDE availability', () => {
165
+ vi.mocked(spawnSync).mockImplementation((cmd, args) => {
166
+ // Handle both 'which' (Unix) and 'where' (Windows)
167
+ if (cmd === 'which' || cmd === 'where') {
168
+ if (args?.[0] === 'code' || args?.[0] === 'cursor') {
169
+ return {
170
+ status: 0,
171
+ stdout: '/path/to/' + args[0],
172
+ stderr: '',
173
+ pid: 0,
174
+ output: [],
175
+ signal: null,
176
+ };
177
+ }
178
+ }
179
+ return { status: 1, stdout: '', stderr: '', pid: 0, output: [], signal: null };
180
+ });
181
+ const result = detectEnvironment();
182
+ expect(result.ide.vscode).toBe(true);
183
+ expect(result.ide.cursor).toBe(true);
184
+ });
185
+ });
186
+ describe('detectDefaultBranch', () => {
187
+ it('returns main by default', () => {
188
+ const result = detectDefaultBranch();
189
+ expect(result).toBe('main');
190
+ });
191
+ it('returns git config default branch if set', () => {
192
+ vi.mocked(spawnSync).mockImplementation((cmd, args) => {
193
+ if (cmd === 'git' && args?.[0] === 'config' && args?.[2] === 'init.defaultBranch') {
194
+ return { status: 0, stdout: 'develop', stderr: '', pid: 0, output: [], signal: null };
195
+ }
196
+ return { status: 1, stdout: '', stderr: '', pid: 0, output: [], signal: null };
197
+ });
198
+ const result = detectDefaultBranch();
199
+ expect(result).toBe('develop');
200
+ });
201
+ });
202
+ describe('getInstallCommand', () => {
203
+ it('returns pnpm install for pnpm', () => {
204
+ expect(getInstallCommand('pnpm')).toBe('pnpm install');
205
+ });
206
+ it('returns yarn install for yarn', () => {
207
+ expect(getInstallCommand('yarn')).toBe('yarn install');
208
+ });
209
+ it('returns bun install for bun', () => {
210
+ expect(getInstallCommand('bun')).toBe('bun install');
211
+ });
212
+ it('returns npm install for npm', () => {
213
+ expect(getInstallCommand('npm')).toBe('npm install');
214
+ });
215
+ it('returns npm install for null', () => {
216
+ expect(getInstallCommand(null)).toBe('npm install');
217
+ });
218
+ });
219
+ describe('getEditorCommand', () => {
220
+ it('returns cursor command when cursor preferred and available', () => {
221
+ const ide = { vscode: true, cursor: true };
222
+ expect(getEditorCommand(ide, 'cursor')).toBe('cursor .');
223
+ });
224
+ it('returns vscode command when vscode preferred and available', () => {
225
+ const ide = { vscode: true, cursor: true };
226
+ expect(getEditorCommand(ide, 'vscode')).toBe('code .');
227
+ });
228
+ it('returns null when preferred editor not available', () => {
229
+ const ide = { vscode: true, cursor: false };
230
+ expect(getEditorCommand(ide, 'cursor')).toBeNull();
231
+ });
232
+ it('prefers cursor when auto and both available', () => {
233
+ const ide = { vscode: true, cursor: true };
234
+ expect(getEditorCommand(ide, 'auto')).toBe('cursor .');
235
+ });
236
+ it('returns vscode when auto and only vscode available', () => {
237
+ const ide = { vscode: true, cursor: false };
238
+ expect(getEditorCommand(ide, 'auto')).toBe('code .');
239
+ });
240
+ it('returns null when no editor available', () => {
241
+ const ide = { vscode: false, cursor: false };
242
+ expect(getEditorCommand(ide, 'auto')).toBeNull();
243
+ });
244
+ });
245
+ });
246
+ //# sourceMappingURL=environment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.test.js","sourceRoot":"","sources":["../../../src/lib/wtconfig/environment.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * wtconfig library - public API exports
3
+ */
4
+ export type { EnvironmentInfo, WizardState, ValidationResult, ValidationError, ValidationWarning, ConfigSource, } from './types.js';
5
+ export { detectEnvironment, detectDefaultBranch, getInstallCommand, getEditorCommand, } from './environment.js';
6
+ export { getGlobalConfigPath, findRepoConfigPath, getDefaultRepoConfigPath, getConfigSource, loadConfigFromPath, loadGlobalConfig, loadRepoConfig, loadMergedConfig, saveConfig, saveGlobalConfig, saveRepoConfig, setConfigValue, getConfigValue, validateConfig, formatConfigDisplay, } from './config-manager.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/wtconfig/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * wtconfig library - public API exports
3
+ */
4
+ // Environment detection
5
+ export { detectEnvironment, detectDefaultBranch, getInstallCommand, getEditorCommand, } from './environment.js';
6
+ // Configuration management
7
+ export { getGlobalConfigPath, findRepoConfigPath, getDefaultRepoConfigPath, getConfigSource, loadConfigFromPath, loadGlobalConfig, loadRepoConfig, loadMergedConfig, saveConfig, saveGlobalConfig, saveRepoConfig, setConfigValue, getConfigValue, validateConfig, formatConfigDisplay, } from './config-manager.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/wtconfig/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAwB;AACxB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,2BAA2B;AAC3B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Types for wtconfig command
3
+ */
4
+ /**
5
+ * Detected environment information
6
+ */
7
+ export interface EnvironmentInfo {
8
+ os: 'windows' | 'macos' | 'linux';
9
+ git: {
10
+ version: string | null;
11
+ configured: boolean;
12
+ user: string | null;
13
+ email: string | null;
14
+ };
15
+ github: {
16
+ installed: boolean;
17
+ authenticated: boolean;
18
+ user: string | null;
19
+ };
20
+ ai: {
21
+ claudeCode: boolean;
22
+ geminiCLI: boolean;
23
+ ollama: boolean;
24
+ openaiKey: boolean;
25
+ };
26
+ packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun' | null;
27
+ ide: {
28
+ vscode: boolean;
29
+ cursor: boolean;
30
+ };
31
+ }
32
+ /**
33
+ * Wizard configuration state
34
+ */
35
+ export interface WizardState {
36
+ baseBranch: string;
37
+ draftPr: boolean;
38
+ worktreeLocation: 'sibling' | 'inside' | 'custom';
39
+ worktreePattern: string;
40
+ worktreeParent: string;
41
+ branchPrefix: string;
42
+ preferredEditor: 'vscode' | 'cursor' | 'auto';
43
+ aiEnabled: boolean;
44
+ aiProvider: 'auto' | 'claude' | 'gemini' | 'openai' | 'ollama' | 'none';
45
+ aiBranchName: boolean;
46
+ aiPrDescription: boolean;
47
+ hooks: {
48
+ autoDeps: boolean;
49
+ openEditor: boolean;
50
+ };
51
+ plugins: string[];
52
+ generators: {
53
+ branchName?: string;
54
+ prTitle?: string;
55
+ prDescription?: string;
56
+ commitMessage?: string;
57
+ };
58
+ integrations: {
59
+ linear?: {
60
+ teamId?: string;
61
+ apiKeyEnv?: string;
62
+ };
63
+ jira?: {
64
+ projectKey?: string;
65
+ baseUrl?: string;
66
+ apiTokenEnv?: string;
67
+ };
68
+ slack?: {
69
+ webhookUrl?: string;
70
+ channel?: string;
71
+ };
72
+ };
73
+ }
74
+ /**
75
+ * Validation result
76
+ */
77
+ export interface ValidationResult {
78
+ valid: boolean;
79
+ errors: ValidationError[];
80
+ warnings: ValidationWarning[];
81
+ }
82
+ export interface ValidationError {
83
+ path: string;
84
+ message: string;
85
+ }
86
+ export interface ValidationWarning {
87
+ path: string;
88
+ message: string;
89
+ }
90
+ /**
91
+ * Configuration source information
92
+ */
93
+ export interface ConfigSource {
94
+ type: 'global' | 'repository' | 'none';
95
+ path: string | null;
96
+ }
97
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/wtconfig/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for wtconfig command
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/wtconfig/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}