@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,450 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ vi.mock('@inquirer/prompts', () => ({
3
+ confirm: vi.fn(),
4
+ }));
5
+ vi.mock('inquirer-select-pro', () => ({
6
+ select: vi.fn(),
7
+ }));
8
+ vi.mock('ora', () => ({
9
+ default: vi.fn(() => ({
10
+ start: vi.fn().mockReturnThis(),
11
+ succeed: vi.fn().mockReturnThis(),
12
+ fail: vi.fn().mockReturnThis(),
13
+ })),
14
+ }));
15
+ vi.mock('../../services/opencode.js', () => ({
16
+ isOpenCodeInstalled: vi.fn(),
17
+ installOpenCode: vi.fn(),
18
+ }));
19
+ vi.mock('../../services/installers.js', () => ({
20
+ installAgents: vi.fn(),
21
+ installSkills: vi.fn(),
22
+ installCommands: vi.fn(),
23
+ installMcps: vi.fn(),
24
+ installThemes: vi.fn(),
25
+ isThemeInstalled: vi.fn(),
26
+ getInstalledMcps: vi.fn(),
27
+ }));
28
+ vi.mock('../../utils/fs.js', () => ({
29
+ getDirectories: vi.fn(),
30
+ getFiles: vi.fn(),
31
+ exists: vi.fn(),
32
+ readJsonConfig: vi.fn(),
33
+ }));
34
+ vi.mock('../../utils/terminal.js', () => ({
35
+ setupScrollRegion: vi.fn(),
36
+ resetScrollRegion: vi.fn(),
37
+ handleResize: vi.fn(),
38
+ clearScreen: vi.fn(),
39
+ }));
40
+ vi.mock('../../ui/display.js', () => ({
41
+ displayHeader: vi.fn(),
42
+ displaySummary: vi.fn(),
43
+ getSeparator: vi.fn(() => '---'),
44
+ showSelectionResult: vi.fn(),
45
+ }));
46
+ vi.mock('../../ui/choices.js', () => ({
47
+ buildAgentChoices: vi.fn(),
48
+ buildSkillChoices: vi.fn(),
49
+ buildCommandChoices: vi.fn(),
50
+ buildMcpChoices: vi.fn(),
51
+ buildThemeChoices: vi.fn(),
52
+ }));
53
+ vi.mock('../../ui/categorize.js', () => ({
54
+ categorizeAgents: vi.fn(),
55
+ categorizeSkills: vi.fn(),
56
+ categorizeCommands: vi.fn(),
57
+ categorizeMcps: vi.fn(),
58
+ categorizeThemes: vi.fn(),
59
+ }));
60
+ describe('integration/installer', () => {
61
+ let mockConfirm;
62
+ let mockSelect;
63
+ let mockIsOpenCodeInstalled;
64
+ let mockInstallOpenCode;
65
+ let mockGetFiles;
66
+ let mockGetDirectories;
67
+ let mockInstallAgents;
68
+ let mockInstallSkills;
69
+ let mockInstallCommands;
70
+ let mockInstallMcps;
71
+ let mockInstallThemes;
72
+ let mockBuildAgentChoices;
73
+ let mockBuildSkillChoices;
74
+ let mockBuildCommandChoices;
75
+ let mockBuildMcpChoices;
76
+ let mockBuildThemeChoices;
77
+ let mockCategorizeAgents;
78
+ let mockCategorizeSkills;
79
+ let mockCategorizeCommands;
80
+ let mockCategorizeMcps;
81
+ let mockCategorizeThemes;
82
+ let mockSetupScrollRegion;
83
+ let mockResetScrollRegion;
84
+ let processExitSpy;
85
+ let consoleLogSpy;
86
+ let stdoutOnSpy;
87
+ let stdoutOffSpy;
88
+ beforeEach(async () => {
89
+ vi.resetAllMocks();
90
+ const promptsModule = await import('@inquirer/prompts');
91
+ mockConfirm = promptsModule.confirm;
92
+ const selectModule = await import('inquirer-select-pro');
93
+ mockSelect = selectModule.select;
94
+ const openCodeModule = await import('../../services/opencode.js');
95
+ mockIsOpenCodeInstalled = openCodeModule.isOpenCodeInstalled;
96
+ mockInstallOpenCode = openCodeModule.installOpenCode;
97
+ const installersModule = await import('../../services/installers.js');
98
+ mockInstallAgents = installersModule.installAgents;
99
+ mockInstallSkills = installersModule.installSkills;
100
+ mockInstallCommands = installersModule.installCommands;
101
+ mockInstallMcps = installersModule.installMcps;
102
+ mockInstallThemes = installersModule.installThemes;
103
+ const fsModule = await import('../../utils/fs.js');
104
+ mockGetFiles = fsModule.getFiles;
105
+ mockGetDirectories = fsModule.getDirectories;
106
+ const choicesModule = await import('../../ui/choices.js');
107
+ mockBuildAgentChoices = choicesModule.buildAgentChoices;
108
+ mockBuildSkillChoices = choicesModule.buildSkillChoices;
109
+ mockBuildCommandChoices = choicesModule.buildCommandChoices;
110
+ mockBuildMcpChoices = choicesModule.buildMcpChoices;
111
+ mockBuildThemeChoices = choicesModule.buildThemeChoices;
112
+ const categorizeModule = await import('../../ui/categorize.js');
113
+ mockCategorizeAgents = categorizeModule.categorizeAgents;
114
+ mockCategorizeSkills = categorizeModule.categorizeSkills;
115
+ mockCategorizeCommands = categorizeModule.categorizeCommands;
116
+ mockCategorizeMcps = categorizeModule.categorizeMcps;
117
+ mockCategorizeThemes = categorizeModule.categorizeThemes;
118
+ const terminalModule = await import('../../utils/terminal.js');
119
+ mockSetupScrollRegion = terminalModule.setupScrollRegion;
120
+ mockResetScrollRegion = terminalModule.resetScrollRegion;
121
+ processExitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
122
+ throw new Error('process.exit called');
123
+ });
124
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
125
+ stdoutOnSpy = vi.spyOn(process.stdout, 'on').mockImplementation(() => process.stdout);
126
+ stdoutOffSpy = vi.spyOn(process.stdout, 'off').mockImplementation(() => process.stdout);
127
+ // Default mocks
128
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
129
+ mockGetFiles.mockResolvedValue([]);
130
+ mockGetDirectories.mockResolvedValue([]);
131
+ mockBuildAgentChoices.mockResolvedValue([]);
132
+ mockBuildSkillChoices.mockResolvedValue([]);
133
+ mockBuildCommandChoices.mockResolvedValue([]);
134
+ mockBuildMcpChoices.mockResolvedValue([]);
135
+ mockBuildThemeChoices.mockResolvedValue([]);
136
+ mockSelect.mockResolvedValue([]);
137
+ mockConfirm.mockResolvedValue(false);
138
+ mockCategorizeAgents.mockResolvedValue({ new: [], update: [] });
139
+ mockCategorizeSkills.mockResolvedValue({ new: [], update: [] });
140
+ mockCategorizeCommands.mockResolvedValue({ new: [], update: [] });
141
+ mockCategorizeMcps.mockResolvedValue({ new: [], update: [] });
142
+ mockCategorizeThemes.mockResolvedValue({ new: [], update: [] });
143
+ });
144
+ afterEach(() => {
145
+ processExitSpy.mockRestore();
146
+ consoleLogSpy.mockRestore();
147
+ stdoutOnSpy.mockRestore();
148
+ stdoutOffSpy.mockRestore();
149
+ vi.clearAllMocks();
150
+ });
151
+ describe('run', () => {
152
+ it('should setup and reset scroll region', async () => {
153
+ const { run } = await import('../../index.js');
154
+ try {
155
+ await run();
156
+ }
157
+ catch {
158
+ // Ignore process.exit
159
+ }
160
+ expect(mockSetupScrollRegion).toHaveBeenCalled();
161
+ expect(mockResetScrollRegion).toHaveBeenCalled();
162
+ });
163
+ it('should setup resize listener', async () => {
164
+ const { run } = await import('../../index.js');
165
+ try {
166
+ await run();
167
+ }
168
+ catch {
169
+ // Ignore process.exit
170
+ }
171
+ expect(stdoutOnSpy).toHaveBeenCalledWith('resize', expect.any(Function));
172
+ expect(stdoutOffSpy).toHaveBeenCalledWith('resize', expect.any(Function));
173
+ });
174
+ it('should exit early when nothing selected', async () => {
175
+ const { run } = await import('../../index.js');
176
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
177
+ mockSelect.mockResolvedValue([]);
178
+ mockConfirm.mockResolvedValue(false);
179
+ try {
180
+ await run();
181
+ }
182
+ catch {
183
+ // Ignore process.exit
184
+ }
185
+ expect(processExitSpy).toHaveBeenCalledWith(0);
186
+ });
187
+ it('should handle ExitPromptError gracefully', async () => {
188
+ const { run } = await import('../../index.js');
189
+ const exitError = new Error('force closed');
190
+ exitError.name = 'ExitPromptError';
191
+ mockSelect.mockRejectedValueOnce(exitError);
192
+ try {
193
+ await run();
194
+ }
195
+ catch {
196
+ // Ignore process.exit
197
+ }
198
+ expect(processExitSpy).toHaveBeenCalledWith(0);
199
+ expect(mockResetScrollRegion).toHaveBeenCalled();
200
+ });
201
+ it('should prompt to install OpenCode when not installed', async () => {
202
+ const { run } = await import('../../index.js');
203
+ mockIsOpenCodeInstalled.mockResolvedValue(false);
204
+ mockConfirm
205
+ .mockResolvedValueOnce(true) // Install OpenCode
206
+ .mockResolvedValueOnce(false); // Theme
207
+ try {
208
+ await run();
209
+ }
210
+ catch {
211
+ // Ignore process.exit
212
+ }
213
+ expect(mockInstallOpenCode).toHaveBeenCalled();
214
+ });
215
+ it('should exit when user declines OpenCode installation', async () => {
216
+ const { run } = await import('../../index.js');
217
+ mockIsOpenCodeInstalled.mockResolvedValue(false);
218
+ mockConfirm.mockResolvedValueOnce(false);
219
+ try {
220
+ await run();
221
+ }
222
+ catch {
223
+ // Ignore process.exit
224
+ }
225
+ expect(processExitSpy).toHaveBeenCalledWith(0);
226
+ expect(mockInstallOpenCode).not.toHaveBeenCalled();
227
+ });
228
+ it('should complete full installation flow', async () => {
229
+ const { run } = await import('../../index.js');
230
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
231
+ mockGetFiles
232
+ .mockResolvedValueOnce(['agent1'])
233
+ .mockResolvedValueOnce(['cmd1'])
234
+ .mockResolvedValueOnce(['theme1']);
235
+ mockGetDirectories.mockResolvedValueOnce(['skill1']).mockResolvedValueOnce(['mcp1']);
236
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
237
+ mockBuildSkillChoices.mockResolvedValue([{ name: 'skill1', value: 'skill1' }]);
238
+ mockBuildCommandChoices.mockResolvedValue([{ name: 'cmd1', value: 'cmd1' }]);
239
+ mockBuildMcpChoices.mockResolvedValue([{ name: 'mcp1', value: 'mcp1' }]);
240
+ mockBuildThemeChoices.mockResolvedValue([{ name: 'theme1', value: 'theme1' }]);
241
+ mockSelect
242
+ .mockResolvedValueOnce(['agent1'])
243
+ .mockResolvedValueOnce(['skill1'])
244
+ .mockResolvedValueOnce(['cmd1'])
245
+ .mockResolvedValueOnce(['mcp1'])
246
+ .mockResolvedValueOnce(['theme1']);
247
+ mockConfirm.mockResolvedValueOnce(true); // Confirm
248
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
249
+ mockCategorizeSkills.mockResolvedValue({ new: ['skill1'], update: [] });
250
+ mockCategorizeCommands.mockResolvedValue({ new: ['cmd1'], update: [] });
251
+ mockCategorizeMcps.mockResolvedValue({ new: ['mcp1'], update: [] });
252
+ mockCategorizeThemes.mockResolvedValue({ new: ['theme1'], update: [] });
253
+ await run();
254
+ expect(mockInstallAgents).toHaveBeenCalledWith(['agent1']);
255
+ expect(mockInstallSkills).toHaveBeenCalledWith(['skill1']);
256
+ expect(mockInstallCommands).toHaveBeenCalledWith(['cmd1']);
257
+ expect(mockInstallMcps).toHaveBeenCalledWith(['mcp1']);
258
+ expect(mockInstallThemes).toHaveBeenCalledWith(['theme1']);
259
+ });
260
+ it('should not install themes when none selected', async () => {
261
+ const { run } = await import('../../index.js');
262
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
263
+ mockGetFiles
264
+ .mockResolvedValueOnce(['agent1'])
265
+ .mockResolvedValueOnce([])
266
+ .mockResolvedValueOnce(['theme1']);
267
+ mockGetDirectories.mockResolvedValue([]);
268
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
269
+ mockBuildThemeChoices.mockResolvedValue([{ name: 'theme1', value: 'theme1' }]);
270
+ mockSelect.mockResolvedValueOnce(['agent1']).mockResolvedValueOnce([]); // No themes selected
271
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
272
+ mockConfirm.mockResolvedValueOnce(true); // Confirm
273
+ await run();
274
+ expect(mockInstallThemes).toHaveBeenCalledWith([]);
275
+ });
276
+ it('should cancel installation when user does not confirm', async () => {
277
+ const { run } = await import('../../index.js');
278
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
279
+ mockSelect.mockResolvedValue(['agent1']);
280
+ mockGetFiles
281
+ .mockResolvedValueOnce(['agent1'])
282
+ .mockResolvedValueOnce([])
283
+ .mockResolvedValueOnce([]);
284
+ mockGetDirectories.mockResolvedValue([]);
285
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
286
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
287
+ mockConfirm.mockResolvedValueOnce(false); // Confirm - NO
288
+ try {
289
+ await run();
290
+ }
291
+ catch {
292
+ // Ignore process.exit
293
+ }
294
+ expect(mockInstallAgents).not.toHaveBeenCalled();
295
+ expect(processExitSpy).toHaveBeenCalledWith(0);
296
+ });
297
+ it('should handle installation failure', async () => {
298
+ const { run } = await import('../../index.js');
299
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
300
+ mockSelect.mockResolvedValue(['agent1']);
301
+ mockGetFiles
302
+ .mockResolvedValueOnce(['agent1'])
303
+ .mockResolvedValueOnce([])
304
+ .mockResolvedValueOnce([]);
305
+ mockGetDirectories.mockResolvedValue([]);
306
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
307
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
308
+ mockConfirm.mockResolvedValueOnce(true);
309
+ mockInstallAgents.mockRejectedValue(new Error('Install failed'));
310
+ try {
311
+ await run();
312
+ }
313
+ catch {
314
+ // Ignore process.exit
315
+ }
316
+ expect(processExitSpy).toHaveBeenCalledWith(1);
317
+ });
318
+ it('should show themes with installed tag when already installed', async () => {
319
+ const { run } = await import('../../index.js');
320
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
321
+ mockGetFiles
322
+ .mockResolvedValueOnce(['agent1'])
323
+ .mockResolvedValueOnce([])
324
+ .mockResolvedValueOnce(['theme1']);
325
+ mockGetDirectories.mockResolvedValue([]);
326
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
327
+ mockBuildThemeChoices.mockResolvedValue([{ name: 'theme1 (installed)', value: 'theme1' }]);
328
+ mockSelect.mockResolvedValueOnce(['agent1']).mockResolvedValueOnce(['theme1']);
329
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
330
+ mockCategorizeThemes.mockResolvedValue({ new: [], update: ['theme1'] });
331
+ mockConfirm.mockResolvedValueOnce(true);
332
+ await run();
333
+ expect(mockBuildThemeChoices).toHaveBeenCalledWith(['theme1']);
334
+ });
335
+ it('should handle OpenCode installation failure with Error', async () => {
336
+ const { run } = await import('../../index.js');
337
+ mockIsOpenCodeInstalled.mockResolvedValue(false);
338
+ mockConfirm.mockResolvedValueOnce(true); // Yes, install OpenCode
339
+ mockInstallOpenCode.mockRejectedValue(new Error('Installation failed'));
340
+ try {
341
+ await run();
342
+ }
343
+ catch {
344
+ // Ignore process.exit
345
+ }
346
+ expect(processExitSpy).toHaveBeenCalledWith(1);
347
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Installation failed'));
348
+ });
349
+ it('should handle OpenCode installation failure with non-Error', async () => {
350
+ const { run } = await import('../../index.js');
351
+ mockIsOpenCodeInstalled.mockResolvedValue(false);
352
+ mockConfirm.mockResolvedValueOnce(true); // Yes, install OpenCode
353
+ mockInstallOpenCode.mockRejectedValue('string error');
354
+ try {
355
+ await run();
356
+ }
357
+ catch {
358
+ // Ignore process.exit
359
+ }
360
+ expect(processExitSpy).toHaveBeenCalledWith(1);
361
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('string error'));
362
+ });
363
+ it('should handle force closed error message', async () => {
364
+ const { run } = await import('../../index.js');
365
+ const forceClosedError = new Error('Prompt was force closed');
366
+ // Setup: need agents so that select is called
367
+ mockGetFiles.mockResolvedValueOnce(['agent1']);
368
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
369
+ mockSelect.mockRejectedValueOnce(forceClosedError);
370
+ try {
371
+ await run();
372
+ }
373
+ catch {
374
+ // Ignore process.exit
375
+ }
376
+ expect(processExitSpy).toHaveBeenCalledWith(0);
377
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Installation cancelled'));
378
+ });
379
+ it('should auto-install theme for new OpenCode installation', async () => {
380
+ const { run } = await import('../../index.js');
381
+ mockIsOpenCodeInstalled.mockResolvedValue(false);
382
+ mockConfirm
383
+ .mockResolvedValueOnce(true) // Install OpenCode
384
+ .mockResolvedValueOnce(true); // Confirm install
385
+ mockInstallOpenCode.mockResolvedValue(undefined);
386
+ mockSelect.mockResolvedValue(['agent1']);
387
+ mockGetFiles
388
+ .mockResolvedValueOnce(['agent1'])
389
+ .mockResolvedValueOnce([])
390
+ .mockResolvedValueOnce([]);
391
+ mockGetDirectories.mockResolvedValue([]);
392
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
393
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
394
+ mockCategorizeThemes.mockResolvedValue({ new: ['claude-vivid'], update: [] });
395
+ await run();
396
+ expect(mockInstallThemes).toHaveBeenCalledWith(['claude-vivid']);
397
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('claude-vivid theme will be installed automatically'));
398
+ });
399
+ it('should handle installation failure with non-Error exception', async () => {
400
+ const { run } = await import('../../index.js');
401
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
402
+ mockSelect.mockResolvedValue(['agent1']);
403
+ mockGetFiles
404
+ .mockResolvedValueOnce(['agent1'])
405
+ .mockResolvedValueOnce([])
406
+ .mockResolvedValueOnce([]);
407
+ mockGetDirectories.mockResolvedValue([]);
408
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
409
+ mockCategorizeAgents.mockResolvedValue({ new: ['agent1'], update: [] });
410
+ mockConfirm.mockResolvedValueOnce(true); // Confirm
411
+ mockInstallAgents.mockRejectedValue('string error');
412
+ try {
413
+ await run();
414
+ }
415
+ catch {
416
+ // Ignore process.exit
417
+ }
418
+ expect(processExitSpy).toHaveBeenCalledWith(1);
419
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('string error'));
420
+ });
421
+ it('should pass theme and instructions to select', async () => {
422
+ const { run } = await import('../../index.js');
423
+ mockIsOpenCodeInstalled.mockResolvedValue(true);
424
+ mockGetFiles.mockResolvedValueOnce(['agent1']).mockResolvedValueOnce([]);
425
+ mockGetDirectories.mockResolvedValue([]);
426
+ mockBuildAgentChoices.mockResolvedValue([{ name: 'agent1', value: 'agent1' }]);
427
+ // Capture the select call to verify theme and instructions
428
+ mockSelect.mockImplementation((options) => {
429
+ // Call the passed functions to cover them
430
+ if (options.theme?.style?.renderSelectedOptions) {
431
+ const result = options.theme.style.renderSelectedOptions();
432
+ expect(result).toBe('');
433
+ }
434
+ if (options.instructions) {
435
+ const result = options.instructions();
436
+ expect(result).toContain('tab');
437
+ }
438
+ return Promise.resolve([]);
439
+ });
440
+ try {
441
+ await run();
442
+ }
443
+ catch {
444
+ // Ignore process.exit
445
+ }
446
+ expect(mockSelect).toHaveBeenCalled();
447
+ });
448
+ });
449
+ });
450
+ //# sourceMappingURL=installer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/installer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=installers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installers.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/services/installers.test.ts"],"names":[],"mappings":""}