@claudetree/cli 0.4.4 → 0.4.5

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 (113) hide show
  1. package/dist/commands/batch.js +1 -1
  2. package/dist/commands/batch.js.map +1 -1
  3. package/dist/commands/batch.test.d.ts +2 -0
  4. package/dist/commands/batch.test.d.ts.map +1 -0
  5. package/dist/commands/batch.test.js +230 -0
  6. package/dist/commands/batch.test.js.map +1 -0
  7. package/dist/commands/bustercall/index.d.ts +4 -0
  8. package/dist/commands/bustercall/index.d.ts.map +1 -0
  9. package/dist/commands/bustercall/index.js +4 -0
  10. package/dist/commands/bustercall/index.js.map +1 -0
  11. package/dist/commands/bustercall/issueFilters.d.ts +21 -0
  12. package/dist/commands/bustercall/issueFilters.d.ts.map +1 -0
  13. package/dist/commands/bustercall/issueFilters.js +62 -0
  14. package/dist/commands/bustercall/issueFilters.js.map +1 -0
  15. package/dist/commands/bustercall/issueFilters.test.d.ts +2 -0
  16. package/dist/commands/bustercall/issueFilters.test.d.ts.map +1 -0
  17. package/dist/commands/bustercall/issueFilters.test.js +151 -0
  18. package/dist/commands/bustercall/issueFilters.test.js.map +1 -0
  19. package/dist/commands/bustercall/sessionManager.d.ts +14 -0
  20. package/dist/commands/bustercall/sessionManager.d.ts.map +1 -0
  21. package/dist/commands/bustercall/sessionManager.js +34 -0
  22. package/dist/commands/bustercall/sessionManager.js.map +1 -0
  23. package/dist/commands/bustercall/sessionManager.test.d.ts +2 -0
  24. package/dist/commands/bustercall/sessionManager.test.d.ts.map +1 -0
  25. package/dist/commands/bustercall/sessionManager.test.js +79 -0
  26. package/dist/commands/bustercall/sessionManager.test.js.map +1 -0
  27. package/dist/commands/bustercall/statusDisplay.d.ts +15 -0
  28. package/dist/commands/bustercall/statusDisplay.d.ts.map +1 -0
  29. package/dist/commands/bustercall/statusDisplay.js +39 -0
  30. package/dist/commands/bustercall/statusDisplay.js.map +1 -0
  31. package/dist/commands/bustercall/statusDisplay.test.d.ts +2 -0
  32. package/dist/commands/bustercall/statusDisplay.test.d.ts.map +1 -0
  33. package/dist/commands/bustercall/statusDisplay.test.js +111 -0
  34. package/dist/commands/bustercall/statusDisplay.test.js.map +1 -0
  35. package/dist/commands/bustercall.d.ts.map +1 -1
  36. package/dist/commands/bustercall.js +1 -88
  37. package/dist/commands/bustercall.js.map +1 -1
  38. package/dist/commands/bustercall.test.d.ts +2 -0
  39. package/dist/commands/bustercall.test.d.ts.map +1 -0
  40. package/dist/commands/bustercall.test.js +258 -0
  41. package/dist/commands/bustercall.test.js.map +1 -0
  42. package/dist/commands/chain/chainDisplay.d.ts +18 -0
  43. package/dist/commands/chain/chainDisplay.d.ts.map +1 -0
  44. package/dist/commands/chain/chainDisplay.js +71 -0
  45. package/dist/commands/chain/chainDisplay.js.map +1 -0
  46. package/dist/commands/chain/chainDisplay.test.d.ts +2 -0
  47. package/dist/commands/chain/chainDisplay.test.d.ts.map +1 -0
  48. package/dist/commands/chain/chainDisplay.test.js +128 -0
  49. package/dist/commands/chain/chainDisplay.test.js.map +1 -0
  50. package/dist/commands/chain/chainSession.d.ts +26 -0
  51. package/dist/commands/chain/chainSession.d.ts.map +1 -0
  52. package/dist/commands/chain/chainSession.js +47 -0
  53. package/dist/commands/chain/chainSession.js.map +1 -0
  54. package/dist/commands/chain/chainSession.test.d.ts +2 -0
  55. package/dist/commands/chain/chainSession.test.d.ts.map +1 -0
  56. package/dist/commands/chain/chainSession.test.js +93 -0
  57. package/dist/commands/chain/chainSession.test.js.map +1 -0
  58. package/dist/commands/chain/index.d.ts +3 -0
  59. package/dist/commands/chain/index.d.ts.map +1 -0
  60. package/dist/commands/chain/index.js +3 -0
  61. package/dist/commands/chain/index.js.map +1 -0
  62. package/dist/commands/chain.d.ts.map +1 -1
  63. package/dist/commands/chain.js +2 -91
  64. package/dist/commands/chain.js.map +1 -1
  65. package/dist/commands/chain.test.d.ts +2 -0
  66. package/dist/commands/chain.test.d.ts.map +1 -0
  67. package/dist/commands/chain.test.js +216 -0
  68. package/dist/commands/chain.test.js.map +1 -0
  69. package/dist/commands/clean.test.d.ts +2 -0
  70. package/dist/commands/clean.test.d.ts.map +1 -0
  71. package/dist/commands/clean.test.js +193 -0
  72. package/dist/commands/clean.test.js.map +1 -0
  73. package/dist/commands/demo.d.ts.map +1 -1
  74. package/dist/commands/demo.js +4 -2
  75. package/dist/commands/demo.js.map +1 -1
  76. package/dist/commands/demo.test.d.ts +2 -0
  77. package/dist/commands/demo.test.d.ts.map +1 -0
  78. package/dist/commands/demo.test.js +34 -0
  79. package/dist/commands/demo.test.js.map +1 -0
  80. package/dist/commands/doctor.test.d.ts +2 -0
  81. package/dist/commands/doctor.test.d.ts.map +1 -0
  82. package/dist/commands/doctor.test.js +324 -0
  83. package/dist/commands/doctor.test.js.map +1 -0
  84. package/dist/commands/resume.test.d.ts +2 -0
  85. package/dist/commands/resume.test.d.ts.map +1 -0
  86. package/dist/commands/resume.test.js +362 -0
  87. package/dist/commands/resume.test.js.map +1 -0
  88. package/dist/commands/start/index.d.ts +2 -0
  89. package/dist/commands/start/index.d.ts.map +1 -1
  90. package/dist/commands/start/index.js +2 -0
  91. package/dist/commands/start/index.js.map +1 -1
  92. package/dist/commands/start/progressTracker.d.ts +18 -0
  93. package/dist/commands/start/progressTracker.d.ts.map +1 -0
  94. package/dist/commands/start/progressTracker.js +72 -0
  95. package/dist/commands/start/progressTracker.js.map +1 -0
  96. package/dist/commands/start/progressTracker.test.d.ts +2 -0
  97. package/dist/commands/start/progressTracker.test.d.ts.map +1 -0
  98. package/dist/commands/start/progressTracker.test.js +100 -0
  99. package/dist/commands/start/progressTracker.test.js.map +1 -0
  100. package/dist/commands/start/validationGates.d.ts +7 -0
  101. package/dist/commands/start/validationGates.d.ts.map +1 -0
  102. package/dist/commands/start/validationGates.js +48 -0
  103. package/dist/commands/start/validationGates.js.map +1 -0
  104. package/dist/commands/start/validationGates.test.d.ts +2 -0
  105. package/dist/commands/start/validationGates.test.d.ts.map +1 -0
  106. package/dist/commands/start/validationGates.test.js +66 -0
  107. package/dist/commands/start/validationGates.test.js.map +1 -0
  108. package/dist/commands/start.d.ts.map +1 -1
  109. package/dist/commands/start.js +3 -75
  110. package/dist/commands/start.js.map +1 -1
  111. package/dist/commands/stop.js +1 -1
  112. package/dist/commands/stop.js.map +1 -1
  113. package/package.json +7 -7
@@ -0,0 +1,258 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bustercall.test.js","sourceRoot":"","sources":["../../src/commands/bustercall.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Chain, ChainSummary } from '@claudetree/shared';
2
+ /**
3
+ * Truncate string to maxLen, adding ellipsis if needed
4
+ */
5
+ export declare function truncate(str: string, maxLen: number): string;
6
+ /**
7
+ * Get branch name for an issue (number or task name)
8
+ */
9
+ export declare function getBranchNameForIssue(issue: string): string;
10
+ /**
11
+ * Get summary counts for a chain
12
+ */
13
+ export declare function getChainSummary(chain: Chain): ChainSummary;
14
+ /**
15
+ * Print chain status to console
16
+ */
17
+ export declare function printChainStatus(chain: Chain): void;
18
+ //# sourceMappingURL=chainDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainDisplay.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/chainDisplay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAW3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAQ1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAiCnD"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Truncate string to maxLen, adding ellipsis if needed
3
+ */
4
+ export function truncate(str, maxLen) {
5
+ if (str.length <= maxLen)
6
+ return str;
7
+ return str.slice(0, maxLen - 3) + '...';
8
+ }
9
+ /**
10
+ * Get branch name for an issue (number or task name)
11
+ */
12
+ export function getBranchNameForIssue(issue) {
13
+ // If it's a number, assume issue number
14
+ if (/^\d+$/.test(issue)) {
15
+ return `issue-${issue}`;
16
+ }
17
+ // Otherwise, sanitize the task name
18
+ return issue
19
+ .toLowerCase()
20
+ .replace(/[^a-z0-9]+/g, '-')
21
+ .replace(/^-|-$/g, '')
22
+ .slice(0, 50);
23
+ }
24
+ /**
25
+ * Get summary counts for a chain
26
+ */
27
+ export function getChainSummary(chain) {
28
+ return {
29
+ total: chain.items.length,
30
+ completed: chain.items.filter((i) => i.status === 'completed').length,
31
+ failed: chain.items.filter((i) => i.status === 'failed').length,
32
+ skipped: chain.items.filter((i) => i.status === 'skipped').length,
33
+ pending: chain.items.filter((i) => i.status === 'pending').length,
34
+ };
35
+ }
36
+ /**
37
+ * Print chain status to console
38
+ */
39
+ export function printChainStatus(chain) {
40
+ console.clear();
41
+ console.log('\n\x1b[36m╔══════════════════════════════════════════╗\x1b[0m');
42
+ console.log('\x1b[36m║ Dependency Chain ║\x1b[0m');
43
+ console.log('\x1b[36m╚══════════════════════════════════════════╝\x1b[0m\n');
44
+ for (let i = 0; i < chain.items.length; i++) {
45
+ const item = chain.items[i];
46
+ const icon = item.status === 'pending'
47
+ ? '\x1b[90m○\x1b[0m'
48
+ : item.status === 'running'
49
+ ? '\x1b[33m◐\x1b[0m'
50
+ : item.status === 'completed'
51
+ ? '\x1b[32m●\x1b[0m'
52
+ : item.status === 'skipped'
53
+ ? '\x1b[90m◌\x1b[0m'
54
+ : '\x1b[31m✗\x1b[0m';
55
+ const arrow = i < chain.items.length - 1 ? '\x1b[90m │\x1b[0m' : '';
56
+ const base = item.baseBranch ? `\x1b[90m← ${item.baseBranch}\x1b[0m` : '';
57
+ const branch = item.branchName ? `\x1b[36m[${item.branchName}]\x1b[0m ` : '';
58
+ const error = item.error ? `\x1b[31m (${truncate(item.error, 30)})\x1b[0m` : '';
59
+ console.log(` ${icon} ${branch}#${item.issue}${error} ${base}`);
60
+ if (arrow)
61
+ console.log(arrow);
62
+ }
63
+ const summary = getChainSummary(chain);
64
+ console.log(`\n \x1b[90m[${summary.completed}/${summary.total}] completed`);
65
+ if (summary.failed > 0)
66
+ console.log(` \x1b[31m${summary.failed} failed\x1b[0m`);
67
+ if (summary.skipped > 0)
68
+ console.log(` \x1b[90m${summary.skipped} skipped\x1b[0m`);
69
+ console.log('\x1b[0m');
70
+ }
71
+ //# sourceMappingURL=chainDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainDisplay.js","sourceRoot":"","sources":["../../../src/commands/chain/chainDisplay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chainDisplay.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainDisplay.test.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/chainDisplay.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainDisplay.test.js","sourceRoot":"","sources":["../../../src/commands/chain/chainDisplay.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Chain } from '@claudetree/shared';
2
+ export interface SessionInfo {
3
+ id: string;
4
+ issueNumber?: number;
5
+ status: string;
6
+ worktreePath?: string;
7
+ }
8
+ /**
9
+ * Load all sessions from sessions.json
10
+ */
11
+ export declare function loadSessions(cwd: string): Promise<SessionInfo[]>;
12
+ /**
13
+ * Save chain state to chains directory
14
+ */
15
+ export declare function saveChain(cwd: string, chain: Chain): Promise<void>;
16
+ export interface WaitResult {
17
+ success: boolean;
18
+ sessionId?: string;
19
+ error?: string;
20
+ }
21
+ /**
22
+ * Wait for a session to complete or fail
23
+ * Polls sessions.json every 3 seconds until status changes or timeout
24
+ */
25
+ export declare function waitForSession(cwd: string, issueNumber: number, timeoutMs?: number): Promise<WaitResult>;
26
+ //# sourceMappingURL=chainSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainSession.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/chainSession.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAKhD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAQtE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC,UAAU,CAAC,CAoBrB"}
@@ -0,0 +1,47 @@
1
+ import { join } from 'node:path';
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ const CONFIG_DIR = '.claudetree';
4
+ const CHAINS_DIR = 'chains';
5
+ /**
6
+ * Load all sessions from sessions.json
7
+ */
8
+ export async function loadSessions(cwd) {
9
+ try {
10
+ const sessionsPath = join(cwd, CONFIG_DIR, 'sessions.json');
11
+ const content = await readFile(sessionsPath, 'utf-8');
12
+ return JSON.parse(content);
13
+ }
14
+ catch {
15
+ return [];
16
+ }
17
+ }
18
+ /**
19
+ * Save chain state to chains directory
20
+ */
21
+ export async function saveChain(cwd, chain) {
22
+ const chainsDir = join(cwd, CONFIG_DIR, CHAINS_DIR);
23
+ await mkdir(chainsDir, { recursive: true });
24
+ await writeFile(join(chainsDir, `${chain.id}.json`), JSON.stringify(chain, null, 2));
25
+ }
26
+ /**
27
+ * Wait for a session to complete or fail
28
+ * Polls sessions.json every 3 seconds until status changes or timeout
29
+ */
30
+ export async function waitForSession(cwd, issueNumber, timeoutMs = 300000) {
31
+ const startTime = Date.now();
32
+ while (Date.now() - startTime < timeoutMs) {
33
+ const sessions = await loadSessions(cwd);
34
+ const session = sessions.find((s) => s.issueNumber === issueNumber);
35
+ if (session) {
36
+ if (session.status === 'completed') {
37
+ return { success: true, sessionId: session.id };
38
+ }
39
+ if (session.status === 'failed') {
40
+ return { success: false, sessionId: session.id, error: 'Session failed' };
41
+ }
42
+ }
43
+ await new Promise((r) => setTimeout(r, 3000));
44
+ }
45
+ return { success: false, error: 'Session timeout' };
46
+ }
47
+ //# sourceMappingURL=chainSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainSession.js","sourceRoot":"","sources":["../../../src/commands/chain/chainSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9D,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAS5B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,KAAY;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,WAAmB,EACnB,YAAoB,MAAM;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;QAEpE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;YAClD,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chainSession.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainSession.test.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/chainSession.test.ts"],"names":[],"mappings":""}