@camaradesuk/git-worktree-tools 1.3.0 → 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 (284) hide show
  1. package/README.md +290 -3
  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 +459 -7
  25. package/dist/cli/cleanpr.test.js.map +1 -1
  26. package/dist/cli/newpr.js +189 -28
  27. package/dist/cli/newpr.js.map +1 -1
  28. package/dist/cli/newpr.test.js +349 -0
  29. package/dist/cli/newpr.test.js.map +1 -1
  30. package/dist/cli/wtconfig.d.ts +14 -0
  31. package/dist/cli/wtconfig.d.ts.map +1 -0
  32. package/dist/cli/wtconfig.js +948 -0
  33. package/dist/cli/wtconfig.js.map +1 -0
  34. package/dist/cli/wtconfig.test.d.ts +5 -0
  35. package/dist/cli/wtconfig.test.d.ts.map +1 -0
  36. package/dist/cli/wtconfig.test.js +1281 -0
  37. package/dist/cli/wtconfig.test.js.map +1 -0
  38. package/dist/cli/wtlink.js +5 -0
  39. package/dist/cli/wtlink.js.map +1 -1
  40. package/dist/cli/wtstate.d.ts +8 -0
  41. package/dist/cli/wtstate.d.ts.map +1 -0
  42. package/dist/cli/wtstate.js +83 -0
  43. package/dist/cli/wtstate.js.map +1 -0
  44. package/dist/cli/wtstate.test.d.ts +5 -0
  45. package/dist/cli/wtstate.test.d.ts.map +1 -0
  46. package/dist/cli/wtstate.test.js +193 -0
  47. package/dist/cli/wtstate.test.js.map +1 -0
  48. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +2 -0
  49. package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +1 -0
  50. package/dist/e2e/cleanpr/cleanpr.e2e.test.js +326 -0
  51. package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +1 -0
  52. package/dist/e2e/helpers/cli-runner.d.ts +103 -0
  53. package/dist/e2e/helpers/cli-runner.d.ts.map +1 -0
  54. package/dist/e2e/helpers/cli-runner.js +200 -0
  55. package/dist/e2e/helpers/cli-runner.js.map +1 -0
  56. package/dist/e2e/helpers/gh-mock.d.ts +87 -0
  57. package/dist/e2e/helpers/gh-mock.d.ts.map +1 -0
  58. package/dist/e2e/helpers/gh-mock.js +384 -0
  59. package/dist/e2e/helpers/gh-mock.js.map +1 -0
  60. package/dist/e2e/helpers/index.d.ts +12 -0
  61. package/dist/e2e/helpers/index.d.ts.map +1 -0
  62. package/dist/e2e/helpers/index.js +16 -0
  63. package/dist/e2e/helpers/index.js.map +1 -0
  64. package/dist/e2e/helpers/pty-wrapper.d.ts +118 -0
  65. package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -0
  66. package/dist/e2e/helpers/pty-wrapper.js +276 -0
  67. package/dist/e2e/helpers/pty-wrapper.js.map +1 -0
  68. package/dist/e2e/helpers/scenario-harness.d.ts +55 -0
  69. package/dist/e2e/helpers/scenario-harness.d.ts.map +1 -0
  70. package/dist/e2e/helpers/scenario-harness.js +360 -0
  71. package/dist/e2e/helpers/scenario-harness.js.map +1 -0
  72. package/dist/e2e/helpers/test-context.d.ts +120 -0
  73. package/dist/e2e/helpers/test-context.d.ts.map +1 -0
  74. package/dist/e2e/helpers/test-context.js +263 -0
  75. package/dist/e2e/helpers/test-context.js.map +1 -0
  76. package/dist/e2e/lswt/lswt.e2e.test.d.ts +2 -0
  77. package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +1 -0
  78. package/dist/e2e/lswt/lswt.e2e.test.js +328 -0
  79. package/dist/e2e/lswt/lswt.e2e.test.js.map +1 -0
  80. package/dist/e2e/newpr/newpr.e2e.test.d.ts +2 -0
  81. package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +1 -0
  82. package/dist/e2e/newpr/newpr.e2e.test.js +286 -0
  83. package/dist/e2e/newpr/newpr.e2e.test.js.map +1 -0
  84. package/dist/e2e/newpr/scenarios.e2e.test.d.ts +2 -0
  85. package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +1 -0
  86. package/dist/e2e/newpr/scenarios.e2e.test.js +426 -0
  87. package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -0
  88. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +2 -0
  89. package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +1 -0
  90. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +298 -0
  91. package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +1 -0
  92. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +2 -0
  93. package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +1 -0
  94. package/dist/e2e/wtlink/wtlink.e2e.test.js +364 -0
  95. package/dist/e2e/wtlink/wtlink.e2e.test.js.map +1 -0
  96. package/dist/index.d.ts +15 -1
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +14 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/lib/ai/base-provider.d.ts +58 -0
  101. package/dist/lib/ai/base-provider.d.ts.map +1 -0
  102. package/dist/lib/ai/base-provider.js +246 -0
  103. package/dist/lib/ai/base-provider.js.map +1 -0
  104. package/dist/lib/ai/base-provider.test.d.ts +7 -0
  105. package/dist/lib/ai/base-provider.test.d.ts.map +1 -0
  106. package/dist/lib/ai/base-provider.test.js +320 -0
  107. package/dist/lib/ai/base-provider.test.js.map +1 -0
  108. package/dist/lib/ai/cli-provider.d.ts +87 -0
  109. package/dist/lib/ai/cli-provider.d.ts.map +1 -0
  110. package/dist/lib/ai/cli-provider.js +280 -0
  111. package/dist/lib/ai/cli-provider.js.map +1 -0
  112. package/dist/lib/ai/cli-provider.test.d.ts +5 -0
  113. package/dist/lib/ai/cli-provider.test.d.ts.map +1 -0
  114. package/dist/lib/ai/cli-provider.test.js +462 -0
  115. package/dist/lib/ai/cli-provider.test.js.map +1 -0
  116. package/dist/lib/ai/fallback-provider.d.ts +20 -0
  117. package/dist/lib/ai/fallback-provider.d.ts.map +1 -0
  118. package/dist/lib/ai/fallback-provider.js +125 -0
  119. package/dist/lib/ai/fallback-provider.js.map +1 -0
  120. package/dist/lib/ai/fallback-provider.test.d.ts +7 -0
  121. package/dist/lib/ai/fallback-provider.test.d.ts.map +1 -0
  122. package/dist/lib/ai/fallback-provider.test.js +165 -0
  123. package/dist/lib/ai/fallback-provider.test.js.map +1 -0
  124. package/dist/lib/ai/generation-service.d.ts +44 -0
  125. package/dist/lib/ai/generation-service.d.ts.map +1 -0
  126. package/dist/lib/ai/generation-service.js +107 -0
  127. package/dist/lib/ai/generation-service.js.map +1 -0
  128. package/dist/lib/ai/generation-service.test.d.ts +7 -0
  129. package/dist/lib/ai/generation-service.test.d.ts.map +1 -0
  130. package/dist/lib/ai/generation-service.test.js +213 -0
  131. package/dist/lib/ai/generation-service.test.js.map +1 -0
  132. package/dist/lib/ai/index.d.ts +19 -0
  133. package/dist/lib/ai/index.d.ts.map +1 -0
  134. package/dist/lib/ai/index.js +22 -0
  135. package/dist/lib/ai/index.js.map +1 -0
  136. package/dist/lib/ai/provider-manager.d.ts +109 -0
  137. package/dist/lib/ai/provider-manager.d.ts.map +1 -0
  138. package/dist/lib/ai/provider-manager.js +270 -0
  139. package/dist/lib/ai/provider-manager.js.map +1 -0
  140. package/dist/lib/ai/provider-manager.test.d.ts +5 -0
  141. package/dist/lib/ai/provider-manager.test.d.ts.map +1 -0
  142. package/dist/lib/ai/provider-manager.test.js +312 -0
  143. package/dist/lib/ai/provider-manager.test.js.map +1 -0
  144. package/dist/lib/ai/types.d.ts +166 -0
  145. package/dist/lib/ai/types.d.ts.map +1 -0
  146. package/dist/lib/ai/types.js +19 -0
  147. package/dist/lib/ai/types.js.map +1 -0
  148. package/dist/lib/cleanpr/args.d.ts.map +1 -1
  149. package/dist/lib/cleanpr/args.js +18 -0
  150. package/dist/lib/cleanpr/args.js.map +1 -1
  151. package/dist/lib/cleanpr/args.test.js +88 -11
  152. package/dist/lib/cleanpr/args.test.js.map +1 -1
  153. package/dist/lib/cleanpr/cleanup.d.ts +2 -0
  154. package/dist/lib/cleanpr/cleanup.d.ts.map +1 -1
  155. package/dist/lib/cleanpr/cleanup.js +30 -2
  156. package/dist/lib/cleanpr/cleanup.js.map +1 -1
  157. package/dist/lib/cleanpr/cleanup.test.js +37 -5
  158. package/dist/lib/cleanpr/cleanup.test.js.map +1 -1
  159. package/dist/lib/cleanpr/types.d.ts +10 -0
  160. package/dist/lib/cleanpr/types.d.ts.map +1 -1
  161. package/dist/lib/cleanpr/worktree-info.test.js +72 -1
  162. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
  163. package/dist/lib/config.d.ts +170 -1
  164. package/dist/lib/config.d.ts.map +1 -1
  165. package/dist/lib/config.js +129 -2
  166. package/dist/lib/config.js.map +1 -1
  167. package/dist/lib/config.test.js +406 -2
  168. package/dist/lib/config.test.js.map +1 -1
  169. package/dist/lib/hooks/executor.d.ts +35 -0
  170. package/dist/lib/hooks/executor.d.ts.map +1 -0
  171. package/dist/lib/hooks/executor.js +401 -0
  172. package/dist/lib/hooks/executor.js.map +1 -0
  173. package/dist/lib/hooks/executor.test.d.ts +5 -0
  174. package/dist/lib/hooks/executor.test.d.ts.map +1 -0
  175. package/dist/lib/hooks/executor.test.js +648 -0
  176. package/dist/lib/hooks/executor.test.js.map +1 -0
  177. package/dist/lib/hooks/index.d.ts +25 -0
  178. package/dist/lib/hooks/index.d.ts.map +1 -0
  179. package/dist/lib/hooks/index.js +26 -0
  180. package/dist/lib/hooks/index.js.map +1 -0
  181. package/dist/lib/hooks/templates.d.ts +74 -0
  182. package/dist/lib/hooks/templates.d.ts.map +1 -0
  183. package/dist/lib/hooks/templates.js +270 -0
  184. package/dist/lib/hooks/templates.js.map +1 -0
  185. package/dist/lib/hooks/templates.test.d.ts +5 -0
  186. package/dist/lib/hooks/templates.test.d.ts.map +1 -0
  187. package/dist/lib/hooks/templates.test.js +163 -0
  188. package/dist/lib/hooks/templates.test.js.map +1 -0
  189. package/dist/lib/hooks/types.d.ts +161 -0
  190. package/dist/lib/hooks/types.d.ts.map +1 -0
  191. package/dist/lib/hooks/types.js +73 -0
  192. package/dist/lib/hooks/types.js.map +1 -0
  193. package/dist/lib/hooks/types.test.d.ts +5 -0
  194. package/dist/lib/hooks/types.test.d.ts.map +1 -0
  195. package/dist/lib/hooks/types.test.js +132 -0
  196. package/dist/lib/hooks/types.test.js.map +1 -0
  197. package/dist/lib/json-output.d.ts +172 -0
  198. package/dist/lib/json-output.d.ts.map +1 -0
  199. package/dist/lib/json-output.js +134 -0
  200. package/dist/lib/json-output.js.map +1 -0
  201. package/dist/lib/json-output.test.d.ts +5 -0
  202. package/dist/lib/json-output.test.d.ts.map +1 -0
  203. package/dist/lib/json-output.test.js +259 -0
  204. package/dist/lib/json-output.test.js.map +1 -0
  205. package/dist/lib/lswt/action-executors.test.js +6 -0
  206. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  207. package/dist/lib/newpr/action-deps.d.ts +15 -0
  208. package/dist/lib/newpr/action-deps.d.ts.map +1 -0
  209. package/dist/lib/newpr/action-deps.js +22 -0
  210. package/dist/lib/newpr/action-deps.js.map +1 -0
  211. package/dist/lib/newpr/args.d.ts.map +1 -1
  212. package/dist/lib/newpr/args.js +56 -0
  213. package/dist/lib/newpr/args.js.map +1 -1
  214. package/dist/lib/newpr/hook-runner.d.ts +80 -0
  215. package/dist/lib/newpr/hook-runner.d.ts.map +1 -0
  216. package/dist/lib/newpr/hook-runner.js +182 -0
  217. package/dist/lib/newpr/hook-runner.js.map +1 -0
  218. package/dist/lib/newpr/hook-runner.test.d.ts +7 -0
  219. package/dist/lib/newpr/hook-runner.test.d.ts.map +1 -0
  220. package/dist/lib/newpr/hook-runner.test.js +301 -0
  221. package/dist/lib/newpr/hook-runner.test.js.map +1 -0
  222. package/dist/lib/newpr/index.d.ts +3 -0
  223. package/dist/lib/newpr/index.d.ts.map +1 -1
  224. package/dist/lib/newpr/index.js +3 -0
  225. package/dist/lib/newpr/index.js.map +1 -1
  226. package/dist/lib/newpr/types.d.ts +9 -0
  227. package/dist/lib/newpr/types.d.ts.map +1 -1
  228. package/dist/lib/wtconfig/config-manager.d.ts +72 -0
  229. package/dist/lib/wtconfig/config-manager.d.ts.map +1 -0
  230. package/dist/lib/wtconfig/config-manager.js +408 -0
  231. package/dist/lib/wtconfig/config-manager.js.map +1 -0
  232. package/dist/lib/wtconfig/config-manager.test.d.ts +5 -0
  233. package/dist/lib/wtconfig/config-manager.test.d.ts.map +1 -0
  234. package/dist/lib/wtconfig/config-manager.test.js +501 -0
  235. package/dist/lib/wtconfig/config-manager.test.js.map +1 -0
  236. package/dist/lib/wtconfig/environment.d.ts +23 -0
  237. package/dist/lib/wtconfig/environment.d.ts.map +1 -0
  238. package/dist/lib/wtconfig/environment.js +238 -0
  239. package/dist/lib/wtconfig/environment.js.map +1 -0
  240. package/dist/lib/wtconfig/environment.test.d.ts +5 -0
  241. package/dist/lib/wtconfig/environment.test.d.ts.map +1 -0
  242. package/dist/lib/wtconfig/environment.test.js +246 -0
  243. package/dist/lib/wtconfig/environment.test.js.map +1 -0
  244. package/dist/lib/wtconfig/index.d.ts +7 -0
  245. package/dist/lib/wtconfig/index.d.ts.map +1 -0
  246. package/dist/lib/wtconfig/index.js +8 -0
  247. package/dist/lib/wtconfig/index.js.map +1 -0
  248. package/dist/lib/wtconfig/types.d.ts +97 -0
  249. package/dist/lib/wtconfig/types.d.ts.map +1 -0
  250. package/dist/lib/wtconfig/types.js +5 -0
  251. package/dist/lib/wtconfig/types.js.map +1 -0
  252. package/dist/lib/wtstate/analyze.d.ts +13 -0
  253. package/dist/lib/wtstate/analyze.d.ts.map +1 -0
  254. package/dist/lib/wtstate/analyze.js +165 -0
  255. package/dist/lib/wtstate/analyze.js.map +1 -0
  256. package/dist/lib/wtstate/analyze.test.d.ts +5 -0
  257. package/dist/lib/wtstate/analyze.test.d.ts.map +1 -0
  258. package/dist/lib/wtstate/analyze.test.js +282 -0
  259. package/dist/lib/wtstate/analyze.test.js.map +1 -0
  260. package/dist/lib/wtstate/args.d.ts +17 -0
  261. package/dist/lib/wtstate/args.d.ts.map +1 -0
  262. package/dist/lib/wtstate/args.js +91 -0
  263. package/dist/lib/wtstate/args.js.map +1 -0
  264. package/dist/lib/wtstate/args.test.d.ts +5 -0
  265. package/dist/lib/wtstate/args.test.d.ts.map +1 -0
  266. package/dist/lib/wtstate/args.test.js +120 -0
  267. package/dist/lib/wtstate/args.test.js.map +1 -0
  268. package/dist/lib/wtstate/index.d.ts +7 -0
  269. package/dist/lib/wtstate/index.d.ts.map +1 -0
  270. package/dist/lib/wtstate/index.js +8 -0
  271. package/dist/lib/wtstate/index.js.map +1 -0
  272. package/dist/lib/wtstate/types.d.ts +64 -0
  273. package/dist/lib/wtstate/types.d.ts.map +1 -0
  274. package/dist/lib/wtstate/types.js +5 -0
  275. package/dist/lib/wtstate/types.js.map +1 -0
  276. package/dist/mcp/server.d.ts +14 -0
  277. package/dist/mcp/server.d.ts.map +1 -0
  278. package/dist/mcp/server.js +339 -0
  279. package/dist/mcp/server.js.map +1 -0
  280. package/dist/mcp/server.test.d.ts +9 -0
  281. package/dist/mcp/server.test.d.ts.map +1 -0
  282. package/dist/mcp/server.test.js +390 -0
  283. package/dist/mcp/server.test.js.map +1 -0
  284. package/package.json +8 -2
@@ -0,0 +1,312 @@
1
+ /**
2
+ * AI Provider Manager Tests
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { AIProviderManager, createAIProviderManager, getDefaultAIProviderManager, } from './provider-manager.js';
6
+ // Mock the provider modules with static checkAvailability methods
7
+ vi.mock('./cli-provider.js', () => {
8
+ const createMockProviderClass = () => {
9
+ const MockClass = vi.fn();
10
+ MockClass.checkAvailability = vi.fn().mockResolvedValue(true);
11
+ return MockClass;
12
+ };
13
+ return {
14
+ ClaudeProvider: createMockProviderClass(),
15
+ GeminiProvider: createMockProviderClass(),
16
+ OllamaProvider: createMockProviderClass(),
17
+ OpenAIProvider: createMockProviderClass(),
18
+ ScriptProvider: vi.fn(),
19
+ };
20
+ });
21
+ vi.mock('./fallback-provider.js', () => ({
22
+ FallbackProvider: vi.fn(),
23
+ }));
24
+ import { ClaudeProvider, GeminiProvider, OllamaProvider, OpenAIProvider } from './cli-provider.js';
25
+ import { FallbackProvider } from './fallback-provider.js';
26
+ describe('provider-manager', () => {
27
+ const mockProvider = (name, available, result) => ({
28
+ name,
29
+ isAvailable: vi.fn().mockResolvedValue(available),
30
+ generateBranchName: vi
31
+ .fn()
32
+ .mockResolvedValue(result ?? { success: true, content: 'test-branch', provider: name }),
33
+ generatePRTitle: vi
34
+ .fn()
35
+ .mockResolvedValue(result ?? { success: true, content: 'Test PR', provider: name }),
36
+ generatePRDescription: vi
37
+ .fn()
38
+ .mockResolvedValue(result ?? { success: true, content: 'Test description', provider: name }),
39
+ generateCommitMessage: vi
40
+ .fn()
41
+ .mockResolvedValue(result ?? { success: true, content: 'test commit', provider: name }),
42
+ generatePlanDocument: vi
43
+ .fn()
44
+ .mockResolvedValue(result ?? { success: true, content: '# Plan', provider: name }),
45
+ });
46
+ beforeEach(() => {
47
+ vi.clearAllMocks();
48
+ // Reset module state
49
+ vi.resetModules();
50
+ // Reset static checkAvailability mocks to default (return true)
51
+ ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(true);
52
+ GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(true);
53
+ OllamaProvider.checkAvailability = vi.fn().mockResolvedValue(true);
54
+ OpenAIProvider.checkAvailability = vi.fn().mockResolvedValue(true);
55
+ });
56
+ describe('AIProviderManager', () => {
57
+ describe('constructor', () => {
58
+ it('creates manager with default config', () => {
59
+ const manager = new AIProviderManager();
60
+ const config = manager.getConfig();
61
+ // Default config has AI disabled
62
+ expect(config.provider).toBe('none');
63
+ expect(config.branchName).toBe(false);
64
+ expect(config.prTitle).toBe(false);
65
+ expect(config.prDescription).toBe(false);
66
+ });
67
+ it('creates manager with custom config', () => {
68
+ const manager = new AIProviderManager({
69
+ config: {
70
+ provider: 'claude',
71
+ branchName: false,
72
+ prTitle: true,
73
+ prDescription: false,
74
+ commitMessage: true,
75
+ planDocument: false,
76
+ },
77
+ });
78
+ const config = manager.getConfig();
79
+ expect(config.provider).toBe('claude');
80
+ expect(config.branchName).toBe(false);
81
+ expect(config.prTitle).toBe(true);
82
+ expect(config.prDescription).toBe(false);
83
+ });
84
+ });
85
+ describe('initialize', () => {
86
+ it('initializes with auto provider detection', async () => {
87
+ const claudeProvider = mockProvider('claude', true);
88
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
89
+ const manager = new AIProviderManager({ config: { provider: 'auto' } });
90
+ await manager.initialize();
91
+ const providerName = await manager.getActiveProviderName();
92
+ expect(providerName).toBe('claude');
93
+ });
94
+ it('skips unavailable providers during auto-detection', async () => {
95
+ const claudeProvider = mockProvider('claude', false);
96
+ const geminiProvider = mockProvider('gemini', true);
97
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
98
+ vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
99
+ // Mock static checkAvailability for lazy initialization
100
+ ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(false);
101
+ GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(true);
102
+ const manager = new AIProviderManager({ config: { provider: 'auto' } });
103
+ await manager.initialize();
104
+ const providerName = await manager.getActiveProviderName();
105
+ expect(providerName).toBe('gemini');
106
+ });
107
+ it('initializes specific provider when configured', async () => {
108
+ const openaiProvider = mockProvider('openai', true);
109
+ vi.mocked(OpenAIProvider).mockImplementation(() => openaiProvider);
110
+ const manager = new AIProviderManager({ config: { provider: 'openai' } });
111
+ await manager.initialize();
112
+ const providerName = await manager.getActiveProviderName();
113
+ expect(providerName).toBe('openai');
114
+ });
115
+ it('initializes fallback provider when configured', async () => {
116
+ const claudeProvider = mockProvider('claude', true);
117
+ const ollamaProvider = mockProvider('ollama', true);
118
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
119
+ vi.mocked(OllamaProvider).mockImplementation(() => ollamaProvider);
120
+ const manager = new AIProviderManager({
121
+ config: { provider: 'claude', fallback: 'ollama' },
122
+ });
123
+ await manager.initialize();
124
+ expect(ClaudeProvider).toHaveBeenCalled();
125
+ expect(OllamaProvider).toHaveBeenCalled();
126
+ });
127
+ it('only initializes once', async () => {
128
+ const claudeProvider = mockProvider('claude', true);
129
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
130
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
131
+ await manager.initialize();
132
+ await manager.initialize();
133
+ expect(ClaudeProvider).toHaveBeenCalledTimes(1);
134
+ });
135
+ });
136
+ describe('getProvider', () => {
137
+ it('returns primary provider when available', async () => {
138
+ const claudeProvider = mockProvider('claude', true);
139
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
140
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
141
+ const provider = await manager.getProvider();
142
+ expect(provider.name).toBe('claude');
143
+ });
144
+ it('returns fallback provider when primary unavailable', async () => {
145
+ const claudeProvider = mockProvider('claude', false);
146
+ const geminiProvider = mockProvider('gemini', true);
147
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
148
+ vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
149
+ // Mock static checkAvailability for lazy initialization
150
+ ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(false);
151
+ GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(true);
152
+ const manager = new AIProviderManager({
153
+ config: { provider: 'claude', fallback: 'gemini' },
154
+ });
155
+ const provider = await manager.getProvider();
156
+ expect(provider.name).toBe('gemini');
157
+ });
158
+ it('returns FallbackProvider when no providers available', async () => {
159
+ const claudeProvider = mockProvider('claude', false);
160
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
161
+ // Mock static checkAvailability for lazy initialization
162
+ ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(false);
163
+ const fallbackProvider = mockProvider('fallback', true);
164
+ vi.mocked(FallbackProvider).mockImplementation(() => fallbackProvider);
165
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
166
+ const provider = await manager.getProvider();
167
+ expect(provider.name).toBe('fallback');
168
+ });
169
+ });
170
+ describe('isEnabled', () => {
171
+ it('returns true for enabled features', () => {
172
+ const manager = new AIProviderManager({
173
+ config: { branchName: true, prTitle: false },
174
+ });
175
+ expect(manager.isEnabled('branchName')).toBe(true);
176
+ expect(manager.isEnabled('prTitle')).toBe(false);
177
+ });
178
+ });
179
+ describe('generation methods', () => {
180
+ it('generateBranchName uses provider', async () => {
181
+ const claudeProvider = mockProvider('claude', true);
182
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
183
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
184
+ const result = await manager.generateBranchName({
185
+ description: 'Add feature',
186
+ repoName: 'test-repo',
187
+ branchPrefix: 'feat',
188
+ });
189
+ expect(result.success).toBe(true);
190
+ expect(claudeProvider.generateBranchName).toHaveBeenCalled();
191
+ });
192
+ it('generatePRTitle uses provider', async () => {
193
+ const claudeProvider = mockProvider('claude', true);
194
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
195
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
196
+ const result = await manager.generatePRTitle({
197
+ description: 'Add feature',
198
+ branchName: 'feat/add-feature',
199
+ baseBranch: 'main',
200
+ });
201
+ expect(result.success).toBe(true);
202
+ expect(claudeProvider.generatePRTitle).toHaveBeenCalled();
203
+ });
204
+ it('generatePRDescription uses provider', async () => {
205
+ const claudeProvider = mockProvider('claude', true);
206
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
207
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
208
+ const result = await manager.generatePRDescription({
209
+ description: 'Add feature',
210
+ branchName: 'feat/add-feature',
211
+ baseBranch: 'main',
212
+ });
213
+ expect(result.success).toBe(true);
214
+ expect(claudeProvider.generatePRDescription).toHaveBeenCalled();
215
+ });
216
+ it('generateCommitMessage uses provider', async () => {
217
+ const claudeProvider = mockProvider('claude', true);
218
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
219
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
220
+ const result = await manager.generateCommitMessage({
221
+ stagedFiles: ['src/index.ts'],
222
+ style: 'conventional',
223
+ });
224
+ expect(result.success).toBe(true);
225
+ expect(claudeProvider.generateCommitMessage).toHaveBeenCalled();
226
+ });
227
+ it('generatePlanDocument uses provider', async () => {
228
+ const claudeProvider = mockProvider('claude', true);
229
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
230
+ const manager = new AIProviderManager({ config: { provider: 'claude' } });
231
+ const result = await manager.generatePlanDocument({
232
+ description: 'Add feature',
233
+ branchName: 'feat/add-feature',
234
+ });
235
+ expect(result.success).toBe(true);
236
+ expect(claudeProvider.generatePlanDocument).toHaveBeenCalled();
237
+ });
238
+ it('falls back when primary fails', async () => {
239
+ const claudeProvider = mockProvider('claude', true, {
240
+ success: false,
241
+ error: 'API error',
242
+ provider: 'claude',
243
+ });
244
+ const geminiProvider = mockProvider('gemini', true, {
245
+ success: true,
246
+ content: 'fallback-branch',
247
+ provider: 'gemini',
248
+ });
249
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
250
+ vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
251
+ const manager = new AIProviderManager({
252
+ config: { provider: 'claude', fallback: 'gemini' },
253
+ });
254
+ const result = await manager.generateBranchName({
255
+ description: 'Add feature',
256
+ repoName: 'test-repo',
257
+ branchPrefix: 'feat',
258
+ });
259
+ expect(result.success).toBe(true);
260
+ expect(result.content).toBe('fallback-branch');
261
+ });
262
+ });
263
+ describe('getAvailableProviders', () => {
264
+ it('returns list of available providers', async () => {
265
+ const claudeProvider = mockProvider('claude', true);
266
+ const geminiProvider = mockProvider('gemini', false);
267
+ const ollamaProvider = mockProvider('ollama', true);
268
+ const openaiProvider = mockProvider('openai', false);
269
+ vi.mocked(ClaudeProvider).mockImplementation(() => claudeProvider);
270
+ vi.mocked(GeminiProvider).mockImplementation(() => geminiProvider);
271
+ vi.mocked(OllamaProvider).mockImplementation(() => ollamaProvider);
272
+ vi.mocked(OpenAIProvider).mockImplementation(() => openaiProvider);
273
+ // Mock static checkAvailability for lazy initialization
274
+ ClaudeProvider.checkAvailability = vi.fn().mockResolvedValue(true);
275
+ GeminiProvider.checkAvailability = vi.fn().mockResolvedValue(false);
276
+ OllamaProvider.checkAvailability = vi.fn().mockResolvedValue(true);
277
+ OpenAIProvider.checkAvailability = vi.fn().mockResolvedValue(false);
278
+ const manager = new AIProviderManager();
279
+ const available = await manager.getAvailableProviders();
280
+ expect(available).toContain('claude');
281
+ expect(available).toContain('ollama');
282
+ expect(available).not.toContain('gemini');
283
+ expect(available).not.toContain('openai');
284
+ });
285
+ });
286
+ });
287
+ describe('createAIProviderManager', () => {
288
+ it('creates a new manager instance', () => {
289
+ const manager = createAIProviderManager();
290
+ expect(manager).toBeInstanceOf(AIProviderManager);
291
+ });
292
+ it('creates manager with provided config', () => {
293
+ const config = { provider: 'gemini', branchName: false };
294
+ const manager = createAIProviderManager(config);
295
+ expect(manager.getConfig().provider).toBe('gemini');
296
+ expect(manager.getConfig().branchName).toBe(false);
297
+ });
298
+ });
299
+ describe('getDefaultAIProviderManager', () => {
300
+ it('returns a manager instance', () => {
301
+ const manager = getDefaultAIProviderManager();
302
+ expect(manager).toBeInstanceOf(AIProviderManager);
303
+ });
304
+ it('creates new manager when config provided', () => {
305
+ getDefaultAIProviderManager({ provider: 'claude' });
306
+ const manager2 = getDefaultAIProviderManager({ provider: 'gemini' });
307
+ // Second call with config creates new manager
308
+ expect(manager2.getConfig().provider).toBe('gemini');
309
+ });
310
+ });
311
+ });
312
+ //# sourceMappingURL=provider-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-manager.test.js","sourceRoot":"","sources":["../../../src/lib/ai/provider-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * AI Provider types and interfaces
3
+ *
4
+ * Defines the contracts for AI content generation providers.
5
+ */
6
+ /**
7
+ * Context for generating branch names
8
+ */
9
+ export interface BranchContext {
10
+ /** User-provided description/intent for the branch */
11
+ description: string;
12
+ /** Repository name */
13
+ repoName: string;
14
+ /** Branch prefix from config (e.g., 'feat', 'fix') */
15
+ branchPrefix: string;
16
+ /** List of existing branch names to avoid collisions */
17
+ existingBranches?: string[];
18
+ /** Maximum length for branch name */
19
+ maxLength?: number;
20
+ }
21
+ /**
22
+ * Context for generating PR titles and descriptions
23
+ */
24
+ export interface PRContext {
25
+ /** User-provided description/intent for the PR */
26
+ description: string;
27
+ /** Git diff content */
28
+ diff?: string;
29
+ /** List of commits in the PR */
30
+ commits?: CommitInfo[];
31
+ /** Branch name */
32
+ branchName: string;
33
+ /** Base branch (e.g., 'main') */
34
+ baseBranch: string;
35
+ /** List of changed files */
36
+ changedFiles?: string[];
37
+ }
38
+ /**
39
+ * Commit information for context
40
+ */
41
+ export interface CommitInfo {
42
+ /** Commit hash (short) */
43
+ hash: string;
44
+ /** Commit message */
45
+ message: string;
46
+ /** Commit author */
47
+ author?: string;
48
+ }
49
+ /**
50
+ * Context for generating commit messages
51
+ */
52
+ export interface CommitContext {
53
+ /** List of staged files */
54
+ stagedFiles: string[];
55
+ /** Git diff of staged changes */
56
+ diff?: string;
57
+ /** Recent commit messages for style reference */
58
+ recentCommits?: string[];
59
+ /** Commit message style */
60
+ style?: 'conventional' | 'gitmoji' | 'simple';
61
+ }
62
+ /**
63
+ * Context for generating plan documents
64
+ */
65
+ export interface PlanContext {
66
+ /** User-provided description/intent */
67
+ description: string;
68
+ /** Key files and folders in the repo */
69
+ repoStructure?: string[];
70
+ /** Tech stack detected */
71
+ techStack?: string[];
72
+ /** Branch name */
73
+ branchName: string;
74
+ }
75
+ /**
76
+ * Result from AI generation
77
+ */
78
+ export interface AIGenerationResult {
79
+ /** Whether generation succeeded */
80
+ success: boolean;
81
+ /** Generated content */
82
+ content?: string;
83
+ /** Error message if failed */
84
+ error?: string;
85
+ /** Provider used */
86
+ provider: string;
87
+ }
88
+ /**
89
+ * AI Provider interface
90
+ *
91
+ * Each provider (Claude, Gemini, OpenAI, Ollama, etc.) implements this interface.
92
+ */
93
+ export interface AIProvider {
94
+ /** Provider name for identification */
95
+ readonly name: string;
96
+ /** Check if provider is available/configured */
97
+ isAvailable(): Promise<boolean>;
98
+ /** Generate a branch name from description */
99
+ generateBranchName(context: BranchContext): Promise<AIGenerationResult>;
100
+ /** Generate a PR title from context */
101
+ generatePRTitle(context: PRContext): Promise<AIGenerationResult>;
102
+ /** Generate a PR description/body from context */
103
+ generatePRDescription(context: PRContext): Promise<AIGenerationResult>;
104
+ /** Generate a commit message from context */
105
+ generateCommitMessage(context: CommitContext): Promise<AIGenerationResult>;
106
+ /** Generate a plan document from context */
107
+ generatePlanDocument(context: PlanContext): Promise<AIGenerationResult>;
108
+ }
109
+ /**
110
+ * AI Provider configuration from .worktreerc
111
+ */
112
+ export interface AIConfig {
113
+ /** Provider to use: 'auto' | 'claude' | 'gemini' | 'openai' | 'ollama' | 'script' | 'none' */
114
+ provider?: AIProviderName;
115
+ /** Fallback provider if primary fails */
116
+ fallback?: AIProviderName;
117
+ /** Enable AI for branch names */
118
+ branchName?: boolean;
119
+ /** Enable AI for PR titles */
120
+ prTitle?: boolean;
121
+ /** Enable AI for PR descriptions */
122
+ prDescription?: boolean;
123
+ /** Enable AI for commit messages */
124
+ commitMessage?: boolean;
125
+ /** Enable AI for plan documents */
126
+ planDocument?: boolean;
127
+ /** Branch naming style */
128
+ branchStyle?: 'conventional' | 'kebab' | 'snake';
129
+ /** Commit message style */
130
+ commitStyle?: 'conventional' | 'gitmoji' | 'simple';
131
+ /** Path to PR description template */
132
+ prTemplate?: string;
133
+ /** Path to plan document template */
134
+ planTemplate?: string;
135
+ /** Claude-specific settings */
136
+ claude?: {
137
+ model?: string;
138
+ };
139
+ /** Gemini-specific settings */
140
+ gemini?: {
141
+ model?: string;
142
+ };
143
+ /** OpenAI-specific settings */
144
+ openai?: {
145
+ model?: string;
146
+ apiKeyEnv?: string;
147
+ };
148
+ /** Ollama-specific settings */
149
+ ollama?: {
150
+ model?: string;
151
+ host?: string;
152
+ };
153
+ /** Custom script provider settings */
154
+ script?: {
155
+ path: string;
156
+ };
157
+ }
158
+ /**
159
+ * Available AI provider names
160
+ */
161
+ export type AIProviderName = 'auto' | 'claude' | 'gemini' | 'openai' | 'ollama' | 'script' | 'fallback' | 'none';
162
+ /**
163
+ * Default AI configuration
164
+ */
165
+ export declare const DEFAULT_AI_CONFIG: AIConfig;
166
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * AI Provider types and interfaces
3
+ *
4
+ * Defines the contracts for AI content generation providers.
5
+ */
6
+ /**
7
+ * Default AI configuration
8
+ */
9
+ export const DEFAULT_AI_CONFIG = {
10
+ provider: 'none',
11
+ branchName: false,
12
+ prTitle: false,
13
+ prDescription: false,
14
+ commitMessage: false,
15
+ planDocument: false,
16
+ branchStyle: 'kebab',
17
+ commitStyle: 'conventional',
18
+ };
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/ai/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyLH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,KAAK;IACpB,YAAY,EAAE,KAAK;IACnB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,cAAc;CAC5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CA4CrD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CA2BpC"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAqDrD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAoCpC"}
@@ -12,6 +12,8 @@ export function parseArgs(argv) {
12
12
  force: false,
13
13
  all: false,
14
14
  interactive: true,
15
+ json: false,
16
+ dryRun: false,
15
17
  };
16
18
  for (const arg of argv) {
17
19
  switch (arg) {
@@ -31,6 +33,13 @@ export function parseArgs(argv) {
31
33
  options.all = true;
32
34
  options.interactive = false;
33
35
  break;
36
+ case '--json':
37
+ options.json = true;
38
+ break;
39
+ case '-n':
40
+ case '--dry-run':
41
+ options.dryRun = true;
42
+ break;
34
43
  default:
35
44
  if (arg.startsWith('-')) {
36
45
  return { kind: 'error', message: `Unknown option: ${arg}` };
@@ -66,6 +75,10 @@ OPTIONS
66
75
  -a, --all Clean all merged/closed PR worktrees (non-interactive)
67
76
  -h, --help Show this help message
68
77
 
78
+ AI/AUTOMATION OPTIONS
79
+ --json Output result as JSON for programmatic parsing
80
+ -n, --dry-run Preview what would be cleaned without making changes
81
+
69
82
  EXAMPLES
70
83
  cleanpr # Interactive mode - select worktrees to clean
71
84
  cleanpr 2245 # Remove worktree and local branch for PR #2245
@@ -73,6 +86,11 @@ EXAMPLES
73
86
  cleanpr 2245 -f -r # Force cleanup and delete remote
74
87
  cleanpr --all # Clean all merged/closed PRs
75
88
 
89
+ # AI/Automation usage
90
+ cleanpr --all --json # Clean all and output JSON result
91
+ cleanpr --all --dry-run --json
92
+ # Preview cleanup as JSON
93
+
76
94
  WHAT IT REMOVES
77
95
  - Git worktree directory
78
96
  - Local branch associated with the PR
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,OAAO,GAAiB;QAC5B,YAAY,EAAE,KAAK;QACnB,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC;YACV,KAAK,UAAU;gBACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,EAAE,EAAE,CAAC;gBAC9D,CAAC;gBACD,CAAC;oBACC,oBAAoB;oBACpB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,EAAE,EAAE,CAAC;oBACjE,CAAC;oBACD,QAAQ,GAAG,GAAG,CAAC;oBACf,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC9B,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;CAyBR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/cleanpr/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,OAAO,GAAiB;QAC5B,YAAY,EAAE,KAAK;QACnB,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;KACd,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC;YACV,KAAK,UAAU;gBACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,EAAE,EAAE,CAAC;gBAC9D,CAAC;gBACD,CAAC;oBACC,oBAAoB;oBACpB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,EAAE,EAAE,CAAC;oBACjE,CAAC;oBACD,QAAQ,GAAG,GAAG,CAAC;oBACf,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC9B,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCR,CAAC;AACF,CAAC"}