@mcadam/worktree 1.0.0 → 1.2.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/README.md +8 -8
- package/dist/cli.js +18 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +86 -5
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +17 -12
- package/dist/commands/list.js.map +1 -1
- package/dist/components/WorktreeList.d.ts +1 -1
- package/dist/components/WorktreeList.d.ts.map +1 -1
- package/dist/components/WorktreeList.js +2 -2
- package/dist/components/WorktreeList.js.map +1 -1
- package/dist/utils/gh.d.ts +11 -5
- package/dist/utils/gh.d.ts.map +1 -1
- package/dist/utils/gh.js +90 -17
- package/dist/utils/gh.js.map +1 -1
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +7 -3
- package/dist/utils/git.js.map +1 -1
- package/package.json +14 -13
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Transform your Git workflow with blazing-fast worktree management across multiple repositories** ⚡
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/@mcadam/worktree)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
[](https://nodejs.org/)
|
|
@@ -47,13 +47,13 @@ Select multiple worktrees with spacebar and delete them all at once. Spring clea
|
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
49
|
# npm
|
|
50
|
-
npm install -g worktree
|
|
50
|
+
npm install -g @mcadam/worktree
|
|
51
51
|
|
|
52
52
|
# pnpm (recommended)
|
|
53
|
-
pnpm add -g worktree
|
|
53
|
+
pnpm add -g @mcadam/worktree
|
|
54
54
|
|
|
55
55
|
# yarn
|
|
56
|
-
yarn global add worktree
|
|
56
|
+
yarn global add @mcadam/worktree
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
## 🚀 Quick Start
|
|
@@ -241,8 +241,8 @@ Want to contribute? Awesome! Here's how to get started:
|
|
|
241
241
|
|
|
242
242
|
```bash
|
|
243
243
|
# Clone the repo
|
|
244
|
-
git clone https://github.com/
|
|
245
|
-
cd worktree
|
|
244
|
+
git clone https://github.com/un/worktree.git
|
|
245
|
+
cd worktree
|
|
246
246
|
|
|
247
247
|
# Install dependencies
|
|
248
248
|
pnpm install
|
|
@@ -302,7 +302,7 @@ MIT © [Your Name]
|
|
|
302
302
|
|
|
303
303
|
**Built with 💙 by developers, for developers**
|
|
304
304
|
|
|
305
|
-
[Report Bug](https://github.com/
|
|
305
|
+
[Report Bug](https://github.com/un/worktree/issues) · [Request Feature](https://github.com/un/worktree/issues) · [Star on GitHub](https://github.com/un/worktree)
|
|
306
306
|
|
|
307
307
|
</div>
|
|
308
308
|
|
|
@@ -312,4 +312,4 @@ MIT © [Your Name]
|
|
|
312
312
|
|
|
313
313
|
### 🌟 Don't forget to star this repo if you find it useful! 🌟
|
|
314
314
|
|
|
315
|
-
</div>
|
|
315
|
+
</div>
|
package/dist/cli.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
2
3
|
import { program } from 'commander';
|
|
3
|
-
import {
|
|
4
|
-
import { configManager } from './config/manager.js';
|
|
4
|
+
import { configCommand } from './commands/config.js';
|
|
5
5
|
import { createCommand } from './commands/create.js';
|
|
6
|
-
import { listCommand } from './commands/list.js';
|
|
7
6
|
import { initCommand } from './commands/init.js';
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
import { listCommand } from './commands/list.js';
|
|
8
|
+
import { getGitRoot, isGitRepo } from './config/detector.js';
|
|
9
|
+
import { configManager } from './config/manager.js';
|
|
10
|
+
function getPackageVersion() {
|
|
11
|
+
const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
12
|
+
return packageJson.version;
|
|
13
|
+
}
|
|
14
|
+
async function getGitRootOrExit() {
|
|
11
15
|
if (!(await isGitRepo())) {
|
|
12
16
|
console.error('Error: Not in a git repository');
|
|
13
17
|
process.exit(1);
|
|
@@ -17,16 +21,19 @@ async function main() {
|
|
|
17
21
|
console.error('Error: Could not determine git root');
|
|
18
22
|
process.exit(1);
|
|
19
23
|
}
|
|
20
|
-
// Load config
|
|
21
24
|
await configManager.load();
|
|
25
|
+
return gitRoot;
|
|
26
|
+
}
|
|
27
|
+
async function main() {
|
|
22
28
|
program
|
|
23
29
|
.name('worktree')
|
|
24
30
|
.description('CLI tool for managing Git worktrees across multiple repositories')
|
|
25
|
-
.version(
|
|
31
|
+
.version(getPackageVersion());
|
|
26
32
|
program
|
|
27
33
|
.argument('[branch]', 'Branch name to create worktree for')
|
|
28
34
|
.description('Create a new worktree or manage existing ones')
|
|
29
35
|
.action(async (branch) => {
|
|
36
|
+
const gitRoot = await getGitRootOrExit();
|
|
30
37
|
if (branch) {
|
|
31
38
|
// Create worktree
|
|
32
39
|
await createCommand(branch, gitRoot);
|
|
@@ -40,18 +47,21 @@ async function main() {
|
|
|
40
47
|
.command('list')
|
|
41
48
|
.description('List and manage worktrees across all configured repositories')
|
|
42
49
|
.action(async () => {
|
|
50
|
+
const gitRoot = await getGitRootOrExit();
|
|
43
51
|
await listCommand(gitRoot);
|
|
44
52
|
});
|
|
45
53
|
program
|
|
46
54
|
.command('init')
|
|
47
55
|
.description('Initialize configuration for current repository')
|
|
48
56
|
.action(async () => {
|
|
57
|
+
const gitRoot = await getGitRootOrExit();
|
|
49
58
|
await initCommand(gitRoot);
|
|
50
59
|
});
|
|
51
60
|
program
|
|
52
61
|
.command('config')
|
|
53
62
|
.description('Manage worktree configuration')
|
|
54
63
|
.action(async () => {
|
|
64
|
+
const gitRoot = await getGitRootOrExit();
|
|
55
65
|
await configCommand(gitRoot);
|
|
56
66
|
});
|
|
57
67
|
await program.parseAsync(process.argv);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,SAAS,iBAAiB;IACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC3C,CAAA;IAExB,OAAO,WAAW,CAAC,OAAO,CAAA;AAC5B,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;IAC1B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAE/B,OAAO;SACJ,QAAQ,CAAC,UAAU,EAAE,oCAAoC,CAAC;SAC1D,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;QAExC,IAAI,MAAM,EAAE,CAAC;YACX,kBAAkB;YAClB,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;QACxC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;QACxC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;QACxC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEJ,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAuGA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFlF"}
|
package/dist/commands/create.js
CHANGED
|
@@ -1,18 +1,90 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import readline from 'node:readline';
|
|
3
|
+
import chalk from 'chalk';
|
|
1
4
|
import { execa } from 'execa';
|
|
2
5
|
import fs from 'fs-extra';
|
|
3
|
-
import path from 'path';
|
|
4
6
|
import ora from 'ora';
|
|
5
|
-
import chalk from 'chalk';
|
|
6
7
|
import { configManager } from '../config/manager.js';
|
|
7
|
-
import { createWorktreeName } from '../utils/sanitize.js';
|
|
8
8
|
import { createWorktree } from '../utils/git.js';
|
|
9
|
+
import { createWorktreeName } from '../utils/sanitize.js';
|
|
9
10
|
import { initCommand } from './init.js';
|
|
11
|
+
async function isWorktreeClean(gitRoot) {
|
|
12
|
+
const { stdout } = await execa('git', ['status', '--porcelain'], { cwd: gitRoot });
|
|
13
|
+
return stdout.trim().length === 0;
|
|
14
|
+
}
|
|
15
|
+
async function promptDirtyWorktreeAction() {
|
|
16
|
+
console.log(chalk.yellow('\nLocal changes detected. Choose how to continue:'));
|
|
17
|
+
console.log(chalk.cyan(' [s] stash and pop (default)'));
|
|
18
|
+
console.log(chalk.cyan(" [d] don't pull remote"));
|
|
19
|
+
console.log(chalk.cyan(' [c] cancel'));
|
|
20
|
+
console.log(chalk.gray('Defaulting to stash and pop in 5 seconds.'));
|
|
21
|
+
const answer = await new Promise((resolve) => {
|
|
22
|
+
const rl = readline.createInterface({
|
|
23
|
+
input: process.stdin,
|
|
24
|
+
output: process.stdout,
|
|
25
|
+
});
|
|
26
|
+
let settled = false;
|
|
27
|
+
const finish = (value) => {
|
|
28
|
+
if (settled)
|
|
29
|
+
return;
|
|
30
|
+
settled = true;
|
|
31
|
+
clearTimeout(timeout);
|
|
32
|
+
rl.close();
|
|
33
|
+
resolve(value);
|
|
34
|
+
};
|
|
35
|
+
const timeout = setTimeout(() => {
|
|
36
|
+
process.stdout.write('\n');
|
|
37
|
+
finish();
|
|
38
|
+
}, 5000);
|
|
39
|
+
rl.question('Selection: ', finish);
|
|
40
|
+
});
|
|
41
|
+
const normalized = (answer ?? '').trim().toLowerCase();
|
|
42
|
+
if (!normalized || ['s', 'stash', 'stash and pop', 'stash-and-pop'].includes(normalized)) {
|
|
43
|
+
return 'stash-and-pop';
|
|
44
|
+
}
|
|
45
|
+
if (['d', 'dont', "don't", 'dont pull', "don't pull", 'no pull'].includes(normalized)) {
|
|
46
|
+
return 'dont-pull';
|
|
47
|
+
}
|
|
48
|
+
if (['c', 'cancel'].includes(normalized)) {
|
|
49
|
+
return 'cancel';
|
|
50
|
+
}
|
|
51
|
+
console.log(chalk.yellow('Unrecognized selection; defaulting to stash and pop.'));
|
|
52
|
+
return 'stash-and-pop';
|
|
53
|
+
}
|
|
54
|
+
async function pullBeforeCreatingWorktree(gitRoot) {
|
|
55
|
+
if (await isWorktreeClean(gitRoot)) {
|
|
56
|
+
await execa('git', ['pull'], { cwd: gitRoot, stdio: 'inherit' });
|
|
57
|
+
return async () => { };
|
|
58
|
+
}
|
|
59
|
+
const action = await promptDirtyWorktreeAction();
|
|
60
|
+
if (action === 'cancel') {
|
|
61
|
+
console.log(chalk.yellow('Cancelled'));
|
|
62
|
+
process.exit(0);
|
|
63
|
+
}
|
|
64
|
+
if (action === 'dont-pull') {
|
|
65
|
+
return async () => { };
|
|
66
|
+
}
|
|
67
|
+
await execa('git', ['stash', 'push', '--include-untracked', '-m', 'worktree auto-stash before pull'], {
|
|
68
|
+
cwd: gitRoot,
|
|
69
|
+
stdio: 'inherit',
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
await execa('git', ['pull'], { cwd: gitRoot, stdio: 'inherit' });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
await execa('git', ['stash', 'pop'], { cwd: gitRoot, stdio: 'inherit' });
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
return async () => {
|
|
79
|
+
await execa('git', ['stash', 'pop'], { cwd: gitRoot, stdio: 'inherit' });
|
|
80
|
+
};
|
|
81
|
+
}
|
|
10
82
|
export async function createCommand(branch, gitRoot) {
|
|
11
83
|
// Check if repo is configured
|
|
12
84
|
let repoConfig = await configManager.getRepoConfig(gitRoot);
|
|
13
85
|
if (!repoConfig) {
|
|
14
86
|
console.log(chalk.yellow('This repository is not configured yet.'));
|
|
15
|
-
console.log(chalk.cyan(
|
|
87
|
+
console.log(chalk.cyan("Let's set it up first!\n"));
|
|
16
88
|
await initCommand(gitRoot);
|
|
17
89
|
repoConfig = await configManager.getRepoConfig(gitRoot);
|
|
18
90
|
if (!repoConfig) {
|
|
@@ -26,7 +98,10 @@ export async function createCommand(branch, gitRoot) {
|
|
|
26
98
|
console.log(chalk.blue(`Creating worktree for branch: ${branch}`));
|
|
27
99
|
console.log(chalk.gray(`Location: ${worktreePath}`));
|
|
28
100
|
const spinner = ora();
|
|
101
|
+
let popStash = async () => { };
|
|
102
|
+
let failed = false;
|
|
29
103
|
try {
|
|
104
|
+
popStash = await pullBeforeCreatingWorktree(gitRoot);
|
|
30
105
|
// Create worktree
|
|
31
106
|
spinner.start('Creating worktree...');
|
|
32
107
|
await createWorktree(config.basePath, worktreeName, branch, gitRoot);
|
|
@@ -64,11 +139,17 @@ export async function createCommand(branch, gitRoot) {
|
|
|
64
139
|
spinner.succeed(`Opened in ${config.ideCommand}`);
|
|
65
140
|
}
|
|
66
141
|
console.log(chalk.green(`\n✨ Worktree ready at: ${worktreePath}`));
|
|
67
|
-
console.log(chalk.cyan(
|
|
142
|
+
console.log(chalk.cyan('✅ Ready for some epic code!'));
|
|
68
143
|
}
|
|
69
144
|
catch (error) {
|
|
145
|
+
failed = true;
|
|
70
146
|
spinner.fail('Failed to create worktree');
|
|
71
147
|
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await popStash();
|
|
151
|
+
}
|
|
152
|
+
if (failed) {
|
|
72
153
|
process.exit(1);
|
|
73
154
|
}
|
|
74
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.tsx"],"names":[],"mappings":"AAyFA,wBAAsB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CvE"}
|
package/dist/commands/list.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { render, Box, Text } from 'ink';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
2
|
import chalk from 'chalk';
|
|
3
|
+
import { Box, Text, render } from 'ink';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { WorktreeList } from '../components/WorktreeList.js';
|
|
5
6
|
import { configManager } from '../config/manager.js';
|
|
7
|
+
import { enrichWorktreesWithPRInfo, isGhInstalled } from '../utils/gh.js';
|
|
6
8
|
import { listWorktrees, removeWorktree } from '../utils/git.js';
|
|
7
|
-
|
|
8
|
-
import { WorktreeList } from '../components/WorktreeList.js';
|
|
9
|
-
function ListApp({ repos }) {
|
|
9
|
+
function ListApp({ repos, prInfoUnavailable, }) {
|
|
10
10
|
const [currentRepoIndex] = useState(0);
|
|
11
11
|
const [isDeleting, setIsDeleting] = useState(false);
|
|
12
12
|
const handleDelete = async (paths) => {
|
|
@@ -26,7 +26,7 @@ function ListApp({ repos }) {
|
|
|
26
26
|
}
|
|
27
27
|
if (successCount > 0) {
|
|
28
28
|
console.log(chalk.cyan(`\n✅ Successfully deleted ${successCount} worktree${successCount > 1 ? 's' : ''}!`));
|
|
29
|
-
console.log(chalk.gray(
|
|
29
|
+
console.log(chalk.gray('💪 Workspace cleaned up and ready to go!'));
|
|
30
30
|
}
|
|
31
31
|
// Refresh the list after deletion
|
|
32
32
|
setTimeout(() => process.exit(0), 1500);
|
|
@@ -37,16 +37,19 @@ function ListApp({ repos }) {
|
|
|
37
37
|
if (isDeleting) {
|
|
38
38
|
return (_jsx(Box, { children: _jsx(Text, { color: "cyan", children: "Deleting worktrees..." }) }));
|
|
39
39
|
}
|
|
40
|
-
return (
|
|
40
|
+
return (_jsxs(Box, { flexDirection: "column", children: [prInfoUnavailable && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "yellow", children: "Unable to load PR info, please install GitHub CLI" }) })), repos.map((repo) => (_jsx(WorktreeList, { worktrees: repo.worktrees, repoName: repo.repoName, repoPath: repo.repoPath, onDelete: handleDelete }, repo.repoPath)))] }));
|
|
41
41
|
}
|
|
42
42
|
export async function listCommand(currentGitRoot) {
|
|
43
43
|
const allRepoConfigs = await configManager.getAllRepoConfigs();
|
|
44
44
|
const repos = [];
|
|
45
|
+
const canLoadPRInfo = await isGhInstalled();
|
|
45
46
|
// Add current repo first if configured
|
|
46
47
|
const currentRepoConfig = allRepoConfigs[currentGitRoot];
|
|
47
48
|
if (currentRepoConfig) {
|
|
48
49
|
const worktrees = await listWorktrees(currentGitRoot);
|
|
49
|
-
|
|
50
|
+
if (canLoadPRInfo) {
|
|
51
|
+
await enrichWorktreesWithPRInfo(worktrees, currentGitRoot);
|
|
52
|
+
}
|
|
50
53
|
repos.push({
|
|
51
54
|
repoPath: currentGitRoot,
|
|
52
55
|
repoName: currentRepoConfig.name,
|
|
@@ -59,14 +62,16 @@ export async function listCommand(currentGitRoot) {
|
|
|
59
62
|
continue;
|
|
60
63
|
try {
|
|
61
64
|
const worktrees = await listWorktrees(repoPath);
|
|
62
|
-
|
|
65
|
+
if (canLoadPRInfo) {
|
|
66
|
+
await enrichWorktreesWithPRInfo(worktrees, repoPath);
|
|
67
|
+
}
|
|
63
68
|
repos.push({
|
|
64
69
|
repoPath,
|
|
65
70
|
repoName: config.name,
|
|
66
71
|
worktrees,
|
|
67
72
|
});
|
|
68
73
|
}
|
|
69
|
-
catch
|
|
74
|
+
catch {
|
|
70
75
|
// Skip repos that might have been deleted or are inaccessible
|
|
71
76
|
console.warn(chalk.yellow(`Warning: Could not access ${config.name} at ${repoPath}`));
|
|
72
77
|
}
|
|
@@ -77,6 +82,6 @@ export async function listCommand(currentGitRoot) {
|
|
|
77
82
|
console.log(chalk.gray(' Then create your first worktree with "worktree <branch>"!'));
|
|
78
83
|
return;
|
|
79
84
|
}
|
|
80
|
-
render(_jsx(ListApp, { repos: repos }));
|
|
85
|
+
render(_jsx(ListApp, { repos: repos, prInfoUnavailable: !canLoadPRInfo }));
|
|
81
86
|
}
|
|
82
87
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeList.d.ts","sourceRoot":"","sources":["../../src/components/WorktreeList.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"WorktreeList.d.ts","sourceRoot":"","sources":["../../src/components/WorktreeList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE/C,UAAU,iBAAiB;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA0E1F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useApp, useInput } from 'ink';
|
|
2
3
|
import { useState } from 'react';
|
|
3
|
-
import { Box, Text, useInput, useApp } from 'ink';
|
|
4
4
|
export function WorktreeList({ worktrees, repoName, repoPath, onDelete }) {
|
|
5
5
|
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
6
6
|
const [checkedItems, setCheckedItems] = useState(new Set());
|
|
@@ -36,6 +36,6 @@ export function WorktreeList({ worktrees, repoName, repoPath, onDelete }) {
|
|
|
36
36
|
if (filteredWorktrees.length === 0) {
|
|
37
37
|
return (_jsx(Box, { flexDirection: "column", marginY: 1, children: _jsxs(Text, { color: "yellow", children: ["No worktrees found for ", repoName] }) }));
|
|
38
38
|
}
|
|
39
|
-
return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, children: _jsxs(Text, { bold: true, color: "cyan", children: [repoName, " (", repoPath, ")"] }) }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: filteredWorktrees.map((worktree, index) => (_jsxs(Box, { children: [_jsx(Text, { color: index === selectedIndex ? 'cyan' : 'white', children: index === selectedIndex ? '❯' : ' ' }), _jsx(Text, { children: " " }), _jsx(Text, { children: checkedItems.has(worktree.path) ? '☑' : '☐' }), _jsx(Text, { children: " " }), _jsx(Text, { color: index === selectedIndex ? 'cyan' : 'white', children: worktree.branch || 'detached' }), worktree.isPushed &&
|
|
39
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, children: _jsxs(Text, { bold: true, color: "cyan", children: [repoName, " (", repoPath, ")"] }) }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: filteredWorktrees.map((worktree, index) => (_jsxs(Box, { children: [_jsx(Text, { color: index === selectedIndex ? 'cyan' : 'white', children: index === selectedIndex ? '❯' : ' ' }), _jsx(Text, { children: " " }), _jsx(Text, { children: checkedItems.has(worktree.path) ? '☑' : '☐' }), _jsx(Text, { children: " " }), _jsx(Text, { color: index === selectedIndex ? 'cyan' : 'white', children: worktree.branch || 'detached' }), worktree.isPushed && _jsx(Text, { color: "green", children: " \u2713 remote" }), worktree.hasPR && (_jsxs(Text, { color: worktree.isPRMerged ? 'green' : 'magenta', children: [' ', "\uD83D\uDD00 PR #", worktree.prNumber, worktree.isPRMerged ? ' (Merged)' : ''] })), !worktree.isPushed && _jsx(Text, { color: "yellow", children: " \u26A0\uFE0F local only" })] }, worktree.path))) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["[Space] Select [Enter] Delete Selected (", checkedItems.size, ") [Q] Quit"] }) })] }));
|
|
40
40
|
}
|
|
41
41
|
//# sourceMappingURL=WorktreeList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeList.js","sourceRoot":"","sources":["../../src/components/WorktreeList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"WorktreeList.js","sourceRoot":"","sources":["../../src/components/WorktreeList.tsx"],"names":[],"mappings":"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"}
|
package/dist/utils/gh.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
+
import type { Worktree } from './git.js';
|
|
1
2
|
interface PRInfo {
|
|
2
3
|
number: number;
|
|
3
|
-
headRefName: string;
|
|
4
4
|
state: string;
|
|
5
|
+
headRefName?: string;
|
|
6
|
+
updatedAt?: string;
|
|
7
|
+
updated_at?: string;
|
|
8
|
+
mergedAt?: string | null;
|
|
9
|
+
merged_at?: string | null;
|
|
10
|
+
head?: {
|
|
11
|
+
ref?: string;
|
|
12
|
+
sha?: string;
|
|
13
|
+
};
|
|
5
14
|
}
|
|
6
15
|
export declare function isGhInstalled(): Promise<boolean>;
|
|
16
|
+
export declare function enrichWorktreesWithPRInfo(worktrees: Worktree[], gitRoot: string): Promise<void>;
|
|
7
17
|
export declare function getPRInfo(gitRoot: string): Promise<Map<string, PRInfo>>;
|
|
8
|
-
export declare function enrichWorktreesWithPRInfo(worktrees: Array<{
|
|
9
|
-
branch?: string;
|
|
10
|
-
[key: string]: any;
|
|
11
|
-
}>, gitRoot: string): Promise<void>;
|
|
12
18
|
export {};
|
|
13
19
|
//# sourceMappingURL=gh.d.ts.map
|
package/dist/utils/gh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../../src/utils/gh.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../../src/utils/gh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD;AAwED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAmC7E"}
|
package/dist/utils/gh.js
CHANGED
|
@@ -8,34 +8,107 @@ export async function isGhInstalled() {
|
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
+
function pickBestPR(prs) {
|
|
12
|
+
return prs.sort((a, b) => {
|
|
13
|
+
const aIsOpen = a.state.toUpperCase() === 'OPEN';
|
|
14
|
+
const bIsOpen = b.state.toUpperCase() === 'OPEN';
|
|
15
|
+
if (aIsOpen && !bIsOpen)
|
|
16
|
+
return -1;
|
|
17
|
+
if (!aIsOpen && bIsOpen)
|
|
18
|
+
return 1;
|
|
19
|
+
return getPRUpdatedAt(b).localeCompare(getPRUpdatedAt(a));
|
|
20
|
+
})[0];
|
|
21
|
+
}
|
|
22
|
+
function getPRUpdatedAt(pr) {
|
|
23
|
+
return pr.updatedAt ?? pr.updated_at ?? '';
|
|
24
|
+
}
|
|
25
|
+
function getPRState(pr) {
|
|
26
|
+
if (isPRMerged(pr))
|
|
27
|
+
return 'MERGED';
|
|
28
|
+
return pr.state.toUpperCase();
|
|
29
|
+
}
|
|
30
|
+
function isPRMerged(pr) {
|
|
31
|
+
return pr.state.toUpperCase() === 'MERGED' || Boolean(pr.mergedAt ?? pr.merged_at);
|
|
32
|
+
}
|
|
33
|
+
async function getPRForCommit(commit, gitRoot) {
|
|
34
|
+
try {
|
|
35
|
+
const { stdout } = await execa('gh', [
|
|
36
|
+
'api',
|
|
37
|
+
`repos/:owner/:repo/commits/${commit}/pulls`,
|
|
38
|
+
'--header',
|
|
39
|
+
'Accept: application/vnd.github+json',
|
|
40
|
+
], { cwd: gitRoot });
|
|
41
|
+
const prs = JSON.parse(stdout);
|
|
42
|
+
return pickBestPR(prs);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function getPRForBranch(branch, gitRoot) {
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await execa('gh', [
|
|
51
|
+
'pr',
|
|
52
|
+
'list',
|
|
53
|
+
'--state',
|
|
54
|
+
'all',
|
|
55
|
+
'--head',
|
|
56
|
+
branch,
|
|
57
|
+
'--json',
|
|
58
|
+
'number,headRefName,state,updatedAt,mergedAt',
|
|
59
|
+
'--limit',
|
|
60
|
+
'100',
|
|
61
|
+
], { cwd: gitRoot });
|
|
62
|
+
const prs = JSON.parse(stdout);
|
|
63
|
+
return pickBestPR(prs);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function enrichWorktreesWithPRInfo(worktrees, gitRoot) {
|
|
70
|
+
if (!(await isGhInstalled())) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
await Promise.all(worktrees.map(async (worktree) => {
|
|
74
|
+
if (!worktree.branch || worktree.isMain)
|
|
75
|
+
return;
|
|
76
|
+
const pr = (worktree.commit ? await getPRForCommit(worktree.commit, gitRoot) : undefined) ??
|
|
77
|
+
(await getPRForBranch(worktree.branch, gitRoot));
|
|
78
|
+
if (pr) {
|
|
79
|
+
worktree.hasPR = true;
|
|
80
|
+
worktree.prNumber = pr.number;
|
|
81
|
+
worktree.prState = getPRState(pr);
|
|
82
|
+
worktree.isPRMerged = isPRMerged(pr);
|
|
83
|
+
}
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
11
86
|
export async function getPRInfo(gitRoot) {
|
|
12
87
|
const prMap = new Map();
|
|
13
88
|
if (!(await isGhInstalled())) {
|
|
14
89
|
return prMap;
|
|
15
90
|
}
|
|
16
91
|
try {
|
|
17
|
-
const { stdout } = await execa('gh', [
|
|
92
|
+
const { stdout } = await execa('gh', [
|
|
93
|
+
'pr',
|
|
94
|
+
'list',
|
|
95
|
+
'--state',
|
|
96
|
+
'all',
|
|
97
|
+
'--json',
|
|
98
|
+
'number,headRefName,state,updatedAt,mergedAt',
|
|
99
|
+
'--limit',
|
|
100
|
+
'500',
|
|
101
|
+
], { cwd: gitRoot });
|
|
18
102
|
const prs = JSON.parse(stdout);
|
|
19
103
|
for (const pr of prs) {
|
|
20
|
-
|
|
104
|
+
if (pr.headRefName) {
|
|
105
|
+
prMap.set(pr.headRefName, pr);
|
|
106
|
+
}
|
|
21
107
|
}
|
|
22
108
|
}
|
|
23
|
-
catch
|
|
24
|
-
// gh might not be authenticated or repo might not have GitHub remote
|
|
25
|
-
// Silently fail and return empty map
|
|
109
|
+
catch {
|
|
110
|
+
// gh might not be authenticated or repo might not have GitHub remote.
|
|
26
111
|
}
|
|
27
112
|
return prMap;
|
|
28
113
|
}
|
|
29
|
-
export async function enrichWorktreesWithPRInfo(worktrees, gitRoot) {
|
|
30
|
-
const prInfo = await getPRInfo(gitRoot);
|
|
31
|
-
for (const worktree of worktrees) {
|
|
32
|
-
if (worktree.branch) {
|
|
33
|
-
const pr = prInfo.get(worktree.branch);
|
|
34
|
-
if (pr) {
|
|
35
|
-
worktree.hasPR = true;
|
|
36
|
-
worktree.prNumber = pr.number;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
114
|
//# sourceMappingURL=gh.js.map
|
package/dist/utils/gh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../src/utils/gh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../src/utils/gh.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export interface Worktree {
|
|
|
6
6
|
isPushed?: boolean;
|
|
7
7
|
hasPR?: boolean;
|
|
8
8
|
prNumber?: number;
|
|
9
|
+
prState?: string;
|
|
10
|
+
isPRMerged?: boolean;
|
|
9
11
|
}
|
|
10
12
|
export declare function createWorktree(basePath: string, worktreeName: string, branchName: string, gitRoot: string): Promise<void>;
|
|
11
13
|
export declare function listWorktrees(gitRoot: string): Promise<Worktree[]>;
|
package/dist/utils/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqDxE;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASvE"}
|
package/dist/utils/git.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
1
2
|
import { execa } from 'execa';
|
|
2
|
-
import path from 'path';
|
|
3
3
|
export async function createWorktree(basePath, worktreeName, branchName, gitRoot) {
|
|
4
4
|
const worktreePath = path.join(basePath, worktreeName);
|
|
5
5
|
// Check if branch exists
|
|
@@ -10,7 +10,9 @@ export async function createWorktree(basePath, worktreeName, branchName, gitRoot
|
|
|
10
10
|
// Branch doesn't exist locally, check remote
|
|
11
11
|
try {
|
|
12
12
|
await execa('git', ['fetch', 'origin', branchName], { cwd: gitRoot });
|
|
13
|
-
await execa('git', ['worktree', 'add', worktreePath, `origin/${branchName}`], {
|
|
13
|
+
await execa('git', ['worktree', 'add', worktreePath, `origin/${branchName}`], {
|
|
14
|
+
cwd: gitRoot,
|
|
15
|
+
});
|
|
14
16
|
return;
|
|
15
17
|
}
|
|
16
18
|
catch {
|
|
@@ -81,7 +83,9 @@ export async function removeWorktree(worktreePath, gitRoot) {
|
|
|
81
83
|
}
|
|
82
84
|
export async function getAllBranches(gitRoot) {
|
|
83
85
|
try {
|
|
84
|
-
const { stdout } = await execa('git', ['branch', '-a', '--format=%(refname:short)'], {
|
|
86
|
+
const { stdout } = await execa('git', ['branch', '-a', '--format=%(refname:short)'], {
|
|
87
|
+
cwd: gitRoot,
|
|
88
|
+
});
|
|
85
89
|
return stdout.split('\n').filter(Boolean);
|
|
86
90
|
}
|
|
87
91
|
catch {
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcadam/worktree",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "A CLI tool for managing Git worktrees across multiple repositories",
|
|
5
5
|
"main": "dist/cli.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"worktree": "
|
|
8
|
+
"worktree": "bin/worktree.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx watch src/cli.tsx",
|
|
13
|
+
"prepublishOnly": "pnpm run build",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"clean": "rm -rf dist",
|
|
16
|
+
"lint": "biome check .",
|
|
17
|
+
"lint:fix": "biome check --apply .",
|
|
18
|
+
"format": "biome format --write ."
|
|
9
19
|
},
|
|
10
20
|
"keywords": [
|
|
11
21
|
"git",
|
|
@@ -55,14 +65,5 @@
|
|
|
55
65
|
"files": [
|
|
56
66
|
"dist",
|
|
57
67
|
"bin"
|
|
58
|
-
]
|
|
59
|
-
|
|
60
|
-
"build": "tsc",
|
|
61
|
-
"dev": "tsx watch src/cli.tsx",
|
|
62
|
-
"typecheck": "tsc --noEmit",
|
|
63
|
-
"clean": "rm -rf dist",
|
|
64
|
-
"lint": "biome check .",
|
|
65
|
-
"lint:fix": "biome check --apply .",
|
|
66
|
-
"format": "biome format --write ."
|
|
67
|
-
}
|
|
68
|
-
}
|
|
68
|
+
]
|
|
69
|
+
}
|