@brookmind/ai-toolkit 1.2.0 → 1.2.2

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 (71) hide show
  1. package/README.md +8 -12
  2. package/dist/__tests__/constants.test.d.ts +2 -0
  3. package/dist/__tests__/constants.test.d.ts.map +1 -0
  4. package/dist/__tests__/constants.test.js +102 -0
  5. package/dist/__tests__/constants.test.js.map +1 -0
  6. package/dist/__tests__/index.test.js +6 -105
  7. package/dist/__tests__/index.test.js.map +1 -1
  8. package/dist/__tests__/integration/installer.test.d.ts +2 -0
  9. package/dist/__tests__/integration/installer.test.d.ts.map +1 -0
  10. package/dist/__tests__/integration/installer.test.js +450 -0
  11. package/dist/__tests__/integration/installer.test.js.map +1 -0
  12. package/dist/__tests__/services/installers.test.d.ts +2 -0
  13. package/dist/__tests__/services/installers.test.d.ts.map +1 -0
  14. package/dist/__tests__/services/installers.test.js +250 -0
  15. package/dist/__tests__/services/installers.test.js.map +1 -0
  16. package/dist/__tests__/services/opencode.test.d.ts +2 -0
  17. package/dist/__tests__/services/opencode.test.d.ts.map +1 -0
  18. package/dist/__tests__/services/opencode.test.js +120 -0
  19. package/dist/__tests__/services/opencode.test.js.map +1 -0
  20. package/dist/__tests__/ui/categorize.test.d.ts +2 -0
  21. package/dist/__tests__/ui/categorize.test.d.ts.map +1 -0
  22. package/dist/__tests__/ui/categorize.test.js +225 -0
  23. package/dist/__tests__/ui/categorize.test.js.map +1 -0
  24. package/dist/__tests__/ui/choices.test.d.ts +2 -0
  25. package/dist/__tests__/ui/choices.test.d.ts.map +1 -0
  26. package/dist/__tests__/ui/choices.test.js +223 -0
  27. package/dist/__tests__/ui/choices.test.js.map +1 -0
  28. package/dist/__tests__/ui/display.test.d.ts +2 -0
  29. package/dist/__tests__/ui/display.test.d.ts.map +1 -0
  30. package/dist/__tests__/ui/display.test.js +138 -0
  31. package/dist/__tests__/ui/display.test.js.map +1 -0
  32. package/dist/__tests__/utils/fs.test.d.ts +2 -0
  33. package/dist/__tests__/utils/fs.test.d.ts.map +1 -0
  34. package/dist/__tests__/utils/fs.test.js +301 -0
  35. package/dist/__tests__/utils/fs.test.js.map +1 -0
  36. package/dist/__tests__/utils/terminal.test.d.ts +2 -0
  37. package/dist/__tests__/utils/terminal.test.d.ts.map +1 -0
  38. package/dist/__tests__/utils/terminal.test.js +97 -0
  39. package/dist/__tests__/utils/terminal.test.js.map +1 -0
  40. package/dist/constants.d.ts +1 -0
  41. package/dist/constants.d.ts.map +1 -1
  42. package/dist/constants.js +3 -0
  43. package/dist/constants.js.map +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +24 -29
  46. package/dist/index.js.map +1 -1
  47. package/dist/services/installers.d.ts +1 -1
  48. package/dist/services/installers.d.ts.map +1 -1
  49. package/dist/services/installers.js +21 -14
  50. package/dist/services/installers.js.map +1 -1
  51. package/dist/types.d.ts +15 -0
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/types.js +28 -1
  54. package/dist/types.js.map +1 -1
  55. package/dist/ui/categorize.d.ts +1 -0
  56. package/dist/ui/categorize.d.ts.map +1 -1
  57. package/dist/ui/categorize.js +15 -3
  58. package/dist/ui/categorize.js.map +1 -1
  59. package/dist/ui/choices.d.ts +1 -0
  60. package/dist/ui/choices.d.ts.map +1 -1
  61. package/dist/ui/choices.js +14 -3
  62. package/dist/ui/choices.js.map +1 -1
  63. package/dist/ui/display.d.ts +1 -2
  64. package/dist/ui/display.d.ts.map +1 -1
  65. package/dist/ui/display.js +14 -17
  66. package/dist/ui/display.js.map +1 -1
  67. package/dist/utils/fs.d.ts +14 -0
  68. package/dist/utils/fs.d.ts.map +1 -1
  69. package/dist/utils/fs.js +72 -2
  70. package/dist/utils/fs.js.map +1 -1
  71. package/package.json +4 -2
@@ -0,0 +1,301 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdir, rm, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { exists, getDirectories, getFiles, readJsonConfig, readOpencodeConfig, readMcpConfig, readPackageJson, JsonParseError, JsonValidationError, } from '../../utils/fs.js';
6
+ describe('utils/fs', () => {
7
+ const testDir = join(tmpdir(), 'ai-toolkit-fs-test');
8
+ beforeEach(async () => {
9
+ await mkdir(testDir, { recursive: true });
10
+ });
11
+ afterEach(async () => {
12
+ await rm(testDir, { recursive: true, force: true });
13
+ });
14
+ describe('exists', () => {
15
+ it('should return true for existing directory', async () => {
16
+ const result = await exists(testDir);
17
+ expect(result).toBe(true);
18
+ });
19
+ it('should return true for existing file', async () => {
20
+ const filePath = join(testDir, 'test.txt');
21
+ await writeFile(filePath, 'test content');
22
+ const result = await exists(filePath);
23
+ expect(result).toBe(true);
24
+ });
25
+ it('should return false for non-existing path', async () => {
26
+ const result = await exists(join(testDir, 'non-existing'));
27
+ expect(result).toBe(false);
28
+ });
29
+ it('should return false for non-existing nested path', async () => {
30
+ const result = await exists(join(testDir, 'a', 'b', 'c', 'd'));
31
+ expect(result).toBe(false);
32
+ });
33
+ });
34
+ describe('getDirectories', () => {
35
+ it('should return empty array for empty directory', async () => {
36
+ const result = await getDirectories(testDir);
37
+ expect(result).toEqual([]);
38
+ });
39
+ it('should return only directories, not files', async () => {
40
+ await mkdir(join(testDir, 'dir1'));
41
+ await mkdir(join(testDir, 'dir2'));
42
+ await writeFile(join(testDir, 'file.txt'), 'content');
43
+ const result = await getDirectories(testDir);
44
+ expect(result).toHaveLength(2);
45
+ expect(result).toContain('dir1');
46
+ expect(result).toContain('dir2');
47
+ expect(result).not.toContain('file.txt');
48
+ });
49
+ it('should return empty array for non-existing directory', async () => {
50
+ const result = await getDirectories(join(testDir, 'non-existing'));
51
+ expect(result).toEqual([]);
52
+ });
53
+ it('should return empty array on error', async () => {
54
+ const result = await getDirectories('/root/definitely/does/not/exist/xyz');
55
+ expect(result).toEqual([]);
56
+ });
57
+ it('should handle directory with only files', async () => {
58
+ await writeFile(join(testDir, 'file1.txt'), 'content1');
59
+ await writeFile(join(testDir, 'file2.txt'), 'content2');
60
+ const result = await getDirectories(testDir);
61
+ expect(result).toEqual([]);
62
+ });
63
+ });
64
+ describe('getFiles', () => {
65
+ it('should return files with specified extension', async () => {
66
+ await writeFile(join(testDir, 'file1.md'), 'content1');
67
+ await writeFile(join(testDir, 'file2.md'), 'content2');
68
+ await writeFile(join(testDir, 'file3.txt'), 'content3');
69
+ const result = await getFiles(testDir, '.md');
70
+ expect(result).toHaveLength(2);
71
+ expect(result).toContain('file1');
72
+ expect(result).toContain('file2');
73
+ expect(result).not.toContain('file3');
74
+ });
75
+ it('should return empty array when no files match extension', async () => {
76
+ await writeFile(join(testDir, 'file1.txt'), 'content1');
77
+ await writeFile(join(testDir, 'file2.txt'), 'content2');
78
+ const result = await getFiles(testDir, '.md');
79
+ expect(result).toEqual([]);
80
+ });
81
+ it('should return empty array for empty directory', async () => {
82
+ const result = await getFiles(testDir, '.md');
83
+ expect(result).toEqual([]);
84
+ });
85
+ it('should return empty array for non-existing directory', async () => {
86
+ const result = await getFiles(join(testDir, 'non-existing'), '.md');
87
+ expect(result).toEqual([]);
88
+ });
89
+ it('should not include directories', async () => {
90
+ await mkdir(join(testDir, 'dir.md'));
91
+ await writeFile(join(testDir, 'file.md'), 'content');
92
+ const result = await getFiles(testDir, '.md');
93
+ expect(result).toHaveLength(1);
94
+ expect(result).toContain('file');
95
+ });
96
+ it('should strip extension from file names', async () => {
97
+ await writeFile(join(testDir, 'my-file.json'), '{}');
98
+ const result = await getFiles(testDir, '.json');
99
+ expect(result).toEqual(['my-file']);
100
+ });
101
+ });
102
+ describe('readJsonConfig', () => {
103
+ it('should read and parse valid JSON file', async () => {
104
+ const jsonPath = join(testDir, 'config.json');
105
+ const data = { key: 'value', number: 42, nested: { foo: 'bar' } };
106
+ await writeFile(jsonPath, JSON.stringify(data));
107
+ const result = await readJsonConfig(jsonPath);
108
+ expect(result).toEqual(data);
109
+ });
110
+ it('should return empty object for non-existing file', async () => {
111
+ const result = await readJsonConfig(join(testDir, 'non-existing.json'));
112
+ expect(result).toEqual({});
113
+ });
114
+ it('should throw JsonParseError for invalid JSON', async () => {
115
+ const jsonPath = join(testDir, 'invalid.json');
116
+ await writeFile(jsonPath, '{ invalid json }');
117
+ await expect(readJsonConfig(jsonPath)).rejects.toThrow(JsonParseError);
118
+ });
119
+ it('should throw JsonParseError for empty file', async () => {
120
+ const jsonPath = join(testDir, 'empty.json');
121
+ await writeFile(jsonPath, '');
122
+ await expect(readJsonConfig(jsonPath)).rejects.toThrow(JsonParseError);
123
+ });
124
+ it('should re-throw non-ENOENT and non-SyntaxError errors', async () => {
125
+ // Trying to read a directory as a file causes EISDIR error
126
+ const dirPath = join(testDir, 'a-directory');
127
+ await mkdir(dirPath, { recursive: true });
128
+ await expect(readJsonConfig(dirPath)).rejects.toThrow();
129
+ try {
130
+ await readJsonConfig(dirPath);
131
+ }
132
+ catch (error) {
133
+ expect(error).not.toBeInstanceOf(JsonParseError);
134
+ expect(error).toBeInstanceOf(Error);
135
+ expect(error.code).toBe('EISDIR');
136
+ }
137
+ });
138
+ it('should handle JSON with arrays', async () => {
139
+ const jsonPath = join(testDir, 'array.json');
140
+ const data = { items: [1, 2, 3], names: ['a', 'b'] };
141
+ await writeFile(jsonPath, JSON.stringify(data));
142
+ const result = await readJsonConfig(jsonPath);
143
+ expect(result).toEqual(data);
144
+ });
145
+ it('should handle deeply nested JSON', async () => {
146
+ const jsonPath = join(testDir, 'nested.json');
147
+ const data = { level1: { level2: { level3: { value: 'deep' } } } };
148
+ await writeFile(jsonPath, JSON.stringify(data));
149
+ const result = await readJsonConfig(jsonPath);
150
+ expect(result).toEqual(data);
151
+ });
152
+ it('should throw JsonValidationError when JSON is not an object', async () => {
153
+ const jsonPath = join(testDir, 'array.json');
154
+ await writeFile(jsonPath, JSON.stringify([1, 2, 3]));
155
+ await expect(readJsonConfig(jsonPath)).rejects.toThrow(JsonValidationError);
156
+ await expect(readJsonConfig(jsonPath)).rejects.toThrow('Record<string, unknown>');
157
+ });
158
+ it('should throw JsonValidationError when JSON is a primitive', async () => {
159
+ const jsonPath = join(testDir, 'primitive.json');
160
+ await writeFile(jsonPath, JSON.stringify('just a string'));
161
+ await expect(readJsonConfig(jsonPath)).rejects.toThrow(JsonValidationError);
162
+ });
163
+ it('should return empty object when JSON content is null (treated as missing file)', async () => {
164
+ const jsonPath = join(testDir, 'null.json');
165
+ await writeFile(jsonPath, 'null');
166
+ const result = await readJsonConfig(jsonPath);
167
+ expect(result).toEqual({});
168
+ });
169
+ it('should throw JsonValidationError when JSON is a number', async () => {
170
+ const jsonPath = join(testDir, 'number.json');
171
+ await writeFile(jsonPath, '42');
172
+ await expect(readJsonConfig(jsonPath)).rejects.toThrow(JsonValidationError);
173
+ });
174
+ });
175
+ describe('JsonValidationError', () => {
176
+ it('should create error with correct properties', () => {
177
+ const error = new JsonValidationError('/path/to/file.json', 'OpencodeConfig');
178
+ expect(error.name).toBe('JsonValidationError');
179
+ expect(error.filePath).toBe('/path/to/file.json');
180
+ expect(error.expectedType).toBe('OpencodeConfig');
181
+ expect(error.message).toBe('Invalid JSON structure at /path/to/file.json: expected OpencodeConfig');
182
+ });
183
+ });
184
+ describe('readOpencodeConfig', () => {
185
+ it('should return empty object for non-existing file', async () => {
186
+ const result = await readOpencodeConfig(join(testDir, 'non-existing.json'));
187
+ expect(result).toEqual({});
188
+ });
189
+ it('should read valid opencode config', async () => {
190
+ const jsonPath = join(testDir, 'opencode.json');
191
+ const data = { mcp: { server1: {} }, theme: 'dark' };
192
+ await writeFile(jsonPath, JSON.stringify(data));
193
+ const result = await readOpencodeConfig(jsonPath);
194
+ expect(result).toEqual(data);
195
+ });
196
+ it('should read opencode config with only mcp', async () => {
197
+ const jsonPath = join(testDir, 'opencode.json');
198
+ const data = { mcp: { server1: { command: 'test' } } };
199
+ await writeFile(jsonPath, JSON.stringify(data));
200
+ const result = await readOpencodeConfig(jsonPath);
201
+ expect(result).toEqual(data);
202
+ });
203
+ it('should read opencode config with only theme', async () => {
204
+ const jsonPath = join(testDir, 'opencode.json');
205
+ const data = { theme: 'light' };
206
+ await writeFile(jsonPath, JSON.stringify(data));
207
+ const result = await readOpencodeConfig(jsonPath);
208
+ expect(result).toEqual(data);
209
+ });
210
+ it('should throw JsonValidationError when mcp is not an object', async () => {
211
+ const jsonPath = join(testDir, 'invalid-opencode.json');
212
+ await writeFile(jsonPath, JSON.stringify({ mcp: 'not-an-object' }));
213
+ await expect(readOpencodeConfig(jsonPath)).rejects.toThrow(JsonValidationError);
214
+ await expect(readOpencodeConfig(jsonPath)).rejects.toThrow('OpencodeConfig');
215
+ });
216
+ it('should throw JsonValidationError when theme is not a string', async () => {
217
+ const jsonPath = join(testDir, 'invalid-theme.json');
218
+ await writeFile(jsonPath, JSON.stringify({ theme: 123 }));
219
+ await expect(readOpencodeConfig(jsonPath)).rejects.toThrow(JsonValidationError);
220
+ });
221
+ it('should throw JsonParseError for invalid JSON', async () => {
222
+ const jsonPath = join(testDir, 'invalid.json');
223
+ await writeFile(jsonPath, '{ invalid json }');
224
+ await expect(readOpencodeConfig(jsonPath)).rejects.toThrow(JsonParseError);
225
+ });
226
+ });
227
+ describe('readMcpConfig', () => {
228
+ it('should return empty object for non-existing file', async () => {
229
+ const result = await readMcpConfig(join(testDir, 'non-existing.json'));
230
+ expect(result).toEqual({});
231
+ });
232
+ it('should read valid mcp config', async () => {
233
+ const jsonPath = join(testDir, 'mcp.json');
234
+ const data = { mcpServers: { server1: { command: 'node', args: ['server.js'] } } };
235
+ await writeFile(jsonPath, JSON.stringify(data));
236
+ const result = await readMcpConfig(jsonPath);
237
+ expect(result).toEqual(data);
238
+ });
239
+ it('should read empty mcp config', async () => {
240
+ const jsonPath = join(testDir, 'mcp.json');
241
+ await writeFile(jsonPath, JSON.stringify({}));
242
+ const result = await readMcpConfig(jsonPath);
243
+ expect(result).toEqual({});
244
+ });
245
+ it('should throw JsonValidationError when mcpServers is not an object', async () => {
246
+ const jsonPath = join(testDir, 'invalid-mcp.json');
247
+ await writeFile(jsonPath, JSON.stringify({ mcpServers: 'not-an-object' }));
248
+ await expect(readMcpConfig(jsonPath)).rejects.toThrow(JsonValidationError);
249
+ await expect(readMcpConfig(jsonPath)).rejects.toThrow('McpConfig');
250
+ });
251
+ it('should throw JsonValidationError when root is an array', async () => {
252
+ const jsonPath = join(testDir, 'array-mcp.json');
253
+ await writeFile(jsonPath, JSON.stringify([{ mcpServers: {} }]));
254
+ await expect(readMcpConfig(jsonPath)).rejects.toThrow(JsonValidationError);
255
+ });
256
+ });
257
+ describe('readPackageJson', () => {
258
+ it('should return empty object for non-existing file', async () => {
259
+ const result = await readPackageJson(join(testDir, 'non-existing.json'));
260
+ expect(result).toEqual({});
261
+ });
262
+ it('should read valid package.json', async () => {
263
+ const jsonPath = join(testDir, 'package.json');
264
+ const data = { name: 'my-package', version: '1.0.0' };
265
+ await writeFile(jsonPath, JSON.stringify(data));
266
+ const result = await readPackageJson(jsonPath);
267
+ expect(result).toEqual(data);
268
+ });
269
+ it('should read package.json with only name', async () => {
270
+ const jsonPath = join(testDir, 'package.json');
271
+ const data = { name: 'test-package' };
272
+ await writeFile(jsonPath, JSON.stringify(data));
273
+ const result = await readPackageJson(jsonPath);
274
+ expect(result).toEqual(data);
275
+ });
276
+ it('should read package.json with only version', async () => {
277
+ const jsonPath = join(testDir, 'package.json');
278
+ const data = { version: '2.0.0' };
279
+ await writeFile(jsonPath, JSON.stringify(data));
280
+ const result = await readPackageJson(jsonPath);
281
+ expect(result).toEqual(data);
282
+ });
283
+ it('should throw JsonValidationError when version is not a string', async () => {
284
+ const jsonPath = join(testDir, 'invalid-package.json');
285
+ await writeFile(jsonPath, JSON.stringify({ version: 123 }));
286
+ await expect(readPackageJson(jsonPath)).rejects.toThrow(JsonValidationError);
287
+ await expect(readPackageJson(jsonPath)).rejects.toThrow('PackageJson');
288
+ });
289
+ it('should throw JsonValidationError when name is not a string', async () => {
290
+ const jsonPath = join(testDir, 'invalid-name.json');
291
+ await writeFile(jsonPath, JSON.stringify({ name: { nested: 'object' } }));
292
+ await expect(readPackageJson(jsonPath)).rejects.toThrow(JsonValidationError);
293
+ });
294
+ it('should throw JsonValidationError when root is not an object', async () => {
295
+ const jsonPath = join(testDir, 'primitive-package.json');
296
+ await writeFile(jsonPath, JSON.stringify('just-a-string'));
297
+ await expect(readPackageJson(jsonPath)).rejects.toThrow(JsonValidationError);
298
+ });
299
+ });
300
+ });
301
+ //# sourceMappingURL=fs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/fs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terminal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/terminal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { setupScrollRegion, resetScrollRegion, handleResize, clearScreen, } from '../../utils/terminal.js';
3
+ import { BOTTOM_PADDING } from '../../constants.js';
4
+ describe('utils/terminal', () => {
5
+ let writeSpy;
6
+ let originalRows;
7
+ beforeEach(() => {
8
+ writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
9
+ originalRows = process.stdout.rows;
10
+ });
11
+ afterEach(() => {
12
+ writeSpy.mockRestore();
13
+ Object.defineProperty(process.stdout, 'rows', {
14
+ value: originalRows,
15
+ writable: true,
16
+ });
17
+ });
18
+ describe('setupScrollRegion', () => {
19
+ it('should set scroll region when terminal has enough rows', () => {
20
+ Object.defineProperty(process.stdout, 'rows', { value: 40, writable: true });
21
+ setupScrollRegion();
22
+ expect(writeSpy).toHaveBeenCalledTimes(2);
23
+ expect(writeSpy).toHaveBeenNthCalledWith(1, `\x1b[1;${40 - BOTTOM_PADDING}r`);
24
+ expect(writeSpy).toHaveBeenNthCalledWith(2, '\x1b[H');
25
+ });
26
+ it('should not set scroll region when terminal is too small', () => {
27
+ Object.defineProperty(process.stdout, 'rows', { value: 10, writable: true });
28
+ setupScrollRegion();
29
+ expect(writeSpy).not.toHaveBeenCalled();
30
+ });
31
+ it('should use default rows (24) when process.stdout.rows is undefined', () => {
32
+ Object.defineProperty(process.stdout, 'rows', { value: undefined, writable: true });
33
+ setupScrollRegion();
34
+ expect(writeSpy).toHaveBeenCalledTimes(2);
35
+ expect(writeSpy).toHaveBeenNthCalledWith(1, `\x1b[1;${24 - BOTTOM_PADDING}r`);
36
+ expect(writeSpy).toHaveBeenNthCalledWith(2, '\x1b[H');
37
+ });
38
+ it('should not set scroll region at boundary (rows = BOTTOM_PADDING + 10)', () => {
39
+ Object.defineProperty(process.stdout, 'rows', {
40
+ value: BOTTOM_PADDING + 10,
41
+ writable: true,
42
+ });
43
+ setupScrollRegion();
44
+ expect(writeSpy).not.toHaveBeenCalled();
45
+ });
46
+ it('should set scroll region when rows is just above boundary', () => {
47
+ Object.defineProperty(process.stdout, 'rows', {
48
+ value: BOTTOM_PADDING + 11,
49
+ writable: true,
50
+ });
51
+ setupScrollRegion();
52
+ expect(writeSpy).toHaveBeenCalledTimes(2);
53
+ });
54
+ it('should handle very large terminal rows', () => {
55
+ Object.defineProperty(process.stdout, 'rows', { value: 200, writable: true });
56
+ setupScrollRegion();
57
+ expect(writeSpy).toHaveBeenCalledTimes(2);
58
+ expect(writeSpy).toHaveBeenNthCalledWith(1, `\x1b[1;${200 - BOTTOM_PADDING}r`);
59
+ });
60
+ it('should use default rows (24) when rows is 0', () => {
61
+ Object.defineProperty(process.stdout, 'rows', { value: 0, writable: true });
62
+ setupScrollRegion();
63
+ // 0 is falsy, so it falls back to 24
64
+ expect(writeSpy).toHaveBeenCalledTimes(2);
65
+ expect(writeSpy).toHaveBeenNthCalledWith(1, `\x1b[1;${24 - BOTTOM_PADDING}r`);
66
+ });
67
+ });
68
+ describe('resetScrollRegion', () => {
69
+ it('should write reset escape sequence', () => {
70
+ resetScrollRegion();
71
+ expect(writeSpy).toHaveBeenCalledTimes(1);
72
+ expect(writeSpy).toHaveBeenCalledWith('\x1b[r');
73
+ });
74
+ });
75
+ describe('handleResize', () => {
76
+ it('should call setupScrollRegion logic when terminal has enough rows', () => {
77
+ Object.defineProperty(process.stdout, 'rows', { value: 40, writable: true });
78
+ handleResize();
79
+ expect(writeSpy).toHaveBeenCalledTimes(2);
80
+ expect(writeSpy).toHaveBeenNthCalledWith(1, `\x1b[1;${40 - BOTTOM_PADDING}r`);
81
+ expect(writeSpy).toHaveBeenNthCalledWith(2, '\x1b[H');
82
+ });
83
+ it('should not write when terminal is too small', () => {
84
+ Object.defineProperty(process.stdout, 'rows', { value: 5, writable: true });
85
+ handleResize();
86
+ expect(writeSpy).not.toHaveBeenCalled();
87
+ });
88
+ });
89
+ describe('clearScreen', () => {
90
+ it('should write clear screen and home cursor escape sequences', () => {
91
+ clearScreen();
92
+ expect(writeSpy).toHaveBeenCalledTimes(1);
93
+ expect(writeSpy).toHaveBeenCalledWith('\x1b[2J\x1b[H');
94
+ });
95
+ });
96
+ });
97
+ //# sourceMappingURL=terminal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/terminal.test.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare const HOME_DIR: string;
4
4
  export declare const OPENCODE_DIR: string;
5
5
  export declare const OPENCODE_CONFIG: string;
6
6
  export declare const BOTTOM_PADDING = 5;
7
+ export declare const UI_PANEL_WIDTH = 61;
7
8
  export declare const MCP_DISPLAY_NAMES: Record<string, string>;
8
9
  export declare const DESCRIPTIONS: Record<string, string>;
9
10
  export declare function getDescription(name: string): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,QAAwB,CAAC;AAC9C,eAAO,MAAM,SAAS,QAA0B,CAAC;AACjD,eAAO,MAAM,QAAQ,QAAY,CAAC;AAClC,eAAO,MAAM,YAAY,QAAwC,CAAC;AAClE,eAAO,MAAM,eAAe,QAAsC,CAAC;AAEnE,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEpD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwB/C,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1D"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,QAAwB,CAAC;AAC9C,eAAO,MAAM,SAAS,QAA0B,CAAC;AACjD,eAAO,MAAM,QAAQ,QAAY,CAAC;AAClC,eAAO,MAAM,YAAY,QAAwC,CAAC;AAClE,eAAO,MAAM,eAAe,QAAsC,CAAC;AAEnE,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEpD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2B/C,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1D"}
package/dist/constants.js CHANGED
@@ -8,6 +8,7 @@ export const HOME_DIR = homedir();
8
8
  export const OPENCODE_DIR = join(HOME_DIR, '.config', 'opencode');
9
9
  export const OPENCODE_CONFIG = join(OPENCODE_DIR, 'opencode.json');
10
10
  export const BOTTOM_PADDING = 5;
11
+ export const UI_PANEL_WIDTH = 61;
11
12
  export const MCP_DISPLAY_NAMES = {
12
13
  'pg-aiguide': 'postgres-mcp',
13
14
  };
@@ -32,6 +33,8 @@ export const DESCRIPTIONS = {
32
33
  context7: 'Library documentation lookup',
33
34
  'expo-mcp': 'Expo/React Native utilities',
34
35
  'figma-mcp': 'Figma design integration (Desktop required)',
36
+ // Themes
37
+ 'claude-vivid': 'High-contrast theme with vivid colors',
35
38
  };
36
39
  export function getDescription(name) {
37
40
  return DESCRIPTIONS[name] ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,YAAY,EAAE,cAAc;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,SAAS;IACT,qBAAqB,EAAE,uCAAuC;IAC9D,eAAe,EAAE,sCAAsC;IACvD,iBAAiB,EAAE,4BAA4B;IAE/C,WAAW;IACX,WAAW,EAAE,oCAAoC;IACjD,uBAAuB,EAAE,mCAAmC;IAC5D,oBAAoB,EAAE,2BAA2B;IAEjD,SAAS;IACT,qBAAqB,EAAE,uCAAuC;IAC9D,YAAY,EAAE,kCAAkC;IAChD,oBAAoB,EAAE,sCAAsC;IAC5D,sBAAsB,EAAE,4BAA4B;IACpD,6BAA6B,EAAE,6BAA6B;IAC5D,eAAe,EAAE,sBAAsB;IACvC,yBAAyB,EAAE,0BAA0B;IAErD,OAAO;IACP,QAAQ,EAAE,8BAA8B;IACxC,UAAU,EAAE,6BAA6B;IACzC,WAAW,EAAE,6CAA6C;CAC3D,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,YAAY,EAAE,cAAc;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,SAAS;IACT,qBAAqB,EAAE,uCAAuC;IAC9D,eAAe,EAAE,sCAAsC;IACvD,iBAAiB,EAAE,4BAA4B;IAE/C,WAAW;IACX,WAAW,EAAE,oCAAoC;IACjD,uBAAuB,EAAE,mCAAmC;IAC5D,oBAAoB,EAAE,2BAA2B;IAEjD,SAAS;IACT,qBAAqB,EAAE,uCAAuC;IAC9D,YAAY,EAAE,kCAAkC;IAChD,oBAAoB,EAAE,sCAAsC;IAC5D,sBAAsB,EAAE,4BAA4B;IACpD,6BAA6B,EAAE,6BAA6B;IAC5D,eAAe,EAAE,sBAAsB;IACvC,yBAAyB,EAAE,0BAA0B;IAErD,OAAO;IACP,QAAQ,EAAE,8BAA8B;IACxC,UAAU,EAAE,6BAA6B;IACzC,WAAW,EAAE,6CAA6C;IAE1D,SAAS;IACT,cAAc,EAAE,uCAAuC;CACxD,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiCA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQzF,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQzF,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBzC"}
package/dist/index.js CHANGED
@@ -7,9 +7,9 @@ import { TOOLS_DIR } from './constants.js';
7
7
  import { getDirectories, getFiles } from './utils/fs.js';
8
8
  import { handleResize, resetScrollRegion, setupScrollRegion } from './utils/terminal.js';
9
9
  import { isOpenCodeInstalled, installOpenCode } from './services/opencode.js';
10
- import { installAgents, installCommands, installMcps, installSkills, installTheme, isThemeInstalled, } from './services/installers.js';
11
- import { buildAgentChoices, buildCommandChoices, buildMcpChoices, buildSkillChoices, } from './ui/choices.js';
12
- import { categorizeAgents, categorizeCommands, categorizeMcps, categorizeSkills, } from './ui/categorize.js';
10
+ import { installAgents, installCommands, installMcps, installSkills, installThemes, } from './services/installers.js';
11
+ import { buildAgentChoices, buildCommandChoices, buildMcpChoices, buildSkillChoices, buildThemeChoices, } from './ui/choices.js';
12
+ import { categorizeAgents, categorizeCommands, categorizeMcps, categorizeSkills, categorizeThemes, } from './ui/categorize.js';
13
13
  import { displayHeader, displaySummary, getSeparator, showSelectionResult } from './ui/display.js';
14
14
  // Re-export for testing
15
15
  export { BOTTOM_PADDING } from './constants.js';
@@ -74,6 +74,7 @@ async function runInstaller() {
74
74
  const skills = await getDirectories(join(TOOLS_DIR, 'skills'));
75
75
  const commands = await getFiles(join(TOOLS_DIR, 'commands'), '.md');
76
76
  const mcps = await getDirectories(join(TOOLS_DIR, 'mcps'));
77
+ const themes = await getFiles(join(TOOLS_DIR, 'themes'), '.json');
77
78
  const selectTheme = {
78
79
  style: {
79
80
  renderSelectedOptions: () => '',
@@ -133,34 +134,30 @@ async function runInstaller() {
133
134
  })
134
135
  : [];
135
136
  showSelectionResult(selectedMcps.length, 'MCPs');
136
- // Step 6: Theme
137
- let installThemeChoice = isNewInstallation;
138
- if (!isNewInstallation) {
139
- console.log(`\n${separator}`);
140
- console.log(chalk.cyan('Step 6/7: Theme'));
141
- const themeInstalled = await isThemeInstalled('claude-vivid');
142
- if (themeInstalled) {
143
- console.log(chalk.green('✓ claude-vivid theme is already installed\n'));
144
- installThemeChoice = false;
145
- }
146
- else {
147
- installThemeChoice = await confirm({
148
- message: 'Install claude-vivid theme? (high-contrast theme with vivid colors)',
149
- default: true,
150
- });
151
- }
152
- }
153
- else {
154
- console.log(`\n${separator}`);
155
- console.log(chalk.cyan('Step 6/7: Theme'));
137
+ // Step 6: Themes
138
+ console.log(`\n${separator}`);
139
+ console.log(chalk.cyan('Step 6/7: Themes'));
140
+ let selectedThemes = [];
141
+ if (isNewInstallation) {
142
+ selectedThemes = ['claude-vivid'];
156
143
  console.log(chalk.green('✓ claude-vivid theme will be installed automatically\n'));
157
144
  }
145
+ else if (themes.length > 0) {
146
+ selectedThemes = await select({
147
+ message: 'Select themes:',
148
+ options: await buildThemeChoices(themes),
149
+ multiple: true,
150
+ theme: selectTheme,
151
+ instructions: selectInstructions,
152
+ });
153
+ showSelectionResult(selectedThemes.length, 'themes');
154
+ }
158
155
  // Check if anything was selected
159
156
  const hasSelections = selectedAgents.length > 0 ||
160
157
  selectedSkills.length > 0 ||
161
158
  selectedCommands.length > 0 ||
162
159
  selectedMcps.length > 0 ||
163
- installThemeChoice;
160
+ selectedThemes.length > 0;
164
161
  if (!hasSelections) {
165
162
  console.log(chalk.yellow('\nNothing selected to install.'));
166
163
  process.exit(0);
@@ -173,8 +170,8 @@ async function runInstaller() {
173
170
  const skillsCat = await categorizeSkills(selectedSkills);
174
171
  const commandsCat = await categorizeCommands(selectedCommands);
175
172
  const mcpsCat = await categorizeMcps(selectedMcps);
176
- const themeIsUpdate = installThemeChoice && (await isThemeInstalled('claude-vivid'));
177
- displaySummary(agentsCat, skillsCat, commandsCat, mcpsCat, installThemeChoice, themeIsUpdate);
173
+ const themesCat = await categorizeThemes(selectedThemes);
174
+ displaySummary(agentsCat, skillsCat, commandsCat, mcpsCat, themesCat);
178
175
  console.log();
179
176
  const confirmInstall = await confirm({ message: 'Proceed with installation?' });
180
177
  if (!confirmInstall) {
@@ -188,9 +185,7 @@ async function runInstaller() {
188
185
  await installSkills(selectedSkills);
189
186
  await installCommands(selectedCommands);
190
187
  await installMcps(selectedMcps);
191
- if (installThemeChoice) {
192
- await installTheme();
193
- }
188
+ await installThemes(selectedThemes);
194
189
  spinner.succeed('Installation complete!');
195
190
  }
196
191
  catch (error) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EACL,aAAa,EACb,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEnG,wBAAwB;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzF,SAAS,UAAU;IACjB,iBAAiB,EAAE,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,iBAAiB,EAAE,CAAC;IACpB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAC5E,CAAC;YACD,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC3C,iBAAiB,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,aAAa,EAAE,CAAC;IAEtB,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACtD,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC3E,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;YAClC,OAAO,EAAE,yCAAyC;YAClD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,eAAe,EAAE,CAAC;gBACxB,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,qFAAqF,CACtF,CACF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,kFAAkF,CACnF,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAElE,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE;YACL,qBAAqB,EAAE,GAAW,EAAE,CAAC,EAAE;SACxC;KACF,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAW,EAAE,CACtC,KAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,CAAC,MAAM,MAAM,CAAC;YACX,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,MAAM,iBAAiB,CAAC,MAAM,CAAC;YACxC,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACjC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACT,mBAAmB,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAErD,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,CAAC,MAAM,MAAM,CAAC;YACX,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,MAAM,iBAAiB,CAAC,MAAM,CAAC;YACxC,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACjC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACT,mBAAmB,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAErD,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GACpB,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC,MAAM,MAAM,CAAC;YACX,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,MAAM,mBAAmB,CAAC,QAAQ,CAAC;YAC5C,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACjC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACT,mBAAmB,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEzD,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,MAAM,YAAY,GAChB,IAAI,CAAC,MAAM,GAAG,CAAC;QACb,CAAC,CAAC,MAAM,MAAM,CAAC;YACX,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC;YACpC,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACjC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACT,mBAAmB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjD,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,IAAI,cAAc,GAAa,EAAE,CAAC;IAElC,IAAI,iBAAiB,EAAE,CAAC;QACtB,cAAc,GAAG,CAAC,cAAc,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACrF,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,cAAc,GAAG,MAAM,MAAM,CAAC;YAC5B,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,MAAM,iBAAiB,CAAC,MAAM,CAAC;YACxC,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACjC,CAAC,CAAC;QACH,mBAAmB,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,iCAAiC;IACjC,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,GAAG,CAAC;QACzB,cAAc,CAAC,MAAM,GAAG,CAAC;QACzB,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAC3B,YAAY,CAAC,MAAM,GAAG,CAAC;QACvB,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE7C,wBAAwB;IACxB,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAEzD,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAe;IACf,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAChC,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;QACpC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAC5D,CAAC"}