@claudetree/cli 0.3.0 → 0.3.1

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.
package/README.ja.md CHANGED
@@ -45,6 +45,7 @@ ct web
45
45
  | `ct demo` | インタラクティブデモ(トークン不使用) |
46
46
  | `ct batch` | 複数の課題を並列処理 |
47
47
  | `ct bustercall` | すべてのopen課題を自動取得して並列セッション実行 |
48
+ | `ct clean` | すべてのworktreeを削除(main以外) |
48
49
  | `ct web` | Webダッシュボード開始 |
49
50
 
50
51
  ## 主な機能
package/README.ko.md CHANGED
@@ -45,6 +45,7 @@ ct web
45
45
  | `ct demo` | 인터랙티브 데모 (토큰 미사용) |
46
46
  | `ct batch` | 여러 이슈를 병렬로 처리 |
47
47
  | `ct bustercall` | 모든 open 이슈를 자동으로 가져와 병렬 세션 실행 |
48
+ | `ct clean` | 모든 worktree 제거 (main 제외) |
48
49
  | `ct web` | 웹 대시보드 시작 |
49
50
 
50
51
  ## 주요 기능
package/README.md CHANGED
@@ -45,6 +45,7 @@ ct web
45
45
  | `ct demo` | Interactive demo (no tokens used) |
46
46
  | `ct batch` | Process multiple issues in parallel |
47
47
  | `ct bustercall` | Auto-fetch all open issues and run parallel sessions |
48
+ | `ct clean` | Remove all worktrees (except main) |
48
49
  | `ct web` | Start web dashboard |
49
50
 
50
51
  ## Key Features
package/README.zh.md CHANGED
@@ -45,6 +45,7 @@ ct web
45
45
  | `ct demo` | 交互式演示(不消耗token) |
46
46
  | `ct batch` | 并行处理多个问题 |
47
47
  | `ct bustercall` | 自动获取所有open问题并运行并行会话 |
48
+ | `ct clean` | 删除所有worktree(main除外) |
48
49
  | `ct web` | 启动Web仪表板 |
49
50
 
50
51
  ## 主要功能
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const cleanCommand: Command;
3
+ //# sourceMappingURL=clean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,eAAO,MAAM,YAAY,SAyGrB,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { Command } from 'commander';
2
+ import { join } from 'node:path';
3
+ import { createInterface } from 'node:readline';
4
+ import { GitWorktreeAdapter, FileSessionRepository } from '@claudetree/core';
5
+ const CONFIG_DIR = '.claudetree';
6
+ async function confirm(message) {
7
+ const rl = createInterface({
8
+ input: process.stdin,
9
+ output: process.stdout,
10
+ });
11
+ return new Promise((resolve) => {
12
+ rl.question(`${message} [y/N] `, (answer) => {
13
+ rl.close();
14
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
15
+ });
16
+ });
17
+ }
18
+ export const cleanCommand = new Command('clean')
19
+ .description('Remove all worktrees (except main)')
20
+ .option('-f, --force', 'Force removal without confirmation', false)
21
+ .option('--keep-sessions', 'Keep session records after removal', false)
22
+ .option('--dry-run', 'Show what would be removed without removing', false)
23
+ .action(async (options) => {
24
+ const cwd = process.cwd();
25
+ const adapter = new GitWorktreeAdapter(cwd);
26
+ try {
27
+ const worktrees = await adapter.list();
28
+ const toRemove = worktrees.filter((wt) => !wt.isMainWorktree);
29
+ if (toRemove.length === 0) {
30
+ console.log('No worktrees to remove.');
31
+ return;
32
+ }
33
+ console.log('\n=== Clean Worktrees ===\n');
34
+ console.log(`Found ${toRemove.length} worktree(s) to remove:\n`);
35
+ for (const wt of toRemove) {
36
+ const branch = wt.branch || '(detached)';
37
+ console.log(` \u2022 ${wt.path} (${branch})`);
38
+ }
39
+ if (options.dryRun) {
40
+ console.log('\n[Dry run] No changes made.');
41
+ return;
42
+ }
43
+ if (!options.force) {
44
+ console.log('');
45
+ const confirmed = await confirm('Are you sure you want to remove these worktrees?');
46
+ if (!confirmed) {
47
+ console.log('Cancelled.');
48
+ return;
49
+ }
50
+ }
51
+ console.log('');
52
+ let successCount = 0;
53
+ let failCount = 0;
54
+ for (const wt of toRemove) {
55
+ process.stdout.write(`Removing ${wt.path}... `);
56
+ try {
57
+ await adapter.remove(wt.path, options.force);
58
+ console.log('\u2713');
59
+ successCount++;
60
+ }
61
+ catch (error) {
62
+ console.log('\u2717');
63
+ if (error instanceof Error) {
64
+ console.log(` Error: ${error.message}`);
65
+ }
66
+ failCount++;
67
+ }
68
+ }
69
+ // Clean up sessions if not keeping them
70
+ if (!options.keepSessions) {
71
+ const configDir = join(cwd, CONFIG_DIR);
72
+ try {
73
+ const sessionRepo = new FileSessionRepository(configDir);
74
+ const sessions = await sessionRepo.findAll();
75
+ // Find sessions that reference removed worktrees
76
+ const removedPaths = new Set(toRemove.map((wt) => wt.path));
77
+ const sessionsToDelete = sessions.filter((s) => s.worktreePath && removedPaths.has(s.worktreePath));
78
+ for (const session of sessionsToDelete) {
79
+ await sessionRepo.delete(session.id);
80
+ }
81
+ if (sessionsToDelete.length > 0) {
82
+ console.log(`\nRemoved ${sessionsToDelete.length} associated session(s).`);
83
+ }
84
+ }
85
+ catch {
86
+ // Config dir might not exist, which is fine
87
+ }
88
+ }
89
+ // Prune stale worktree entries
90
+ process.stdout.write('\nPruning stale entries... ');
91
+ try {
92
+ await adapter.prune();
93
+ console.log('\u2713');
94
+ }
95
+ catch {
96
+ console.log('\u2717');
97
+ }
98
+ console.log(`\nRemoved ${successCount} worktree(s) successfully.`);
99
+ if (failCount > 0) {
100
+ console.log(`Failed to remove ${failCount} worktree(s).`);
101
+ process.exit(1);
102
+ }
103
+ }
104
+ catch (error) {
105
+ if (error instanceof Error) {
106
+ console.error(`Error: ${error.message}`);
107
+ }
108
+ process.exit(1);
109
+ }
110
+ });
111
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { program } from 'commander';
3
3
  import { batchCommand } from './commands/batch.js';
4
4
  import { bustercallCommand } from './commands/bustercall.js';
5
+ import { cleanCommand } from './commands/clean.js';
5
6
  import { demoCommand } from './commands/demo.js';
6
7
  import { doctorCommand } from './commands/doctor.js';
7
8
  import { initCommand } from './commands/init.js';
@@ -17,6 +18,7 @@ program
17
18
  .version('0.1.0');
18
19
  program.addCommand(batchCommand);
19
20
  program.addCommand(bustercallCommand);
21
+ program.addCommand(cleanCommand);
20
22
  program.addCommand(demoCommand);
21
23
  program.addCommand(doctorCommand);
22
24
  program.addCommand(initCommand);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudetree/cli",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "CLI for claudetree - Manage Claude sessions with git worktrees",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,8 +28,8 @@
28
28
  "license": "MIT",
29
29
  "dependencies": {
30
30
  "commander": "^13.0.0",
31
- "@claudetree/core": "0.3.0",
32
- "@claudetree/shared": "0.3.0"
31
+ "@claudetree/core": "0.3.1",
32
+ "@claudetree/shared": "0.3.1"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "^22.10.0",