@claudetree/cli 0.4.3 → 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 (120) 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 +3 -0
  63. package/dist/commands/chain.d.ts.map +1 -0
  64. package/dist/commands/chain.js +195 -0
  65. package/dist/commands/chain.js.map +1 -0
  66. package/dist/commands/chain.test.d.ts +2 -0
  67. package/dist/commands/chain.test.d.ts.map +1 -0
  68. package/dist/commands/chain.test.js +216 -0
  69. package/dist/commands/chain.test.js.map +1 -0
  70. package/dist/commands/clean.test.d.ts +2 -0
  71. package/dist/commands/clean.test.d.ts.map +1 -0
  72. package/dist/commands/clean.test.js +193 -0
  73. package/dist/commands/clean.test.js.map +1 -0
  74. package/dist/commands/demo.d.ts.map +1 -1
  75. package/dist/commands/demo.js +4 -2
  76. package/dist/commands/demo.js.map +1 -1
  77. package/dist/commands/demo.test.d.ts +2 -0
  78. package/dist/commands/demo.test.d.ts.map +1 -0
  79. package/dist/commands/demo.test.js +34 -0
  80. package/dist/commands/demo.test.js.map +1 -0
  81. package/dist/commands/doctor.test.d.ts +2 -0
  82. package/dist/commands/doctor.test.d.ts.map +1 -0
  83. package/dist/commands/doctor.test.js +324 -0
  84. package/dist/commands/doctor.test.js.map +1 -0
  85. package/dist/commands/resume.test.d.ts +2 -0
  86. package/dist/commands/resume.test.d.ts.map +1 -0
  87. package/dist/commands/resume.test.js +362 -0
  88. package/dist/commands/resume.test.js.map +1 -0
  89. package/dist/commands/start/createWorktree.d.ts +1 -0
  90. package/dist/commands/start/createWorktree.d.ts.map +1 -1
  91. package/dist/commands/start/createWorktree.js +3 -2
  92. package/dist/commands/start/createWorktree.js.map +1 -1
  93. package/dist/commands/start/index.d.ts +2 -0
  94. package/dist/commands/start/index.d.ts.map +1 -1
  95. package/dist/commands/start/index.js +2 -0
  96. package/dist/commands/start/index.js.map +1 -1
  97. package/dist/commands/start/progressTracker.d.ts +18 -0
  98. package/dist/commands/start/progressTracker.d.ts.map +1 -0
  99. package/dist/commands/start/progressTracker.js +72 -0
  100. package/dist/commands/start/progressTracker.js.map +1 -0
  101. package/dist/commands/start/progressTracker.test.d.ts +2 -0
  102. package/dist/commands/start/progressTracker.test.d.ts.map +1 -0
  103. package/dist/commands/start/progressTracker.test.js +100 -0
  104. package/dist/commands/start/progressTracker.test.js.map +1 -0
  105. package/dist/commands/start/validationGates.d.ts +7 -0
  106. package/dist/commands/start/validationGates.d.ts.map +1 -0
  107. package/dist/commands/start/validationGates.js +48 -0
  108. package/dist/commands/start/validationGates.js.map +1 -0
  109. package/dist/commands/start/validationGates.test.d.ts +2 -0
  110. package/dist/commands/start/validationGates.test.d.ts.map +1 -0
  111. package/dist/commands/start/validationGates.test.js +66 -0
  112. package/dist/commands/start/validationGates.test.js.map +1 -0
  113. package/dist/commands/start.d.ts.map +1 -1
  114. package/dist/commands/start.js +6 -75
  115. package/dist/commands/start.js.map +1 -1
  116. package/dist/commands/stop.js +1 -1
  117. package/dist/commands/stop.js.map +1 -1
  118. package/dist/index.js +2 -0
  119. package/dist/index.js.map +1 -1
  120. package/package.json +7 -7
@@ -0,0 +1,93 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'node:fs/promises';
3
+ import { loadSessions, saveChain, waitForSession } from './chainSession.js';
4
+ vi.mock('node:fs/promises');
5
+ describe('chainSession', () => {
6
+ describe('loadSessions', () => {
7
+ beforeEach(() => {
8
+ vi.resetAllMocks();
9
+ });
10
+ it('should load and parse sessions file', async () => {
11
+ const mockSessions = [
12
+ { id: '1', issueNumber: 42, status: 'running', worktreePath: '/path/1' },
13
+ { id: '2', issueNumber: 43, status: 'completed', worktreePath: '/path/2' },
14
+ ];
15
+ vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockSessions));
16
+ const result = await loadSessions('/test/cwd');
17
+ expect(result).toHaveLength(2);
18
+ expect(result[0]?.id).toBe('1');
19
+ expect(result[1]?.id).toBe('2');
20
+ });
21
+ it('should return empty array on file read error', async () => {
22
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('File not found'));
23
+ const result = await loadSessions('/test/cwd');
24
+ expect(result).toHaveLength(0);
25
+ });
26
+ });
27
+ describe('saveChain', () => {
28
+ beforeEach(() => {
29
+ vi.resetAllMocks();
30
+ });
31
+ it('should create directory and save chain file', async () => {
32
+ vi.mocked(fs.mkdir).mockResolvedValue(undefined);
33
+ vi.mocked(fs.writeFile).mockResolvedValue(undefined);
34
+ const chain = {
35
+ id: 'test-123',
36
+ items: [],
37
+ status: 'pending',
38
+ createdAt: new Date(),
39
+ updatedAt: new Date(),
40
+ options: { baseBranch: 'develop', skipFailed: false, autoMerge: false },
41
+ };
42
+ await saveChain('/test/cwd', chain);
43
+ expect(fs.mkdir).toHaveBeenCalledWith(expect.stringContaining('chains'), { recursive: true });
44
+ expect(fs.writeFile).toHaveBeenCalledWith(expect.stringContaining('test-123.json'), expect.any(String));
45
+ });
46
+ });
47
+ describe('waitForSession', () => {
48
+ beforeEach(() => {
49
+ vi.useFakeTimers();
50
+ vi.resetAllMocks();
51
+ });
52
+ afterEach(() => {
53
+ vi.useRealTimers();
54
+ });
55
+ it('should return success when session completes', async () => {
56
+ vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify([{ id: 'sess-1', issueNumber: 42, status: 'completed' }]));
57
+ const promise = waitForSession('/test/cwd', 42, 10000);
58
+ await vi.advanceTimersByTimeAsync(3000);
59
+ const result = await promise;
60
+ expect(result.success).toBe(true);
61
+ expect(result.sessionId).toBe('sess-1');
62
+ });
63
+ it('should return failure when session fails', async () => {
64
+ vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify([{ id: 'sess-1', issueNumber: 42, status: 'failed' }]));
65
+ const promise = waitForSession('/test/cwd', 42, 10000);
66
+ await vi.advanceTimersByTimeAsync(3000);
67
+ const result = await promise;
68
+ expect(result.success).toBe(false);
69
+ expect(result.error).toBe('Session failed');
70
+ });
71
+ it('should return timeout error when no session found', async () => {
72
+ vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify([]));
73
+ const promise = waitForSession('/test/cwd', 42, 5000);
74
+ await vi.advanceTimersByTimeAsync(6000);
75
+ const result = await promise;
76
+ expect(result.success).toBe(false);
77
+ expect(result.error).toBe('Session timeout');
78
+ });
79
+ it('should poll until session status changes', async () => {
80
+ vi.mocked(fs.readFile)
81
+ .mockResolvedValueOnce(JSON.stringify([{ id: 's1', issueNumber: 42, status: 'running' }]))
82
+ .mockResolvedValueOnce(JSON.stringify([{ id: 's1', issueNumber: 42, status: 'running' }]))
83
+ .mockResolvedValueOnce(JSON.stringify([{ id: 's1', issueNumber: 42, status: 'completed' }]));
84
+ const promise = waitForSession('/test/cwd', 42, 30000);
85
+ await vi.advanceTimersByTimeAsync(3000);
86
+ await vi.advanceTimersByTimeAsync(3000);
87
+ await vi.advanceTimersByTimeAsync(3000);
88
+ const result = await promise;
89
+ expect(result.success).toBe(true);
90
+ });
91
+ });
92
+ });
93
+ //# sourceMappingURL=chainSession.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainSession.test.js","sourceRoot":"","sources":["../../../src/commands/chain/chainSession.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { truncate, getBranchNameForIssue, getChainSummary, printChainStatus, } from './chainDisplay.js';
2
+ export { loadSessions, saveChain, waitForSession, type SessionInfo, type WaitResult, } from './chainSession.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { truncate, getBranchNameForIssue, getChainSummary, printChainStatus, } from './chainDisplay.js';
2
+ export { loadSessions, saveChain, waitForSession, } from './chainSession.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/chain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,cAAc,GAGf,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const chainCommand: Command;
3
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/commands/chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,eAAO,MAAM,YAAY,SA0KrB,CAAC"}
@@ -0,0 +1,195 @@
1
+ import { Command } from 'commander';
2
+ import { join } from 'node:path';
3
+ import { access, readFile } from 'node:fs/promises';
4
+ import { spawn } from 'node:child_process';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { getBranchNameForIssue, getChainSummary, printChainStatus, saveChain, waitForSession, } from './chain/index.js';
7
+ const CONFIG_DIR = '.claudetree';
8
+ const CHAINS_DIR = 'chains';
9
+ async function loadConfig(cwd) {
10
+ try {
11
+ const configPath = join(cwd, CONFIG_DIR, 'config.json');
12
+ await access(configPath);
13
+ const content = await readFile(configPath, 'utf-8');
14
+ return JSON.parse(content);
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ async function startChainItem(item, options) {
21
+ const args = ['start', item.issue];
22
+ if (options.template) {
23
+ args.push('--template', options.template);
24
+ }
25
+ // Use --branch to set custom branch name if baseBranch is specified
26
+ if (item.baseBranch && item.baseBranch !== 'develop') {
27
+ // The worktree will be created from the baseBranch
28
+ // We need to pass this info somehow - for now use environment variable
29
+ process.env.CLAUDETREE_BASE_BRANCH = item.baseBranch;
30
+ }
31
+ const proc = spawn('claudetree', args, {
32
+ cwd: options.cwd,
33
+ stdio: 'ignore',
34
+ detached: true,
35
+ env: {
36
+ ...process.env,
37
+ CLAUDETREE_BASE_BRANCH: item.baseBranch,
38
+ },
39
+ });
40
+ proc.unref();
41
+ // Wait for session to be created
42
+ await new Promise(r => setTimeout(r, 3000));
43
+ }
44
+ export const chainCommand = new Command('chain')
45
+ .description('Execute a dependency chain of issues (each builds on the previous)')
46
+ .argument('<issues...>', 'Issue numbers in dependency order (first is base)')
47
+ .option('-T, --template <template>', 'Session template (bugfix, feature, refactor)')
48
+ .option('--skip-failed', 'Continue chain even if an issue fails', false)
49
+ .option('-b, --base-branch <branch>', 'Base branch for first issue', 'develop')
50
+ .option('--dry-run', 'Show chain plan without executing', false)
51
+ .action(async (issues, options) => {
52
+ const cwd = process.cwd();
53
+ const config = await loadConfig(cwd);
54
+ if (!config) {
55
+ console.error('Error: claudetree not initialized. Run "claudetree init" first.');
56
+ process.exit(1);
57
+ }
58
+ if (issues.length < 2) {
59
+ console.error('Error: Chain requires at least 2 issues.');
60
+ console.log('Usage: claudetree chain <issue1> <issue2> [issue3...]');
61
+ console.log('Example: claudetree chain 10 11 12');
62
+ process.exit(1);
63
+ }
64
+ // Build chain items
65
+ const chainItems = issues.map((issue, idx) => {
66
+ const branchName = getBranchNameForIssue(issue);
67
+ const baseBranch = idx === 0 ? options.baseBranch : getBranchNameForIssue(issues[idx - 1]);
68
+ return {
69
+ issue,
70
+ order: idx,
71
+ status: 'pending',
72
+ branchName,
73
+ baseBranch,
74
+ };
75
+ });
76
+ const chain = {
77
+ id: randomUUID().slice(0, 8),
78
+ items: chainItems,
79
+ status: 'pending',
80
+ createdAt: new Date(),
81
+ updatedAt: new Date(),
82
+ options: {
83
+ template: options.template,
84
+ skipFailed: options.skipFailed,
85
+ autoMerge: false,
86
+ baseBranch: options.baseBranch,
87
+ },
88
+ };
89
+ // Dry run mode
90
+ if (options.dryRun) {
91
+ console.log('\n\x1b[36m[Dry Run] Chain execution plan:\x1b[0m\n');
92
+ for (let i = 0; i < chain.items.length; i++) {
93
+ const item = chain.items[i];
94
+ const arrow = i > 0 ? ' ↓' : '';
95
+ if (arrow)
96
+ console.log(`\x1b[90m${arrow}\x1b[0m`);
97
+ console.log(` \x1b[33m${i + 1}.\x1b[0m Issue #${item.issue}`);
98
+ console.log(` Branch: \x1b[36m${item.branchName}\x1b[0m`);
99
+ console.log(` Base: \x1b[90m${item.baseBranch}\x1b[0m`);
100
+ }
101
+ console.log('\n\x1b[90mRemove --dry-run to execute this chain.\x1b[0m\n');
102
+ return;
103
+ }
104
+ // Save initial chain state
105
+ await saveChain(cwd, chain);
106
+ console.log(`\nStarting dependency chain: ${chain.id}`);
107
+ console.log(`Issues: ${issues.join(' → ')}`);
108
+ if (options.template)
109
+ console.log(`Template: ${options.template}`);
110
+ console.log('');
111
+ chain.status = 'running';
112
+ printChainStatus(chain);
113
+ // Execute chain sequentially
114
+ for (let i = 0; i < chain.items.length; i++) {
115
+ const item = chain.items[i];
116
+ // Check if previous item failed and skip-failed is false
117
+ if (i > 0) {
118
+ const prevItem = chain.items[i - 1];
119
+ if (prevItem.status === 'failed' && !options.skipFailed) {
120
+ item.status = 'skipped';
121
+ item.error = 'Previous item failed';
122
+ chain.updatedAt = new Date();
123
+ await saveChain(cwd, chain);
124
+ printChainStatus(chain);
125
+ continue;
126
+ }
127
+ }
128
+ // Start this item
129
+ item.status = 'running';
130
+ item.startedAt = new Date();
131
+ chain.updatedAt = new Date();
132
+ await saveChain(cwd, chain);
133
+ printChainStatus(chain);
134
+ try {
135
+ // Start the session
136
+ await startChainItem(item, {
137
+ template: options.template,
138
+ cwd,
139
+ });
140
+ // Wait for completion
141
+ const issueNum = parseInt(item.issue, 10);
142
+ if (!isNaN(issueNum)) {
143
+ const result = await waitForSession(cwd, issueNum);
144
+ if (result.success) {
145
+ item.status = 'completed';
146
+ item.sessionId = result.sessionId;
147
+ }
148
+ else {
149
+ item.status = 'failed';
150
+ item.error = result.error;
151
+ }
152
+ }
153
+ else {
154
+ // For non-numeric issues, just wait a bit and mark as completed
155
+ // (can't track by issue number)
156
+ item.status = 'completed';
157
+ }
158
+ item.completedAt = new Date();
159
+ }
160
+ catch (error) {
161
+ item.status = 'failed';
162
+ item.error = error instanceof Error ? error.message : 'Unknown error';
163
+ item.completedAt = new Date();
164
+ }
165
+ chain.updatedAt = new Date();
166
+ await saveChain(cwd, chain);
167
+ printChainStatus(chain);
168
+ }
169
+ // Final summary
170
+ const summary = getChainSummary(chain);
171
+ chain.status = summary.failed > 0 ? 'failed' : 'completed';
172
+ chain.updatedAt = new Date();
173
+ await saveChain(cwd, chain);
174
+ console.log('\n\x1b[36m╔══════════════════════════════════════════╗\x1b[0m');
175
+ console.log('\x1b[36m║ Chain Complete ║\x1b[0m');
176
+ console.log('\x1b[36m╚══════════════════════════════════════════╝\x1b[0m\n');
177
+ console.log(` Completed: \x1b[32m${summary.completed}\x1b[0m`);
178
+ console.log(` Failed: \x1b[31m${summary.failed}\x1b[0m`);
179
+ console.log(` Skipped: \x1b[90m${summary.skipped}\x1b[0m`);
180
+ if (summary.completed === summary.total) {
181
+ console.log('\n \x1b[32m✓ All issues completed successfully!\x1b[0m');
182
+ console.log('\n Next steps:');
183
+ console.log(` 1. Review each branch's PR`);
184
+ console.log(` 2. Merge in order: ${chain.items.map(i => i.branchName).join(' → ')}`);
185
+ }
186
+ else if (summary.failed > 0) {
187
+ console.log('\n \x1b[33m⚠ Some issues failed. Check the logs for details.\x1b[0m');
188
+ }
189
+ console.log(`\n Chain log: ${join(CONFIG_DIR, CHAINS_DIR, `${chain.id}.json`)}`);
190
+ console.log(' View sessions: claudetree status\n');
191
+ if (summary.failed > 0 && !options.skipFailed) {
192
+ process.exit(1);
193
+ }
194
+ });
195
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/commands/chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.test.d.ts","sourceRoot":"","sources":["../../src/commands/chain.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,216 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { mkdtemp, rm, mkdir, writeFile, access } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ // Mock spawn
6
+ const mockSpawn = vi.fn();
7
+ vi.mock('node:child_process', () => ({
8
+ spawn: (...args) => mockSpawn(...args),
9
+ }));
10
+ // Mock crypto for consistent UUIDs in tests
11
+ vi.mock('node:crypto', () => ({
12
+ randomUUID: () => 'test-uuid-1234',
13
+ }));
14
+ import { chainCommand } from './chain.js';
15
+ describe('chainCommand', () => {
16
+ let testDir;
17
+ let originalCwd;
18
+ let originalExit;
19
+ let consoleLogSpy;
20
+ let consoleErrorSpy;
21
+ let consoleClearSpy;
22
+ beforeEach(async () => {
23
+ testDir = await mkdtemp(join(tmpdir(), 'claudetree-chain-test-'));
24
+ originalCwd = process.cwd();
25
+ process.chdir(testDir);
26
+ originalExit = process.exit;
27
+ process.exit = vi.fn();
28
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
29
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
30
+ consoleClearSpy = vi.spyOn(console, 'clear').mockImplementation(() => { });
31
+ mockSpawn.mockReset();
32
+ });
33
+ afterEach(async () => {
34
+ process.chdir(originalCwd);
35
+ process.exit = originalExit;
36
+ consoleLogSpy.mockRestore();
37
+ consoleErrorSpy.mockRestore();
38
+ consoleClearSpy.mockRestore();
39
+ vi.clearAllMocks();
40
+ await rm(testDir, { recursive: true, force: true });
41
+ });
42
+ describe('when not initialized', () => {
43
+ it('should display error and exit with code 1', async () => {
44
+ const exitError = new Error('process.exit called');
45
+ process.exit.mockImplementation(() => {
46
+ throw exitError;
47
+ });
48
+ await expect(chainCommand.parseAsync(['node', 'test', '10', '11', '12'])).rejects.toThrow('process.exit called');
49
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: claudetree not initialized. Run "claudetree init" first.');
50
+ expect(process.exit).toHaveBeenCalledWith(1);
51
+ });
52
+ });
53
+ describe('when initialized', () => {
54
+ beforeEach(async () => {
55
+ await mkdir(join(testDir, '.claudetree'), { recursive: true });
56
+ await writeFile(join(testDir, '.claudetree', 'config.json'), JSON.stringify({
57
+ worktreeDir: '.worktrees',
58
+ github: {
59
+ token: 'test-token',
60
+ owner: 'test-owner',
61
+ repo: 'test-repo',
62
+ },
63
+ }));
64
+ });
65
+ describe('with insufficient issues', () => {
66
+ it('should error when only one issue provided', async () => {
67
+ const exitError = new Error('process.exit called');
68
+ process.exit.mockImplementation(() => {
69
+ throw exitError;
70
+ });
71
+ await expect(chainCommand.parseAsync(['node', 'test', '10'])).rejects.toThrow('process.exit called');
72
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Chain requires at least 2 issues.');
73
+ expect(process.exit).toHaveBeenCalledWith(1);
74
+ });
75
+ });
76
+ describe('with --dry-run option', () => {
77
+ it('should show chain plan without executing', async () => {
78
+ await chainCommand.parseAsync([
79
+ 'node',
80
+ 'test',
81
+ '10',
82
+ '11',
83
+ '12',
84
+ '--dry-run',
85
+ ]);
86
+ expect(mockSpawn).not.toHaveBeenCalled();
87
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('[Dry Run]'));
88
+ });
89
+ it('should display issues in order with branch info', async () => {
90
+ await chainCommand.parseAsync([
91
+ 'node',
92
+ 'test',
93
+ '10',
94
+ '11',
95
+ '--dry-run',
96
+ ]);
97
+ const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
98
+ expect(logCalls).toContain('#10');
99
+ expect(logCalls).toContain('#11');
100
+ expect(logCalls).toContain('issue-10');
101
+ expect(logCalls).toContain('issue-11');
102
+ });
103
+ it('should show base branch for first issue', async () => {
104
+ await chainCommand.parseAsync([
105
+ 'node',
106
+ 'test',
107
+ '10',
108
+ '11',
109
+ '--dry-run',
110
+ '--base-branch',
111
+ 'main',
112
+ ]);
113
+ const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
114
+ expect(logCalls).toContain('main');
115
+ });
116
+ it('should show dependency relationships', async () => {
117
+ await chainCommand.parseAsync([
118
+ 'node',
119
+ 'test',
120
+ '10',
121
+ '11',
122
+ '12',
123
+ '--dry-run',
124
+ ]);
125
+ const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
126
+ // Second issue should base on first
127
+ expect(logCalls).toContain('issue-10');
128
+ // Third issue should base on second
129
+ expect(logCalls).toContain('issue-11');
130
+ });
131
+ });
132
+ describe('with --base-branch option', () => {
133
+ it('should use custom base branch', async () => {
134
+ await chainCommand.parseAsync([
135
+ 'node',
136
+ 'test',
137
+ '10',
138
+ '11',
139
+ '--base-branch',
140
+ 'main',
141
+ '--dry-run',
142
+ ]);
143
+ const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
144
+ expect(logCalls).toContain('main');
145
+ });
146
+ });
147
+ describe('with --template option', () => {
148
+ it('should include template in output', async () => {
149
+ await chainCommand.parseAsync([
150
+ 'node',
151
+ 'test',
152
+ '10',
153
+ '11',
154
+ '--template',
155
+ 'bugfix',
156
+ '--dry-run',
157
+ ]);
158
+ // Template is passed to session start, not necessarily shown in dry-run
159
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('[Dry Run]'));
160
+ });
161
+ });
162
+ describe('branch name generation', () => {
163
+ it('should generate branch names from issue numbers', async () => {
164
+ await chainCommand.parseAsync([
165
+ 'node',
166
+ 'test',
167
+ '101',
168
+ '102',
169
+ '--dry-run',
170
+ ]);
171
+ const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
172
+ expect(logCalls).toContain('issue-101');
173
+ expect(logCalls).toContain('issue-102');
174
+ });
175
+ it('should sanitize non-numeric issue names', async () => {
176
+ await chainCommand.parseAsync([
177
+ 'node',
178
+ 'test',
179
+ 'feature-auth',
180
+ 'feature-dashboard',
181
+ '--dry-run',
182
+ ]);
183
+ const logCalls = consoleLogSpy.mock.calls.flat().join('\n');
184
+ expect(logCalls).toContain('feature-auth');
185
+ expect(logCalls).toContain('feature-dashboard');
186
+ });
187
+ });
188
+ describe('chain state persistence', () => {
189
+ it('should create chains directory for non-dry-run', async () => {
190
+ // Setup mock for spawn
191
+ const mockProc = {
192
+ unref: vi.fn(),
193
+ on: vi.fn(),
194
+ };
195
+ mockSpawn.mockReturnValue(mockProc);
196
+ // Mock session creation by writing to sessions.json
197
+ await writeFile(join(testDir, '.claudetree', 'sessions.json'), JSON.stringify([
198
+ { issueNumber: 10, status: 'completed', id: 'session-1' },
199
+ { issueNumber: 11, status: 'completed', id: 'session-2' },
200
+ ]));
201
+ // We can't easily test the full execution because it requires
202
+ // waiting for sessions, so we just verify dry-run works
203
+ await chainCommand.parseAsync([
204
+ 'node',
205
+ 'test',
206
+ '10',
207
+ '11',
208
+ '--dry-run',
209
+ ]);
210
+ // In dry-run, chains dir is not created
211
+ await expect(access(join(testDir, '.claudetree', 'chains'))).rejects.toThrow();
212
+ });
213
+ });
214
+ });
215
+ });
216
+ //# sourceMappingURL=chain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.test.js","sourceRoot":"","sources":["../../src/commands/chain.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clean.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.test.d.ts","sourceRoot":"","sources":["../../src/commands/clean.test.ts"],"names":[],"mappings":""}