wt-manager 1.4.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.
- package/LICENSE +21 -0
- package/README.md +343 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +26 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/clean.d.ts +3 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +339 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +12 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +202 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +147 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +192 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/wt.d.ts +3 -0
- package/dist/commands/wt.d.ts.map +1 -0
- package/dist/commands/wt.js +78 -0
- package/dist/commands/wt.js.map +1 -0
- package/dist/commands/wtclean.d.ts +3 -0
- package/dist/commands/wtclean.d.ts.map +1 -0
- package/dist/commands/wtclean.js +190 -0
- package/dist/commands/wtclean.js.map +1 -0
- package/dist/commands/wtlist.d.ts +3 -0
- package/dist/commands/wtlist.d.ts.map +1 -0
- package/dist/commands/wtlist.js +202 -0
- package/dist/commands/wtlist.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +23 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/git.d.ts +45 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +202 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/github.d.ts +21 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +113 -0
- package/dist/utils/github.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { join, dirname, basename } from 'node:path';
|
|
5
|
+
import { symlink, copyFile, mkdir, readFile, cp, readdir } from 'node:fs/promises';
|
|
6
|
+
import { existsSync, statSync } from 'node:fs';
|
|
7
|
+
import { execa } from 'execa';
|
|
8
|
+
import { getMainWorktreePath, getDefaultBranch, branchExists, ensureDir, createWorktree, fetchOrigin, } from '../utils/git.js';
|
|
9
|
+
import { copyToClipboard } from '../utils/clipboard.js';
|
|
10
|
+
export function newCommand() {
|
|
11
|
+
const cmd = new Command('new');
|
|
12
|
+
cmd
|
|
13
|
+
.description('Create new worktree with branch')
|
|
14
|
+
.argument('<branch-name>', 'Name of the branch to create worktree for')
|
|
15
|
+
.argument('[base-branch]', 'Base branch to create from (default: auto-detected)')
|
|
16
|
+
.action(async (branchName, baseBranch) => {
|
|
17
|
+
const spinner = ora();
|
|
18
|
+
try {
|
|
19
|
+
if (await branchExists(branchName)) {
|
|
20
|
+
console.error(chalk.red(`Error: Branch '${branchName}' already exists locally`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
spinner.start('Creating worktree...');
|
|
24
|
+
const mainWorktreePath = await getMainWorktreePath();
|
|
25
|
+
const repoName = basename(mainWorktreePath);
|
|
26
|
+
const worktreeBaseDir = join(dirname(mainWorktreePath), `${repoName}-worktrees`);
|
|
27
|
+
const dirName = branchName.replace(/\//g, '-');
|
|
28
|
+
const worktreePath = join(worktreeBaseDir, dirName);
|
|
29
|
+
const base = baseBranch || (await getDefaultBranch());
|
|
30
|
+
let useRemoteBase = true;
|
|
31
|
+
try {
|
|
32
|
+
spinner.text = 'Fetching latest from origin...';
|
|
33
|
+
await fetchOrigin();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
spinner.stop();
|
|
37
|
+
console.log(chalk.yellow(`⚠ Warning: Could not fetch from origin, using local '${base}'`));
|
|
38
|
+
spinner.start('Creating worktree...');
|
|
39
|
+
useRemoteBase = false;
|
|
40
|
+
}
|
|
41
|
+
await ensureDir(worktreeBaseDir);
|
|
42
|
+
const actualBase = useRemoteBase ? `origin/${base}` : base;
|
|
43
|
+
await createWorktree(branchName, worktreePath, actualBase);
|
|
44
|
+
spinner.stop();
|
|
45
|
+
console.log(chalk.green(`✓ Created worktree for branch '${branchName}'`));
|
|
46
|
+
try {
|
|
47
|
+
const mainRoot = mainWorktreePath;
|
|
48
|
+
const sourceEnvPath = join(mainRoot, '.env');
|
|
49
|
+
const targetEnvPath = join(worktreePath, '.env');
|
|
50
|
+
if (existsSync(sourceEnvPath)) {
|
|
51
|
+
await symlink(sourceEnvPath, targetEnvPath);
|
|
52
|
+
console.log(chalk.gray(' Symlinked .env from main worktree'));
|
|
53
|
+
}
|
|
54
|
+
const sourceSettingsPath = join(mainRoot, '.claude', 'settings.local.json');
|
|
55
|
+
const targetSettingsPath = join(worktreePath, '.claude', 'settings.local.json');
|
|
56
|
+
if (existsSync(sourceSettingsPath)) {
|
|
57
|
+
await mkdir(dirname(targetSettingsPath), { recursive: true });
|
|
58
|
+
await copyFile(sourceSettingsPath, targetSettingsPath);
|
|
59
|
+
console.log(chalk.gray(' Copied .claude/settings.local.json from main worktree'));
|
|
60
|
+
}
|
|
61
|
+
const sourceIdeaPath = join(mainRoot, '.idea');
|
|
62
|
+
const targetIdeaPath = join(worktreePath, '.idea');
|
|
63
|
+
if (existsSync(sourceIdeaPath)) {
|
|
64
|
+
let copiedAny = false;
|
|
65
|
+
await mkdir(targetIdeaPath, { recursive: true });
|
|
66
|
+
const dirsTocp = ['runConfigurations', 'codeStyles', 'inspectionProfiles', 'scopes'];
|
|
67
|
+
for (const dir of dirsTocp) {
|
|
68
|
+
const sourceDir = join(sourceIdeaPath, dir);
|
|
69
|
+
const targetDir = join(targetIdeaPath, dir);
|
|
70
|
+
if (existsSync(sourceDir) && statSync(sourceDir).isDirectory()) {
|
|
71
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
72
|
+
copiedAny = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const filesToCopy = ['modules.xml', 'vcs.xml', 'encodings.xml', 'misc.xml'];
|
|
76
|
+
for (const file of filesToCopy) {
|
|
77
|
+
const sourceFile = join(sourceIdeaPath, file);
|
|
78
|
+
const targetFile = join(targetIdeaPath, file);
|
|
79
|
+
if (existsSync(sourceFile)) {
|
|
80
|
+
await copyFile(sourceFile, targetFile);
|
|
81
|
+
copiedAny = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const ideaFiles = await readdir(sourceIdeaPath);
|
|
85
|
+
for (const file of ideaFiles) {
|
|
86
|
+
if (file.endsWith('.iml')) {
|
|
87
|
+
const sourceFile = join(sourceIdeaPath, file);
|
|
88
|
+
const targetFile = join(targetIdeaPath, file);
|
|
89
|
+
if (existsSync(sourceFile)) {
|
|
90
|
+
await copyFile(sourceFile, targetFile);
|
|
91
|
+
copiedAny = true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (copiedAny) {
|
|
96
|
+
console.log(chalk.gray(' Copied WebStorm settings from main worktree'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const packageJsonPath = join(worktreePath, 'package.json');
|
|
104
|
+
if (existsSync(packageJsonPath)) {
|
|
105
|
+
const packageJsonContent = await readFile(packageJsonPath, 'utf-8');
|
|
106
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
107
|
+
const hookScript = packageJson.scripts?.['post-worktree-created'];
|
|
108
|
+
if (hookScript) {
|
|
109
|
+
spinner.stop();
|
|
110
|
+
console.log(chalk.blue(`→ Running post-worktree-created: ${hookScript}`));
|
|
111
|
+
spinner.start('Executing hook...');
|
|
112
|
+
await execa('npm', ['run', 'post-worktree-created'], {
|
|
113
|
+
cwd: worktreePath,
|
|
114
|
+
});
|
|
115
|
+
spinner.stop();
|
|
116
|
+
console.log(chalk.green('✓ Post-worktree hook completed'));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
spinner.stop();
|
|
122
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
123
|
+
console.log(chalk.yellow(`⚠ Warning: Post-worktree hook failed: ${errorMessage}`));
|
|
124
|
+
}
|
|
125
|
+
console.log();
|
|
126
|
+
const copied = await copyToClipboard(worktreePath);
|
|
127
|
+
if (copied) {
|
|
128
|
+
console.log(chalk.cyan(`cd ${worktreePath}`), chalk.gray('(path copied to clipboard)'));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log(chalk.cyan(`cd ${worktreePath}`));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
spinner.stop();
|
|
136
|
+
if (error instanceof Error) {
|
|
137
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
141
|
+
}
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return cmd;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBnC,wBAAgB,aAAa,YA0O5B"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { select } from '@inquirer/prompts';
|
|
5
|
+
import { basename, dirname, join } from 'node:path';
|
|
6
|
+
import { listWorktrees, getRepoName, hasUncommittedChanges, removeWorktree, deleteBranch, hasUnpushedCommits, getWorktreeChanges, getGitDiff, forceRemoveDirectory, pruneWorktrees, } from '../utils/git.js';
|
|
7
|
+
export function removeCommand() {
|
|
8
|
+
const cmd = new Command('remove');
|
|
9
|
+
cmd
|
|
10
|
+
.description('Remove a specific worktree and its branch')
|
|
11
|
+
.argument('<name>', 'Worktree name (branch name or directory name)')
|
|
12
|
+
.option('--keep-branch', 'Keep the local branch after removing worktree')
|
|
13
|
+
.option('-f, --force', 'Force removal even if there are uncommitted changes or unpushed commits')
|
|
14
|
+
.action(async (name, options) => {
|
|
15
|
+
const spinner = ora('Finding worktree...').start();
|
|
16
|
+
try {
|
|
17
|
+
const repoName = await getRepoName();
|
|
18
|
+
const worktrees = await listWorktrees();
|
|
19
|
+
const mainWorktree = worktrees[0];
|
|
20
|
+
const worktreesDir = join(dirname(mainWorktree.path), `${repoName}-worktrees`);
|
|
21
|
+
const filteredWorktrees = worktrees.filter((wt) => wt.path.includes(worktreesDir));
|
|
22
|
+
if (filteredWorktrees.length === 0) {
|
|
23
|
+
spinner.stop();
|
|
24
|
+
console.log(chalk.yellow(`No worktrees found in ${worktreesDir}`));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let matchedWorktree = filteredWorktrees.find((wt) => wt.branch === name);
|
|
28
|
+
if (!matchedWorktree) {
|
|
29
|
+
matchedWorktree = filteredWorktrees.find((wt) => basename(wt.path) === name);
|
|
30
|
+
}
|
|
31
|
+
if (!matchedWorktree) {
|
|
32
|
+
spinner.stop();
|
|
33
|
+
console.error(chalk.red(`Error: No worktree found matching '${name}'`));
|
|
34
|
+
console.log(chalk.gray(`\nRun 'wt list' to see available worktrees`));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const worktreePath = matchedWorktree.path;
|
|
38
|
+
const worktreeDirname = basename(worktreePath);
|
|
39
|
+
const branch = matchedWorktree.branch || 'unknown';
|
|
40
|
+
spinner.text = 'Checking for uncommitted changes...';
|
|
41
|
+
const uncommitted = await hasUncommittedChanges(worktreePath);
|
|
42
|
+
let hasUnpushed = false;
|
|
43
|
+
let noRemote = false;
|
|
44
|
+
if (!options.keepBranch && branch && branch !== 'unknown') {
|
|
45
|
+
spinner.text = 'Checking for unpushed commits...';
|
|
46
|
+
const pushStatus = await hasUnpushedCommits(branch);
|
|
47
|
+
hasUnpushed = pushStatus.hasUnpushed;
|
|
48
|
+
noRemote = pushStatus.noRemote;
|
|
49
|
+
}
|
|
50
|
+
spinner.stop();
|
|
51
|
+
console.log(chalk.bold(`Worktree: ${worktreeDirname}`));
|
|
52
|
+
console.log(chalk.gray(` Path: ${worktreePath}`));
|
|
53
|
+
console.log(chalk.gray(` Branch: ${branch}`));
|
|
54
|
+
console.log();
|
|
55
|
+
if (uncommitted && !options.force) {
|
|
56
|
+
const changes = await getWorktreeChanges(worktreePath);
|
|
57
|
+
console.log(chalk.yellow('⚠ Uncommitted changes detected:'));
|
|
58
|
+
console.log();
|
|
59
|
+
if (changes.modified.length > 0) {
|
|
60
|
+
console.log(chalk.bold('Modified:'));
|
|
61
|
+
for (const line of changes.modified) {
|
|
62
|
+
console.log(` ${line}`);
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
}
|
|
66
|
+
if (changes.untracked.length > 0) {
|
|
67
|
+
console.log(chalk.bold('Untracked:'));
|
|
68
|
+
for (const line of changes.untracked) {
|
|
69
|
+
console.log(` ${line}`);
|
|
70
|
+
}
|
|
71
|
+
console.log();
|
|
72
|
+
}
|
|
73
|
+
let showedDiff = false;
|
|
74
|
+
let shouldRemove = false;
|
|
75
|
+
while (!shouldRemove) {
|
|
76
|
+
const choices = showedDiff
|
|
77
|
+
? [
|
|
78
|
+
{ name: 'Discard changes and remove', value: 'remove' },
|
|
79
|
+
{ name: 'Abort', value: 'abort' },
|
|
80
|
+
]
|
|
81
|
+
: [
|
|
82
|
+
{ name: 'Show diff', value: 'diff' },
|
|
83
|
+
{ name: 'Discard changes and remove', value: 'remove' },
|
|
84
|
+
{ name: 'Abort', value: 'abort' },
|
|
85
|
+
];
|
|
86
|
+
const action = await select({
|
|
87
|
+
message: 'What would you like to do?',
|
|
88
|
+
choices,
|
|
89
|
+
});
|
|
90
|
+
if (action === 'abort') {
|
|
91
|
+
console.log(chalk.yellow('Aborted.'));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (action === 'diff') {
|
|
95
|
+
const diff = await getGitDiff(worktreePath);
|
|
96
|
+
console.log();
|
|
97
|
+
console.log('─'.repeat(60));
|
|
98
|
+
if (diff) {
|
|
99
|
+
console.log(diff);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(chalk.gray('No diff available (only untracked files)'));
|
|
103
|
+
}
|
|
104
|
+
console.log('─'.repeat(60));
|
|
105
|
+
console.log();
|
|
106
|
+
showedDiff = true;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (action === 'remove') {
|
|
110
|
+
shouldRemove = true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if ((hasUnpushed || noRemote) && !options.keepBranch && !options.force) {
|
|
115
|
+
if (hasUnpushed) {
|
|
116
|
+
console.log(chalk.yellow(`⚠ Warning: Branch '${branch}' has unpushed commits`));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(chalk.yellow(`⚠ Warning: Branch '${branch}' has no remote tracking branch`));
|
|
120
|
+
}
|
|
121
|
+
const action = await select({
|
|
122
|
+
message: 'What would you like to do?',
|
|
123
|
+
choices: [
|
|
124
|
+
{ name: 'Delete branch anyway', value: 'delete' },
|
|
125
|
+
{ name: 'Keep branch (only remove worktree)', value: 'keep' },
|
|
126
|
+
{ name: 'Abort', value: 'abort' },
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
if (action === 'abort') {
|
|
130
|
+
console.log(chalk.yellow('Aborted.'));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (action === 'keep') {
|
|
134
|
+
options.keepBranch = true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (options.force) {
|
|
138
|
+
if (uncommitted) {
|
|
139
|
+
console.log(chalk.yellow(`⚠ Warning: Removing worktree with uncommitted changes`));
|
|
140
|
+
}
|
|
141
|
+
if (hasUnpushed && !options.keepBranch) {
|
|
142
|
+
console.log(chalk.yellow(`⚠ Warning: Deleting branch with unpushed commits`));
|
|
143
|
+
}
|
|
144
|
+
if (noRemote && !options.keepBranch) {
|
|
145
|
+
console.log(chalk.yellow(`⚠ Warning: Deleting branch with no remote tracking`));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
spinner.text = 'Removing worktree...';
|
|
150
|
+
spinner.start();
|
|
151
|
+
try {
|
|
152
|
+
await removeWorktree(worktreePath, true);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
spinner.text = 'Force removing directory...';
|
|
156
|
+
await forceRemoveDirectory(worktreePath);
|
|
157
|
+
await pruneWorktrees();
|
|
158
|
+
}
|
|
159
|
+
spinner.stop();
|
|
160
|
+
console.log(chalk.green(`✓ Removed worktree: ${worktreeDirname}`));
|
|
161
|
+
if (!options.keepBranch && branch && branch !== 'unknown') {
|
|
162
|
+
try {
|
|
163
|
+
await deleteBranch(branch, true);
|
|
164
|
+
console.log(chalk.green(`✓ Deleted branch: ${branch}`));
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.log(chalk.yellow(`⚠ Could not delete branch: ${branch}`));
|
|
168
|
+
if (error instanceof Error) {
|
|
169
|
+
console.log(chalk.gray(` ${error.message}`));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (options.keepBranch) {
|
|
174
|
+
console.log(chalk.gray(`Branch '${branch}' kept`));
|
|
175
|
+
}
|
|
176
|
+
console.log();
|
|
177
|
+
console.log(chalk.gray("Run 'wt list' to see remaining worktrees"));
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
spinner.stop();
|
|
181
|
+
if (error instanceof Error) {
|
|
182
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
186
|
+
}
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
return cmd;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wt.d.ts","sourceRoot":"","sources":["../../src/commands/wt.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { join, dirname } from 'node:path';
|
|
6
|
+
import { symlink, copyFile, mkdir } from 'node:fs/promises';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { execa } from 'execa';
|
|
9
|
+
import { getRepoName, getDefaultBranch, branchExists, ensureDir, createWorktree, } from '../utils/git.js';
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('wt')
|
|
13
|
+
.description('Create new worktree with branch')
|
|
14
|
+
.argument('<branch-name>', 'Name of the branch to create worktree for')
|
|
15
|
+
.argument('[base-branch]', 'Base branch to create from (default: auto-detected)')
|
|
16
|
+
.action(async (branchName, baseBranch) => {
|
|
17
|
+
const spinner = ora();
|
|
18
|
+
try {
|
|
19
|
+
if (await branchExists(branchName)) {
|
|
20
|
+
console.error(chalk.red(`Error: Branch '${branchName}' already exists locally`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
spinner.start('Creating worktree...');
|
|
24
|
+
const repoName = await getRepoName();
|
|
25
|
+
const worktreeBaseDir = join('..', `${repoName}-worktrees`);
|
|
26
|
+
const dirName = branchName.replace(/\//g, '-');
|
|
27
|
+
const worktreePath = join(worktreeBaseDir, dirName);
|
|
28
|
+
const base = baseBranch || (await getDefaultBranch());
|
|
29
|
+
await ensureDir(worktreeBaseDir);
|
|
30
|
+
await createWorktree(branchName, worktreePath, base);
|
|
31
|
+
let envSymlinked = false;
|
|
32
|
+
let settingsCopied = false;
|
|
33
|
+
try {
|
|
34
|
+
const { stdout: mainWorktreeRoot } = await execa('git', [
|
|
35
|
+
'rev-parse',
|
|
36
|
+
'--show-toplevel',
|
|
37
|
+
]);
|
|
38
|
+
const mainRoot = mainWorktreeRoot.trim();
|
|
39
|
+
const sourceEnvPath = join(mainRoot, '.env');
|
|
40
|
+
const targetEnvPath = join(worktreePath, '.env');
|
|
41
|
+
if (existsSync(sourceEnvPath)) {
|
|
42
|
+
await symlink(sourceEnvPath, targetEnvPath);
|
|
43
|
+
envSymlinked = true;
|
|
44
|
+
}
|
|
45
|
+
const sourceSettingsPath = join(mainRoot, '.claude', 'settings.local.json');
|
|
46
|
+
const targetSettingsPath = join(worktreePath, '.claude', 'settings.local.json');
|
|
47
|
+
if (existsSync(sourceSettingsPath)) {
|
|
48
|
+
await mkdir(dirname(targetSettingsPath), { recursive: true });
|
|
49
|
+
await copyFile(sourceSettingsPath, targetSettingsPath);
|
|
50
|
+
settingsCopied = true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
}
|
|
55
|
+
spinner.stop();
|
|
56
|
+
console.log(chalk.green(`✓ Created worktree for branch '${branchName}'`));
|
|
57
|
+
if (envSymlinked) {
|
|
58
|
+
console.log(chalk.gray(' Symlinked .env from main worktree'));
|
|
59
|
+
}
|
|
60
|
+
if (settingsCopied) {
|
|
61
|
+
console.log(chalk.gray(' Copied .claude/settings.local.json from main worktree'));
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
console.log(chalk.cyan(`cd ${worktreePath}`));
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
spinner.stop();
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
73
|
+
}
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
program.parse();
|
|
78
|
+
//# sourceMappingURL=wt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wt.js","sourceRoot":"","sources":["../../src/commands/wt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wtclean.d.ts","sourceRoot":"","sources":["../../src/commands/wtclean.ts"],"names":[],"mappings":""}
|