cluttry 1.0.3 → 1.5.0

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 (91) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +203 -300
  3. package/dist/commands/completions.d.ts +16 -0
  4. package/dist/commands/completions.d.ts.map +1 -0
  5. package/dist/commands/completions.js +46 -0
  6. package/dist/commands/completions.js.map +1 -0
  7. package/dist/commands/explain-copy.d.ts +11 -0
  8. package/dist/commands/explain-copy.d.ts.map +1 -0
  9. package/dist/commands/explain-copy.js +34 -0
  10. package/dist/commands/explain-copy.js.map +1 -0
  11. package/dist/commands/finish.d.ts +20 -0
  12. package/dist/commands/finish.d.ts.map +1 -0
  13. package/dist/commands/finish.js +817 -0
  14. package/dist/commands/finish.js.map +1 -0
  15. package/dist/commands/gc.d.ts +22 -0
  16. package/dist/commands/gc.d.ts.map +1 -0
  17. package/dist/commands/gc.js +163 -0
  18. package/dist/commands/gc.js.map +1 -0
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +1 -0
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/open.d.ts +15 -1
  23. package/dist/commands/open.d.ts.map +1 -1
  24. package/dist/commands/open.js +96 -17
  25. package/dist/commands/open.js.map +1 -1
  26. package/dist/commands/resume.d.ts +21 -0
  27. package/dist/commands/resume.d.ts.map +1 -0
  28. package/dist/commands/resume.js +106 -0
  29. package/dist/commands/resume.js.map +1 -0
  30. package/dist/commands/rm.d.ts.map +1 -1
  31. package/dist/commands/rm.js +6 -14
  32. package/dist/commands/rm.js.map +1 -1
  33. package/dist/commands/spawn.d.ts +3 -0
  34. package/dist/commands/spawn.d.ts.map +1 -1
  35. package/dist/commands/spawn.js +182 -19
  36. package/dist/commands/spawn.js.map +1 -1
  37. package/dist/index.d.ts +4 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +198 -9
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/completions.d.ts +35 -0
  42. package/dist/lib/completions.d.ts.map +1 -0
  43. package/dist/lib/completions.js +368 -0
  44. package/dist/lib/completions.js.map +1 -0
  45. package/dist/lib/config.d.ts.map +1 -1
  46. package/dist/lib/config.js +2 -0
  47. package/dist/lib/config.js.map +1 -1
  48. package/dist/lib/errors.d.ts +43 -0
  49. package/dist/lib/errors.d.ts.map +1 -0
  50. package/dist/lib/errors.js +251 -0
  51. package/dist/lib/errors.js.map +1 -0
  52. package/dist/lib/git.d.ts +17 -0
  53. package/dist/lib/git.d.ts.map +1 -1
  54. package/dist/lib/git.js +78 -10
  55. package/dist/lib/git.js.map +1 -1
  56. package/dist/lib/safety.d.ts +79 -0
  57. package/dist/lib/safety.d.ts.map +1 -0
  58. package/dist/lib/safety.js +133 -0
  59. package/dist/lib/safety.js.map +1 -0
  60. package/dist/lib/secrets.d.ts +29 -0
  61. package/dist/lib/secrets.d.ts.map +1 -1
  62. package/dist/lib/secrets.js +115 -0
  63. package/dist/lib/secrets.js.map +1 -1
  64. package/dist/lib/session.d.ts +93 -0
  65. package/dist/lib/session.d.ts.map +1 -0
  66. package/dist/lib/session.js +254 -0
  67. package/dist/lib/session.js.map +1 -0
  68. package/dist/lib/types.d.ts +6 -1
  69. package/dist/lib/types.d.ts.map +1 -1
  70. package/package.json +1 -1
  71. package/.claude/settings.local.json +0 -7
  72. package/src/commands/doctor.ts +0 -222
  73. package/src/commands/init.ts +0 -120
  74. package/src/commands/list.ts +0 -133
  75. package/src/commands/open.ts +0 -78
  76. package/src/commands/prune.ts +0 -36
  77. package/src/commands/rm.ts +0 -125
  78. package/src/commands/shell.ts +0 -99
  79. package/src/commands/spawn.ts +0 -169
  80. package/src/index.ts +0 -123
  81. package/src/lib/config.ts +0 -120
  82. package/src/lib/git.ts +0 -243
  83. package/src/lib/output.ts +0 -102
  84. package/src/lib/paths.ts +0 -108
  85. package/src/lib/secrets.ts +0 -193
  86. package/src/lib/types.ts +0 -69
  87. package/tests/config.test.ts +0 -102
  88. package/tests/paths.test.ts +0 -155
  89. package/tests/secrets.test.ts +0 -150
  90. package/tsconfig.json +0 -20
  91. package/vitest.config.ts +0 -15
@@ -7,6 +7,7 @@ import { createInterface } from 'node:readline';
7
7
  import { isGitRepo, getRepoRoot, listWorktrees, removeWorktree, deleteBranch, isWorktreeDirty, getCurrentBranch, } from '../lib/git.js';
8
8
  import { resolveBranchOrPath } from '../lib/paths.js';
9
9
  import * as out from '../lib/output.js';
10
+ import { fail, errors } from '../lib/errors.js';
10
11
  async function confirm(message) {
11
12
  const rl = createInterface({
12
13
  input: process.stdin,
@@ -22,8 +23,7 @@ async function confirm(message) {
22
23
  export async function rm(branchOrPath, options) {
23
24
  // Check if we're in a git repo
24
25
  if (!isGitRepo()) {
25
- out.error('Not a git repository. Run this command from within a git repo.');
26
- process.exit(1);
26
+ fail(errors.notGitRepo());
27
27
  }
28
28
  const repoRoot = getRepoRoot();
29
29
  const worktrees = listWorktrees(repoRoot);
@@ -35,26 +35,18 @@ export async function rm(branchOrPath, options) {
35
35
  // Resolve the worktree
36
36
  const resolved = resolveBranchOrPath(branchOrPath, wtList, repoRoot);
37
37
  if (!resolved) {
38
- out.error(`Worktree not found: ${branchOrPath}`);
39
- out.info('Available worktrees:');
40
- for (const wt of wtList) {
41
- out.log(` • ${wt.branch ?? '(detached)'} → ${wt.path}`);
42
- }
43
- process.exit(1);
38
+ const available = wtList.map(w => w.branch ?? w.path);
39
+ fail(errors.worktreeNotFound(branchOrPath, available));
44
40
  }
45
41
  const { path: wtPath, branch } = resolved;
46
42
  // Check if it's the main worktree (the original checkout)
47
43
  if (wtPath === repoRoot) {
48
- out.error('Cannot remove the main worktree.');
49
- out.info('This is your primary repository checkout.');
50
- process.exit(1);
44
+ fail(errors.cannotRemoveMainWorktree());
51
45
  }
52
46
  // Check if dirty
53
47
  const dirty = isWorktreeDirty(wtPath);
54
48
  if (dirty && !options.force) {
55
- out.error('Worktree has uncommitted changes.');
56
- out.info('Use --force to remove anyway (changes will be lost).');
57
- process.exit(1);
49
+ fail(errors.dirtyWorkingTree(branch ?? branchOrPath));
58
50
  }
59
51
  // Warn and confirm if dirty and force
60
52
  if (dirty && options.force && !options.yes) {
@@ -1 +1 @@
1
- {"version":3,"file":"rm.js","sourceRoot":"","sources":["../../src/commands/rm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rm.js","sourceRoot":"","sources":["../../src/commands/rm.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,12 @@ interface SpawnOptions {
8
8
  new?: boolean;
9
9
  path?: string;
10
10
  base?: string;
11
+ baseBranch?: string;
11
12
  mode?: SecretMode;
12
13
  run?: string;
13
14
  agent?: string;
15
+ finishOnExit?: boolean;
16
+ dryRun?: boolean;
14
17
  }
15
18
  export declare function spawn(branch: string, options: SpawnOptions): Promise<void>;
16
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuIhF"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA6GD,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4MhF"}
@@ -4,16 +4,107 @@
4
4
  * Create a worktree for a branch with optional secrets handling and hooks.
5
5
  */
6
6
  import { existsSync } from 'node:fs';
7
- import { isGitRepo, getRepoRoot, getRepoName, branchExists, addWorktree, listWorktrees, runCommand, commandExists, } from '../lib/git.js';
7
+ import { spawn as spawnProcess } from 'node:child_process';
8
+ import { isGitRepo, getRepoRoot, getRepoName, branchExists, addWorktree, listWorktrees, runCommand, commandExists, getCurrentBranch, isDetachedHead, getDefaultBranch, } from '../lib/git.js';
8
9
  import { getMergedConfig, configExists } from '../lib/config.js';
9
10
  import { getDefaultWorktreePath } from '../lib/paths.js';
10
- import { processSecrets } from '../lib/secrets.js';
11
+ import { processSecrets, generateCopyPlan, formatCopyPlan } from '../lib/secrets.js';
12
+ import { createSessionManifest } from '../lib/session.js';
11
13
  import * as out from '../lib/output.js';
14
+ import { fail, errors } from '../lib/errors.js';
15
+ import { finish } from './finish.js';
16
+ /**
17
+ * Run an agent command and wait for it to exit
18
+ * Returns the exit code and whether it was interrupted
19
+ */
20
+ async function runAgentWithExitHandling(command, cwd) {
21
+ return new Promise((resolve) => {
22
+ const isWindows = process.platform === 'win32';
23
+ const shell = isWindows ? 'cmd.exe' : '/bin/sh';
24
+ const shellArgs = isWindows ? ['/c', command] : ['-c', command];
25
+ let interrupted = false;
26
+ const child = spawnProcess(shell, shellArgs, {
27
+ cwd,
28
+ stdio: 'inherit',
29
+ env: process.env,
30
+ });
31
+ // Handle Ctrl+C gracefully
32
+ const sigintHandler = () => {
33
+ interrupted = true;
34
+ child.kill('SIGINT');
35
+ };
36
+ const sigtermHandler = () => {
37
+ interrupted = true;
38
+ child.kill('SIGTERM');
39
+ };
40
+ process.on('SIGINT', sigintHandler);
41
+ process.on('SIGTERM', sigtermHandler);
42
+ child.on('close', (code) => {
43
+ // Clean up signal handlers
44
+ process.removeListener('SIGINT', sigintHandler);
45
+ process.removeListener('SIGTERM', sigtermHandler);
46
+ resolve({ exitCode: code ?? 1, interrupted });
47
+ });
48
+ child.on('error', () => {
49
+ process.removeListener('SIGINT', sigintHandler);
50
+ process.removeListener('SIGTERM', sigtermHandler);
51
+ resolve({ exitCode: 1, interrupted });
52
+ });
53
+ });
54
+ }
55
+ /**
56
+ * Show post-agent menu and handle user choice
57
+ */
58
+ async function showPostAgentMenu(worktreePath, agentExitCode, interrupted) {
59
+ const readline = await import('node:readline');
60
+ // Change to worktree directory for finish command
61
+ process.chdir(worktreePath);
62
+ out.newline();
63
+ out.header('Agent Session Ended');
64
+ if (interrupted) {
65
+ out.log(out.fmt.yellow(' Agent was interrupted (Ctrl+C)'));
66
+ }
67
+ else if (agentExitCode !== 0) {
68
+ out.log(out.fmt.yellow(` Agent exited with error (code ${agentExitCode})`));
69
+ }
70
+ else {
71
+ out.log(out.fmt.green(' Agent exited successfully'));
72
+ }
73
+ out.newline();
74
+ out.log('What would you like to do?');
75
+ out.log(` ${out.fmt.bold('f')}) Finish session (commit, PR, cleanup)`);
76
+ out.log(` ${out.fmt.bold('c')}) Cleanup only (remove worktree)`);
77
+ out.log(` ${out.fmt.bold('n')}) Do nothing (exit)`);
78
+ const rl = readline.createInterface({
79
+ input: process.stdin,
80
+ output: process.stdout,
81
+ });
82
+ const answer = await new Promise((resolve) => {
83
+ rl.question('Choice [f/c/n]: ', (ans) => {
84
+ rl.close();
85
+ resolve(ans.toLowerCase().trim());
86
+ });
87
+ });
88
+ if (answer === 'f' || answer === 'finish') {
89
+ // Run finish in interactive mode
90
+ await finish({});
91
+ }
92
+ else if (answer === 'c' || answer === 'cleanup') {
93
+ // Run finish with cleanup only, skip PR
94
+ await finish({
95
+ skipCommit: true,
96
+ cleanup: true,
97
+ });
98
+ }
99
+ else {
100
+ out.log(out.fmt.dim('Exiting without cleanup.'));
101
+ out.log(` ${out.fmt.dim('Run')} cry finish ${out.fmt.dim('later to complete the session.')}`);
102
+ }
103
+ }
12
104
  export async function spawn(branch, options) {
13
105
  // Check if we're in a git repo
14
106
  if (!isGitRepo()) {
15
- out.error('Not a git repository. Run this command from within a git repo.');
16
- process.exit(1);
107
+ fail(errors.notGitRepo());
17
108
  }
18
109
  const repoRoot = getRepoRoot();
19
110
  const repoName = getRepoName();
@@ -35,26 +126,70 @@ export async function spawn(branch, options) {
35
126
  });
36
127
  // Check if destination already exists
37
128
  if (existsSync(worktreePath)) {
38
- out.error(`Destination already exists: ${worktreePath}`);
39
- out.info('Remove it first or choose a different path with --path');
40
- process.exit(1);
129
+ fail(errors.destinationExists(worktreePath));
41
130
  }
42
131
  // Check if worktree already exists for this branch
43
132
  const existingWorktrees = listWorktrees(repoRoot);
44
133
  const existingForBranch = existingWorktrees.find((w) => w.branch === branch);
45
134
  if (existingForBranch) {
46
- out.error(`A worktree already exists for branch '${branch}'`);
47
- out.info(`Path: ${existingForBranch.worktree}`);
48
- out.info('Remove it first with: cry rm ' + branch);
49
- process.exit(1);
135
+ fail(errors.worktreeAlreadyExists(branch, existingForBranch.worktree));
50
136
  }
51
137
  // Determine if we need to create the branch
52
138
  const needsNewBranch = options.new || !branchExists(branch, repoRoot);
139
+ // Determine base branch with proper fallback chain:
140
+ // 1. User-provided --base-branch option
141
+ // 2. Current branch (if not detached)
142
+ // 3. Default branch (origin/HEAD or main/master)
143
+ // 4. Error if detached HEAD and no fallback
144
+ let baseBranch;
145
+ if (options.baseBranch) {
146
+ baseBranch = options.baseBranch;
147
+ }
148
+ else if (isDetachedHead(repoRoot)) {
149
+ // Try to get default branch as fallback
150
+ const defaultBranch = getDefaultBranch(repoRoot);
151
+ if (defaultBranch) {
152
+ baseBranch = defaultBranch;
153
+ out.warn(`Detached HEAD detected. Using default branch '${defaultBranch}' as base.`);
154
+ }
155
+ else {
156
+ fail(errors.detachedHead());
157
+ }
158
+ }
159
+ else {
160
+ const currentBranch = getCurrentBranch(repoRoot);
161
+ if (currentBranch) {
162
+ baseBranch = currentBranch;
163
+ }
164
+ else {
165
+ // Fallback to default branch
166
+ const defaultBranch = getDefaultBranch(repoRoot);
167
+ baseBranch = defaultBranch ?? 'main';
168
+ }
169
+ }
53
170
  out.header('Creating worktree');
54
171
  out.log(` Branch: ${out.fmt.branch(branch)}${needsNewBranch ? out.fmt.gray(' (new)') : ''}`);
172
+ out.log(` Base: ${out.fmt.branch(baseBranch)}`);
55
173
  out.log(` Path: ${out.fmt.path(worktreePath)}`);
56
174
  out.log(` Mode: ${out.fmt.cyan(mode)}`);
57
175
  out.newline();
176
+ // Handle dry-run mode
177
+ if (options.dryRun) {
178
+ out.header('Dry Run - Copy Plan');
179
+ if (mode === 'none') {
180
+ out.log(out.fmt.dim(' Secret mode is "none" — no files will be copied/symlinked'));
181
+ }
182
+ else if (config.include.length === 0) {
183
+ out.log(out.fmt.dim(' No include patterns configured'));
184
+ }
185
+ else {
186
+ const plan = await generateCopyPlan(config.include, repoRoot);
187
+ out.log(formatCopyPlan(plan, mode));
188
+ }
189
+ out.newline();
190
+ out.log(out.fmt.dim('Dry run complete. No changes were made.'));
191
+ return;
192
+ }
58
193
  // Create the worktree
59
194
  try {
60
195
  addWorktree(worktreePath, branch, needsNewBranch, repoRoot);
@@ -64,6 +199,22 @@ export async function spawn(branch, options) {
64
199
  out.error(`Failed to create worktree: ${error.message}`);
65
200
  process.exit(1);
66
201
  }
202
+ // Create session manifest
203
+ const agentChoice = options.agent ?? 'none';
204
+ try {
205
+ const session = createSessionManifest({
206
+ repoRoot,
207
+ branch,
208
+ baseBranch,
209
+ worktreePath,
210
+ agent: agentChoice !== 'none' ? agentChoice : undefined,
211
+ });
212
+ out.success(`Session created: ${out.fmt.dim(session.id)}`);
213
+ }
214
+ catch (error) {
215
+ // Non-fatal: session manifest is helpful but not required
216
+ out.warn(`Could not create session manifest: ${error.message}`);
217
+ }
67
218
  // Handle secrets
68
219
  if (mode !== 'none' && config.include.length > 0) {
69
220
  out.newline();
@@ -106,22 +257,34 @@ export async function spawn(branch, options) {
106
257
  }
107
258
  }
108
259
  // Handle agent launch
109
- const agentChoice = options.agent ?? 'none';
110
- if (agentChoice === 'claude') {
111
- const agentCmd = config.agentCommand;
260
+ if (agentChoice === 'claude' || agentChoice === 'cursor') {
261
+ // Determine the actual command to run
262
+ // For 'claude', use config.agentCommand (defaults to 'claude')
263
+ // For 'cursor', use 'cursor' command
264
+ const agentCmd = agentChoice === 'cursor' ? 'cursor' : config.agentCommand;
112
265
  out.newline();
113
266
  if (commandExists(agentCmd)) {
114
267
  out.log(`Launching ${agentCmd}...`);
115
- await runCommand(agentCmd, worktreePath);
268
+ if (options.finishOnExit) {
269
+ // Use special handler that waits for exit and shows menu
270
+ const { exitCode, interrupted } = await runAgentWithExitHandling(agentCmd, worktreePath);
271
+ await showPostAgentMenu(worktreePath, exitCode, interrupted);
272
+ }
273
+ else {
274
+ // Just run the command normally
275
+ await runCommand(agentCmd, worktreePath);
276
+ }
116
277
  }
117
278
  else {
118
279
  out.warn(`Agent command '${agentCmd}' not found.`);
119
280
  out.info('Install Claude Code: https://docs.anthropic.com/claude-code');
120
281
  }
121
282
  }
122
- // Final summary
123
- out.newline();
124
- out.header('Worktree ready');
125
- out.log(` ${out.fmt.dim('cd')} ${worktreePath}`);
283
+ // Final summary (only if not using finish-on-exit, since finish handles its own output)
284
+ if (!options.finishOnExit || agentChoice === 'none') {
285
+ out.newline();
286
+ out.header('Worktree ready');
287
+ out.log(` ${out.fmt.dim('cd')} ${worktreePath}`);
288
+ }
126
289
  }
127
290
  //# sourceMappingURL=spawn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,10 @@
3
3
  * cry - Git worktrees made painless for vibecoders
4
4
  *
5
5
  * A CLI tool for managing git worktrees with parallel AI-agent sessions in mind.
6
+ *
7
+ * Shorthand syntax:
8
+ * cry <name> → cry spawn <name> --new
9
+ * cry <name> claude → cry spawn <name> --new --agent claude
6
10
  */
7
11
  export {};
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
package/dist/index.js CHANGED
@@ -3,6 +3,10 @@
3
3
  * cry - Git worktrees made painless for vibecoders
4
4
  *
5
5
  * A CLI tool for managing git worktrees with parallel AI-agent sessions in mind.
6
+ *
7
+ * Shorthand syntax:
8
+ * cry <name> → cry spawn <name> --new
9
+ * cry <name> claude → cry spawn <name> --new --agent claude
6
10
  */
7
11
  import { Command } from 'commander';
8
12
  import { init } from './commands/init.js';
@@ -13,11 +17,111 @@ import { rm } from './commands/rm.js';
13
17
  import { prune } from './commands/prune.js';
14
18
  import { doctor } from './commands/doctor.js';
15
19
  import { shell } from './commands/shell.js';
20
+ import { finish } from './commands/finish.js';
21
+ import { explainCopy } from './commands/explain-copy.js';
22
+ import { resume } from './commands/resume.js';
23
+ import { gc } from './commands/gc.js';
24
+ import { completions } from './commands/completions.js';
25
+ // Known subcommands - shorthand parsing must not interfere with these
26
+ const SUBCOMMANDS = new Set([
27
+ 'init',
28
+ 'spawn',
29
+ 'list', 'ls',
30
+ 'open',
31
+ 'rm', 'remove',
32
+ 'prune',
33
+ 'doctor',
34
+ 'explain-copy',
35
+ 'shell',
36
+ 'finish',
37
+ 'resume',
38
+ 'gc',
39
+ 'completions',
40
+ 'help',
41
+ ]);
42
+ // Known agent values for shorthand parsing
43
+ const KNOWN_AGENTS = new Set(['claude', 'cursor', 'none']);
44
+ /**
45
+ * Check if an argument looks like an option (starts with -)
46
+ */
47
+ function isOption(arg) {
48
+ return arg.startsWith('-');
49
+ }
50
+ /**
51
+ * Transform shorthand syntax into explicit spawn command
52
+ *
53
+ * cry feat-auth → cry spawn feat-auth --new
54
+ * cry feat-auth claude → cry spawn feat-auth --new --agent claude
55
+ */
56
+ function transformShorthand(args) {
57
+ // args[0] is 'node', args[1] is script path
58
+ // Real arguments start at index 2
59
+ const realArgs = args.slice(2);
60
+ // No arguments or first arg is an option → pass through
61
+ if (realArgs.length === 0 || isOption(realArgs[0])) {
62
+ return args;
63
+ }
64
+ const firstArg = realArgs[0];
65
+ // First arg is a known subcommand → pass through
66
+ if (SUBCOMMANDS.has(firstArg)) {
67
+ return args;
68
+ }
69
+ // First arg looks like a branch name → shorthand mode
70
+ const branchName = firstArg;
71
+ const remainingArgs = realArgs.slice(1);
72
+ // Build new args array
73
+ const newArgs = [args[0], args[1], 'spawn', branchName, '--new'];
74
+ // Check if second arg is a known agent
75
+ if (remainingArgs.length > 0 && KNOWN_AGENTS.has(remainingArgs[0])) {
76
+ const agent = remainingArgs[0];
77
+ newArgs.push('--agent', agent);
78
+ // Pass through any remaining args (options)
79
+ newArgs.push(...remainingArgs.slice(1));
80
+ }
81
+ else {
82
+ // Pass through all remaining args
83
+ newArgs.push(...remainingArgs);
84
+ }
85
+ return newArgs;
86
+ }
87
+ // Transform arguments before Commander parses them
88
+ const transformedArgs = transformShorthand(process.argv);
16
89
  const program = new Command();
17
90
  program
18
91
  .name('cry')
19
- .description('Git worktrees made painless for vibecoders running parallel AI-agent sessions')
20
- .version('1.0.0');
92
+ .description(`Git worktrees made painless for vibecoders running parallel AI-agent sessions
93
+
94
+ Shorthand syntax:
95
+ cry <name> Create worktree for new branch <name>
96
+ cry <name> claude Create worktree and launch Claude agent
97
+
98
+ Quick start:
99
+ cry init # Initialize in repo
100
+ cry feat-auth # Create worktree for new branch
101
+ cry feat-auth claude # Create and launch Claude agent
102
+
103
+ Workflow examples:
104
+ cry spawn feat-auth --new # Explicit: create new branch worktree
105
+ cry list # List all worktrees
106
+ cry open feat-auth # Open worktree in agent/editor
107
+ cry resume feat-auth # Resume session by name
108
+ cry finish # Commit, push, create PR, cleanup
109
+ cry rm feat-auth # Remove worktree
110
+
111
+ Finish flow (run from worktree):
112
+ cry finish # Interactive: commit → PR → cleanup
113
+ cry finish --dry-run # Preview what would happen
114
+ cry finish -m "Add auth" # Commit with message, create PR
115
+ cry finish --cleanup # Auto-cleanup after PR
116
+
117
+ Safety notes:
118
+ • Never auto-merges PRs
119
+ • Never deletes without confirmation (unless --yes)
120
+ • Only copies gitignored files to worktrees (secrets safety)
121
+
122
+ Shell completions:
123
+ cry completions fish > ~/.config/fish/completions/cry.fish`)
124
+ .version('1.5.0');
21
125
  // cry init
22
126
  program
23
127
  .command('init')
@@ -33,9 +137,12 @@ program
33
137
  .option('-n, --new', 'Create a new branch (equivalent to git worktree add -b)')
34
138
  .option('-p, --path <dir>', 'Explicit path for the worktree')
35
139
  .option('-b, --base <dir>', 'Base directory for worktrees')
140
+ .option('--base-branch <branch>', 'Base branch for PRs (default: current branch)')
36
141
  .option('-m, --mode <mode>', 'Secret handling mode: copy, symlink, or none', 'copy')
37
142
  .option('-r, --run <cmd>', 'Command to run after creating worktree')
38
143
  .option('-a, --agent <agent>', 'Launch agent after setup: claude or none', 'none')
144
+ .option('--finish-on-exit', 'After agent exits, show finish menu (commit, PR, cleanup)')
145
+ .option('--dry-run', 'Show what would happen without creating the worktree')
39
146
  .action(async (branch, options) => {
40
147
  const mode = options.mode;
41
148
  if (!['copy', 'symlink', 'none'].includes(mode)) {
@@ -46,9 +153,12 @@ program
46
153
  new: options.new,
47
154
  path: options.path,
48
155
  base: options.base,
156
+ baseBranch: options.baseBranch,
49
157
  mode,
50
158
  run: options.run,
51
159
  agent: options.agent,
160
+ finishOnExit: options.finishOnExit,
161
+ dryRun: options.dryRun,
52
162
  });
53
163
  });
54
164
  // cry list
@@ -60,14 +170,21 @@ program
60
170
  .action(async (options) => {
61
171
  await list({ json: options.json });
62
172
  });
63
- // cry open <branch-or-path>
173
+ // cry open [branch-or-path]
64
174
  program
65
- .command('open <branch-or-path>')
66
- .description('Open or navigate to a worktree by branch name or path')
67
- .option('-c, --cmd <cmd>', 'Command to execute in the worktree directory')
175
+ .command('open [branch-or-path]')
176
+ .description('Open a worktree in agent (Claude) or editor (VS Code)')
177
+ .option('-c, --cmd <cmd>', 'Custom command to execute in the worktree directory')
68
178
  .option('-p, --path-only', 'Only print the path (for scripting)')
179
+ .option('-a, --agent', 'Open in agent (Claude Code)')
180
+ .option('-e, --editor', 'Open in editor (VS Code)')
69
181
  .action(async (branchOrPath, options) => {
70
- await open(branchOrPath, { cmd: options.cmd, pathOnly: options.pathOnly });
182
+ await open(branchOrPath, {
183
+ cmd: options.cmd,
184
+ pathOnly: options.pathOnly,
185
+ agent: options.agent,
186
+ editor: options.editor,
187
+ });
71
188
  });
72
189
  // cry rm <branch-or-path>
73
190
  program
@@ -98,6 +215,14 @@ program
98
215
  .action(async () => {
99
216
  await doctor();
100
217
  });
218
+ // cry explain-copy
219
+ program
220
+ .command('explain-copy')
221
+ .description('Explain which files will be copied/symlinked and which are blocked')
222
+ .option('-j, --json', 'Output as JSON')
223
+ .action(async (options) => {
224
+ await explainCopy({ json: options.json });
225
+ });
101
226
  // cry shell
102
227
  program
103
228
  .command('shell')
@@ -106,6 +231,70 @@ program
106
231
  .action(async (options) => {
107
232
  await shell({ shell: options.shell });
108
233
  });
109
- // Parse and execute
110
- program.parse();
234
+ // cry finish
235
+ program
236
+ .command('finish')
237
+ .description('Complete session: show summary, optionally create PR, and cleanup')
238
+ .option('-j, --json', 'Output as JSON (summary only, no actions)')
239
+ .option('-m, --message <msg>', 'Commit message (stages all, commits, non-interactive)')
240
+ .option('--skip-commit', 'Skip commit step entirely (still safe)')
241
+ .option('--dry-run', 'Show what would happen without executing')
242
+ .option('--pr', 'Force PR creation path')
243
+ .option('--cleanup', 'Auto-cleanup after successful PR (skip prompt)')
244
+ .option('--skip-cleanup', 'Skip cleanup prompt entirely')
245
+ .option('--non-interactive', 'Never prompt; errors on dirty unless --allow-dirty')
246
+ .option('--allow-dirty', 'Allow proceeding with dirty working tree in non-interactive mode')
247
+ .option('--delete-branch', 'Delete branch during cleanup (with --cleanup)')
248
+ .action(async (options) => {
249
+ await finish({
250
+ json: options.json,
251
+ message: options.message,
252
+ skipCommit: options.skipCommit,
253
+ dryRun: options.dryRun,
254
+ pr: options.pr,
255
+ cleanup: options.cleanup,
256
+ noCleanup: options.skipCleanup,
257
+ nonInteractive: options.nonInteractive,
258
+ allowDirty: options.allowDirty,
259
+ deleteBranch: options.deleteBranch,
260
+ });
261
+ });
262
+ // cry resume <nameOrId>
263
+ program
264
+ .command('resume <nameOrId>')
265
+ .description('Resume an existing session by branch name or session ID')
266
+ .option('-a, --agent <agent>', 'Launch agent in the session (e.g., claude)')
267
+ .option('--cd', 'Print cd command for shell copy/paste')
268
+ .action(async (nameOrId, options) => {
269
+ await resume(nameOrId, {
270
+ agent: options.agent,
271
+ cd: options.cd,
272
+ });
273
+ });
274
+ // cry gc
275
+ program
276
+ .command('gc')
277
+ .description('Clean up stale session manifests and git worktree references')
278
+ .option('--dry-run', 'Show what would be cleaned without making changes')
279
+ .option('-y, --yes', 'Skip confirmation prompts')
280
+ .option('--manifests-only', 'Only remove stale manifests, skip git worktree prune')
281
+ .action(async (options) => {
282
+ await gc({
283
+ dryRun: options.dryRun,
284
+ yes: options.yes,
285
+ manifestsOnly: options.manifestsOnly,
286
+ });
287
+ });
288
+ // cry completions [shell]
289
+ program
290
+ .command('completions [shell]')
291
+ .description('Generate shell completions (bash, zsh, fish)')
292
+ .option('-s, --shell <shell>', 'Shell type (bash, zsh, fish)')
293
+ .action(async (shell, options) => {
294
+ await completions(shell, {
295
+ shell: options.shell,
296
+ });
297
+ });
298
+ // Parse with transformed arguments
299
+ program.parse(transformedArgs);
111
300
  //# sourceMappingURL=index.js.map