@claudetree/cli 0.4.1 → 0.4.3

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 (64) hide show
  1. package/README.ko.md +23 -0
  2. package/README.md +23 -0
  3. package/dist/commands/bustercall.d.ts.map +1 -1
  4. package/dist/commands/bustercall.js +185 -42
  5. package/dist/commands/bustercall.js.map +1 -1
  6. package/dist/commands/init.test.d.ts +2 -0
  7. package/dist/commands/init.test.d.ts.map +1 -0
  8. package/dist/commands/init.test.js +94 -0
  9. package/dist/commands/init.test.js.map +1 -0
  10. package/dist/commands/list.test.d.ts +2 -0
  11. package/dist/commands/list.test.d.ts.map +1 -0
  12. package/dist/commands/list.test.js +106 -0
  13. package/dist/commands/list.test.js.map +1 -0
  14. package/dist/commands/start/buildPrompt.d.ts +29 -0
  15. package/dist/commands/start/buildPrompt.d.ts.map +1 -0
  16. package/dist/commands/start/buildPrompt.js +142 -0
  17. package/dist/commands/start/buildPrompt.js.map +1 -0
  18. package/dist/commands/start/buildPrompt.test.d.ts +2 -0
  19. package/dist/commands/start/buildPrompt.test.d.ts.map +1 -0
  20. package/dist/commands/start/buildPrompt.test.js +182 -0
  21. package/dist/commands/start/buildPrompt.test.js.map +1 -0
  22. package/dist/commands/start/createWorktree.d.ts +20 -0
  23. package/dist/commands/start/createWorktree.d.ts.map +1 -0
  24. package/dist/commands/start/createWorktree.js +35 -0
  25. package/dist/commands/start/createWorktree.js.map +1 -0
  26. package/dist/commands/start/createWorktree.test.d.ts +2 -0
  27. package/dist/commands/start/createWorktree.test.d.ts.map +1 -0
  28. package/dist/commands/start/createWorktree.test.js +81 -0
  29. package/dist/commands/start/createWorktree.test.js.map +1 -0
  30. package/dist/commands/start/index.d.ts +4 -0
  31. package/dist/commands/start/index.d.ts.map +1 -0
  32. package/dist/commands/start/index.js +4 -0
  33. package/dist/commands/start/index.js.map +1 -0
  34. package/dist/commands/start/parseIssueInput.d.ts +21 -0
  35. package/dist/commands/start/parseIssueInput.d.ts.map +1 -0
  36. package/dist/commands/start/parseIssueInput.js +78 -0
  37. package/dist/commands/start/parseIssueInput.js.map +1 -0
  38. package/dist/commands/start/parseIssueInput.test.d.ts +2 -0
  39. package/dist/commands/start/parseIssueInput.test.d.ts.map +1 -0
  40. package/dist/commands/start/parseIssueInput.test.js +118 -0
  41. package/dist/commands/start/parseIssueInput.test.js.map +1 -0
  42. package/dist/commands/start.d.ts.map +1 -1
  43. package/dist/commands/start.js +141 -239
  44. package/dist/commands/start.js.map +1 -1
  45. package/dist/commands/start.test.d.ts +2 -0
  46. package/dist/commands/start.test.d.ts.map +1 -0
  47. package/dist/commands/start.test.js +260 -0
  48. package/dist/commands/start.test.js.map +1 -0
  49. package/dist/commands/status.test.d.ts +2 -0
  50. package/dist/commands/status.test.d.ts.map +1 -0
  51. package/dist/commands/status.test.js +172 -0
  52. package/dist/commands/status.test.js.map +1 -0
  53. package/dist/commands/stop.test.d.ts +2 -0
  54. package/dist/commands/stop.test.d.ts.map +1 -0
  55. package/dist/commands/stop.test.js +152 -0
  56. package/dist/commands/stop.test.js.map +1 -0
  57. package/dist/commands/web.d.ts.map +1 -1
  58. package/dist/commands/web.js +95 -1
  59. package/dist/commands/web.js.map +1 -1
  60. package/dist/commands/web.test.d.ts +2 -0
  61. package/dist/commands/web.test.d.ts.map +1 -0
  62. package/dist/commands/web.test.js +133 -0
  63. package/dist/commands/web.test.js.map +1 -0
  64. package/package.json +9 -5
package/README.ko.md CHANGED
@@ -26,6 +26,9 @@ ct init
26
26
  # GitHub 이슈 작업 시작 (TDD 모드 기본)
27
27
  ct start https://github.com/you/repo/issues/42
28
28
 
29
+ # 또는 자연어로
30
+ ct start "로그인 버그 수정해줘"
31
+
29
32
  # 진행상황 모니터링
30
33
  ct status
31
34
 
@@ -70,6 +73,26 @@ ct start 42 --no-tdd
70
73
  | `ct clean` | 모든 worktree 제거 (main 제외) |
71
74
  | `ct web` | 웹 대시보드 시작 |
72
75
 
76
+ ## Bustercall (일괄 처리)
77
+
78
+ 스마트 충돌 감지로 여러 GitHub 이슈를 병렬 처리:
79
+
80
+ ```bash
81
+ # 처리될 이슈 미리보기
82
+ ct bustercall --dry-run
83
+
84
+ # 기본 설정으로 실행 (3개 병렬)
85
+ ct bustercall
86
+
87
+ # 순차 실행 강제
88
+ ct bustercall --sequential
89
+
90
+ # 커스텀 충돌 라벨
91
+ ct bustercall --conflict-labels "deps,config"
92
+ ```
93
+
94
+ **충돌 감지:** 공유 파일(package.json, config)을 수정할 수 있는 이슈는 자동 감지되어 머지 충돌 방지를 위해 순차 실행됩니다.
95
+
73
96
  ## 주요 기능
74
97
 
75
98
  - **멀티 세션**: 무제한 Claude 세션 병렬 실행
package/README.md CHANGED
@@ -26,6 +26,9 @@ ct init
26
26
  # Start working on a GitHub issue (TDD mode by default)
27
27
  ct start https://github.com/you/repo/issues/42
28
28
 
29
+ # Or use natural language
30
+ ct start "fix the login validation bug"
31
+
29
32
  # Monitor progress
30
33
  ct status
31
34
 
@@ -70,6 +73,26 @@ ct start 42 --no-tdd
70
73
  | `ct clean` | Remove all worktrees (except main) |
71
74
  | `ct web` | Start web dashboard |
72
75
 
76
+ ## Bustercall (Batch Processing)
77
+
78
+ Process multiple GitHub issues in parallel with smart conflict detection:
79
+
80
+ ```bash
81
+ # Preview which issues will be processed
82
+ ct bustercall --dry-run
83
+
84
+ # Run with default settings (3 parallel)
85
+ ct bustercall
86
+
87
+ # Force sequential execution
88
+ ct bustercall --sequential
89
+
90
+ # Custom conflict labels
91
+ ct bustercall --conflict-labels "deps,config"
92
+ ```
93
+
94
+ **Conflict Detection:** Issues that may modify shared files (package.json, config) are automatically detected and run sequentially to prevent merge conflicts.
95
+
73
96
  ## Key Features
74
97
 
75
98
  - **Multi-session**: Run unlimited Claude sessions in parallel
@@ -1 +1 @@
1
- {"version":3,"file":"bustercall.d.ts","sourceRoot":"","sources":["../../src/commands/bustercall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgKpC,eAAO,MAAM,iBAAiB,SA6M1B,CAAC"}
1
+ {"version":3,"file":"bustercall.d.ts","sourceRoot":"","sources":["../../src/commands/bustercall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8OpC,eAAO,MAAM,iBAAiB,SAyS1B,CAAC"}
@@ -1,8 +1,11 @@
1
1
  import { Command } from 'commander';
2
2
  import { join } from 'node:path';
3
3
  import { access, readFile } from 'node:fs/promises';
4
- import { spawn } from 'node:child_process';
4
+ import { spawn, exec } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { Mutex } from 'async-mutex';
5
7
  import { GitHubAdapter, SlackNotifier } from '@claudetree/core';
8
+ const execAsync = promisify(exec);
6
9
  const CONFIG_DIR = '.claudetree';
7
10
  async function loadConfig(cwd) {
8
11
  try {
@@ -15,27 +18,82 @@ async function loadConfig(cwd) {
15
18
  return null;
16
19
  }
17
20
  }
18
- async function startSession(issueNumber, options) {
19
- return new Promise((resolve, reject) => {
20
- const args = ['start', String(issueNumber)];
21
- if (options.template) {
22
- args.push('--template', options.template);
21
+ async function getSessionsForIssue(cwd, issueNumber) {
22
+ try {
23
+ const sessionsPath = join(cwd, CONFIG_DIR, 'sessions.json');
24
+ const content = await readFile(sessionsPath, 'utf-8');
25
+ const sessions = JSON.parse(content);
26
+ return sessions.filter((s) => s.issueNumber === issueNumber);
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ async function waitForSessionCreated(cwd, issueNumber, timeoutMs) {
33
+ const startTime = Date.now();
34
+ while (Date.now() - startTime < timeoutMs) {
35
+ const sessions = await getSessionsForIssue(cwd, issueNumber);
36
+ // Check if there's a running session for this issue
37
+ if (sessions.some((s) => s.status === 'running')) {
38
+ return true;
23
39
  }
24
- const proc = spawn('claudetree', args, {
25
- cwd: options.cwd,
26
- stdio: 'inherit',
27
- detached: true,
28
- });
29
- proc.unref();
30
- setTimeout(() => resolve(), 1000);
31
- proc.on('error', reject);
40
+ await new Promise((r) => setTimeout(r, 1000));
41
+ }
42
+ return false;
43
+ }
44
+ async function startSession(issueNumber, options) {
45
+ const args = ['start', String(issueNumber)];
46
+ if (options.template) {
47
+ args.push('--template', options.template);
48
+ }
49
+ const proc = spawn('claudetree', args, {
50
+ cwd: options.cwd,
51
+ stdio: 'ignore',
52
+ detached: true,
32
53
  });
54
+ proc.unref();
55
+ // Wait for process to initialize
56
+ await new Promise((r) => setTimeout(r, 2000));
57
+ // Check if session was created for this specific issue (poll for up to 60 seconds)
58
+ const sessionCreated = await waitForSessionCreated(options.cwd, issueNumber, 60000);
59
+ if (!sessionCreated) {
60
+ throw new Error(`Session for issue #${issueNumber} was not created within 60 seconds`);
61
+ }
33
62
  }
34
63
  function truncate(str, maxLen) {
35
64
  if (str.length <= maxLen)
36
65
  return str;
37
66
  return str.slice(0, maxLen - 3) + '...';
38
67
  }
68
+ async function getIssuesWithExistingPRs(owner, repo) {
69
+ try {
70
+ const { stdout } = await execAsync(`gh pr list --repo ${owner}/${repo} --state open --json number,body,title --limit 100`);
71
+ const prs = JSON.parse(stdout);
72
+ const issuesWithPRs = new Set();
73
+ for (const pr of prs) {
74
+ // Check title for issue references like "#123" or "issue-123"
75
+ const titleMatches = pr.title.match(/#(\d+)|issue-(\d+)/gi) || [];
76
+ for (const match of titleMatches) {
77
+ const num = parseInt(match.replace(/\D/g, ''), 10);
78
+ if (num)
79
+ issuesWithPRs.add(num);
80
+ }
81
+ // Check body for "Closes #123", "Fixes #123", etc.
82
+ if (pr.body) {
83
+ const bodyMatches = pr.body.match(/(closes?|fixes?|resolves?)\s*#(\d+)/gi) || [];
84
+ for (const match of bodyMatches) {
85
+ const num = parseInt(match.replace(/\D/g, ''), 10);
86
+ if (num)
87
+ issuesWithPRs.add(num);
88
+ }
89
+ }
90
+ }
91
+ return issuesWithPRs;
92
+ }
93
+ catch {
94
+ return new Set();
95
+ }
96
+ }
39
97
  // Keywords that indicate potential conflicts with config/shared files
40
98
  const CONFLICT_KEYWORDS = [
41
99
  'package.json', 'tsconfig', 'vitest', 'eslint', 'config',
@@ -140,6 +198,17 @@ export const bustercallCommand = new Command('bustercall')
140
198
  const excludeSet = new Set(options.exclude.split(',').map((n) => parseInt(n.trim(), 10)));
141
199
  issues = issues.filter((i) => !excludeSet.has(i.number));
142
200
  }
201
+ // Filter out issues that already have PRs
202
+ console.log('Checking for existing PRs...');
203
+ const issuesWithPRs = await getIssuesWithExistingPRs(config.github.owner, config.github.repo);
204
+ if (issuesWithPRs.size > 0) {
205
+ const before = issues.length;
206
+ issues = issues.filter((i) => !issuesWithPRs.has(i.number));
207
+ const skipped = before - issues.length;
208
+ if (skipped > 0) {
209
+ console.log(`Skipped ${skipped} issue(s) with existing PRs`);
210
+ }
211
+ }
143
212
  // Apply limit
144
213
  const limit = parseInt(options.limit, 10);
145
214
  if (issues.length > limit) {
@@ -204,49 +273,123 @@ export const bustercallCommand = new Command('bustercall')
204
273
  issue,
205
274
  status: 'pending',
206
275
  }));
276
+ // Shared state with mutex protection
277
+ const mutex = new Mutex();
207
278
  let runningCount = 0;
208
279
  let currentIndex = 0;
280
+ let conflictingRunning = false;
209
281
  // Track which issues are "safe" for parallel execution
210
282
  const safeIssueNumbers = new Set(safe.map(i => i.number));
211
- const startNext = async () => {
212
- while (currentIndex < items.length) {
213
- const item = items[currentIndex];
214
- if (!item)
215
- break;
216
- const isSafe = safeIssueNumbers.has(item.issue.number);
217
- const currentParallelLimit = (isSafe && !options.sequential) ? effectiveParallel : 1;
218
- // Wait if we're at the parallel limit
219
- if (runningCount >= currentParallelLimit) {
220
- break;
283
+ const conflictingIssueNumbers = new Set(conflicting.map(i => i.number));
284
+ // Helper to safely update item status
285
+ const updateItemStatus = async (index, status, error) => {
286
+ const release = await mutex.acquire();
287
+ try {
288
+ const item = items[index];
289
+ if (item) {
290
+ item.status = status;
291
+ if (error)
292
+ item.error = error;
221
293
  }
222
- currentIndex++;
223
- runningCount++;
224
- item.status = 'running';
225
294
  printStatus(items);
295
+ }
296
+ finally {
297
+ release();
298
+ }
299
+ };
300
+ const processItem = async (itemIndex, isConflicting) => {
301
+ const item = items[itemIndex];
302
+ if (!item)
303
+ return;
304
+ await updateItemStatus(itemIndex, 'running');
305
+ try {
306
+ await startSession(item.issue.number, {
307
+ template: options.template,
308
+ cwd,
309
+ });
310
+ await updateItemStatus(itemIndex, 'completed');
311
+ }
312
+ catch (err) {
313
+ await updateItemStatus(itemIndex, 'failed', err instanceof Error ? err.message : 'Unknown error');
314
+ }
315
+ // Decrement counters with mutex
316
+ const release = await mutex.acquire();
317
+ try {
318
+ runningCount--;
319
+ if (isConflicting) {
320
+ conflictingRunning = false;
321
+ }
322
+ }
323
+ finally {
324
+ release();
325
+ }
326
+ };
327
+ const startNext = async () => {
328
+ while (true) {
329
+ // Acquire mutex to safely check and update shared state
330
+ const release = await mutex.acquire();
331
+ let itemIndex = null;
332
+ let isConflicting = false;
226
333
  try {
227
- await startSession(item.issue.number, {
228
- template: options.template,
229
- cwd,
230
- });
231
- item.status = 'completed';
334
+ if (currentIndex >= items.length) {
335
+ return; // No more items
336
+ }
337
+ const item = items[currentIndex];
338
+ if (!item) {
339
+ return;
340
+ }
341
+ const isSafe = safeIssueNumbers.has(item.issue.number);
342
+ isConflicting = conflictingIssueNumbers.has(item.issue.number);
343
+ const currentParallelLimit = (isSafe && !options.sequential) ? effectiveParallel : 1;
344
+ // For conflicting issues, ensure only one runs at a time
345
+ if (isConflicting && conflictingRunning) {
346
+ return; // Wait for current conflicting issue to finish
347
+ }
348
+ // Check parallel limit
349
+ if (runningCount >= currentParallelLimit) {
350
+ return; // At capacity
351
+ }
352
+ // Reserve this item
353
+ itemIndex = currentIndex;
354
+ currentIndex++;
355
+ runningCount++;
356
+ if (isConflicting) {
357
+ conflictingRunning = true;
358
+ }
232
359
  }
233
- catch (err) {
234
- item.status = 'failed';
235
- item.error = err instanceof Error ? err.message : 'Unknown error';
360
+ finally {
361
+ release();
362
+ }
363
+ if (itemIndex !== null) {
364
+ // Process item outside mutex (long-running operation)
365
+ await processItem(itemIndex, isConflicting);
366
+ // Try to start next item
367
+ await startNext();
236
368
  }
237
- runningCount--;
238
- printStatus(items);
239
- // Continue to next item
240
- await startNext();
241
369
  }
242
370
  };
243
- // Start initial batch (respecting parallel limits)
371
+ // Calculate proper initial batch size
372
+ let initialBatch;
373
+ if (options.sequential) {
374
+ initialBatch = 1;
375
+ }
376
+ else if (safe.length > 0) {
377
+ initialBatch = Math.min(effectiveParallel, safe.length);
378
+ }
379
+ else if (conflicting.length > 0) {
380
+ initialBatch = 1; // Conflicting issues run one at a time
381
+ }
382
+ else {
383
+ initialBatch = 0;
384
+ }
385
+ // Start initial batch
244
386
  const promises = [];
245
- const initialBatch = Math.min(effectiveParallel, safe.length || 1);
246
387
  for (let i = 0; i < initialBatch && i < items.length; i++) {
247
388
  promises.push(startNext());
248
389
  }
249
- await Promise.all(promises);
390
+ if (promises.length > 0) {
391
+ await Promise.all(promises);
392
+ }
250
393
  // Final status
251
394
  console.log('\n=== Bustercall Complete ===');
252
395
  const completed = items.filter((i) => i.status === 'completed').length;
@@ -1 +1 @@
1
- {"version":3,"file":"bustercall.js","sourceRoot":"","sources":["../../src/commands/bustercall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bustercall.js","sourceRoot":"","sources":["../../src/commands/bustercall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { mkdtemp, rm, readFile, access } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { initCommand } from './init.js';
6
+ describe('initCommand', () => {
7
+ let testDir;
8
+ let originalCwd;
9
+ let originalExit;
10
+ let consoleLogSpy;
11
+ let consoleErrorSpy;
12
+ beforeEach(async () => {
13
+ testDir = await mkdtemp(join(tmpdir(), 'claudetree-init-test-'));
14
+ originalCwd = process.cwd();
15
+ process.chdir(testDir);
16
+ originalExit = process.exit;
17
+ process.exit = vi.fn();
18
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
19
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
20
+ });
21
+ afterEach(async () => {
22
+ process.chdir(originalCwd);
23
+ process.exit = originalExit;
24
+ consoleLogSpy.mockRestore();
25
+ consoleErrorSpy.mockRestore();
26
+ await rm(testDir, { recursive: true, force: true });
27
+ });
28
+ describe('basic initialization', () => {
29
+ it('should create .claudetree directory with config.json', async () => {
30
+ await initCommand.parseAsync(['node', 'test']);
31
+ const configPath = join(testDir, '.claudetree', 'config.json');
32
+ await expect(access(configPath)).resolves.toBeUndefined();
33
+ const config = JSON.parse(await readFile(configPath, 'utf-8'));
34
+ expect(config.version).toBe('0.1.0');
35
+ expect(config.worktreeDir).toBe('.worktrees');
36
+ });
37
+ it('should create worktree directory', async () => {
38
+ await initCommand.parseAsync(['node', 'test']);
39
+ const worktreePath = join(testDir, '.worktrees');
40
+ await expect(access(worktreePath)).resolves.toBeUndefined();
41
+ });
42
+ it('should create templates directory with default templates', async () => {
43
+ await initCommand.parseAsync(['node', 'test']);
44
+ const templatesPath = join(testDir, '.claudetree', 'templates');
45
+ await expect(access(templatesPath)).resolves.toBeUndefined();
46
+ });
47
+ it('should output success message', async () => {
48
+ await initCommand.parseAsync(['node', 'test']);
49
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Initialized claudetree'));
50
+ });
51
+ });
52
+ describe('with --worktree-dir option', () => {
53
+ it('should use custom worktree directory', async () => {
54
+ await initCommand.parseAsync(['node', 'test', '-d', 'custom-worktrees']);
55
+ const configPath = join(testDir, '.claudetree', 'config.json');
56
+ const config = JSON.parse(await readFile(configPath, 'utf-8'));
57
+ expect(config.worktreeDir).toBe('custom-worktrees');
58
+ const customWorktreePath = join(testDir, 'custom-worktrees');
59
+ await expect(access(customWorktreePath)).resolves.toBeUndefined();
60
+ });
61
+ });
62
+ describe('with --slack option', () => {
63
+ it('should add slack webhook to config', async () => {
64
+ await initCommand.parseAsync([
65
+ 'node',
66
+ 'test',
67
+ '--slack',
68
+ 'https://hooks.slack.com/services/xxx',
69
+ ]);
70
+ const configPath = join(testDir, '.claudetree', 'config.json');
71
+ const config = JSON.parse(await readFile(configPath, 'utf-8'));
72
+ expect(config.slack?.webhookUrl).toBe('https://hooks.slack.com/services/xxx');
73
+ });
74
+ });
75
+ describe('when already initialized', () => {
76
+ it('should error without --force flag', async () => {
77
+ // Initialize first time
78
+ await initCommand.parseAsync(['node', 'test']);
79
+ consoleErrorSpy.mockClear();
80
+ // Try to initialize again
81
+ await initCommand.parseAsync(['node', 'test']);
82
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('already initialized'));
83
+ expect(process.exit).toHaveBeenCalledWith(1);
84
+ });
85
+ it('should reinitialize with --force flag', async () => {
86
+ // Initialize first time
87
+ await initCommand.parseAsync(['node', 'test']);
88
+ // Reinitialize with force
89
+ await initCommand.parseAsync(['node', 'test', '--force']);
90
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Initialized claudetree'));
91
+ });
92
+ });
93
+ });
94
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/commands/list.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { listCommand } from './list.js';
3
+ // Mock GitWorktreeAdapter
4
+ vi.mock('@claudetree/core', () => ({
5
+ GitWorktreeAdapter: vi.fn().mockImplementation(() => ({
6
+ list: vi.fn(),
7
+ })),
8
+ }));
9
+ import { GitWorktreeAdapter } from '@claudetree/core';
10
+ describe('listCommand', () => {
11
+ let originalExit;
12
+ let consoleLogSpy;
13
+ let consoleErrorSpy;
14
+ let mockList;
15
+ beforeEach(() => {
16
+ originalExit = process.exit;
17
+ process.exit = vi.fn();
18
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
19
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
20
+ mockList = vi.fn();
21
+ vi.mocked(GitWorktreeAdapter).mockImplementation(() => ({
22
+ list: mockList,
23
+ }));
24
+ });
25
+ afterEach(() => {
26
+ process.exit = originalExit;
27
+ consoleLogSpy.mockRestore();
28
+ consoleErrorSpy.mockRestore();
29
+ vi.clearAllMocks();
30
+ });
31
+ describe('when no worktrees exist', () => {
32
+ it('should display "No worktrees found" message', async () => {
33
+ mockList.mockResolvedValue([]);
34
+ await listCommand.parseAsync(['node', 'test']);
35
+ expect(consoleLogSpy).toHaveBeenCalledWith('No worktrees found.');
36
+ });
37
+ });
38
+ describe('when worktrees exist', () => {
39
+ const mockWorktrees = [
40
+ {
41
+ path: '/path/to/main',
42
+ branch: 'main',
43
+ commit: 'abc123def456',
44
+ isMainWorktree: true,
45
+ },
46
+ {
47
+ path: '/path/to/feature',
48
+ branch: 'feature-branch',
49
+ commit: 'def456abc789',
50
+ isMainWorktree: false,
51
+ },
52
+ ];
53
+ it('should display worktrees with their details', async () => {
54
+ mockList.mockResolvedValue(mockWorktrees);
55
+ await listCommand.parseAsync(['node', 'test']);
56
+ expect(consoleLogSpy).toHaveBeenCalledWith('Worktrees:\n');
57
+ expect(consoleLogSpy).toHaveBeenCalledWith(' main (main)');
58
+ expect(consoleLogSpy).toHaveBeenCalledWith(' feature-branch');
59
+ expect(consoleLogSpy).toHaveBeenCalledWith(' Path: /path/to/main');
60
+ expect(consoleLogSpy).toHaveBeenCalledWith(' Path: /path/to/feature');
61
+ expect(consoleLogSpy).toHaveBeenCalledWith(' Commit: abc123de');
62
+ expect(consoleLogSpy).toHaveBeenCalledWith(' Commit: def456ab');
63
+ });
64
+ it('should handle detached HEAD state', async () => {
65
+ mockList.mockResolvedValue([
66
+ {
67
+ path: '/path/to/detached',
68
+ branch: null,
69
+ commit: '123456789',
70
+ isMainWorktree: false,
71
+ },
72
+ ]);
73
+ await listCommand.parseAsync(['node', 'test']);
74
+ expect(consoleLogSpy).toHaveBeenCalledWith(' (detached)');
75
+ });
76
+ });
77
+ describe('with --json option', () => {
78
+ it('should output worktrees as JSON', async () => {
79
+ const mockWorktrees = [
80
+ {
81
+ path: '/path/to/main',
82
+ branch: 'main',
83
+ commit: 'abc123def456',
84
+ isMainWorktree: true,
85
+ },
86
+ ];
87
+ mockList.mockResolvedValue(mockWorktrees);
88
+ await listCommand.parseAsync(['node', 'test', '--json']);
89
+ expect(consoleLogSpy).toHaveBeenCalledWith(JSON.stringify(mockWorktrees, null, 2));
90
+ });
91
+ });
92
+ describe('when git command fails', () => {
93
+ it('should display error and exit with code 1', async () => {
94
+ mockList.mockRejectedValue(new Error('Git not available'));
95
+ await listCommand.parseAsync(['node', 'test']);
96
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Git not available');
97
+ expect(process.exit).toHaveBeenCalledWith(1);
98
+ });
99
+ });
100
+ describe('alias', () => {
101
+ it('should have "ls" as an alias', () => {
102
+ expect(listCommand.alias()).toBe('ls');
103
+ });
104
+ });
105
+ });
106
+ //# sourceMappingURL=list.test.js.map