@claudetree/cli 0.5.0 → 0.5.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 (111) hide show
  1. package/dist/commands/log.d.ts +3 -0
  2. package/dist/commands/log.d.ts.map +1 -0
  3. package/dist/commands/log.js +116 -0
  4. package/dist/commands/log.js.map +1 -0
  5. package/dist/index.js +6 -1
  6. package/dist/index.js.map +1 -1
  7. package/package.json +7 -4
  8. package/dist/commands/batch.test.d.ts +0 -2
  9. package/dist/commands/batch.test.d.ts.map +0 -1
  10. package/dist/commands/batch.test.js +0 -230
  11. package/dist/commands/batch.test.js.map +0 -1
  12. package/dist/commands/bustercall/issueFilters.test.d.ts +0 -2
  13. package/dist/commands/bustercall/issueFilters.test.d.ts.map +0 -1
  14. package/dist/commands/bustercall/issueFilters.test.js +0 -151
  15. package/dist/commands/bustercall/issueFilters.test.js.map +0 -1
  16. package/dist/commands/bustercall/sessionManager.test.d.ts +0 -2
  17. package/dist/commands/bustercall/sessionManager.test.d.ts.map +0 -1
  18. package/dist/commands/bustercall/sessionManager.test.js +0 -79
  19. package/dist/commands/bustercall/sessionManager.test.js.map +0 -1
  20. package/dist/commands/bustercall/statusDisplay.test.d.ts +0 -2
  21. package/dist/commands/bustercall/statusDisplay.test.d.ts.map +0 -1
  22. package/dist/commands/bustercall/statusDisplay.test.js +0 -111
  23. package/dist/commands/bustercall/statusDisplay.test.js.map +0 -1
  24. package/dist/commands/bustercall.test.d.ts +0 -2
  25. package/dist/commands/bustercall.test.d.ts.map +0 -1
  26. package/dist/commands/bustercall.test.js +0 -258
  27. package/dist/commands/bustercall.test.js.map +0 -1
  28. package/dist/commands/chain/chainDisplay.test.d.ts +0 -2
  29. package/dist/commands/chain/chainDisplay.test.d.ts.map +0 -1
  30. package/dist/commands/chain/chainDisplay.test.js +0 -128
  31. package/dist/commands/chain/chainDisplay.test.js.map +0 -1
  32. package/dist/commands/chain/chainSession.test.d.ts +0 -2
  33. package/dist/commands/chain/chainSession.test.d.ts.map +0 -1
  34. package/dist/commands/chain/chainSession.test.js +0 -93
  35. package/dist/commands/chain/chainSession.test.js.map +0 -1
  36. package/dist/commands/chain.test.d.ts +0 -2
  37. package/dist/commands/chain.test.d.ts.map +0 -1
  38. package/dist/commands/chain.test.js +0 -216
  39. package/dist/commands/chain.test.js.map +0 -1
  40. package/dist/commands/clean.test.d.ts +0 -2
  41. package/dist/commands/clean.test.d.ts.map +0 -1
  42. package/dist/commands/clean.test.js +0 -193
  43. package/dist/commands/clean.test.js.map +0 -1
  44. package/dist/commands/demo.d.ts +0 -3
  45. package/dist/commands/demo.d.ts.map +0 -1
  46. package/dist/commands/demo.js +0 -175
  47. package/dist/commands/demo.js.map +0 -1
  48. package/dist/commands/demo.test.d.ts +0 -2
  49. package/dist/commands/demo.test.d.ts.map +0 -1
  50. package/dist/commands/demo.test.js +0 -34
  51. package/dist/commands/demo.test.js.map +0 -1
  52. package/dist/commands/doctor.test.d.ts +0 -2
  53. package/dist/commands/doctor.test.d.ts.map +0 -1
  54. package/dist/commands/doctor.test.js +0 -324
  55. package/dist/commands/doctor.test.js.map +0 -1
  56. package/dist/commands/init.test.d.ts +0 -2
  57. package/dist/commands/init.test.d.ts.map +0 -1
  58. package/dist/commands/init.test.js +0 -94
  59. package/dist/commands/init.test.js.map +0 -1
  60. package/dist/commands/list.test.d.ts +0 -2
  61. package/dist/commands/list.test.d.ts.map +0 -1
  62. package/dist/commands/list.test.js +0 -106
  63. package/dist/commands/list.test.js.map +0 -1
  64. package/dist/commands/resume.test.d.ts +0 -2
  65. package/dist/commands/resume.test.d.ts.map +0 -1
  66. package/dist/commands/resume.test.js +0 -362
  67. package/dist/commands/resume.test.js.map +0 -1
  68. package/dist/commands/start/buildPrompt.test.d.ts +0 -2
  69. package/dist/commands/start/buildPrompt.test.d.ts.map +0 -1
  70. package/dist/commands/start/buildPrompt.test.js +0 -182
  71. package/dist/commands/start/buildPrompt.test.js.map +0 -1
  72. package/dist/commands/start/createWorktree.test.d.ts +0 -2
  73. package/dist/commands/start/createWorktree.test.d.ts.map +0 -1
  74. package/dist/commands/start/createWorktree.test.js +0 -81
  75. package/dist/commands/start/createWorktree.test.js.map +0 -1
  76. package/dist/commands/start/parseIssueInput.test.d.ts +0 -2
  77. package/dist/commands/start/parseIssueInput.test.d.ts.map +0 -1
  78. package/dist/commands/start/parseIssueInput.test.js +0 -118
  79. package/dist/commands/start/parseIssueInput.test.js.map +0 -1
  80. package/dist/commands/start/progressTracker.test.d.ts +0 -2
  81. package/dist/commands/start/progressTracker.test.d.ts.map +0 -1
  82. package/dist/commands/start/progressTracker.test.js +0 -100
  83. package/dist/commands/start/progressTracker.test.js.map +0 -1
  84. package/dist/commands/start/validationGates.test.d.ts +0 -2
  85. package/dist/commands/start/validationGates.test.d.ts.map +0 -1
  86. package/dist/commands/start/validationGates.test.js +0 -66
  87. package/dist/commands/start/validationGates.test.js.map +0 -1
  88. package/dist/commands/start.test.d.ts +0 -2
  89. package/dist/commands/start.test.d.ts.map +0 -1
  90. package/dist/commands/start.test.js +0 -260
  91. package/dist/commands/start.test.js.map +0 -1
  92. package/dist/commands/stats.test.d.ts +0 -2
  93. package/dist/commands/stats.test.d.ts.map +0 -1
  94. package/dist/commands/stats.test.js +0 -127
  95. package/dist/commands/stats.test.js.map +0 -1
  96. package/dist/commands/status.test.d.ts +0 -2
  97. package/dist/commands/status.test.d.ts.map +0 -1
  98. package/dist/commands/status.test.js +0 -172
  99. package/dist/commands/status.test.js.map +0 -1
  100. package/dist/commands/stop.test.d.ts +0 -2
  101. package/dist/commands/stop.test.d.ts.map +0 -1
  102. package/dist/commands/stop.test.js +0 -152
  103. package/dist/commands/stop.test.js.map +0 -1
  104. package/dist/commands/tdd.d.ts +0 -3
  105. package/dist/commands/tdd.d.ts.map +0 -1
  106. package/dist/commands/tdd.js +0 -472
  107. package/dist/commands/tdd.js.map +0 -1
  108. package/dist/commands/web.test.d.ts +0 -2
  109. package/dist/commands/web.test.d.ts.map +0 -1
  110. package/dist/commands/web.test.js +0 -133
  111. package/dist/commands/web.test.js.map +0 -1
@@ -1,79 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import * as fs from 'node:fs/promises';
3
- import { getSessionsForIssue, waitForSessionCreated } from './sessionManager.js';
4
- vi.mock('node:fs/promises');
5
- describe('sessionManager', () => {
6
- describe('getSessionsForIssue', () => {
7
- beforeEach(() => {
8
- vi.resetAllMocks();
9
- });
10
- it('should return sessions matching issue number', async () => {
11
- const mockSessions = [
12
- { id: '1', issueNumber: 42, status: 'running' },
13
- { id: '2', issueNumber: 43, status: 'completed' },
14
- { id: '3', issueNumber: 42, status: 'completed' },
15
- ];
16
- vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockSessions));
17
- const result = await getSessionsForIssue('/test/cwd', 42);
18
- expect(result).toHaveLength(2);
19
- expect(result[0]?.issueNumber).toBe(42);
20
- expect(result[1]?.issueNumber).toBe(42);
21
- });
22
- it('should return empty array when no sessions match', async () => {
23
- const mockSessions = [
24
- { id: '1', issueNumber: 1, status: 'running' },
25
- ];
26
- vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockSessions));
27
- const result = await getSessionsForIssue('/test/cwd', 999);
28
- expect(result).toHaveLength(0);
29
- });
30
- it('should return empty array on file read error', async () => {
31
- vi.mocked(fs.readFile).mockRejectedValue(new Error('File not found'));
32
- const result = await getSessionsForIssue('/test/cwd', 42);
33
- expect(result).toHaveLength(0);
34
- });
35
- });
36
- describe('waitForSessionCreated', () => {
37
- beforeEach(() => {
38
- vi.useFakeTimers();
39
- vi.resetAllMocks();
40
- });
41
- afterEach(() => {
42
- vi.useRealTimers();
43
- });
44
- it('should return true when running session is found', async () => {
45
- const mockSessions = [
46
- { id: '1', issueNumber: 42, status: 'running' },
47
- ];
48
- vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockSessions));
49
- const promise = waitForSessionCreated('/test/cwd', 42, 5000);
50
- await vi.advanceTimersByTimeAsync(1000);
51
- const result = await promise;
52
- expect(result).toBe(true);
53
- });
54
- it('should return false on timeout', async () => {
55
- vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify([]));
56
- const promise = waitForSessionCreated('/test/cwd', 42, 3000);
57
- // Advance past the timeout
58
- await vi.advanceTimersByTimeAsync(4000);
59
- const result = await promise;
60
- expect(result).toBe(false);
61
- });
62
- it('should poll until session is found', async () => {
63
- vi.mocked(fs.readFile)
64
- .mockResolvedValueOnce(JSON.stringify([]))
65
- .mockResolvedValueOnce(JSON.stringify([]))
66
- .mockResolvedValueOnce(JSON.stringify([{ id: '1', issueNumber: 42, status: 'running' }]));
67
- const promise = waitForSessionCreated('/test/cwd', 42, 10000);
68
- // First poll at 0ms
69
- await vi.advanceTimersByTimeAsync(1000);
70
- // Second poll at 1000ms
71
- await vi.advanceTimersByTimeAsync(1000);
72
- // Third poll at 2000ms - should find session
73
- await vi.advanceTimersByTimeAsync(1000);
74
- const result = await promise;
75
- expect(result).toBe(true);
76
- });
77
- });
78
- });
79
- //# sourceMappingURL=sessionManager.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionManager.test.js","sourceRoot":"","sources":["../../../src/commands/bustercall/sessionManager.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=statusDisplay.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statusDisplay.test.d.ts","sourceRoot":"","sources":["../../../src/commands/bustercall/statusDisplay.test.ts"],"names":[],"mappings":""}
@@ -1,111 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { truncate, printStatus } from './statusDisplay.js';
3
- describe('statusDisplay', () => {
4
- describe('truncate', () => {
5
- it('should return string unchanged if shorter than maxLen', () => {
6
- expect(truncate('short', 10)).toBe('short');
7
- });
8
- it('should return string unchanged if equal to maxLen', () => {
9
- expect(truncate('12345', 5)).toBe('12345');
10
- });
11
- it('should truncate and add ellipsis', () => {
12
- expect(truncate('this is a long string', 10)).toBe('this is...');
13
- });
14
- it('should handle empty string', () => {
15
- expect(truncate('', 10)).toBe('');
16
- });
17
- it('should handle maxLen of 3 (minimum for ellipsis)', () => {
18
- expect(truncate('abcdef', 3)).toBe('...');
19
- });
20
- });
21
- describe('printStatus', () => {
22
- let consoleLogSpy;
23
- let consoleClearSpy;
24
- beforeEach(() => {
25
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
26
- consoleClearSpy = vi.spyOn(console, 'clear').mockImplementation(() => { });
27
- });
28
- afterEach(() => {
29
- consoleLogSpy.mockRestore();
30
- consoleClearSpy.mockRestore();
31
- });
32
- it('should clear console and print header', () => {
33
- const items = [];
34
- printStatus(items);
35
- expect(consoleClearSpy).toHaveBeenCalled();
36
- expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Bustercall'));
37
- });
38
- it('should display pending items', () => {
39
- const items = [
40
- {
41
- issue: createMockIssue(1, 'First issue'),
42
- status: 'pending',
43
- },
44
- ];
45
- printStatus(items);
46
- const output = consoleLogSpy.mock.calls.map(c => c[0]).join('\n');
47
- expect(output).toContain('#1');
48
- expect(output).toContain('First issue');
49
- });
50
- it('should display running items with correct icon', () => {
51
- const items = [
52
- {
53
- issue: createMockIssue(2, 'Running issue'),
54
- status: 'running',
55
- },
56
- ];
57
- printStatus(items);
58
- const output = consoleLogSpy.mock.calls.map(c => c[0]).join('\n');
59
- expect(output).toContain('#2');
60
- });
61
- it('should display completed items', () => {
62
- const items = [
63
- {
64
- issue: createMockIssue(3, 'Done issue'),
65
- status: 'completed',
66
- },
67
- ];
68
- printStatus(items);
69
- const output = consoleLogSpy.mock.calls.map(c => c[0]).join('\n');
70
- expect(output).toContain('#3');
71
- });
72
- it('should display failed items with error', () => {
73
- const items = [
74
- {
75
- issue: createMockIssue(4, 'Failed issue'),
76
- status: 'failed',
77
- error: 'Something went wrong',
78
- },
79
- ];
80
- printStatus(items);
81
- const output = consoleLogSpy.mock.calls.map(c => c[0]).join('\n');
82
- expect(output).toContain('#4');
83
- expect(output).toContain('Something went wrong');
84
- });
85
- it('should display summary counts', () => {
86
- const items = [
87
- { issue: createMockIssue(1, 'A'), status: 'completed' },
88
- { issue: createMockIssue(2, 'B'), status: 'completed' },
89
- { issue: createMockIssue(3, 'C'), status: 'running' },
90
- { issue: createMockIssue(4, 'D'), status: 'failed' },
91
- { issue: createMockIssue(5, 'E'), status: 'pending' },
92
- ];
93
- printStatus(items);
94
- const output = consoleLogSpy.mock.calls.map(c => c[0]).join('\n');
95
- expect(output).toContain('[2/5]');
96
- expect(output).toContain('1 running');
97
- expect(output).toContain('1 failed');
98
- });
99
- });
100
- });
101
- function createMockIssue(number, title) {
102
- return {
103
- number,
104
- title,
105
- body: '',
106
- labels: [],
107
- state: 'open',
108
- url: `https://github.com/owner/repo/issues/${number}`,
109
- };
110
- }
111
- //# sourceMappingURL=statusDisplay.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statusDisplay.test.js","sourceRoot":"","sources":["../../../src/commands/bustercall/statusDisplay.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=bustercall.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bustercall.test.d.ts","sourceRoot":"","sources":["../../src/commands/bustercall.test.ts"],"names":[],"mappings":""}
@@ -1,258 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- // Create mock functions at module scope
6
- const mockSpawn = vi.fn();
7
- const mockExec = vi.fn();
8
- // Mock child_process
9
- vi.mock('node:child_process', () => ({
10
- spawn: (...args) => mockSpawn(...args),
11
- exec: (cmd, callback) => {
12
- mockExec(cmd).then((result) => callback(null, { stdout: result.stdout, stderr: '' }), (error) => callback(error, { stdout: '', stderr: '' }));
13
- },
14
- }));
15
- // Mock GitHubAdapter and SlackNotifier
16
- const mockListIssues = vi.fn();
17
- const mockNotifyBatch = vi.fn();
18
- vi.mock('@claudetree/core', () => ({
19
- GitHubAdapter: vi.fn().mockImplementation(() => ({
20
- listIssues: mockListIssues,
21
- })),
22
- SlackNotifier: vi.fn().mockImplementation(() => ({
23
- notifyBatch: mockNotifyBatch,
24
- })),
25
- }));
26
- import { bustercallCommand } from './bustercall.js';
27
- describe('bustercallCommand', () => {
28
- let testDir;
29
- let originalCwd;
30
- let originalExit;
31
- let consoleLogSpy;
32
- let consoleErrorSpy;
33
- let consoleClearSpy;
34
- let originalEnv;
35
- beforeEach(async () => {
36
- testDir = await mkdtemp(join(tmpdir(), 'claudetree-bustercall-test-'));
37
- originalCwd = process.cwd();
38
- process.chdir(testDir);
39
- originalExit = process.exit;
40
- process.exit = vi.fn();
41
- originalEnv = { ...process.env };
42
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
43
- consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
44
- consoleClearSpy = vi.spyOn(console, 'clear').mockImplementation(() => { });
45
- mockSpawn.mockReset();
46
- mockListIssues.mockReset();
47
- mockNotifyBatch.mockReset();
48
- mockExec.mockReset();
49
- });
50
- afterEach(async () => {
51
- process.chdir(originalCwd);
52
- process.exit = originalExit;
53
- process.env = originalEnv;
54
- consoleLogSpy.mockRestore();
55
- consoleErrorSpy.mockRestore();
56
- consoleClearSpy.mockRestore();
57
- vi.clearAllMocks();
58
- await rm(testDir, { recursive: true, force: true });
59
- });
60
- describe('when not initialized', () => {
61
- it('should display error and exit with code 1', async () => {
62
- const exitError = new Error('process.exit called');
63
- process.exit.mockImplementation(() => {
64
- throw exitError;
65
- });
66
- await expect(bustercallCommand.parseAsync(['node', 'test'])).rejects.toThrow('process.exit called');
67
- expect(consoleErrorSpy).toHaveBeenCalledWith('Error: claudetree not initialized. Run "claudetree init" first.');
68
- expect(process.exit).toHaveBeenCalledWith(1);
69
- });
70
- });
71
- describe('when initialized without GitHub config', () => {
72
- beforeEach(async () => {
73
- await mkdir(join(testDir, '.claudetree'), { recursive: true });
74
- await writeFile(join(testDir, '.claudetree', 'config.json'), JSON.stringify({ worktreeDir: '.worktrees' }));
75
- delete process.env.GITHUB_TOKEN;
76
- });
77
- it('should display error about missing GitHub config', async () => {
78
- const exitError = new Error('process.exit called');
79
- process.exit.mockImplementation(() => {
80
- throw exitError;
81
- });
82
- await expect(bustercallCommand.parseAsync(['node', 'test'])).rejects.toThrow('process.exit called');
83
- expect(consoleErrorSpy).toHaveBeenCalledWith('Error: GitHub configuration required for bustercall.');
84
- expect(process.exit).toHaveBeenCalledWith(1);
85
- });
86
- });
87
- describe('when initialized with GitHub config', () => {
88
- beforeEach(async () => {
89
- await mkdir(join(testDir, '.claudetree'), { recursive: true });
90
- await writeFile(join(testDir, '.claudetree', 'config.json'), JSON.stringify({
91
- worktreeDir: '.worktrees',
92
- github: {
93
- token: 'test-token',
94
- owner: 'test-owner',
95
- repo: 'test-repo',
96
- },
97
- }));
98
- // Mock gh pr list
99
- mockExec.mockResolvedValue({ stdout: '[]' });
100
- });
101
- describe('when no issues found', () => {
102
- it('should exit with message', async () => {
103
- mockListIssues.mockResolvedValue([]);
104
- const exitError = new Error('process.exit called');
105
- process.exit.mockImplementation((code) => {
106
- if (code === 0)
107
- throw exitError;
108
- });
109
- await expect(bustercallCommand.parseAsync(['node', 'test'])).rejects.toThrow('process.exit called');
110
- expect(consoleLogSpy).toHaveBeenCalledWith('No open issues found matching criteria.');
111
- expect(process.exit).toHaveBeenCalledWith(0);
112
- });
113
- });
114
- describe('with --dry-run option', () => {
115
- it('should show issues without starting sessions', async () => {
116
- mockListIssues.mockResolvedValue([
117
- { number: 101, title: 'Fix bug A', labels: [] },
118
- { number: 102, title: 'Fix bug B', labels: [] },
119
- ]);
120
- await bustercallCommand.parseAsync(['node', 'test', '--dry-run']);
121
- expect(mockSpawn).not.toHaveBeenCalled();
122
- expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('[Dry Run]'));
123
- });
124
- it('should categorize issues by conflict potential', async () => {
125
- mockListIssues.mockResolvedValue([
126
- { number: 101, title: 'Fix bug A', labels: [] },
127
- { number: 102, title: 'Update package.json', labels: ['dependencies'] },
128
- ]);
129
- await bustercallCommand.parseAsync(['node', 'test', '--dry-run']);
130
- // Safe issues should be shown
131
- const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
132
- expect(logCalls).toContain('#101');
133
- expect(logCalls).toContain('#102');
134
- });
135
- });
136
- describe('with --label option', () => {
137
- it('should filter issues by label', async () => {
138
- mockListIssues.mockResolvedValue([
139
- { number: 101, title: 'Bug fix', labels: ['bug'] },
140
- ]);
141
- await bustercallCommand.parseAsync(['node', 'test', '--label', 'bug', '--dry-run']);
142
- expect(mockListIssues).toHaveBeenCalledWith('test-owner', 'test-repo', {
143
- labels: 'bug',
144
- state: 'open',
145
- });
146
- });
147
- });
148
- describe('with --exclude option', () => {
149
- it('should exclude specified issue numbers', async () => {
150
- mockListIssues.mockResolvedValue([
151
- { number: 101, title: 'Fix bug A', labels: [] },
152
- { number: 102, title: 'Fix bug B', labels: [] },
153
- { number: 103, title: 'Fix bug C', labels: [] },
154
- ]);
155
- await bustercallCommand.parseAsync([
156
- 'node',
157
- 'test',
158
- '--exclude',
159
- '102',
160
- '--dry-run',
161
- ]);
162
- const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
163
- expect(logCalls).toContain('#101');
164
- expect(logCalls).not.toContain('Fix bug B');
165
- expect(logCalls).toContain('#103');
166
- });
167
- });
168
- describe('with --limit option', () => {
169
- it('should limit number of issues', async () => {
170
- mockListIssues.mockResolvedValue([
171
- { number: 101, title: 'Fix A', labels: [] },
172
- { number: 102, title: 'Fix B', labels: [] },
173
- { number: 103, title: 'Fix C', labels: [] },
174
- { number: 104, title: 'Fix D', labels: [] },
175
- ]);
176
- await bustercallCommand.parseAsync([
177
- 'node',
178
- 'test',
179
- '--limit',
180
- '2',
181
- '--dry-run',
182
- ]);
183
- expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Found 4 issues, limiting to 2'));
184
- });
185
- });
186
- describe('with --sequential option', () => {
187
- it('should indicate sequential execution in dry-run', async () => {
188
- mockListIssues.mockResolvedValue([
189
- { number: 101, title: 'Fix A', labels: [] },
190
- { number: 102, title: 'Fix B', labels: [] },
191
- ]);
192
- await bustercallCommand.parseAsync([
193
- 'node',
194
- 'test',
195
- '--sequential',
196
- '--dry-run',
197
- ]);
198
- // In sequential mode, all issues are processed
199
- const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
200
- expect(logCalls).toContain('#101');
201
- expect(logCalls).toContain('#102');
202
- });
203
- });
204
- describe('PR filtering', () => {
205
- it('should skip issues with existing PRs', async () => {
206
- mockListIssues.mockResolvedValue([
207
- { number: 101, title: 'Fix A', labels: [] },
208
- { number: 102, title: 'Fix B', labels: [] },
209
- ]);
210
- // Mock gh pr list to return PR referencing issue 102
211
- mockExec.mockResolvedValue({
212
- stdout: JSON.stringify([
213
- { number: 1, title: 'PR for #102', body: 'Fixes #102' },
214
- ]),
215
- });
216
- await bustercallCommand.parseAsync(['node', 'test', '--dry-run']);
217
- expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Skipped 1 issue(s) with existing PRs'));
218
- });
219
- });
220
- describe('conflict detection', () => {
221
- it('should detect issues with config-related labels', async () => {
222
- mockListIssues.mockResolvedValue([
223
- { number: 101, title: 'Add feature', labels: [] },
224
- { number: 102, title: 'Update deps', labels: ['dependencies'] },
225
- ]);
226
- await bustercallCommand.parseAsync(['node', 'test', '--dry-run']);
227
- const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
228
- expect(logCalls).toContain('Potential Conflict');
229
- });
230
- it('should detect issues with config keywords in title', async () => {
231
- mockListIssues.mockResolvedValue([
232
- { number: 101, title: 'Update package.json', labels: [] },
233
- { number: 102, title: 'Fix bug in login', labels: [] },
234
- ]);
235
- await bustercallCommand.parseAsync(['node', 'test', '--dry-run']);
236
- const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
237
- expect(logCalls).toContain('Potential Conflict');
238
- });
239
- });
240
- describe('with --template option', () => {
241
- it('should pass template for dry-run display', async () => {
242
- mockListIssues.mockResolvedValue([
243
- { number: 101, title: 'Fix bug', labels: [] },
244
- ]);
245
- await bustercallCommand.parseAsync([
246
- 'node',
247
- 'test',
248
- '--template',
249
- 'bugfix',
250
- '--dry-run',
251
- ]);
252
- // Template is used when starting sessions, not shown in dry-run
253
- expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('[Dry Run]'));
254
- });
255
- });
256
- });
257
- });
258
- //# sourceMappingURL=bustercall.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bustercall.test.js","sourceRoot":"","sources":["../../src/commands/bustercall.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAa,MAAM,QAAQ,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,wCAAwC;AACxC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEzB,qBAAqB;AACrB,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACjD,IAAI,EAAE,CAAC,GAAW,EAAE,QAAmF,EAAE,EAAE;QACzG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAChB,CAAC,MAA0B,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EACrF,CAAC,KAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAC9D,CAAC;IACJ,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,uCAAuC;AACvC,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC/B,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAChC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,UAAU,EAAE,cAAc;KAC3B,CAAC,CAAC;IACH,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,OAAe,CAAC;IACpB,IAAI,WAAmB,CAAC;IACxB,IAAI,YAAiC,CAAC;IACtC,IAAI,aAA0C,CAAC;IAC/C,IAAI,eAA4C,CAAC;IACjD,IAAI,eAA4C,CAAC;IACjD,IAAI,WAA8B,CAAC;IAEnC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,6BAA6B,CAAC,CAAC,CAAC;QACvE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;QAC5B,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAW,CAAC;QAChC,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtE,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1E,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1E,SAAS,CAAC,SAAS,EAAE,CAAC;QACtB,cAAc,CAAC,SAAS,EAAE,CAAC;QAC3B,eAAe,CAAC,SAAS,EAAE,CAAC;QAC5B,QAAQ,CAAC,SAAS,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;QAC5B,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1B,aAAa,CAAC,WAAW,EAAE,CAAC;QAC5B,eAAe,CAAC,WAAW,EAAE,CAAC;QAC9B,eAAe,CAAC,WAAW,EAAE,CAAC;QAC9B,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAClD,OAAO,CAAC,IAAwB,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBACxD,MAAM,SAAS,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1E,qBAAqB,CACtB,CAAC;YAEF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,iEAAiE,CAClE,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAC9C,CAAC;YACF,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAClD,OAAO,CAAC,IAAwB,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBACxD,MAAM,SAAS,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1E,qBAAqB,CACtB,CAAC;YAEF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,sDAAsD,CACvD,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC;gBACb,WAAW,EAAE,YAAY;gBACzB,MAAM,EAAE;oBACN,KAAK,EAAE,YAAY;oBACnB,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,WAAW;iBAClB;aACF,CAAC,CACH,CAAC;YACF,kBAAkB;YAClB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;gBACxC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACrC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAwB,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC5D,IAAI,IAAI,KAAK,CAAC;wBAAE,MAAM,SAAS,CAAC;gBAClC,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1E,qBAAqB,CACtB,CAAC;gBAEF,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,yCAAyC,CAC1C,CAAC;gBACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACrC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;gBAC5D,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;iBAChD,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;gBAElE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACzC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CACrC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE;iBACxE,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;gBAElE,8BAA8B;gBAC9B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;gBAC7C,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;iBACnD,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;gBAEpF,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE;oBACrE,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACrC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;gBACtD,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;iBAChD,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC;oBACjC,MAAM;oBACN,MAAM;oBACN,WAAW;oBACX,KAAK;oBACL,WAAW;iBACZ,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;gBAC7C,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC;oBACjC,MAAM;oBACN,MAAM;oBACN,SAAS;oBACT,GAAG;oBACH,WAAW;iBACZ,CAAC,CAAC;gBAEH,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CACzD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC/D,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC;oBACjC,MAAM;oBACN,MAAM;oBACN,cAAc;oBACd,WAAW;iBACZ,CAAC,CAAC;gBAEH,+CAA+C;gBAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;YAC5B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;gBACpD,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBACH,qDAAqD;gBACrD,QAAQ,CAAC,iBAAiB,CAAC;oBACzB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;wBACrB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE;qBACxD,CAAC;iBACH,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;gBAElE,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,sCAAsC,CAAC,CAChE,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAClC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC/D,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;oBACjD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE;iBAChE,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;gBAElE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;gBAClE,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE;oBACzD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAAE;iBACvD,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;gBAElE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACtC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;gBACxD,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;iBAC9C,CAAC,CAAC;gBAEH,MAAM,iBAAiB,CAAC,UAAU,CAAC;oBACjC,MAAM;oBACN,MAAM;oBACN,YAAY;oBACZ,QAAQ;oBACR,WAAW;iBACZ,CAAC,CAAC;gBAEH,gEAAgE;gBAChE,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CACrC,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=chainDisplay.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chainDisplay.test.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/chainDisplay.test.ts"],"names":[],"mappings":""}
@@ -1,128 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { truncate, printChainStatus, getChainSummary, getBranchNameForIssue, } from './chainDisplay.js';
3
- describe('chainDisplay', () => {
4
- describe('truncate', () => {
5
- it('should return string unchanged if shorter than maxLen', () => {
6
- expect(truncate('short', 10)).toBe('short');
7
- });
8
- it('should truncate and add ellipsis', () => {
9
- expect(truncate('this is a long string', 10)).toBe('this is...');
10
- });
11
- });
12
- describe('getBranchNameForIssue', () => {
13
- it('should create branch name for numeric issue', () => {
14
- expect(getBranchNameForIssue('42')).toBe('issue-42');
15
- expect(getBranchNameForIssue('123')).toBe('issue-123');
16
- });
17
- it('should sanitize task name', () => {
18
- expect(getBranchNameForIssue('add user authentication')).toBe('add-user-authentication');
19
- });
20
- it('should handle special characters', () => {
21
- expect(getBranchNameForIssue('Fix: bug #123!')).toBe('fix-bug-123');
22
- });
23
- it('should limit branch name length', () => {
24
- const longName = 'a'.repeat(100);
25
- const result = getBranchNameForIssue(longName);
26
- expect(result.length).toBeLessThanOrEqual(50);
27
- });
28
- it('should handle leading/trailing dashes', () => {
29
- expect(getBranchNameForIssue('--test--')).toBe('test');
30
- });
31
- });
32
- describe('getChainSummary', () => {
33
- it('should calculate summary correctly', () => {
34
- const chain = createMockChain([
35
- { status: 'completed' },
36
- { status: 'completed' },
37
- { status: 'failed' },
38
- { status: 'skipped' },
39
- { status: 'pending' },
40
- ]);
41
- const summary = getChainSummary(chain);
42
- expect(summary.total).toBe(5);
43
- expect(summary.completed).toBe(2);
44
- expect(summary.failed).toBe(1);
45
- expect(summary.skipped).toBe(1);
46
- expect(summary.pending).toBe(1);
47
- });
48
- it('should handle empty chain', () => {
49
- const chain = {
50
- id: 'test',
51
- items: [],
52
- status: 'pending',
53
- createdAt: new Date(),
54
- updatedAt: new Date(),
55
- options: { baseBranch: 'develop', skipFailed: false, autoMerge: false },
56
- };
57
- const summary = getChainSummary(chain);
58
- expect(summary.total).toBe(0);
59
- expect(summary.completed).toBe(0);
60
- });
61
- });
62
- describe('printChainStatus', () => {
63
- let consoleLogSpy;
64
- let consoleClearSpy;
65
- beforeEach(() => {
66
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
67
- consoleClearSpy = vi.spyOn(console, 'clear').mockImplementation(() => { });
68
- });
69
- afterEach(() => {
70
- consoleLogSpy.mockRestore();
71
- consoleClearSpy.mockRestore();
72
- });
73
- it('should clear console and print header', () => {
74
- const chain = createMockChain([{ status: 'pending' }]);
75
- printChainStatus(chain);
76
- expect(consoleClearSpy).toHaveBeenCalled();
77
- expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Dependency Chain'));
78
- });
79
- it('should display chain items with status', () => {
80
- const chain = createMockChain([
81
- { status: 'completed' },
82
- { status: 'running' },
83
- { status: 'pending' },
84
- ]);
85
- printChainStatus(chain);
86
- const output = consoleLogSpy.mock.calls.map((c) => c[0]).join('\n');
87
- expect(output).toContain('#1');
88
- expect(output).toContain('#2');
89
- expect(output).toContain('#3');
90
- });
91
- it('should show error for failed items', () => {
92
- const chain = createMockChain([
93
- { status: 'failed', error: 'Build failed' },
94
- ]);
95
- printChainStatus(chain);
96
- const output = consoleLogSpy.mock.calls.map((c) => c[0]).join('\n');
97
- expect(output).toContain('Build failed');
98
- });
99
- it('should display summary counts', () => {
100
- const chain = createMockChain([
101
- { status: 'completed' },
102
- { status: 'completed' },
103
- { status: 'pending' },
104
- ]);
105
- printChainStatus(chain);
106
- const output = consoleLogSpy.mock.calls.map((c) => c[0]).join('\n');
107
- expect(output).toContain('[2/3]');
108
- });
109
- });
110
- });
111
- function createMockChain(itemStatuses) {
112
- return {
113
- id: 'test-chain',
114
- items: itemStatuses.map((s, idx) => ({
115
- issue: String(idx + 1),
116
- order: idx,
117
- status: s.status,
118
- branchName: `issue-${idx + 1}`,
119
- baseBranch: idx === 0 ? 'develop' : `issue-${idx}`,
120
- error: s.error,
121
- })),
122
- status: 'running',
123
- createdAt: new Date(),
124
- updatedAt: new Date(),
125
- options: { baseBranch: 'develop', skipFailed: false, autoMerge: false },
126
- };
127
- }
128
- //# sourceMappingURL=chainDisplay.test.js.map