@mcadam/worktree 1.0.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 +315 -0
- package/bin/worktree.js +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +110 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +75 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +90 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +82 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/components/WorktreeList.d.ts +10 -0
- package/dist/components/WorktreeList.d.ts.map +1 -0
- package/dist/components/WorktreeList.js +41 -0
- package/dist/components/WorktreeList.js.map +1 -0
- package/dist/config/detector.d.ts +4 -0
- package/dist/config/detector.d.ts.map +1 -0
- package/dist/config/detector.js +34 -0
- package/dist/config/detector.js.map +1 -0
- package/dist/config/manager.d.ts +19 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +73 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/schema.d.ts +77 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +19 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/utils/gh.d.ts +13 -0
- package/dist/utils/gh.d.ts.map +1 -0
- package/dist/utils/gh.js +41 -0
- package/dist/utils/gh.js.map +1 -0
- package/dist/utils/git.d.ts +14 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +91 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/sanitize.d.ts +3 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +13 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Unproprietary Corporation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# ๐ณ Worktree CLI
|
|
2
|
+
|
|
3
|
+
> **Transform your Git workflow with blazing-fast worktree management across multiple repositories** โก
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/worktree-cli)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
[](https://nodejs.org/)
|
|
9
|
+
|
|
10
|
+
## ๐ฏ Why Worktree CLI?
|
|
11
|
+
|
|
12
|
+
Stop juggling branches with `git stash` and `git checkout`. Stop losing your local changes. Stop waiting for dependency installs. **Start working on multiple features simultaneously without the hassle.**
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Old way ๐ซ
|
|
16
|
+
git stash
|
|
17
|
+
git checkout feature-B
|
|
18
|
+
npm install
|
|
19
|
+
# ... where did my changes go?
|
|
20
|
+
|
|
21
|
+
# Worktree way ๐
|
|
22
|
+
worktree feature-B
|
|
23
|
+
# Done! New isolated workspace ready in seconds!
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## โจ Features That Spark Joy
|
|
27
|
+
|
|
28
|
+
### ๐ **Lightning-Fast Setup**
|
|
29
|
+
One command to rule them all - create a worktree, copy env files, install dependencies, and open your IDE.
|
|
30
|
+
|
|
31
|
+
### ๐ข **Multi-Repository Management**
|
|
32
|
+
Manage worktrees across your entire stack - frontend, backend, microservices - all from one place.
|
|
33
|
+
|
|
34
|
+
### ๐ท๏ธ **Smart Organization**
|
|
35
|
+
Custom prefixes keep your worktrees organized (`fe-feature`, `be-bugfix`, `api-hotfix`).
|
|
36
|
+
|
|
37
|
+
### ๐จ **Beautiful CLI Experience**
|
|
38
|
+
React-powered interactive UI with Ink - because terminals can be beautiful too.
|
|
39
|
+
|
|
40
|
+
### ๐ **GitHub Integration**
|
|
41
|
+
See PR status instantly when `gh` CLI is installed - no API keys needed!
|
|
42
|
+
|
|
43
|
+
### ๐งน **Bulk Operations**
|
|
44
|
+
Select multiple worktrees with spacebar and delete them all at once. Spring cleaning made easy.
|
|
45
|
+
|
|
46
|
+
## ๐ฆ Installation
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# npm
|
|
50
|
+
npm install -g worktree-cli
|
|
51
|
+
|
|
52
|
+
# pnpm (recommended)
|
|
53
|
+
pnpm add -g worktree-cli
|
|
54
|
+
|
|
55
|
+
# yarn
|
|
56
|
+
yarn global add worktree-cli
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## ๐ Quick Start
|
|
60
|
+
|
|
61
|
+
### 1๏ธโฃ Initialize Your First Repository
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
cd your-awesome-project
|
|
65
|
+
worktree init
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
You'll be guided through a delightful setup:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
๐ Repository name: frontend
|
|
72
|
+
๐ท๏ธ Worktree prefix: fe-
|
|
73
|
+
๐ Base path: ../worktrees
|
|
74
|
+
๐ Env file: .env.local
|
|
75
|
+
๐ฆ Install command: pnpm install
|
|
76
|
+
๐ป IDE command: cursor
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 2๏ธโฃ Create Your First Worktree
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
worktree feature/dark-mode
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Watch the magic happen:
|
|
86
|
+
```
|
|
87
|
+
โจ Creating worktree for branch: feature/dark-mode
|
|
88
|
+
๐ Location: ../worktrees/fe-feature-dark-mode
|
|
89
|
+
โ Worktree created
|
|
90
|
+
โ Copied .env.local
|
|
91
|
+
โ Dependencies installed
|
|
92
|
+
โ Opened in cursor
|
|
93
|
+
|
|
94
|
+
โ
Ready for some epic code!
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 3๏ธโฃ Manage Your Worktrees
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
worktree list
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Interactive UI shows all your worktrees:
|
|
104
|
+
```
|
|
105
|
+
โโ Frontend (/Users/you/frontend) โโโโโโ
|
|
106
|
+
โ โ fe-feature-auth โ remote ๐ PR #23 โ
|
|
107
|
+
โ โ fe-dark-mode โ ๏ธ local only โ
|
|
108
|
+
โ โ fe-fix-header โ remote โ
|
|
109
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
110
|
+
|
|
111
|
+
[Space] Select [Enter] Delete [Q] Quit
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## ๐ฎ Commands
|
|
115
|
+
|
|
116
|
+
### `worktree <branch>` - Create Magic โจ
|
|
117
|
+
|
|
118
|
+
Creates a new worktree with all the bells and whistles:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
worktree feature/awesome-stuff
|
|
122
|
+
# Creates: ../worktrees/fe-feature-awesome-stuff
|
|
123
|
+
# Runs: pnpm install
|
|
124
|
+
# Copies: .env.local
|
|
125
|
+
# Opens: cursor
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `worktree list` - See Everything ๐
|
|
129
|
+
|
|
130
|
+
Beautiful interactive list of all worktrees across all repositories:
|
|
131
|
+
- **Space** - Select worktrees
|
|
132
|
+
- **Enter** - Delete selected
|
|
133
|
+
- **Q** - Quit
|
|
134
|
+
|
|
135
|
+
Status indicators:
|
|
136
|
+
- โ **remote** - Pushed to remote
|
|
137
|
+
- ๐ **PR #X** - Has an open pull request
|
|
138
|
+
- โ ๏ธ **local only** - Not yet pushed
|
|
139
|
+
|
|
140
|
+
### `worktree init` - Setup Paradise ๐๏ธ
|
|
141
|
+
|
|
142
|
+
Interactive configuration for the current repository:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
worktree init
|
|
146
|
+
# Answer a few questions and you're golden!
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### `worktree config` - Fine-Tune Everything โ๏ธ
|
|
150
|
+
|
|
151
|
+
Manage global defaults and repository settings:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
worktree config
|
|
155
|
+
# โข View configuration
|
|
156
|
+
# โข Edit defaults
|
|
157
|
+
# โข Remove repositories
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## ๐ฏ Real-World Workflow
|
|
161
|
+
|
|
162
|
+
### The Full-Stack Developer's Dream
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Monday morning - Set up your repositories
|
|
166
|
+
cd ~/projects/frontend
|
|
167
|
+
worktree init
|
|
168
|
+
# prefix: fe-
|
|
169
|
+
|
|
170
|
+
cd ~/projects/backend
|
|
171
|
+
worktree init
|
|
172
|
+
# prefix: be-
|
|
173
|
+
|
|
174
|
+
cd ~/projects/mobile
|
|
175
|
+
worktree init
|
|
176
|
+
# prefix: mob-
|
|
177
|
+
|
|
178
|
+
# Start working on a feature across all repos
|
|
179
|
+
cd ~/projects/frontend
|
|
180
|
+
worktree feature/user-dashboard
|
|
181
|
+
|
|
182
|
+
cd ~/projects/backend
|
|
183
|
+
worktree feature/user-dashboard-api
|
|
184
|
+
|
|
185
|
+
cd ~/projects/mobile
|
|
186
|
+
worktree feature/user-dashboard-mobile
|
|
187
|
+
|
|
188
|
+
# See all your work
|
|
189
|
+
worktree list
|
|
190
|
+
# Shows all 3 worktrees across all repos! ๐
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### The Quick Fix Master
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# Emergency hotfix needed!
|
|
197
|
+
worktree hotfix/critical-bug
|
|
198
|
+
|
|
199
|
+
# Fix the bug...
|
|
200
|
+
# Push to remote...
|
|
201
|
+
# Create PR...
|
|
202
|
+
|
|
203
|
+
# Clean up when done
|
|
204
|
+
worktree list
|
|
205
|
+
# Select the hotfix worktree
|
|
206
|
+
# Press Enter to delete
|
|
207
|
+
# โ
Workspace cleaned up!
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## โ๏ธ Configuration
|
|
211
|
+
|
|
212
|
+
Your config lives at `~/.worktreerc.json`:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"defaultBasePath": "../worktrees",
|
|
217
|
+
"defaultInstallCommand": "pnpm install",
|
|
218
|
+
"defaultIdeCommand": "cursor",
|
|
219
|
+
"repos": {
|
|
220
|
+
"/Users/you/frontend": {
|
|
221
|
+
"name": "frontend",
|
|
222
|
+
"prefix": "fe-",
|
|
223
|
+
"basePath": "../worktrees",
|
|
224
|
+
"envPath": ".env.local",
|
|
225
|
+
"installCommand": "pnpm install && pnpm prepare",
|
|
226
|
+
"ideCommand": "cursor"
|
|
227
|
+
},
|
|
228
|
+
"/Users/you/backend": {
|
|
229
|
+
"name": "backend",
|
|
230
|
+
"prefix": "be-",
|
|
231
|
+
"envPath": ".env",
|
|
232
|
+
"installCommand": "pnpm install && pnpm db:migrate"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## ๐ ๏ธ Development
|
|
239
|
+
|
|
240
|
+
Want to contribute? Awesome! Here's how to get started:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# Clone the repo
|
|
244
|
+
git clone https://github.com/yourusername/worktree-cli.git
|
|
245
|
+
cd worktree-cli
|
|
246
|
+
|
|
247
|
+
# Install dependencies
|
|
248
|
+
pnpm install
|
|
249
|
+
|
|
250
|
+
# Development mode with hot reload
|
|
251
|
+
pnpm dev
|
|
252
|
+
|
|
253
|
+
# Build for production
|
|
254
|
+
pnpm build
|
|
255
|
+
|
|
256
|
+
# Test locally
|
|
257
|
+
npm link
|
|
258
|
+
worktree --version
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Tech Stack
|
|
262
|
+
|
|
263
|
+
- **TypeScript** - Type safety FTW
|
|
264
|
+
- **Ink** - React for CLIs
|
|
265
|
+
- **Commander** - CLI argument parsing
|
|
266
|
+
- **Zod** - Runtime type validation
|
|
267
|
+
- **Biome** - Fast formatting & linting
|
|
268
|
+
|
|
269
|
+
## ๐ค Contributing
|
|
270
|
+
|
|
271
|
+
We love contributions! Whether it's:
|
|
272
|
+
|
|
273
|
+
- ๐ Bug reports
|
|
274
|
+
- ๐ก Feature requests
|
|
275
|
+
- ๐ Documentation improvements
|
|
276
|
+
- ๐จ UI/UX enhancements
|
|
277
|
+
- ๐ง Code contributions
|
|
278
|
+
|
|
279
|
+
Check out our [Contributing Guide](CONTRIBUTING.md) to get started.
|
|
280
|
+
|
|
281
|
+
## ๐ Requirements
|
|
282
|
+
|
|
283
|
+
- **Node.js** >= 18.0.0
|
|
284
|
+
- **Git** (obviously!)
|
|
285
|
+
- **gh CLI** (optional, for PR status)
|
|
286
|
+
|
|
287
|
+
## ๐ Success Stories
|
|
288
|
+
|
|
289
|
+
> "Worktree CLI changed my life! I can finally work on multiple features without losing my mind!" - Happy Developer
|
|
290
|
+
|
|
291
|
+
> "The prefix system is genius. My worktrees folder is finally organized!" - Organized Developer
|
|
292
|
+
|
|
293
|
+
> "Being able to see PR status right in the terminal? *Chef's kiss*" - Efficient Developer
|
|
294
|
+
|
|
295
|
+
## ๐ License
|
|
296
|
+
|
|
297
|
+
MIT ยฉ [Your Name]
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
<div align="center">
|
|
302
|
+
|
|
303
|
+
**Built with ๐ by developers, for developers**
|
|
304
|
+
|
|
305
|
+
[Report Bug](https://github.com/yourusername/worktree-cli/issues) ยท [Request Feature](https://github.com/yourusername/worktree-cli/issues) ยท [Star on GitHub](https://github.com/yourusername/worktree-cli)
|
|
306
|
+
|
|
307
|
+
</div>
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
<div align="center">
|
|
312
|
+
|
|
313
|
+
### ๐ Don't forget to star this repo if you find it useful! ๐
|
|
314
|
+
|
|
315
|
+
</div>
|
package/bin/worktree.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { program } from 'commander';
|
|
3
|
+
import { getGitRoot, isGitRepo } from './config/detector.js';
|
|
4
|
+
import { configManager } from './config/manager.js';
|
|
5
|
+
import { createCommand } from './commands/create.js';
|
|
6
|
+
import { listCommand } from './commands/list.js';
|
|
7
|
+
import { initCommand } from './commands/init.js';
|
|
8
|
+
import { configCommand } from './commands/config.js';
|
|
9
|
+
async function main() {
|
|
10
|
+
// Check if we're in a git repository
|
|
11
|
+
if (!(await isGitRepo())) {
|
|
12
|
+
console.error('Error: Not in a git repository');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const gitRoot = await getGitRoot();
|
|
16
|
+
if (!gitRoot) {
|
|
17
|
+
console.error('Error: Could not determine git root');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Load config
|
|
21
|
+
await configManager.load();
|
|
22
|
+
program
|
|
23
|
+
.name('worktree')
|
|
24
|
+
.description('CLI tool for managing Git worktrees across multiple repositories')
|
|
25
|
+
.version('1.0.0');
|
|
26
|
+
program
|
|
27
|
+
.argument('[branch]', 'Branch name to create worktree for')
|
|
28
|
+
.description('Create a new worktree or manage existing ones')
|
|
29
|
+
.action(async (branch) => {
|
|
30
|
+
if (branch) {
|
|
31
|
+
// Create worktree
|
|
32
|
+
await createCommand(branch, gitRoot);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Show list if no branch provided
|
|
36
|
+
await listCommand(gitRoot);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
program
|
|
40
|
+
.command('list')
|
|
41
|
+
.description('List and manage worktrees across all configured repositories')
|
|
42
|
+
.action(async () => {
|
|
43
|
+
await listCommand(gitRoot);
|
|
44
|
+
});
|
|
45
|
+
program
|
|
46
|
+
.command('init')
|
|
47
|
+
.description('Initialize configuration for current repository')
|
|
48
|
+
.action(async () => {
|
|
49
|
+
await initCommand(gitRoot);
|
|
50
|
+
});
|
|
51
|
+
program
|
|
52
|
+
.command('config')
|
|
53
|
+
.description('Manage worktree configuration')
|
|
54
|
+
.action(async () => {
|
|
55
|
+
await configCommand(gitRoot);
|
|
56
|
+
});
|
|
57
|
+
await program.parseAsync(process.argv);
|
|
58
|
+
}
|
|
59
|
+
main().catch((error) => {
|
|
60
|
+
console.error('Error:', error.message);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,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,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,KAAK,UAAU,IAAI;IACjB,qCAAqC;IACrC,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,cAAc;IACd,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;IAE1B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnB,OAAO;SACJ,QAAQ,CAAC,UAAU,EAAE,oCAAoC,CAAC;SAC1D,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,EAAE;QAChC,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,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,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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.tsx"],"names":[],"mappings":"AAwLA,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { render, Box, Text, useInput, useApp } from 'ink';
|
|
4
|
+
import SelectInput from 'ink-select-input';
|
|
5
|
+
import TextInput from 'ink-text-input';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { configManager } from '../config/manager.js';
|
|
8
|
+
function ConfigMenu({}) {
|
|
9
|
+
const [action, setAction] = useState(null);
|
|
10
|
+
const [editingDefault, setEditingDefault] = useState(null);
|
|
11
|
+
const [inputValue, setInputValue] = useState('');
|
|
12
|
+
const { exit } = useApp();
|
|
13
|
+
useInput((input) => {
|
|
14
|
+
if (input === 'q' && !editingDefault) {
|
|
15
|
+
exit();
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const handleSelect = (item) => {
|
|
19
|
+
setAction(item.value);
|
|
20
|
+
if (item.value === 'back') {
|
|
21
|
+
exit();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const handleDefaultEdit = async (field, value) => {
|
|
25
|
+
const updates = {};
|
|
26
|
+
updates[field] = value;
|
|
27
|
+
await configManager.updateDefaults(updates);
|
|
28
|
+
setEditingDefault(null);
|
|
29
|
+
setInputValue('');
|
|
30
|
+
console.log(chalk.green(`\nโ
Updated ${field} successfully!`));
|
|
31
|
+
console.log(chalk.cyan(`๐ฏ Your new default is now active!`));
|
|
32
|
+
};
|
|
33
|
+
if (editingDefault) {
|
|
34
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: ["Enter new value for ", editingDefault, ":"] }), _jsx(TextInput, { value: inputValue, onChange: setInputValue, onSubmit: (value) => handleDefaultEdit(editingDefault, value) })] }));
|
|
35
|
+
}
|
|
36
|
+
if (action === 'view') {
|
|
37
|
+
return _jsx(ConfigViewer, { onBack: () => setAction(null) });
|
|
38
|
+
}
|
|
39
|
+
if (action === 'edit-defaults') {
|
|
40
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "cyan", children: "Edit Default Settings" }), _jsx(SelectInput, { items: [
|
|
41
|
+
{ label: 'Default Base Path', value: 'defaultBasePath' },
|
|
42
|
+
{ label: 'Default Install Command', value: 'defaultInstallCommand' },
|
|
43
|
+
{ label: 'Default IDE Command', value: 'defaultIdeCommand' },
|
|
44
|
+
{ label: 'Back', value: 'back' },
|
|
45
|
+
], onSelect: (item) => {
|
|
46
|
+
if (item.value === 'back') {
|
|
47
|
+
setAction(null);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
setEditingDefault(item.value);
|
|
51
|
+
}
|
|
52
|
+
} })] }));
|
|
53
|
+
}
|
|
54
|
+
if (action === 'remove-repo') {
|
|
55
|
+
return _jsx(RepoRemover, { onBack: () => setAction(null) });
|
|
56
|
+
}
|
|
57
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "cyan", children: "Worktree Configuration" }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
|
|
58
|
+
{ label: 'View Configuration', value: 'view' },
|
|
59
|
+
{ label: 'Edit Default Settings', value: 'edit-defaults' },
|
|
60
|
+
{ label: 'Remove Repository', value: 'remove-repo' },
|
|
61
|
+
{ label: 'Exit', value: 'back' },
|
|
62
|
+
], onSelect: handleSelect }) })] }));
|
|
63
|
+
}
|
|
64
|
+
function ConfigViewer({ onBack }) {
|
|
65
|
+
const [config, setConfig] = useState(null);
|
|
66
|
+
React.useEffect(() => {
|
|
67
|
+
configManager.load().then(setConfig);
|
|
68
|
+
}, []);
|
|
69
|
+
useInput((input) => {
|
|
70
|
+
if (input === 'b') {
|
|
71
|
+
onBack();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
if (!config) {
|
|
75
|
+
return _jsx(Text, { children: "Loading..." });
|
|
76
|
+
}
|
|
77
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "cyan", children: "Current Configuration" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Defaults:" }), _jsxs(Text, { children: [" Base Path: ", config.defaultBasePath] }), _jsxs(Text, { children: [" Install Command: ", config.defaultInstallCommand] }), _jsxs(Text, { children: [" IDE Command: ", config.defaultIdeCommand] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: "Repositories:" }) }), Object.entries(config.repos).map(([path, repo]) => (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsxs(Text, { color: "yellow", children: [repo.name, " (", path, ")"] }), _jsxs(Text, { children: [" Prefix: ", repo.prefix] }), repo.basePath && _jsxs(Text, { children: [" Base Path: ", repo.basePath] }), repo.envPath && _jsxs(Text, { children: [" Env Path: ", repo.envPath] }), repo.installCommand && _jsxs(Text, { children: [" Install: ", repo.installCommand] }), repo.ideCommand && _jsxs(Text, { children: [" IDE: ", repo.ideCommand] })] }, path)))] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press 'b' to go back" }) })] }));
|
|
78
|
+
}
|
|
79
|
+
function RepoRemover({ onBack }) {
|
|
80
|
+
const [repos, setRepos] = useState([]);
|
|
81
|
+
React.useEffect(() => {
|
|
82
|
+
configManager.getAllRepoConfigs().then((configs) => {
|
|
83
|
+
const items = Object.entries(configs).map(([path, config]) => ({
|
|
84
|
+
label: `${config.name} (${path})`,
|
|
85
|
+
value: path,
|
|
86
|
+
}));
|
|
87
|
+
items.push({ label: 'Cancel', value: 'cancel' });
|
|
88
|
+
setRepos(items);
|
|
89
|
+
});
|
|
90
|
+
}, []);
|
|
91
|
+
const handleSelect = async (item) => {
|
|
92
|
+
if (item.value === 'cancel') {
|
|
93
|
+
onBack();
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
await configManager.removeRepoConfig(item.value);
|
|
97
|
+
console.log(chalk.green(`\nโ
Removed repository configuration`));
|
|
98
|
+
console.log(chalk.cyan(`๐งน Repository config cleaned up!`));
|
|
99
|
+
setTimeout(() => onBack(), 1000);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
if (repos.length === 0) {
|
|
103
|
+
return _jsx(Text, { children: "Loading..." });
|
|
104
|
+
}
|
|
105
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "cyan", children: "Select Repository to Remove" }), _jsx(SelectInput, { items: repos, onSelect: handleSelect })] }));
|
|
106
|
+
}
|
|
107
|
+
export async function configCommand(gitRoot) {
|
|
108
|
+
render(_jsx(ConfigMenu, { gitRoot: gitRoot }));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AACtC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAQpD,SAAS,UAAU,CAAC,EAAoB;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAA;IAC/D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;IAEzB,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,EAAE,CAAA;QACR,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,CAAC,IAA6B,EAAE,EAAE;QACrD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,EAAE,CAAA;QACR,CAAC;IACH,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,KAAK,EAAE,KAAa,EAAE,KAAa,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAQ,EAAE,CAAA;QACvB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QACtB,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3C,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,aAAa,CAAC,EAAE,CAAC,CAAA;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,gBAAgB,CAAC,CAAC,CAAA;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAA;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,uCAAsB,cAAc,SAAS,EAClD,KAAC,SAAS,IACR,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,GAC7D,IACE,CACP,CAAA;IACH,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,KAAC,YAAY,IAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAI,CAAA;IACxD,CAAC;IAED,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QAC/B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,sCAA6B,EACpD,KAAC,WAAW,IACV,KAAK,EAAE;wBACL,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,iBAAiB,EAAE;wBACxD,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,uBAAuB,EAAE;wBACpE,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,mBAAmB,EAAE;wBAC5D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;qBACjC,EACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;wBACjB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;4BAC1B,SAAS,CAAC,IAAI,CAAC,CAAA;wBACjB,CAAC;6BAAM,CAAC;4BACN,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBAC/B,CAAC;oBACH,CAAC,GACD,IACE,CACP,CAAA;IACH,CAAC;IAED,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,OAAO,KAAC,WAAW,IAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAI,CAAA;IACvD,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,uCAA8B,EACrD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,WAAW,IACV,KAAK,EAAE;wBACL,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC9C,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,eAAe,EAAE;wBAC1D,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,EAAE;wBACpD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;qBACjC,EACD,QAAQ,EAAE,YAAY,GACtB,GACE,IACF,CACP,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,MAAM,EAA0B;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAM,IAAI,CAAC,CAAA;IAE/C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,EAAE,CAAA;QACV,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAC,IAAI,6BAAkB,CAAA;IAChC,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,sCAA6B,EACpD,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,KAAC,IAAI,IAAC,IAAI,gCAAiB,EAC3B,MAAC,IAAI,gCAAe,MAAM,CAAC,eAAe,IAAQ,EAClD,MAAC,IAAI,sCAAqB,MAAM,CAAC,qBAAqB,IAAQ,EAC9D,MAAC,IAAI,kCAAiB,MAAM,CAAC,iBAAiB,IAAQ,EAEtD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,oCAAqB,GAAM,EACvD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAgB,EAAE,EAAE,CAAC,CACjE,MAAC,GAAG,IAAY,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aAClD,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aAAE,IAAI,CAAC,IAAI,QAAI,IAAI,SAAS,EAChD,MAAC,IAAI,6BAAY,IAAI,CAAC,MAAM,IAAQ,EACnC,IAAI,CAAC,QAAQ,IAAI,MAAC,IAAI,gCAAe,IAAI,CAAC,QAAQ,IAAQ,EAC1D,IAAI,CAAC,OAAO,IAAI,MAAC,IAAI,+BAAc,IAAI,CAAC,OAAO,IAAQ,EACvD,IAAI,CAAC,cAAc,IAAI,MAAC,IAAI,8BAAa,IAAI,CAAC,cAAc,IAAQ,EACpE,IAAI,CAAC,UAAU,IAAI,MAAC,IAAI,0BAAS,IAAI,CAAC,UAAU,IAAQ,KANjD,IAAI,CAOR,CACP,CAAC,IACE,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,QAAQ,2CAA4B,GAAM,IAC/D,CACP,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,MAAM,EAA0B;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0C,EAAE,CAAC,CAAA;IAE/E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,aAAa,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7D,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,GAAG;gBACjC,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC,CAAA;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;YAChD,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAG,KAAK,EAAE,IAAuB,EAAE,EAAE;QACrD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,EAAE,CAAA;QACV,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAA;YAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAA;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAC,IAAI,6BAAkB,CAAA;IAChC,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,4CAAmC,EAC1D,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,GAAI,IACjD,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,CAAC,KAAC,UAAU,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { configManager } from '../config/manager.js';
|
|
7
|
+
import { createWorktreeName } from '../utils/sanitize.js';
|
|
8
|
+
import { createWorktree } from '../utils/git.js';
|
|
9
|
+
import { initCommand } from './init.js';
|
|
10
|
+
export async function createCommand(branch, gitRoot) {
|
|
11
|
+
// Check if repo is configured
|
|
12
|
+
let repoConfig = await configManager.getRepoConfig(gitRoot);
|
|
13
|
+
if (!repoConfig) {
|
|
14
|
+
console.log(chalk.yellow('This repository is not configured yet.'));
|
|
15
|
+
console.log(chalk.cyan('Let\'s set it up first!\n'));
|
|
16
|
+
await initCommand(gitRoot);
|
|
17
|
+
repoConfig = await configManager.getRepoConfig(gitRoot);
|
|
18
|
+
if (!repoConfig) {
|
|
19
|
+
console.error(chalk.red('Configuration cancelled'));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const config = configManager.getEffectiveConfig(repoConfig);
|
|
24
|
+
const worktreeName = createWorktreeName(branch, repoConfig.prefix);
|
|
25
|
+
const worktreePath = path.resolve(gitRoot, config.basePath, worktreeName);
|
|
26
|
+
console.log(chalk.blue(`Creating worktree for branch: ${branch}`));
|
|
27
|
+
console.log(chalk.gray(`Location: ${worktreePath}`));
|
|
28
|
+
const spinner = ora();
|
|
29
|
+
try {
|
|
30
|
+
// Create worktree
|
|
31
|
+
spinner.start('Creating worktree...');
|
|
32
|
+
await createWorktree(config.basePath, worktreeName, branch, gitRoot);
|
|
33
|
+
spinner.succeed('Worktree created');
|
|
34
|
+
// Copy .env file if configured
|
|
35
|
+
if (config.envPath) {
|
|
36
|
+
spinner.start('Copying environment file...');
|
|
37
|
+
const sourcePath = path.join(gitRoot, config.envPath);
|
|
38
|
+
const destPath = path.join(worktreePath, config.envPath);
|
|
39
|
+
if (await fs.pathExists(sourcePath)) {
|
|
40
|
+
await fs.copy(sourcePath, destPath);
|
|
41
|
+
spinner.succeed(`Copied ${config.envPath}`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
spinner.warn(`Environment file ${config.envPath} not found`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Run install command
|
|
48
|
+
if (config.installCommand) {
|
|
49
|
+
spinner.start(`Running: ${config.installCommand}`);
|
|
50
|
+
await execa(config.installCommand, [], {
|
|
51
|
+
cwd: worktreePath,
|
|
52
|
+
shell: true,
|
|
53
|
+
stdio: 'inherit',
|
|
54
|
+
});
|
|
55
|
+
spinner.succeed('Dependencies installed');
|
|
56
|
+
}
|
|
57
|
+
// Open IDE
|
|
58
|
+
if (config.ideCommand) {
|
|
59
|
+
spinner.start(`Opening in ${config.ideCommand}...`);
|
|
60
|
+
await execa(config.ideCommand, [worktreePath], {
|
|
61
|
+
detached: true,
|
|
62
|
+
stdio: 'ignore',
|
|
63
|
+
});
|
|
64
|
+
spinner.succeed(`Opened in ${config.ideCommand}`);
|
|
65
|
+
}
|
|
66
|
+
console.log(chalk.green(`\nโจ Worktree ready at: ${worktreePath}`));
|
|
67
|
+
console.log(chalk.cyan(`โ
Ready for some epic code!`));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
spinner.fail('Failed to create worktree');
|
|
71
|
+
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +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;AACvB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IACjE,8BAA8B;IAC9B,IAAI,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAE3D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAA;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAA;QACpD,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1B,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAEvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAA;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAC3D,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAEzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC,CAAA;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,YAAY,EAAE,CAAC,CAAC,CAAA;IAEpD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAA;IAErB,IAAI,CAAC;QACH,kBAAkB;QAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;QACrC,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QACpE,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAEnC,+BAA+B;QAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;YAExD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;gBACnC,OAAO,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,OAAO,YAAY,CAAC,CAAA;YAC9D,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;YAClD,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE;gBACrC,GAAG,EAAE,YAAY;gBACjB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;YACF,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;QAC3C,CAAC;QAED,WAAW;QACX,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,UAAU,KAAK,CAAC,CAAA;YACnD,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;gBAC7C,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAA;YACF,OAAO,CAAC,OAAO,CAAC,aAAa,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.tsx"],"names":[],"mappings":"AAyGA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhE"}
|