git-easy-worktree 1.0.2 → 1.1.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 -7
- package/dist/index.js +116 -97
- package/dist/index.js.map +1 -1
- package/dist/tui.d.ts +9 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +183 -0
- package/dist/tui.js.map +1 -0
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -18,9 +18,12 @@ npm link
|
|
|
18
18
|
## Usage
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
git-wt
|
|
21
|
+
git-wt [repo-url] [branch-name] [options]
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
> In an interactive terminal, `git-wt` always launches the full-screen TUI.
|
|
25
|
+
> Optional `repo-url` and `branch-name` are used as prefilled values.
|
|
26
|
+
|
|
24
27
|
### Options
|
|
25
28
|
|
|
26
29
|
- `-d, --dir <directory>`: Base directory for worktrees (default: current directory)
|
|
@@ -28,13 +31,11 @@ git-wt <repo-url> <branch-name> [options]
|
|
|
28
31
|
### Example
|
|
29
32
|
|
|
30
33
|
```bash
|
|
31
|
-
#
|
|
32
|
-
git-wt
|
|
34
|
+
# Launch TUI with empty fields
|
|
35
|
+
git-wt
|
|
33
36
|
|
|
34
|
-
#
|
|
35
|
-
|
|
36
|
-
# .bare/ (Bare repository)
|
|
37
|
-
# master/ (Worktree)
|
|
37
|
+
# Launch TUI with prefilled repository and branch
|
|
38
|
+
git-wt https://github.com/octocat/Hello-World.git master
|
|
38
39
|
```
|
|
39
40
|
|
|
40
41
|
## Development
|
package/dist/index.js
CHANGED
|
@@ -4,127 +4,146 @@ import { simpleGit } from 'simple-git';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import fs from 'fs-extra';
|
|
6
6
|
import * as path from 'path';
|
|
7
|
-
import inquirer from 'inquirer';
|
|
8
7
|
import ora from 'ora';
|
|
9
8
|
import boxen from 'boxen';
|
|
10
9
|
import figlet from 'figlet';
|
|
11
10
|
import gradient from 'gradient-string';
|
|
11
|
+
import { createRequire } from 'node:module';
|
|
12
|
+
import { collectInputsWithTui } from './tui.js';
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
const { version } = require('../package.json');
|
|
15
|
+
const MISSING_BRANCH_PATTERNS = ['invalid reference', 'not a valid object name'];
|
|
12
16
|
const program = new Command();
|
|
13
17
|
const printBanner = () => {
|
|
14
18
|
const title = figlet.textSync('Git Easy WT', { font: 'Standard' });
|
|
15
19
|
console.log(gradient.pastel.multiline(title));
|
|
16
20
|
};
|
|
21
|
+
const toErrorMessage = (error) => {
|
|
22
|
+
if (error instanceof Error) {
|
|
23
|
+
return error.message;
|
|
24
|
+
}
|
|
25
|
+
return String(error);
|
|
26
|
+
};
|
|
27
|
+
const resolveRepoName = (url) => {
|
|
28
|
+
const repoNameMatch = url.match(/\/([^\/]+?)(\.git)?$/);
|
|
29
|
+
const repoName = repoNameMatch?.[1];
|
|
30
|
+
if (!repoName) {
|
|
31
|
+
throw new Error('Invalid Git URL. Could not extract repository name.');
|
|
32
|
+
}
|
|
33
|
+
return repoName;
|
|
34
|
+
};
|
|
35
|
+
const resolveInputs = async (urlArg, branchArg, dirArg) => {
|
|
36
|
+
const url = urlArg?.trim();
|
|
37
|
+
const branch = branchArg?.trim();
|
|
38
|
+
const dir = dirArg.trim() || process.cwd();
|
|
39
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
40
|
+
const initialValues = { dir };
|
|
41
|
+
if (url) {
|
|
42
|
+
initialValues.url = url;
|
|
43
|
+
}
|
|
44
|
+
if (branch) {
|
|
45
|
+
initialValues.branch = branch;
|
|
46
|
+
}
|
|
47
|
+
return collectInputsWithTui(initialValues);
|
|
48
|
+
}
|
|
49
|
+
// Non-interactive environments cannot render TUI, so keep a script-friendly fallback.
|
|
50
|
+
if (url && branch) {
|
|
51
|
+
return { url, branch, dir };
|
|
52
|
+
}
|
|
53
|
+
throw new Error('TUI requires an interactive terminal. In non-interactive mode, pass <repo-url> <branch-name>.');
|
|
54
|
+
};
|
|
55
|
+
const ensureBareRepository = async (url, bareRepoPath, spinner) => {
|
|
56
|
+
const git = simpleGit();
|
|
57
|
+
if (fs.existsSync(bareRepoPath)) {
|
|
58
|
+
spinner.start(`Checking bare repository at ${chalk.dim(bareRepoPath)}`);
|
|
59
|
+
spinner.succeed('Bare repository found');
|
|
60
|
+
spinner.start('Fetching latest updates from remote...');
|
|
61
|
+
await simpleGit(bareRepoPath)
|
|
62
|
+
.outputHandler((_command, _stdout, stderr) => {
|
|
63
|
+
stderr.on('data', (data) => {
|
|
64
|
+
const line = data.toString().trim();
|
|
65
|
+
if (line) {
|
|
66
|
+
spinner.text = `Fetching: ${line}`;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
})
|
|
70
|
+
.fetch('origin');
|
|
71
|
+
spinner.succeed('Repository updated');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
spinner.start(`Cloning bare repository to ${chalk.dim(bareRepoPath)}...`);
|
|
75
|
+
await git
|
|
76
|
+
.outputHandler((_command, _stdout, stderr) => {
|
|
77
|
+
stderr.on('data', (data) => {
|
|
78
|
+
const line = data.toString().trim();
|
|
79
|
+
if (line) {
|
|
80
|
+
spinner.text = `Cloning: ${line}`;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
})
|
|
84
|
+
.clone(url, bareRepoPath, ['--bare', '--progress']);
|
|
85
|
+
spinner.succeed('Repository cloned successfully');
|
|
86
|
+
};
|
|
87
|
+
const isMissingBranchError = (error) => {
|
|
88
|
+
const message = toErrorMessage(error).toLowerCase();
|
|
89
|
+
return MISSING_BRANCH_PATTERNS.some((pattern) => message.includes(pattern));
|
|
90
|
+
};
|
|
91
|
+
const createWorktree = async (bareRepoPath, worktreePath, branch, spinner) => {
|
|
92
|
+
if (fs.existsSync(worktreePath)) {
|
|
93
|
+
throw new Error(`Worktree path ${worktreePath} already exists.`);
|
|
94
|
+
}
|
|
95
|
+
spinner.start(`Creating worktree for branch ${chalk.green(branch)}...`);
|
|
96
|
+
const bareGit = simpleGit(bareRepoPath);
|
|
97
|
+
try {
|
|
98
|
+
await bareGit.raw(['worktree', 'add', worktreePath, branch]);
|
|
99
|
+
spinner.succeed('Worktree created successfully!');
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (!isMissingBranchError(error)) {
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
spinner.text = `Branch ${branch} not found. Creating new branch...`;
|
|
106
|
+
await bareGit.raw(['worktree', 'add', '-b', branch, worktreePath]);
|
|
107
|
+
spinner.succeed('New branch worktree created!');
|
|
108
|
+
}
|
|
109
|
+
};
|
|
17
110
|
const run = async () => {
|
|
18
111
|
printBanner();
|
|
19
112
|
program
|
|
20
113
|
.name('git-wt')
|
|
21
114
|
.description('A CLI tool to create git worktrees from a repository URL and branch name')
|
|
22
|
-
.version(
|
|
23
|
-
.argument('[url]', 'Git repository URL')
|
|
24
|
-
.argument('[branch]', '
|
|
115
|
+
.version(version)
|
|
116
|
+
.argument('[url]', 'Optional: prefill Git repository URL in TUI')
|
|
117
|
+
.argument('[branch]', 'Optional: prefill branch name in TUI')
|
|
25
118
|
.option('-d, --dir <directory>', 'Base directory for worktrees', process.cwd())
|
|
26
119
|
.action(async (urlArg, branchArg, options) => {
|
|
27
|
-
|
|
28
|
-
let branch = branchArg;
|
|
29
|
-
// Interactive Mode if args missing
|
|
30
|
-
if (!url || !branch) {
|
|
31
|
-
console.log(boxen(chalk.cyan('Welcome to Git Easy Worktree! 🚀\nLet\'s set up your workspace.'), { padding: 1, borderStyle: 'round', borderColor: 'cyan' }));
|
|
32
|
-
const answers = await inquirer.prompt([
|
|
33
|
-
{
|
|
34
|
-
type: 'input',
|
|
35
|
-
name: 'url',
|
|
36
|
-
message: 'Enter Git Repository URL:',
|
|
37
|
-
when: !url,
|
|
38
|
-
validate: (input) => input ? true : 'URL is required'
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
type: 'input',
|
|
42
|
-
name: 'branch',
|
|
43
|
-
message: 'Enter Branch Name:',
|
|
44
|
-
when: !branch,
|
|
45
|
-
validate: (input) => input ? true : 'Branch name is required'
|
|
46
|
-
}
|
|
47
|
-
]);
|
|
48
|
-
if (!url)
|
|
49
|
-
url = answers.url;
|
|
50
|
-
if (!branch)
|
|
51
|
-
branch = answers.branch;
|
|
52
|
-
}
|
|
120
|
+
const spinner = ora();
|
|
53
121
|
try {
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
throw new Error('Invalid Git URL. Could not extract repository name.');
|
|
58
|
-
}
|
|
59
|
-
const repoName = repoNameMatch[1];
|
|
60
|
-
const baseDir = path.resolve(options.dir);
|
|
122
|
+
const { url, branch, dir } = await resolveInputs(urlArg, branchArg, options.dir);
|
|
123
|
+
const repoName = resolveRepoName(url);
|
|
124
|
+
const baseDir = path.resolve(dir);
|
|
61
125
|
const repoDir = path.join(baseDir, repoName);
|
|
62
126
|
const bareRepoPath = path.join(repoDir, '.bare');
|
|
63
127
|
const worktreePath = path.join(repoDir, branch);
|
|
64
128
|
await fs.ensureDir(repoDir);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.outputHandler((_command, _stdout, stderr) => {
|
|
74
|
-
stderr.on('data', (data) => {
|
|
75
|
-
const line = data.toString().trim();
|
|
76
|
-
if (line)
|
|
77
|
-
spinner.text = `Fetching: ${line}`;
|
|
78
|
-
});
|
|
79
|
-
})
|
|
80
|
-
.fetch('origin');
|
|
81
|
-
spinner.succeed('Repository updated');
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
spinner.start(`Cloning bare repository to ${chalk.dim(bareRepoPath)}...`);
|
|
85
|
-
await git
|
|
86
|
-
.outputHandler((_command, _stdout, stderr) => {
|
|
87
|
-
stderr.on('data', (data) => {
|
|
88
|
-
const line = data.toString().trim();
|
|
89
|
-
if (line)
|
|
90
|
-
spinner.text = `Cloning: ${line}`;
|
|
91
|
-
});
|
|
92
|
-
})
|
|
93
|
-
.clone(url, bareRepoPath, ['--bare', '--progress']);
|
|
94
|
-
spinner.succeed('Repository cloned successfully');
|
|
95
|
-
}
|
|
96
|
-
// 3. Create Worktree
|
|
97
|
-
if (fs.existsSync(worktreePath)) {
|
|
98
|
-
spinner.fail(`Worktree path ${worktreePath} already exists.`);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
spinner.start(`Creating worktree for branch ${chalk.green(branch)}...`);
|
|
102
|
-
const bareGit = simpleGit(bareRepoPath);
|
|
103
|
-
try {
|
|
104
|
-
await bareGit.raw(['worktree', 'add', worktreePath, branch]);
|
|
105
|
-
spinner.succeed('Worktree created successfully!');
|
|
106
|
-
}
|
|
107
|
-
catch (err) {
|
|
108
|
-
if (err.message.includes('invalid reference') || err.message.includes('not a valid object name')) {
|
|
109
|
-
spinner.text = `Branch ${branch} not found. Creating new branch...`;
|
|
110
|
-
await bareGit.raw(['worktree', 'add', '-b', branch, worktreePath]);
|
|
111
|
-
spinner.succeed('New branch worktree created!');
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
throw err;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
console.log('\n' + boxen(chalk.green(`🎉 All done! \n\n`) +
|
|
118
|
-
`📂 Worktree: ${chalk.cyan(worktreePath)}\n` +
|
|
119
|
-
`🌿 Branch: ${chalk.cyan(branch)}\n\n` +
|
|
120
|
-
chalk.dim(`cd ${path.relative(process.cwd(), worktreePath)}`), { padding: 1, borderStyle: 'round', borderColor: 'green' }));
|
|
129
|
+
await ensureBareRepository(url, bareRepoPath, spinner);
|
|
130
|
+
await createWorktree(bareRepoPath, worktreePath, branch, spinner);
|
|
131
|
+
const relativeWorktreePath = path.relative(process.cwd(), worktreePath) || '.';
|
|
132
|
+
console.log('\n' +
|
|
133
|
+
boxen(chalk.green('🎉 All done! \n\n') +
|
|
134
|
+
`📂 Worktree: ${chalk.cyan(worktreePath)}\n` +
|
|
135
|
+
`🌿 Branch: ${chalk.cyan(branch)}\n\n` +
|
|
136
|
+
chalk.dim(`cd ${relativeWorktreePath}`), { padding: 1, borderStyle: 'round', borderColor: 'green' }));
|
|
121
137
|
}
|
|
122
138
|
catch (error) {
|
|
123
|
-
|
|
124
|
-
process.
|
|
139
|
+
spinner.fail(chalk.red(toErrorMessage(error)));
|
|
140
|
+
process.exitCode = 1;
|
|
125
141
|
}
|
|
126
142
|
});
|
|
127
|
-
program.
|
|
143
|
+
await program.parseAsync(process.argv);
|
|
128
144
|
};
|
|
129
|
-
run()
|
|
145
|
+
run().catch((error) => {
|
|
146
|
+
ora().fail(chalk.red(toErrorMessage(error)));
|
|
147
|
+
process.exitCode = 1;
|
|
148
|
+
});
|
|
130
149
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tui.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type WorkspaceInputs = {
|
|
2
|
+
url: string;
|
|
3
|
+
branch: string;
|
|
4
|
+
dir: string;
|
|
5
|
+
};
|
|
6
|
+
type PartialInputs = Partial<WorkspaceInputs>;
|
|
7
|
+
export declare const collectInputsWithTui: (initial: PartialInputs) => Promise<WorkspaceInputs>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAEA,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAoD9C,eAAO,MAAM,oBAAoB,GAAI,SAAS,aAAa,KAAG,OAAO,CAAC,eAAe,CA0KjF,CAAC"}
|
package/dist/tui.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import blessed from 'blessed';
|
|
2
|
+
const createLabeledInput = (screen, parent, label, top, value) => {
|
|
3
|
+
blessed.text({
|
|
4
|
+
parent,
|
|
5
|
+
top,
|
|
6
|
+
left: 2,
|
|
7
|
+
width: 16,
|
|
8
|
+
height: 1,
|
|
9
|
+
content: label,
|
|
10
|
+
style: {
|
|
11
|
+
fg: 'cyan',
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
const input = blessed.textbox({
|
|
15
|
+
parent,
|
|
16
|
+
inputOnFocus: true,
|
|
17
|
+
mouse: true,
|
|
18
|
+
keys: true,
|
|
19
|
+
top,
|
|
20
|
+
left: 20,
|
|
21
|
+
right: 2,
|
|
22
|
+
height: 3,
|
|
23
|
+
border: 'line',
|
|
24
|
+
value,
|
|
25
|
+
style: {
|
|
26
|
+
fg: 'white',
|
|
27
|
+
border: { fg: 'gray' },
|
|
28
|
+
focus: { border: { fg: 'green' } },
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
input.on('focus', () => {
|
|
32
|
+
screen.render();
|
|
33
|
+
});
|
|
34
|
+
return input;
|
|
35
|
+
};
|
|
36
|
+
const toInitialValue = (value) => value?.trim() ?? '';
|
|
37
|
+
export const collectInputsWithTui = (initial) => new Promise((resolve, reject) => {
|
|
38
|
+
const screen = blessed.screen({
|
|
39
|
+
smartCSR: true,
|
|
40
|
+
title: 'Git Easy WT',
|
|
41
|
+
fullUnicode: true,
|
|
42
|
+
});
|
|
43
|
+
const root = blessed.box({
|
|
44
|
+
parent: screen,
|
|
45
|
+
top: 'center',
|
|
46
|
+
left: 'center',
|
|
47
|
+
width: '90%',
|
|
48
|
+
height: '90%',
|
|
49
|
+
border: 'line',
|
|
50
|
+
style: {
|
|
51
|
+
border: { fg: 'blue' },
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
blessed.box({
|
|
55
|
+
parent: root,
|
|
56
|
+
top: 1,
|
|
57
|
+
left: 2,
|
|
58
|
+
right: 2,
|
|
59
|
+
height: 2,
|
|
60
|
+
tags: true,
|
|
61
|
+
content: '{bold}Git Easy Worktree TUI{/bold} | Fill values and press Enter to continue',
|
|
62
|
+
style: {
|
|
63
|
+
fg: 'white',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const form = blessed.form({
|
|
67
|
+
parent: root,
|
|
68
|
+
top: 4,
|
|
69
|
+
left: 1,
|
|
70
|
+
right: 1,
|
|
71
|
+
bottom: 4,
|
|
72
|
+
keys: true,
|
|
73
|
+
mouse: true,
|
|
74
|
+
});
|
|
75
|
+
const urlInput = createLabeledInput(screen, form, 'Repository URL', 0, toInitialValue(initial.url));
|
|
76
|
+
const branchInput = createLabeledInput(screen, form, 'Branch', 4, toInitialValue(initial.branch));
|
|
77
|
+
const dirInput = createLabeledInput(screen, form, 'Base Dir', 8, toInitialValue(initial.dir || process.cwd()));
|
|
78
|
+
const message = blessed.box({
|
|
79
|
+
parent: root,
|
|
80
|
+
left: 2,
|
|
81
|
+
right: 2,
|
|
82
|
+
bottom: 2,
|
|
83
|
+
height: 1,
|
|
84
|
+
tags: true,
|
|
85
|
+
content: '{gray-fg}Tab/Shift+Tab switch focus · Enter submit · Esc cancel{/gray-fg}',
|
|
86
|
+
});
|
|
87
|
+
const submitButton = blessed.button({
|
|
88
|
+
parent: form,
|
|
89
|
+
mouse: true,
|
|
90
|
+
keys: true,
|
|
91
|
+
shrink: true,
|
|
92
|
+
top: 13,
|
|
93
|
+
left: 20,
|
|
94
|
+
padding: { left: 2, right: 2 },
|
|
95
|
+
name: 'submit',
|
|
96
|
+
content: 'Submit',
|
|
97
|
+
style: {
|
|
98
|
+
fg: 'black',
|
|
99
|
+
bg: 'green',
|
|
100
|
+
focus: { bg: 'white', fg: 'black' },
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const cancelButton = blessed.button({
|
|
104
|
+
parent: form,
|
|
105
|
+
mouse: true,
|
|
106
|
+
keys: true,
|
|
107
|
+
shrink: true,
|
|
108
|
+
top: 13,
|
|
109
|
+
left: 34,
|
|
110
|
+
padding: { left: 2, right: 2 },
|
|
111
|
+
name: 'cancel',
|
|
112
|
+
content: 'Cancel',
|
|
113
|
+
style: {
|
|
114
|
+
fg: 'white',
|
|
115
|
+
bg: 'red',
|
|
116
|
+
focus: { bg: 'white', fg: 'black' },
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
const focusables = [urlInput, branchInput, dirInput, submitButton, cancelButton];
|
|
120
|
+
let focusIndex = 0;
|
|
121
|
+
let settled = false;
|
|
122
|
+
const focusAt = (index) => {
|
|
123
|
+
const normalized = (index + focusables.length) % focusables.length;
|
|
124
|
+
const target = focusables[normalized];
|
|
125
|
+
if (!target) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
focusIndex = normalized;
|
|
129
|
+
target.focus();
|
|
130
|
+
screen.render();
|
|
131
|
+
};
|
|
132
|
+
const setError = (content) => {
|
|
133
|
+
message.setContent(`{red-fg}${content}{/red-fg}`);
|
|
134
|
+
screen.render();
|
|
135
|
+
};
|
|
136
|
+
const cleanup = () => {
|
|
137
|
+
screen.destroy();
|
|
138
|
+
};
|
|
139
|
+
const settle = (handler) => {
|
|
140
|
+
if (settled) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
settled = true;
|
|
144
|
+
cleanup();
|
|
145
|
+
handler();
|
|
146
|
+
};
|
|
147
|
+
const cancel = () => {
|
|
148
|
+
settle(() => reject(new Error('Cancelled by user.')));
|
|
149
|
+
};
|
|
150
|
+
const submit = () => {
|
|
151
|
+
const url = urlInput.getValue().trim();
|
|
152
|
+
const branch = branchInput.getValue().trim();
|
|
153
|
+
const dir = dirInput.getValue().trim();
|
|
154
|
+
if (!url) {
|
|
155
|
+
setError('Repository URL is required.');
|
|
156
|
+
focusAt(0);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (!branch) {
|
|
160
|
+
setError('Branch is required.');
|
|
161
|
+
focusAt(1);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (!dir) {
|
|
165
|
+
setError('Base directory is required.');
|
|
166
|
+
focusAt(2);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
settle(() => resolve({ url, branch, dir }));
|
|
170
|
+
};
|
|
171
|
+
screen.key(['tab'], () => focusAt(focusIndex + 1));
|
|
172
|
+
screen.key(['S-tab'], () => focusAt(focusIndex - 1));
|
|
173
|
+
screen.key(['escape', 'q', 'C-c'], cancel);
|
|
174
|
+
screen.key(['C-s'], submit);
|
|
175
|
+
urlInput.key('enter', () => focusAt(1));
|
|
176
|
+
branchInput.key('enter', () => focusAt(2));
|
|
177
|
+
dirInput.key('enter', submit);
|
|
178
|
+
submitButton.on('press', submit);
|
|
179
|
+
cancelButton.on('press', cancel);
|
|
180
|
+
form.on('submit', submit);
|
|
181
|
+
focusAt(0);
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=tui.js.map
|
package/dist/tui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "git-easy-worktree",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "CLI tool to create git worktrees from URL",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"start": "node dist/index.js",
|
|
13
13
|
"dev": "ts-node src/index.ts",
|
|
14
14
|
"prepublishOnly": "npm run build",
|
|
15
|
-
"test": "
|
|
15
|
+
"test": "npm run build && node --test"
|
|
16
16
|
},
|
|
17
17
|
"keywords": [
|
|
18
18
|
"git",
|
|
@@ -28,19 +28,18 @@
|
|
|
28
28
|
"author": "",
|
|
29
29
|
"license": "ISC",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"
|
|
32
|
-
"@types/inquirer": "^9.0.9",
|
|
31
|
+
"blessed": "^0.1.81",
|
|
33
32
|
"boxen": "^8.0.1",
|
|
34
33
|
"chalk": "^4.1.2",
|
|
35
34
|
"commander": "^14.0.3",
|
|
36
35
|
"figlet": "^1.10.0",
|
|
37
36
|
"fs-extra": "^11.3.3",
|
|
38
37
|
"gradient-string": "^3.0.0",
|
|
39
|
-
"inquirer": "^9.3.8",
|
|
40
38
|
"ora": "^9.3.0",
|
|
41
39
|
"simple-git": "^3.30.0"
|
|
42
40
|
},
|
|
43
41
|
"devDependencies": {
|
|
42
|
+
"@types/blessed": "^0.1.25",
|
|
44
43
|
"@types/figlet": "^1.7.0",
|
|
45
44
|
"@types/fs-extra": "^11.0.4",
|
|
46
45
|
"@types/gradient-string": "^1.1.6",
|