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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +343 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +26 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/clean.d.ts +3 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +339 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +12 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/list.d.ts +3 -0
  16. package/dist/commands/list.d.ts.map +1 -0
  17. package/dist/commands/list.js +202 -0
  18. package/dist/commands/list.js.map +1 -0
  19. package/dist/commands/new.d.ts +3 -0
  20. package/dist/commands/new.d.ts.map +1 -0
  21. package/dist/commands/new.js +147 -0
  22. package/dist/commands/new.js.map +1 -0
  23. package/dist/commands/remove.d.ts +3 -0
  24. package/dist/commands/remove.d.ts.map +1 -0
  25. package/dist/commands/remove.js +192 -0
  26. package/dist/commands/remove.js.map +1 -0
  27. package/dist/commands/wt.d.ts +3 -0
  28. package/dist/commands/wt.d.ts.map +1 -0
  29. package/dist/commands/wt.js +78 -0
  30. package/dist/commands/wt.js.map +1 -0
  31. package/dist/commands/wtclean.d.ts +3 -0
  32. package/dist/commands/wtclean.d.ts.map +1 -0
  33. package/dist/commands/wtclean.js +190 -0
  34. package/dist/commands/wtclean.js.map +1 -0
  35. package/dist/commands/wtlist.d.ts +3 -0
  36. package/dist/commands/wtlist.d.ts.map +1 -0
  37. package/dist/commands/wtlist.js +202 -0
  38. package/dist/commands/wtlist.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/utils/clipboard.d.ts +2 -0
  44. package/dist/utils/clipboard.d.ts.map +1 -0
  45. package/dist/utils/clipboard.js +23 -0
  46. package/dist/utils/clipboard.js.map +1 -0
  47. package/dist/utils/git.d.ts +45 -0
  48. package/dist/utils/git.d.ts.map +1 -0
  49. package/dist/utils/git.js +202 -0
  50. package/dist/utils/git.js.map +1 -0
  51. package/dist/utils/github.d.ts +21 -0
  52. package/dist/utils/github.d.ts.map +1 -0
  53. package/dist/utils/github.js +113 -0
  54. package/dist/utils/github.js.map +1 -0
  55. package/package.json +61 -0
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { basename, dirname, join } from 'node:path';
6
+ import { createInterface } from 'node:readline';
7
+ import { listWorktrees, getRepoName, getRemoteUrl, hasUncommittedChanges, removeWorktree, deleteBranch, getCurrentWorktreePath, isPathInWorktree, } from '../utils/git.js';
8
+ import { getPRStatus, parseGitHubRepo, isGhCliAvailable } from '../utils/github.js';
9
+ const program = new Command();
10
+ async function confirm(message) {
11
+ const rl = createInterface({
12
+ input: process.stdin,
13
+ output: process.stdout,
14
+ });
15
+ return new Promise((resolve) => {
16
+ rl.question(`${message} (y/N): `, (answer) => {
17
+ rl.close();
18
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
19
+ });
20
+ });
21
+ }
22
+ program
23
+ .name('wtclean')
24
+ .description('Remove merged/closed worktrees')
25
+ .option('-d, --dry-run', 'Show what would be removed without actually removing')
26
+ .option('-f, --force', 'Skip confirmation prompt')
27
+ .action(async (options) => {
28
+ const spinner = ora();
29
+ try {
30
+ const ghStatus = await isGhCliAvailable();
31
+ if (!ghStatus.available) {
32
+ console.error(chalk.red("Error: 'gh' CLI is required for wtclean"));
33
+ console.log('Install it with: brew install gh');
34
+ process.exit(1);
35
+ }
36
+ if (!ghStatus.authenticated) {
37
+ console.error(chalk.red('Error: gh CLI is not authenticated'));
38
+ console.log('Authenticate with: gh auth login');
39
+ process.exit(1);
40
+ }
41
+ spinner.start('Scanning worktrees...');
42
+ const repoName = await getRepoName();
43
+ const worktrees = await listWorktrees();
44
+ let githubInfo = null;
45
+ try {
46
+ const remoteUrl = await getRemoteUrl();
47
+ githubInfo = parseGitHubRepo(remoteUrl);
48
+ if (!githubInfo) {
49
+ console.error(chalk.red('Error: Not a GitHub repository'));
50
+ process.exit(1);
51
+ }
52
+ }
53
+ catch {
54
+ console.error(chalk.red('Error: No remote repository configured'));
55
+ process.exit(1);
56
+ }
57
+ const mainWorktree = worktrees[0];
58
+ const worktreesDir = join(dirname(mainWorktree.path), `${repoName}-worktrees`);
59
+ const filteredWorktrees = worktrees.filter((wt) => wt.path.includes(worktreesDir));
60
+ if (filteredWorktrees.length === 0) {
61
+ spinner.stop();
62
+ console.log(chalk.yellow(`No worktrees found in ${worktreesDir}`));
63
+ return;
64
+ }
65
+ spinner.text = 'Checking PR status...';
66
+ const currentPath = await getCurrentWorktreePath();
67
+ const cleanable = [];
68
+ for (const wt of filteredWorktrees) {
69
+ if (!wt.branch)
70
+ continue;
71
+ if (isPathInWorktree(currentPath, wt.path)) {
72
+ continue;
73
+ }
74
+ try {
75
+ const pr = await getPRStatus(githubInfo.owner, githubInfo.repo, wt.branch);
76
+ if (!pr)
77
+ continue;
78
+ const prState = pr.state;
79
+ if (prState === 'merged' || prState === 'closed') {
80
+ const uncommitted = await hasUncommittedChanges(wt.path);
81
+ cleanable.push({
82
+ path: wt.path,
83
+ dirname: basename(wt.path),
84
+ branch: wt.branch,
85
+ prState,
86
+ hasUncommittedChanges: uncommitted,
87
+ });
88
+ }
89
+ }
90
+ catch {
91
+ continue;
92
+ }
93
+ }
94
+ const skipped = cleanable.filter((w) => w.hasUncommittedChanges);
95
+ const toRemove = cleanable.filter((w) => !w.hasUncommittedChanges);
96
+ spinner.stop();
97
+ if (cleanable.length === 0) {
98
+ console.log(chalk.green('✓ No merged/closed worktrees found'));
99
+ return;
100
+ }
101
+ console.log(chalk.bold('Cleanable worktrees:'));
102
+ console.log();
103
+ for (const wt of toRemove) {
104
+ const stateColor = wt.prState === 'merged' ? chalk.magenta : chalk.magenta;
105
+ console.log(`${stateColor(wt.dirname)} (${wt.prState.toUpperCase()})`);
106
+ console.log(` Branch: ${wt.branch}`);
107
+ console.log();
108
+ }
109
+ if (skipped.length > 0) {
110
+ console.log(chalk.yellow('⚠ Skipped (uncommitted changes):'));
111
+ console.log();
112
+ for (const wt of skipped) {
113
+ console.log(`${chalk.yellow(wt.dirname)} (${wt.prState.toUpperCase()})`);
114
+ console.log(` Branch: ${wt.branch}`);
115
+ console.log();
116
+ }
117
+ }
118
+ if (toRemove.length === 0) {
119
+ console.log(chalk.yellow('No worktrees can be removed (all have uncommitted changes)'));
120
+ return;
121
+ }
122
+ if (options.dryRun) {
123
+ console.log('━'.repeat(60));
124
+ console.log(chalk.blue(`[DRY RUN] Would remove ${toRemove.length} worktree(s)`));
125
+ return;
126
+ }
127
+ if (!options.force) {
128
+ console.log('━'.repeat(60));
129
+ const confirmed = await confirm(chalk.bold(`Remove ${toRemove.length} worktree(s)?`));
130
+ if (!confirmed) {
131
+ console.log(chalk.yellow('Cancelled'));
132
+ return;
133
+ }
134
+ console.log();
135
+ }
136
+ let removed = 0;
137
+ let failed = 0;
138
+ for (const wt of toRemove) {
139
+ try {
140
+ await removeWorktree(wt.path);
141
+ console.log(chalk.green(`✓ Removed worktree: ${wt.dirname}`));
142
+ const deleteBranchConfirmed = await confirm(chalk.gray(` Delete branch '${wt.branch}'?`));
143
+ if (deleteBranchConfirmed) {
144
+ try {
145
+ await deleteBranch(wt.branch, true);
146
+ console.log(chalk.green(` ✓ Deleted branch: ${wt.branch}`));
147
+ }
148
+ catch (error) {
149
+ console.log(chalk.yellow(` ⚠ Could not delete branch: ${wt.branch}`));
150
+ }
151
+ }
152
+ else {
153
+ console.log(chalk.gray(` Branch '${wt.branch}' kept`));
154
+ }
155
+ console.log();
156
+ removed++;
157
+ }
158
+ catch (error) {
159
+ console.log(chalk.red(`✗ Failed to remove: ${wt.dirname}`));
160
+ if (error instanceof Error) {
161
+ console.log(chalk.red(` ${error.message}`));
162
+ }
163
+ console.log();
164
+ failed++;
165
+ }
166
+ }
167
+ console.log('━'.repeat(60));
168
+ if (removed > 0) {
169
+ console.log(chalk.green(`✓ Cleaned up ${removed} worktree(s)!`));
170
+ }
171
+ if (failed > 0) {
172
+ console.log(chalk.red(`✗ Failed to remove ${failed} worktree(s)`));
173
+ }
174
+ if (removed > 0) {
175
+ console.log("Run 'wtlist' to see remaining worktrees.");
176
+ }
177
+ }
178
+ catch (error) {
179
+ spinner.stop();
180
+ if (error instanceof Error) {
181
+ console.error(chalk.red(`Error: ${error.message}`));
182
+ }
183
+ else {
184
+ console.error(chalk.red('An unknown error occurred'));
185
+ }
186
+ process.exit(1);
187
+ }
188
+ });
189
+ program.parse();
190
+ //# sourceMappingURL=wtclean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wtclean.js","sourceRoot":"","sources":["../../src/commands/wtclean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=wtlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wtlist.d.ts","sourceRoot":"","sources":["../../src/commands/wtlist.ts"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { basename, dirname, join } from 'node:path';
6
+ import { listWorktrees, getRepoName, getDefaultBranch, getCreationTime, hasUncommittedChanges, getAheadBehind, isPathInWorktree, getRemoteUrl, } from '../utils/git.js';
7
+ import { getPRStatus, parseGitHubRepo, isGhCliAvailable } from '../utils/github.js';
8
+ const program = new Command();
9
+ program
10
+ .name('wtlist')
11
+ .description('List all worktrees with status')
12
+ .option('--json', 'Output in JSON format')
13
+ .action(async (options) => {
14
+ const spinner = options.json ? null : ora('Gathering worktree information...').start();
15
+ try {
16
+ const repoName = await getRepoName();
17
+ const worktrees = await listWorktrees();
18
+ if (worktrees.length === 0) {
19
+ spinner?.stop();
20
+ console.log(chalk.yellow('No worktrees found'));
21
+ return;
22
+ }
23
+ const mainWorktree = worktrees[0];
24
+ const worktreesDir = join(dirname(mainWorktree.path), `${repoName}-worktrees`);
25
+ const filteredWorktrees = worktrees.filter((wt) => wt.path.includes(worktreesDir));
26
+ if (filteredWorktrees.length === 0) {
27
+ spinner?.stop();
28
+ console.log(chalk.yellow(`No worktrees found in ${worktreesDir}`));
29
+ return;
30
+ }
31
+ let githubInfo = null;
32
+ let githubError = null;
33
+ try {
34
+ const remoteUrl = await getRemoteUrl();
35
+ githubInfo = parseGitHubRepo(remoteUrl);
36
+ if (!githubInfo) {
37
+ githubError = 'not-github';
38
+ }
39
+ }
40
+ catch {
41
+ githubError = 'no-remote';
42
+ }
43
+ if (githubInfo) {
44
+ const ghStatus = await isGhCliAvailable();
45
+ if (!ghStatus.available || !ghStatus.authenticated) {
46
+ githubError = 'gh-unavailable';
47
+ }
48
+ }
49
+ const currentPath = process.cwd();
50
+ const defaultBranch = await getDefaultBranch();
51
+ if (spinner) {
52
+ spinner.text = 'Fetching status for worktrees...';
53
+ }
54
+ const worktreeInfos = await Promise.all(filteredWorktrees.map(async (wt) => {
55
+ const creationTime = await getCreationTime(wt.path);
56
+ const uncommitted = await hasUncommittedChanges(wt.path);
57
+ const isInWorktree = isPathInWorktree(currentPath, wt.path);
58
+ let ahead = 0;
59
+ let behind = 0;
60
+ if (wt.branch) {
61
+ const aheadBehind = await getAheadBehind(wt.branch, defaultBranch);
62
+ ahead = aheadBehind.ahead;
63
+ behind = aheadBehind.behind;
64
+ }
65
+ let prStatus;
66
+ if (githubInfo && wt.branch && !githubError) {
67
+ try {
68
+ const pr = await getPRStatus(githubInfo.owner, githubInfo.repo, wt.branch);
69
+ if (pr) {
70
+ let state;
71
+ if (pr.isDraft) {
72
+ state = 'draft';
73
+ }
74
+ else {
75
+ state = pr.state;
76
+ }
77
+ prStatus = {
78
+ state,
79
+ url: pr.url,
80
+ checksStatus: pr.checksStatus,
81
+ };
82
+ }
83
+ else {
84
+ prStatus = { state: 'no-pr' };
85
+ }
86
+ }
87
+ catch {
88
+ prStatus = { state: 'no-pr' };
89
+ }
90
+ }
91
+ else {
92
+ prStatus = { state: 'no-pr' };
93
+ }
94
+ return {
95
+ path: wt.path,
96
+ dirname: basename(wt.path),
97
+ branch: wt.branch || 'no-branch',
98
+ creationTime,
99
+ isCurrentWorktree: isInWorktree,
100
+ hasUncommittedChanges: uncommitted,
101
+ ahead,
102
+ behind,
103
+ prStatus,
104
+ };
105
+ }));
106
+ spinner?.stop();
107
+ worktreeInfos.sort((a, b) => a.creationTime - b.creationTime);
108
+ if (options.json) {
109
+ console.log(JSON.stringify(worktreeInfos, null, 2));
110
+ return;
111
+ }
112
+ console.log(chalk.bold(`Worktrees for ${repoName}:`));
113
+ console.log('━'.repeat(60));
114
+ console.log();
115
+ for (const info of worktreeInfos) {
116
+ let statusColor = chalk.gray;
117
+ if (info.prStatus?.state === 'open') {
118
+ statusColor = chalk.green;
119
+ }
120
+ else if (info.prStatus?.state === 'merged' || info.prStatus?.state === 'closed') {
121
+ statusColor = chalk.magenta;
122
+ }
123
+ let statusLine = `${statusColor(info.dirname.padEnd(40))} ${statusColor(info.prStatus?.state || 'no-pr')}`;
124
+ if (info.branch !== 'no-branch') {
125
+ statusLine += ` ${chalk.gray(`(↑${info.ahead} ↓${info.behind})`)}`;
126
+ }
127
+ if (info.hasUncommittedChanges) {
128
+ statusLine += ` ${chalk.yellow('(uncommitted changes)')}`;
129
+ }
130
+ if (info.behind > 10) {
131
+ statusLine += ` ${chalk.yellow('⚠️ outdated')}`;
132
+ }
133
+ if (info.prStatus?.checksStatus === 'failure') {
134
+ statusLine += ` ${chalk.red('❌ checks failing')}`;
135
+ }
136
+ if (info.isCurrentWorktree) {
137
+ statusLine += ` ${chalk.cyan('← you are here')}`;
138
+ }
139
+ console.log(statusLine);
140
+ console.log(` ${chalk.gray('Branch:')} ${info.branch}`);
141
+ if (info.prStatus?.url) {
142
+ console.log(` ${chalk.gray('PR:')} ${info.prStatus.url}`);
143
+ }
144
+ console.log();
145
+ }
146
+ console.log('━'.repeat(60));
147
+ const counts = {
148
+ total: worktreeInfos.length,
149
+ open: worktreeInfos.filter((w) => w.prStatus?.state === 'open').length,
150
+ draft: worktreeInfos.filter((w) => w.prStatus?.state === 'draft').length,
151
+ merged: worktreeInfos.filter((w) => w.prStatus?.state === 'merged').length,
152
+ closed: worktreeInfos.filter((w) => w.prStatus?.state === 'closed').length,
153
+ noPr: worktreeInfos.filter((w) => w.prStatus?.state === 'no-pr').length,
154
+ };
155
+ const parts = [];
156
+ if (counts.open > 0)
157
+ parts.push(`${counts.open} open`);
158
+ if (counts.draft > 0)
159
+ parts.push(`${counts.draft} draft`);
160
+ if (counts.merged > 0)
161
+ parts.push(`${counts.merged} merged`);
162
+ if (counts.closed > 0)
163
+ parts.push(`${counts.closed} closed`);
164
+ if (counts.noPr > 0)
165
+ parts.push(`${counts.noPr} no-pr`);
166
+ let summary = `Summary: ${counts.total} worktrees`;
167
+ if (parts.length > 0) {
168
+ summary += ` (${parts.join(', ')})`;
169
+ }
170
+ console.log(summary);
171
+ const cleanable = counts.merged + counts.closed;
172
+ if (cleanable > 0) {
173
+ console.log(chalk.blue(`💡 Run 'wtclean' to remove ${cleanable} merged/closed worktree(s)`));
174
+ }
175
+ if (githubError) {
176
+ if (githubError === 'not-github') {
177
+ console.log(chalk.blue('💡 Not a GitHub repository - PR status unavailable'));
178
+ }
179
+ else if (githubError === 'gh-unavailable') {
180
+ const ghStatus = await isGhCliAvailable();
181
+ if (!ghStatus.available) {
182
+ console.log(chalk.blue('💡 Install gh CLI for PR status: brew install gh'));
183
+ }
184
+ else if (!ghStatus.authenticated) {
185
+ console.log(chalk.blue('💡 Authenticate gh CLI for PR status: gh auth login'));
186
+ }
187
+ }
188
+ }
189
+ }
190
+ catch (error) {
191
+ spinner?.stop();
192
+ if (error instanceof Error) {
193
+ console.error(chalk.red(`Error: ${error.message}`));
194
+ }
195
+ else {
196
+ console.error(chalk.red('An unknown error occurred'));
197
+ }
198
+ process.exit(1);
199
+ }
200
+ });
201
+ program.parse();
202
+ //# sourceMappingURL=wtlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wtlist.js","sourceRoot":"","sources":["../../src/commands/wtlist.ts"],"names":[],"mappings":";AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEnF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAoB7B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAA;IACtF,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;QACpC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAA;QAEvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAA;YAC/C,OAAM;QACR,CAAC;QAGD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,YAAY,CAAC,CAAA;QAG9E,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA;QAElF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC,CAAA;YAClE,OAAM;QACR,CAAC;QAGD,IAAI,UAAU,GAA2C,IAAI,CAAA;QAC7D,IAAI,WAAW,GAAyD,IAAI,CAAA;QAE5E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAA;YACtC,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;YAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,WAAW,GAAG,YAAY,CAAA;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,WAAW,CAAA;QAC3B,CAAC;QAGD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAA;YACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACnD,WAAW,GAAG,gBAAgB,CAAA;YAChC,CAAC;QACH,CAAC;QAGD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QACjC,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAA;QAG9C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,GAAG,kCAAkC,CAAA;QACnD,CAAC;QAGD,MAAM,aAAa,GAAmB,MAAM,OAAO,CAAC,GAAG,CACrD,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACjC,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;YACnD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;YACxD,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;YAE3D,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBACd,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;gBAClE,KAAK,GAAG,WAAW,CAAC,KAAK,CAAA;gBACzB,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;YAC7B,CAAC;YAGD,IAAI,QAMS,CAAA;YAEb,IAAI,UAAU,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;oBAC1E,IAAI,EAAE,EAAE,CAAC;wBACP,IAAI,KAA6C,CAAA;wBACjD,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;4BACf,KAAK,GAAG,OAAO,CAAA;wBACjB,CAAC;6BAAM,CAAC;4BACN,KAAK,GAAG,EAAE,CAAC,KAAK,CAAA;wBAClB,CAAC;wBACD,QAAQ,GAAG;4BACT,KAAK;4BACL,GAAG,EAAE,EAAE,CAAC,GAAG;4BACX,YAAY,EAAE,EAAE,CAAC,YAAY;yBAC9B,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,QAAQ,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;oBAC/B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,QAAQ,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;gBAC/B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;YAC/B,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,WAAW;gBAChC,YAAY;gBACZ,iBAAiB,EAAE,YAAY;gBAC/B,qBAAqB,EAAE,WAAW;gBAClC,KAAK;gBACL,MAAM;gBACN,QAAQ;aACT,CAAA;QACH,CAAC,CAAC,CACH,CAAA;QAGD,OAAO,EAAE,IAAI,EAAE,CAAA;QAGf,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAA;QAG7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACnD,OAAM;QACR,CAAC;QAGD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,GAAG,CAAC,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3B,OAAO,CAAC,GAAG,EAAE,CAAA;QAGb,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YAEjC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,CAAA;YAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;gBACpC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAA;YAC3B,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAClF,WAAW,GAAG,KAAK,CAAC,OAAO,CAAA;YAC7B,CAAC;YAGD,IAAI,UAAU,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,OAAO,CAAC,EAAE,CAAA;YAG1G,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChC,UAAU,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAA;YACpE,CAAC;YAGD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC/B,UAAU,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,CAAA;YAC3D,CAAC;YAGD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACrB,UAAU,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAA;YAClD,CAAC;YAGD,IAAI,IAAI,CAAC,QAAQ,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC9C,UAAU,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAA;YACnD,CAAC;YAGD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,UAAU,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAA;YAClD,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;YAExD,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;YAC5D,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,CAAA;QACf,CAAC;QAGD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAE3B,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,aAAa,CAAC,MAAM;YAC3B,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM;YACtE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM;YACxE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,MAAM;YAC1E,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,MAAM;YAC1E,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM;SACxE,CAAA;QAED,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAA;QACtD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAA;QACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,SAAS,CAAC,CAAA;QAC5D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,SAAS,CAAC,CAAA;QAC5D,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAA;QAEvD,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,KAAK,YAAY,CAAA;QAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;QACrC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAGpB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC/C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,SAAS,4BAA4B,CAAC,CAAC,CAAA;QAC9F,CAAC;QAGD,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAA;YAC/E,CAAC;iBAAM,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAA;gBACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAA;gBAC7E,CAAC;qBAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAA;gBAChF,CAAC;YACH,CAAC;QAEH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,CAAA;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './utils/git.js';
2
+ export { getOctokit, getPRStatus, parseGitHubRepo, isGhCliAvailable } from './utils/github.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './utils/git.js';
2
+ export { getOctokit, getPRStatus, parseGitHubRepo, isGhCliAvailable } from './utils/github.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function copyToClipboard(text: string): Promise<boolean>;
2
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB9D"}
@@ -0,0 +1,23 @@
1
+ import { exec } from 'child_process';
2
+ import { platform } from 'os';
3
+ export function copyToClipboard(text) {
4
+ return new Promise((resolve) => {
5
+ const os = platform();
6
+ let cmd;
7
+ if (os === 'darwin') {
8
+ cmd = 'pbcopy';
9
+ }
10
+ else if (os === 'win32') {
11
+ cmd = 'clip';
12
+ }
13
+ else {
14
+ cmd = 'xclip -selection clipboard';
15
+ }
16
+ const proc = exec(cmd);
17
+ proc.stdin?.write(text);
18
+ proc.stdin?.end();
19
+ proc.on('close', (code) => resolve(code === 0));
20
+ proc.on('error', () => resolve(false));
21
+ });
22
+ }
23
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAE7B,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;QACrB,IAAI,GAAW,CAAA;QAEf,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YACpB,GAAG,GAAG,QAAQ,CAAA;QAChB,CAAC;aAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YAC1B,GAAG,GAAG,MAAM,CAAA;QACd,CAAC;aAAM,CAAC;YAEN,GAAG,GAAG,4BAA4B,CAAA;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ export interface Worktree {
2
+ path: string;
3
+ branch: string;
4
+ commit: string;
5
+ isMain: boolean;
6
+ creationTime?: number;
7
+ hasUncommittedChanges?: boolean;
8
+ }
9
+ export declare function getMainWorktreePath(): Promise<string>;
10
+ export declare function getRepoName(): Promise<string>;
11
+ export declare function getDefaultBranch(): Promise<string>;
12
+ export declare function fetchOrigin(): Promise<void>;
13
+ export declare function listWorktrees(): Promise<Worktree[]>;
14
+ export declare function ensureDir(path: string): Promise<void>;
15
+ export declare function createWorktree(branchName: string, worktreePath: string, baseBranch: string): Promise<void>;
16
+ export declare function removeWorktree(path: string, force?: boolean): Promise<void>;
17
+ export declare function deleteBranch(branch: string, force?: boolean): Promise<void>;
18
+ export declare function branchExists(branch: string): Promise<boolean>;
19
+ export declare function isBranchMerged(_branch: string, _baseBranch?: string): Promise<boolean>;
20
+ export declare function getRemoteUrl(remote?: string): Promise<string>;
21
+ export declare function getWorktreeStatus(_path: string): Promise<{
22
+ clean: boolean;
23
+ ahead: number;
24
+ behind: number;
25
+ }>;
26
+ export declare function getCreationTime(path: string): Promise<number>;
27
+ export declare function hasUncommittedChanges(path: string): Promise<boolean>;
28
+ export declare function getAheadBehind(branch: string, baseBranch: string): Promise<{
29
+ ahead: number;
30
+ behind: number;
31
+ }>;
32
+ export declare function getCurrentWorktreePath(): Promise<string>;
33
+ export declare function isPathInWorktree(currentPath: string, worktreePath: string): boolean;
34
+ export declare function getWorktreeChanges(path: string): Promise<{
35
+ modified: string[];
36
+ untracked: string[];
37
+ }>;
38
+ export declare function getGitDiff(path: string): Promise<string>;
39
+ export declare function forceRemoveDirectory(path: string): Promise<void>;
40
+ export declare function pruneWorktrees(): Promise<void>;
41
+ export declare function hasUnpushedCommits(branch: string): Promise<{
42
+ hasUnpushed: boolean;
43
+ noRemote: boolean;
44
+ }>;
45
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}