@claudetree/cli 0.4.2 → 0.4.4

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 (65) hide show
  1. package/dist/commands/chain.d.ts +3 -0
  2. package/dist/commands/chain.d.ts.map +1 -0
  3. package/dist/commands/chain.js +284 -0
  4. package/dist/commands/chain.js.map +1 -0
  5. package/dist/commands/init.test.d.ts +2 -0
  6. package/dist/commands/init.test.d.ts.map +1 -0
  7. package/dist/commands/init.test.js +94 -0
  8. package/dist/commands/init.test.js.map +1 -0
  9. package/dist/commands/list.test.d.ts +2 -0
  10. package/dist/commands/list.test.d.ts.map +1 -0
  11. package/dist/commands/list.test.js +106 -0
  12. package/dist/commands/list.test.js.map +1 -0
  13. package/dist/commands/start/buildPrompt.d.ts +29 -0
  14. package/dist/commands/start/buildPrompt.d.ts.map +1 -0
  15. package/dist/commands/start/buildPrompt.js +142 -0
  16. package/dist/commands/start/buildPrompt.js.map +1 -0
  17. package/dist/commands/start/buildPrompt.test.d.ts +2 -0
  18. package/dist/commands/start/buildPrompt.test.d.ts.map +1 -0
  19. package/dist/commands/start/buildPrompt.test.js +182 -0
  20. package/dist/commands/start/buildPrompt.test.js.map +1 -0
  21. package/dist/commands/start/createWorktree.d.ts +21 -0
  22. package/dist/commands/start/createWorktree.d.ts.map +1 -0
  23. package/dist/commands/start/createWorktree.js +36 -0
  24. package/dist/commands/start/createWorktree.js.map +1 -0
  25. package/dist/commands/start/createWorktree.test.d.ts +2 -0
  26. package/dist/commands/start/createWorktree.test.d.ts.map +1 -0
  27. package/dist/commands/start/createWorktree.test.js +81 -0
  28. package/dist/commands/start/createWorktree.test.js.map +1 -0
  29. package/dist/commands/start/index.d.ts +4 -0
  30. package/dist/commands/start/index.d.ts.map +1 -0
  31. package/dist/commands/start/index.js +4 -0
  32. package/dist/commands/start/index.js.map +1 -0
  33. package/dist/commands/start/parseIssueInput.d.ts +21 -0
  34. package/dist/commands/start/parseIssueInput.d.ts.map +1 -0
  35. package/dist/commands/start/parseIssueInput.js +78 -0
  36. package/dist/commands/start/parseIssueInput.js.map +1 -0
  37. package/dist/commands/start/parseIssueInput.test.d.ts +2 -0
  38. package/dist/commands/start/parseIssueInput.test.d.ts.map +1 -0
  39. package/dist/commands/start/parseIssueInput.test.js +118 -0
  40. package/dist/commands/start/parseIssueInput.test.js.map +1 -0
  41. package/dist/commands/start.d.ts.map +1 -1
  42. package/dist/commands/start.js +144 -280
  43. package/dist/commands/start.js.map +1 -1
  44. package/dist/commands/start.test.d.ts +2 -0
  45. package/dist/commands/start.test.d.ts.map +1 -0
  46. package/dist/commands/start.test.js +260 -0
  47. package/dist/commands/start.test.js.map +1 -0
  48. package/dist/commands/status.test.d.ts +2 -0
  49. package/dist/commands/status.test.d.ts.map +1 -0
  50. package/dist/commands/status.test.js +172 -0
  51. package/dist/commands/status.test.js.map +1 -0
  52. package/dist/commands/stop.test.d.ts +2 -0
  53. package/dist/commands/stop.test.d.ts.map +1 -0
  54. package/dist/commands/stop.test.js +152 -0
  55. package/dist/commands/stop.test.js.map +1 -0
  56. package/dist/commands/web.d.ts.map +1 -1
  57. package/dist/commands/web.js +95 -1
  58. package/dist/commands/web.js.map +1 -1
  59. package/dist/commands/web.test.d.ts +2 -0
  60. package/dist/commands/web.test.d.ts.map +1 -0
  61. package/dist/commands/web.test.js +133 -0
  62. package/dist/commands/web.test.js.map +1 -0
  63. package/dist/index.js +2 -0
  64. package/dist/index.js.map +1 -1
  65. package/package.json +8 -5
@@ -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;AA0LpC,eAAO,MAAM,YAAY,SA0KrB,CAAC"}
@@ -0,0 +1,284 @@
1
+ import { Command } from 'commander';
2
+ import { join } from 'node:path';
3
+ import { access, readFile, writeFile, mkdir } from 'node:fs/promises';
4
+ import { spawn } from 'node:child_process';
5
+ import { randomUUID } from 'node:crypto';
6
+ const CONFIG_DIR = '.claudetree';
7
+ const CHAINS_DIR = 'chains';
8
+ async function loadConfig(cwd) {
9
+ try {
10
+ const configPath = join(cwd, CONFIG_DIR, 'config.json');
11
+ await access(configPath);
12
+ const content = await readFile(configPath, 'utf-8');
13
+ return JSON.parse(content);
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ async function loadSessions(cwd) {
20
+ try {
21
+ const sessionsPath = join(cwd, CONFIG_DIR, 'sessions.json');
22
+ const content = await readFile(sessionsPath, 'utf-8');
23
+ return JSON.parse(content);
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ async function saveChain(cwd, chain) {
30
+ const chainsDir = join(cwd, CONFIG_DIR, CHAINS_DIR);
31
+ await mkdir(chainsDir, { recursive: true });
32
+ await writeFile(join(chainsDir, `${chain.id}.json`), JSON.stringify(chain, null, 2));
33
+ }
34
+ function truncate(str, maxLen) {
35
+ if (str.length <= maxLen)
36
+ return str;
37
+ return str.slice(0, maxLen - 3) + '...';
38
+ }
39
+ 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' ? '\x1b[90m○\x1b[0m' :
47
+ item.status === 'running' ? '\x1b[33m◐\x1b[0m' :
48
+ item.status === 'completed' ? '\x1b[32m●\x1b[0m' :
49
+ item.status === 'skipped' ? '\x1b[90m◌\x1b[0m' :
50
+ '\x1b[31m✗\x1b[0m';
51
+ const arrow = i < chain.items.length - 1 ? '\x1b[90m │\x1b[0m' : '';
52
+ const base = item.baseBranch ? `\x1b[90m← ${item.baseBranch}\x1b[0m` : '';
53
+ const branch = item.branchName ? `\x1b[36m[${item.branchName}]\x1b[0m ` : '';
54
+ const error = item.error ? `\x1b[31m (${truncate(item.error, 30)})\x1b[0m` : '';
55
+ console.log(` ${icon} ${branch}#${item.issue}${error} ${base}`);
56
+ if (arrow)
57
+ console.log(arrow);
58
+ }
59
+ const summary = getChainSummary(chain);
60
+ console.log(`\n \x1b[90m[${summary.completed}/${summary.total}] completed`);
61
+ if (summary.failed > 0)
62
+ console.log(` \x1b[31m${summary.failed} failed\x1b[0m`);
63
+ if (summary.skipped > 0)
64
+ console.log(` \x1b[90m${summary.skipped} skipped\x1b[0m`);
65
+ console.log('\x1b[0m');
66
+ }
67
+ function getChainSummary(chain) {
68
+ return {
69
+ total: chain.items.length,
70
+ completed: chain.items.filter(i => i.status === 'completed').length,
71
+ failed: chain.items.filter(i => i.status === 'failed').length,
72
+ skipped: chain.items.filter(i => i.status === 'skipped').length,
73
+ pending: chain.items.filter(i => i.status === 'pending').length,
74
+ };
75
+ }
76
+ async function waitForSession(cwd, issueNumber, timeoutMs = 300000) {
77
+ const startTime = Date.now();
78
+ let lastStatus = '';
79
+ while (Date.now() - startTime < timeoutMs) {
80
+ const sessions = await loadSessions(cwd);
81
+ const session = sessions.find(s => s.issueNumber === issueNumber);
82
+ if (session) {
83
+ if (session.status !== lastStatus) {
84
+ lastStatus = session.status;
85
+ }
86
+ if (session.status === 'completed') {
87
+ return { success: true, sessionId: session.id };
88
+ }
89
+ if (session.status === 'failed') {
90
+ return { success: false, sessionId: session.id, error: 'Session failed' };
91
+ }
92
+ }
93
+ await new Promise(r => setTimeout(r, 3000));
94
+ }
95
+ return { success: false, error: 'Session timeout' };
96
+ }
97
+ async function startChainItem(item, options) {
98
+ const args = ['start', item.issue];
99
+ if (options.template) {
100
+ args.push('--template', options.template);
101
+ }
102
+ // Use --branch to set custom branch name if baseBranch is specified
103
+ if (item.baseBranch && item.baseBranch !== 'develop') {
104
+ // The worktree will be created from the baseBranch
105
+ // We need to pass this info somehow - for now use environment variable
106
+ process.env.CLAUDETREE_BASE_BRANCH = item.baseBranch;
107
+ }
108
+ const proc = spawn('claudetree', args, {
109
+ cwd: options.cwd,
110
+ stdio: 'ignore',
111
+ detached: true,
112
+ env: {
113
+ ...process.env,
114
+ CLAUDETREE_BASE_BRANCH: item.baseBranch,
115
+ },
116
+ });
117
+ proc.unref();
118
+ // Wait for session to be created
119
+ await new Promise(r => setTimeout(r, 3000));
120
+ }
121
+ function getBranchNameForIssue(issue) {
122
+ // If it's a number, assume issue number
123
+ if (/^\d+$/.test(issue)) {
124
+ return `issue-${issue}`;
125
+ }
126
+ // Otherwise, sanitize the task name
127
+ return issue
128
+ .toLowerCase()
129
+ .replace(/[^a-z0-9]+/g, '-')
130
+ .replace(/^-|-$/g, '')
131
+ .slice(0, 50);
132
+ }
133
+ export const chainCommand = new Command('chain')
134
+ .description('Execute a dependency chain of issues (each builds on the previous)')
135
+ .argument('<issues...>', 'Issue numbers in dependency order (first is base)')
136
+ .option('-T, --template <template>', 'Session template (bugfix, feature, refactor)')
137
+ .option('--skip-failed', 'Continue chain even if an issue fails', false)
138
+ .option('-b, --base-branch <branch>', 'Base branch for first issue', 'develop')
139
+ .option('--dry-run', 'Show chain plan without executing', false)
140
+ .action(async (issues, options) => {
141
+ const cwd = process.cwd();
142
+ const config = await loadConfig(cwd);
143
+ if (!config) {
144
+ console.error('Error: claudetree not initialized. Run "claudetree init" first.');
145
+ process.exit(1);
146
+ }
147
+ if (issues.length < 2) {
148
+ console.error('Error: Chain requires at least 2 issues.');
149
+ console.log('Usage: claudetree chain <issue1> <issue2> [issue3...]');
150
+ console.log('Example: claudetree chain 10 11 12');
151
+ process.exit(1);
152
+ }
153
+ // Build chain items
154
+ const chainItems = issues.map((issue, idx) => {
155
+ const branchName = getBranchNameForIssue(issue);
156
+ const baseBranch = idx === 0 ? options.baseBranch : getBranchNameForIssue(issues[idx - 1]);
157
+ return {
158
+ issue,
159
+ order: idx,
160
+ status: 'pending',
161
+ branchName,
162
+ baseBranch,
163
+ };
164
+ });
165
+ const chain = {
166
+ id: randomUUID().slice(0, 8),
167
+ items: chainItems,
168
+ status: 'pending',
169
+ createdAt: new Date(),
170
+ updatedAt: new Date(),
171
+ options: {
172
+ template: options.template,
173
+ skipFailed: options.skipFailed,
174
+ autoMerge: false,
175
+ baseBranch: options.baseBranch,
176
+ },
177
+ };
178
+ // Dry run mode
179
+ if (options.dryRun) {
180
+ console.log('\n\x1b[36m[Dry Run] Chain execution plan:\x1b[0m\n');
181
+ for (let i = 0; i < chain.items.length; i++) {
182
+ const item = chain.items[i];
183
+ const arrow = i > 0 ? ' ↓' : '';
184
+ if (arrow)
185
+ console.log(`\x1b[90m${arrow}\x1b[0m`);
186
+ console.log(` \x1b[33m${i + 1}.\x1b[0m Issue #${item.issue}`);
187
+ console.log(` Branch: \x1b[36m${item.branchName}\x1b[0m`);
188
+ console.log(` Base: \x1b[90m${item.baseBranch}\x1b[0m`);
189
+ }
190
+ console.log('\n\x1b[90mRemove --dry-run to execute this chain.\x1b[0m\n');
191
+ return;
192
+ }
193
+ // Save initial chain state
194
+ await saveChain(cwd, chain);
195
+ console.log(`\nStarting dependency chain: ${chain.id}`);
196
+ console.log(`Issues: ${issues.join(' → ')}`);
197
+ if (options.template)
198
+ console.log(`Template: ${options.template}`);
199
+ console.log('');
200
+ chain.status = 'running';
201
+ printChainStatus(chain);
202
+ // Execute chain sequentially
203
+ for (let i = 0; i < chain.items.length; i++) {
204
+ const item = chain.items[i];
205
+ // Check if previous item failed and skip-failed is false
206
+ if (i > 0) {
207
+ const prevItem = chain.items[i - 1];
208
+ if (prevItem.status === 'failed' && !options.skipFailed) {
209
+ item.status = 'skipped';
210
+ item.error = 'Previous item failed';
211
+ chain.updatedAt = new Date();
212
+ await saveChain(cwd, chain);
213
+ printChainStatus(chain);
214
+ continue;
215
+ }
216
+ }
217
+ // Start this item
218
+ item.status = 'running';
219
+ item.startedAt = new Date();
220
+ chain.updatedAt = new Date();
221
+ await saveChain(cwd, chain);
222
+ printChainStatus(chain);
223
+ try {
224
+ // Start the session
225
+ await startChainItem(item, {
226
+ template: options.template,
227
+ cwd,
228
+ });
229
+ // Wait for completion
230
+ const issueNum = parseInt(item.issue, 10);
231
+ if (!isNaN(issueNum)) {
232
+ const result = await waitForSession(cwd, issueNum);
233
+ if (result.success) {
234
+ item.status = 'completed';
235
+ item.sessionId = result.sessionId;
236
+ }
237
+ else {
238
+ item.status = 'failed';
239
+ item.error = result.error;
240
+ }
241
+ }
242
+ else {
243
+ // For non-numeric issues, just wait a bit and mark as completed
244
+ // (can't track by issue number)
245
+ item.status = 'completed';
246
+ }
247
+ item.completedAt = new Date();
248
+ }
249
+ catch (error) {
250
+ item.status = 'failed';
251
+ item.error = error instanceof Error ? error.message : 'Unknown error';
252
+ item.completedAt = new Date();
253
+ }
254
+ chain.updatedAt = new Date();
255
+ await saveChain(cwd, chain);
256
+ printChainStatus(chain);
257
+ }
258
+ // Final summary
259
+ const summary = getChainSummary(chain);
260
+ chain.status = summary.failed > 0 ? 'failed' : 'completed';
261
+ chain.updatedAt = new Date();
262
+ await saveChain(cwd, chain);
263
+ console.log('\n\x1b[36m╔══════════════════════════════════════════╗\x1b[0m');
264
+ console.log('\x1b[36m║ Chain Complete ║\x1b[0m');
265
+ console.log('\x1b[36m╚══════════════════════════════════════════╝\x1b[0m\n');
266
+ console.log(` Completed: \x1b[32m${summary.completed}\x1b[0m`);
267
+ console.log(` Failed: \x1b[31m${summary.failed}\x1b[0m`);
268
+ console.log(` Skipped: \x1b[90m${summary.skipped}\x1b[0m`);
269
+ if (summary.completed === summary.total) {
270
+ console.log('\n \x1b[32m✓ All issues completed successfully!\x1b[0m');
271
+ console.log('\n Next steps:');
272
+ console.log(` 1. Review each branch's PR`);
273
+ console.log(` 2. Merge in order: ${chain.items.map(i => i.branchName).join(' → ')}`);
274
+ }
275
+ else if (summary.failed > 0) {
276
+ console.log('\n \x1b[33m⚠ Some issues failed. Check the logs for details.\x1b[0m');
277
+ }
278
+ console.log(`\n Chain log: ${join(CONFIG_DIR, CHAINS_DIR, `${chain.id}.json`)}`);
279
+ console.log(' View sessions: claudetree status\n');
280
+ if (summary.failed > 0 && !options.skipFailed) {
281
+ process.exit(1);
282
+ }
283
+ });
284
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/commands/chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAyB5B,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACxD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,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,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,KAAY;IAChD,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,CACb,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,EACnC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,MAAc;IAC3C,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,GAAG,CAAC;IACrC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAY;IACpC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;oBAClD,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;wBAChD,kBAAkB,CAAC;QAErB,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhF,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,aAAa,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACjF,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,KAAY;IACnC,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;QACzB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;QACnE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM;QAC7D,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAC/D,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;KAChE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,WAAmB,EACnB,YAAoB,MAAM;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,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,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;QAElE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAClC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC;YAED,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,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAe,EACf,OAA2C;IAE3C,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrD,mDAAmD;QACnD,uEAAuE;QACvE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,UAAU,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE;QACrC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,sBAAsB,EAAE,IAAI,CAAC,UAAU;SACxC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;IAEb,iCAAiC;IACjC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,wCAAwC;IACxC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,oCAAoC;IACpC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,oEAAoE,CAAC;KACjF,QAAQ,CAAC,aAAa,EAAE,mDAAmD,CAAC;KAC5E,MAAM,CAAC,2BAA2B,EAAE,8CAA8C,CAAC;KACnF,MAAM,CAAC,eAAe,EAAE,uCAAuC,EAAE,KAAK,CAAC;KACvE,MAAM,CAAC,4BAA4B,EAAE,6BAA6B,EAAE,SAAS,CAAC;KAC9E,MAAM,CAAC,WAAW,EAAE,mCAAmC,EAAE,KAAK,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,MAAgB,EAAE,OAAqB,EAAE,EAAE;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACxD,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,CAAC;QAE5F,OAAO;YACL,KAAK;YACL,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,SAAS;YACjB,UAAU;YACV,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAU;QACnB,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5B,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,OAAO,EAAE;YACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B;KACF,CAAC;IAEF,eAAe;IACf,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAElE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;YAElD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,UAAU,SAAS,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,UAAU,SAAS,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IACzB,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAExB,6BAA6B;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAE7B,yDAAyD;QACzD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBACxD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,KAAK,GAAG,sBAAsB,CAAC;gBACpC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5B,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,cAAc,CAAC,IAAI,EAAE;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG;aACJ,CAAC,CAAC;YAEH,sBAAsB;YACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAEnD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;oBAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;oBACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gEAAgE;gBAChE,gCAAgC;gBAChC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACtE,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3D,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,SAAS,SAAS,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,OAAO,SAAS,CAAC,CAAC;IAE5D,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAe,CAAC;IACpB,IAAI,WAAmB,CAAC;IACxB,IAAI,YAAiC,CAAC;IACtC,IAAI,aAA0C,CAAC;IAC/C,IAAI,eAA4C,CAAC;IAEjD,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACjE,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,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;IAC5E,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,aAAa,CAAC,WAAW,EAAE,CAAC;QAC5B,eAAe,CAAC,WAAW,EAAE,CAAC;QAC9B,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,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAE1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAClD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;YAEzE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEpD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC7D,MAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,WAAW,CAAC,UAAU,CAAC;gBAC3B,MAAM;gBACN,MAAM;gBACN,SAAS;gBACT,sCAAsC;aACvC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,IAAI,CACnC,sCAAsC,CACvC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,wBAAwB;YACxB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/C,eAAe,CAAC,SAAS,EAAE,CAAC;YAE5B,0BAA0B;YAC1B,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAC/C,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,wBAAwB;YACxB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAE/C,0BAA0B;YAC1B,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAClD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/commands/list.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Issue, SessionTemplate, TDDConfig } from '@claudetree/shared';
2
+ export interface BuildPromptOptions {
3
+ issueNumber: number | null;
4
+ issueData: Issue | null;
5
+ branchName: string;
6
+ taskDescription: string | null;
7
+ tddEnabled: boolean;
8
+ template?: SessionTemplate | null;
9
+ customPrompt?: string;
10
+ }
11
+ export interface BuildSystemPromptOptions {
12
+ tddEnabled: boolean;
13
+ tddConfig?: TDDConfig;
14
+ skill?: string;
15
+ template?: SessionTemplate | null;
16
+ }
17
+ /**
18
+ * Format duration in milliseconds to human readable string
19
+ */
20
+ export declare function formatDuration(ms: number): string;
21
+ /**
22
+ * Build the prompt for Claude session
23
+ */
24
+ export declare function buildPrompt(options: BuildPromptOptions): string;
25
+ /**
26
+ * Build system prompt based on mode and skill
27
+ */
28
+ export declare function buildSystemPrompt(options: BuildSystemPromptOptions): string | undefined;
29
+ //# sourceMappingURL=buildPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPrompt.d.ts","sourceRoot":"","sources":["../../../src/commands/start/buildPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAqC/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,GAAG,SAAS,CA0FvF"}