colyn-cli 3.1.4
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-en.md +85 -0
- package/README.md +85 -0
- package/bin/colyn +25 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.helpers.d.ts +48 -0
- package/dist/commands/add.helpers.d.ts.map +1 -0
- package/dist/commands/add.helpers.js +251 -0
- package/dist/commands/add.helpers.js.map +1 -0
- package/dist/commands/add.js +286 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/checkout.d.ts +16 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +428 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/completion.d.ts +10 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +380 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +338 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +41 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/info.d.ts +6 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +374 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.handlers.d.ts +27 -0
- package/dist/commands/init.handlers.d.ts.map +1 -0
- package/dist/commands/init.handlers.js +314 -0
- package/dist/commands/init.handlers.js.map +1 -0
- package/dist/commands/init.helpers.d.ts +42 -0
- package/dist/commands/init.helpers.d.ts.map +1 -0
- package/dist/commands/init.helpers.js +275 -0
- package/dist/commands/init.helpers.js.map +1 -0
- package/dist/commands/init.js +61 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.helpers.d.ts +32 -0
- package/dist/commands/install.helpers.d.ts.map +1 -0
- package/dist/commands/install.helpers.js +124 -0
- package/dist/commands/install.helpers.js.map +1 -0
- package/dist/commands/install.js +104 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list-project.d.ts +11 -0
- package/dist/commands/list-project.d.ts.map +1 -0
- package/dist/commands/list-project.js +260 -0
- package/dist/commands/list-project.js.map +1 -0
- package/dist/commands/list.d.ts +15 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.helpers.d.ts +50 -0
- package/dist/commands/list.helpers.d.ts.map +1 -0
- package/dist/commands/list.helpers.js +143 -0
- package/dist/commands/list.helpers.js.map +1 -0
- package/dist/commands/list.js +530 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/merge.d.ts +6 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.helpers.d.ts +74 -0
- package/dist/commands/merge.helpers.d.ts.map +1 -0
- package/dist/commands/merge.helpers.js +307 -0
- package/dist/commands/merge.helpers.js.map +1 -0
- package/dist/commands/merge.js +260 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/release.d.ts +6 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.helpers.d.ts +61 -0
- package/dist/commands/release.helpers.d.ts.map +1 -0
- package/dist/commands/release.helpers.js +277 -0
- package/dist/commands/release.helpers.js.map +1 -0
- package/dist/commands/release.js +127 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/remove.d.ts +6 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.helpers.d.ts +59 -0
- package/dist/commands/remove.helpers.d.ts.map +1 -0
- package/dist/commands/remove.helpers.js +190 -0
- package/dist/commands/remove.helpers.js.map +1 -0
- package/dist/commands/remove.js +137 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/repair.d.ts +6 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.helpers.d.ts +5 -0
- package/dist/commands/repair.helpers.d.ts.map +1 -0
- package/dist/commands/repair.helpers.js +499 -0
- package/dist/commands/repair.helpers.js.map +1 -0
- package/dist/commands/repair.js +28 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +116 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/system-integration.d.ts +6 -0
- package/dist/commands/system-integration.d.ts.map +1 -0
- package/dist/commands/system-integration.helpers.d.ts +70 -0
- package/dist/commands/system-integration.helpers.d.ts.map +1 -0
- package/dist/commands/system-integration.helpers.js +313 -0
- package/dist/commands/system-integration.helpers.js.map +1 -0
- package/dist/commands/system-integration.js +132 -0
- package/dist/commands/system-integration.js.map +1 -0
- package/dist/commands/tmux.d.ts +11 -0
- package/dist/commands/tmux.d.ts.map +1 -0
- package/dist/commands/tmux.js +500 -0
- package/dist/commands/tmux.js.map +1 -0
- package/dist/commands/todo.d.ts +6 -0
- package/dist/commands/todo.d.ts.map +1 -0
- package/dist/commands/todo.helpers.d.ts +50 -0
- package/dist/commands/todo.helpers.d.ts.map +1 -0
- package/dist/commands/todo.helpers.js +297 -0
- package/dist/commands/todo.helpers.js.map +1 -0
- package/dist/commands/todo.js +579 -0
- package/dist/commands/todo.js.map +1 -0
- package/dist/commands/update.d.ts +18 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.helpers.d.ts +89 -0
- package/dist/commands/update.helpers.d.ts.map +1 -0
- package/dist/commands/update.helpers.js +335 -0
- package/dist/commands/update.helpers.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/config-loader.d.ts +47 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +188 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/config-merger.d.ts +29 -0
- package/dist/core/config-merger.d.ts.map +1 -0
- package/dist/core/config-merger.js +100 -0
- package/dist/core/config-merger.js.map +1 -0
- package/dist/core/config-migration.d.ts +64 -0
- package/dist/core/config-migration.d.ts.map +1 -0
- package/dist/core/config-migration.js +340 -0
- package/dist/core/config-migration.js.map +1 -0
- package/dist/core/config-new.d.ts +19 -0
- package/dist/core/config-new.d.ts.map +1 -0
- package/dist/core/config-new.js +58 -0
- package/dist/core/config-new.js.map +1 -0
- package/dist/core/config-schema.d.ts +221 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +168 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/config.d.ts +55 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +143 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dev-server.d.ts +29 -0
- package/dist/core/dev-server.d.ts.map +1 -0
- package/dist/core/dev-server.js +54 -0
- package/dist/core/dev-server.js.map +1 -0
- package/dist/core/discovery.d.ts +51 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +247 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/env.d.ts +13 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +75 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/git.d.ts +31 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +56 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/paths.d.ts +86 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +256 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/tmux-config.d.ts +174 -0
- package/dist/core/tmux-config.d.ts.map +1 -0
- package/dist/core/tmux-config.js +545 -0
- package/dist/core/tmux-config.js.map +1 -0
- package/dist/core/tmux-config.legacy.d.ts +243 -0
- package/dist/core/tmux-config.legacy.d.ts.map +1 -0
- package/dist/core/tmux-config.legacy.js +896 -0
- package/dist/core/tmux-config.legacy.js.map +1 -0
- package/dist/core/tmux.d.ts +214 -0
- package/dist/core/tmux.d.ts.map +1 -0
- package/dist/core/tmux.js +712 -0
- package/dist/core/tmux.js.map +1 -0
- package/dist/core/toolchain-resolver.d.ts +51 -0
- package/dist/core/toolchain-resolver.d.ts.map +1 -0
- package/dist/core/toolchain-resolver.js +364 -0
- package/dist/core/toolchain-resolver.js.map +1 -0
- package/dist/core/worktree-status.d.ts +20 -0
- package/dist/core/worktree-status.d.ts.map +1 -0
- package/dist/core/worktree-status.js +67 -0
- package/dist/core/worktree-status.js.map +1 -0
- package/dist/i18n/index.d.ts +36 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +157 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +866 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +985 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/zh-CN.d.ts +865 -0
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
- package/dist/i18n/locales/zh-CN.js +985 -0
- package/dist/i18n/locales/zh-CN.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/builtin/gradle.d.ts +9 -0
- package/dist/plugins/builtin/gradle.d.ts.map +1 -0
- package/dist/plugins/builtin/gradle.js +164 -0
- package/dist/plugins/builtin/gradle.js.map +1 -0
- package/dist/plugins/builtin/maven.d.ts +9 -0
- package/dist/plugins/builtin/maven.d.ts.map +1 -0
- package/dist/plugins/builtin/maven.js +127 -0
- package/dist/plugins/builtin/maven.js.map +1 -0
- package/dist/plugins/builtin/npm.d.ts +9 -0
- package/dist/plugins/builtin/npm.d.ts.map +1 -0
- package/dist/plugins/builtin/npm.js +238 -0
- package/dist/plugins/builtin/npm.js.map +1 -0
- package/dist/plugins/builtin/pip.d.ts +9 -0
- package/dist/plugins/builtin/pip.d.ts.map +1 -0
- package/dist/plugins/builtin/pip.js +210 -0
- package/dist/plugins/builtin/pip.js.map +1 -0
- package/dist/plugins/builtin/xcode.d.ts +12 -0
- package/dist/plugins/builtin/xcode.d.ts.map +1 -0
- package/dist/plugins/builtin/xcode.js +438 -0
- package/dist/plugins/builtin/xcode.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +24 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/manager.d.ts +93 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +270 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/utils.d.ts +42 -0
- package/dist/plugins/utils.d.ts.map +1 -0
- package/dist/plugins/utils.js +175 -0
- package/dist/plugins/utils.js.map +1 -0
- package/dist/types/index.d.ts +104 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/plugin.d.ts +200 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +19 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +80 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/en/manual/04-command-reference/README.md +58 -0
- package/docs/en/manual/README.md +108 -0
- package/docs/zh-CN/manual/04-command-reference/README.md +58 -0
- package/docs/zh-CN/manual/README.md +108 -0
- package/package.json +65 -0
- package/shell/colyn.sh +55 -0
- package/shell/completion.bash +270 -0
- package/shell/completion.zsh +167 -0
package/README-en.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Colyn
|
|
2
|
+
|
|
3
|
+
[中文](README.md) | **English**
|
|
4
|
+
|
|
5
|
+
Let multiple AIs write code for you simultaneously. Colyn is a Git Worktree management tool built for **Parallel Vibe Coding**.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why Colyn?
|
|
10
|
+
|
|
11
|
+
AI coding assistants can now build complex features independently — but you're still doing **one thing at a time**: wait for Claude to finish, review it, hand off the next task. Your attention bandwidth has become the bottleneck.
|
|
12
|
+
|
|
13
|
+
Colyn lets you command multiple AIs developing different features in parallel — each worktree has its own branch, dev port, and runtime environment. One command to create, `Ctrl-b 1/2/3` to switch between them in tmux.
|
|
14
|
+
|
|
15
|
+
**[→ See it in action: User Story](docs/en/manual/00-user-story.md)**
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Core Capabilities
|
|
20
|
+
|
|
21
|
+
- **Parallel Worktree Management**: `colyn add feature/auth` creates a worktree in one step — port assigned, dependencies installed, directory switched automatically
|
|
22
|
+
- **Task Queue (Todo)**: Capture ideas anytime with `colyn todo add`; `colyn todo start` picks the next task and copies context to clipboard — paste into Claude and go
|
|
23
|
+
- **Deep tmux Integration**: Each worktree automatically maps to a tmux window with a fixed three-pane layout (Claude Code / Dev Server / Bash), started automatically
|
|
24
|
+
- **Merge Quality Gate**: `colyn merge` runs lint and build before merging — failing checks block the merge
|
|
25
|
+
- **Worktree Reuse**: `colyn checkout` switches tasks within the same worktree, preserving Claude's project context for higher efficiency on related features
|
|
26
|
+
- **Multi-toolchain Support**: npm, Maven, Gradle, pip, and Xcode projects work out of the box
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g colyn
|
|
34
|
+
|
|
35
|
+
# Configure shell integration (enables auto directory switching)
|
|
36
|
+
colyn setup
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Initialize project
|
|
45
|
+
colyn init -p 3000
|
|
46
|
+
|
|
47
|
+
# Create a parallel worktree (auto-switches to new directory, port 3001)
|
|
48
|
+
colyn add feature/auth
|
|
49
|
+
|
|
50
|
+
# View global status
|
|
51
|
+
colyn list
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**[→ Full Quick Start Guide](docs/en/manual/01-quick-start.md)**
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Documentation
|
|
59
|
+
|
|
60
|
+
| Document | Description |
|
|
61
|
+
|----------|-------------|
|
|
62
|
+
| [User Story](docs/en/manual/00-user-story.md) | See how Colyn works through a complete real-world scenario |
|
|
63
|
+
| [Quick Start](docs/en/manual/01-quick-start.md) | Get up and running in 5 minutes |
|
|
64
|
+
| [Core Concepts](docs/en/manual/03-core-concepts.md) | Understand worktrees, ports, and the dual-layer architecture |
|
|
65
|
+
| [tmux Integration](docs/en/manual/06-tmux-integration.md) | Manage all worktrees from one window |
|
|
66
|
+
| [Best Practices](docs/en/manual/07-best-practices.md) | Recommended workflows |
|
|
67
|
+
| [Command Reference](docs/en/manual/04-command-reference/README.md) | Detailed documentation for all commands |
|
|
68
|
+
| [Plugin System](docs/en/manual/11-plugin-system.md) | Multi-language toolchain support |
|
|
69
|
+
| [Troubleshooting](docs/en/manual/08-troubleshooting.md) | Common issues and solutions |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Development
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
volta run yarn install # Install dependencies
|
|
77
|
+
volta run yarn build # Build
|
|
78
|
+
volta run yarn test # Run tests
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## License
|
|
84
|
+
|
|
85
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Colyn
|
|
2
|
+
|
|
3
|
+
**中文** | [English](README-en.md)
|
|
4
|
+
|
|
5
|
+
让多个 AI 同时帮你写代码。Colyn 是专为**并行 Vibe Coding** 设计的 Git Worktree 管理工具。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 为什么需要 Colyn?
|
|
10
|
+
|
|
11
|
+
AI 编程助手已经能独立完成复杂功能,但你还在**一次只做一件事**:等 Claude 跑完,审查,再给下一个任务。你的注意力带宽成了瓶颈。
|
|
12
|
+
|
|
13
|
+
Colyn 让你同时指挥多个 AI 并行开发不同功能——每个 worktree 有独立的代码分支、开发端口、运行环境,用一条命令创建,用 `Ctrl-b 1/2/3` 在 tmux 中秒切。
|
|
14
|
+
|
|
15
|
+
**[→ 看完整的使用场景:用户故事](docs/zh-CN/manual/00-user-story.md)**
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 核心能力
|
|
20
|
+
|
|
21
|
+
- **并行 Worktree 管理**:`colyn add feature/auth` 一键创建 worktree,自动分配端口、安装依赖、切换目录
|
|
22
|
+
- **任务队列(Todo)**:随时 `colyn todo add` 捕捉灵感,`colyn todo start` 选任务时自动复制上下文到剪贴板,粘贴给 Claude 即可开工
|
|
23
|
+
- **tmux 深度集成**:每个 worktree 自动对应一个 tmux window,固定三栏布局(Claude Code / Dev Server / Bash),自动启动
|
|
24
|
+
- **合并质量把关**:`colyn merge` 前自动运行 lint 和 build,失败则阻止合并
|
|
25
|
+
- **Worktree 复用**:`colyn checkout` 在同一个 worktree 中切换任务,复用 Claude 的项目上下文,相关功能开发效率更高
|
|
26
|
+
- **多工具链支持**:npm、Maven、Gradle、pip、Xcode 项目开箱即用
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 安装
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g colyn
|
|
34
|
+
|
|
35
|
+
# 配置 shell 集成(启用自动目录切换)
|
|
36
|
+
colyn setup
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 快速开始
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 初始化项目
|
|
45
|
+
colyn init -p 3000
|
|
46
|
+
|
|
47
|
+
# 创建并行 worktree(自动切换到新目录,端口 3001)
|
|
48
|
+
colyn add feature/auth
|
|
49
|
+
|
|
50
|
+
# 查看全局状态
|
|
51
|
+
colyn list
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**[→ 完整的快速开始指南](docs/zh-CN/manual/01-quick-start.md)**
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 文档
|
|
59
|
+
|
|
60
|
+
| 文档 | 说明 |
|
|
61
|
+
|------|------|
|
|
62
|
+
| [用户故事](docs/zh-CN/manual/00-user-story.md) | 通过完整场景了解 Colyn 的工作方式 |
|
|
63
|
+
| [快速开始](docs/zh-CN/manual/01-quick-start.md) | 5 分钟上手 |
|
|
64
|
+
| [核心概念](docs/zh-CN/manual/03-core-concepts.md) | 理解 worktree、端口、双层架构 |
|
|
65
|
+
| [tmux 集成](docs/zh-CN/manual/06-tmux-integration.md) | 一个窗口管理所有 worktree |
|
|
66
|
+
| [最佳实践](docs/zh-CN/manual/07-best-practices.md) | 推荐工作流程 |
|
|
67
|
+
| [命令参考](docs/zh-CN/manual/04-command-reference/README.md) | 所有命令详细说明 |
|
|
68
|
+
| [插件系统](docs/zh-CN/manual/11-plugin-system.md) | 多语言工具链支持 |
|
|
69
|
+
| [故障排除](docs/zh-CN/manual/08-troubleshooting.md) | 常见问题解答 |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 开发
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
volta run yarn install # 安装依赖
|
|
77
|
+
volta run yarn build # 编译
|
|
78
|
+
volta run yarn test # 运行测试
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 许可证
|
|
84
|
+
|
|
85
|
+
MIT
|
package/bin/colyn
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Colyn - Git Worktree 管理工具
|
|
4
|
+
# 纯 Node.js 入口(不做目录切换)
|
|
5
|
+
# 如需目录切换功能,请 source shell/colyn.sh
|
|
6
|
+
|
|
7
|
+
# 保存用户当前工作目录
|
|
8
|
+
USER_CWD="$(pwd)"
|
|
9
|
+
|
|
10
|
+
# 定位脚本所在目录
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
13
|
+
COLYN_CORE="${PROJECT_DIR}/dist/index.js"
|
|
14
|
+
|
|
15
|
+
# 检查 Node.js 核心是否存在
|
|
16
|
+
if [[ ! -f "${COLYN_CORE}" ]]; then
|
|
17
|
+
echo "错误: 找不到 colyn 核心文件" >&2
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# 切换到项目目录
|
|
22
|
+
cd "$PROJECT_DIR" || exit 1
|
|
23
|
+
|
|
24
|
+
# 执行 Node.js 核心
|
|
25
|
+
COLYN_USER_CWD="$USER_CWD" node "${COLYN_CORE}" "$@"
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA+HA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAYzC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
6
|
+
import { registerAllCommands } from './commands/index.js';
|
|
7
|
+
import { t, initI18n } from './i18n/index.js';
|
|
8
|
+
import { getProjectPaths } from './core/paths.js';
|
|
9
|
+
// 获取 package.json 中的版本号
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
13
|
+
const version = packageJson.version;
|
|
14
|
+
// 检查是否禁用颜色输出
|
|
15
|
+
const noColor = process.argv.includes('--no-color') || process.argv.includes('-C');
|
|
16
|
+
if (noColor) {
|
|
17
|
+
// 禁用颜色输出
|
|
18
|
+
chalk.level = 0;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// 强制启用颜色输出
|
|
22
|
+
// 即使通过 alias 或管道调用,也保持彩色输出
|
|
23
|
+
chalk.level = 3; // 启用 TrueColor (24-bit) 支持
|
|
24
|
+
}
|
|
25
|
+
const program = new Command();
|
|
26
|
+
// 如果通过 bash 入口调用,使用环境变量中的用户目录
|
|
27
|
+
const userCwd = process.env.COLYN_USER_CWD;
|
|
28
|
+
if (userCwd) {
|
|
29
|
+
process.chdir(userCwd);
|
|
30
|
+
}
|
|
31
|
+
// 配置 commander.js 的帮助文本国际化
|
|
32
|
+
program.configureHelp({
|
|
33
|
+
formatHelp: (cmd, helper) => {
|
|
34
|
+
const termWidth = helper.padWidth(cmd, helper);
|
|
35
|
+
const helpWidth = helper.helpWidth || 80;
|
|
36
|
+
function formatItem(term, description) {
|
|
37
|
+
if (description) {
|
|
38
|
+
const fullText = `${term.padEnd(termWidth + 2)}${description}`;
|
|
39
|
+
return helper.wrap(fullText, helpWidth - 2, termWidth + 2);
|
|
40
|
+
}
|
|
41
|
+
return term;
|
|
42
|
+
}
|
|
43
|
+
function formatList(textArray) {
|
|
44
|
+
return textArray.join('\n').replace(/^/gm, ' ');
|
|
45
|
+
}
|
|
46
|
+
// Usage
|
|
47
|
+
let output = [`${t('cli.usage')} ${helper.commandUsage(cmd)}`, ''];
|
|
48
|
+
// Description
|
|
49
|
+
const commandDescription = helper.commandDescription(cmd);
|
|
50
|
+
if (commandDescription.length > 0) {
|
|
51
|
+
output = output.concat([helper.wrap(commandDescription, helpWidth, 0), '']);
|
|
52
|
+
}
|
|
53
|
+
// Arguments
|
|
54
|
+
const argumentList = helper.visibleArguments(cmd).map((argument) => {
|
|
55
|
+
return formatItem(helper.argumentTerm(argument), helper.argumentDescription(argument));
|
|
56
|
+
});
|
|
57
|
+
if (argumentList.length > 0) {
|
|
58
|
+
output = output.concat([t('cli.arguments'), formatList(argumentList), '']);
|
|
59
|
+
}
|
|
60
|
+
// Options
|
|
61
|
+
const optionList = helper.visibleOptions(cmd).map((option) => {
|
|
62
|
+
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
|
63
|
+
});
|
|
64
|
+
if (optionList.length > 0) {
|
|
65
|
+
output = output.concat([t('cli.options'), formatList(optionList), '']);
|
|
66
|
+
}
|
|
67
|
+
// Commands
|
|
68
|
+
const commandList = helper.visibleCommands(cmd).map((subCmd) => {
|
|
69
|
+
return formatItem(helper.subcommandTerm(subCmd), helper.subcommandDescription(subCmd));
|
|
70
|
+
});
|
|
71
|
+
if (commandList.length > 0) {
|
|
72
|
+
output = output.concat([t('cli.commands'), formatList(commandList), '']);
|
|
73
|
+
}
|
|
74
|
+
return output.join('\n');
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// 配置 Commander 输出(本地化错误消息)
|
|
78
|
+
program.configureOutput({
|
|
79
|
+
writeErr: (str) => {
|
|
80
|
+
// 本地化 Commander.js 错误消息
|
|
81
|
+
let localizedStr = str;
|
|
82
|
+
// 替换 "error:" 为本地化版本
|
|
83
|
+
localizedStr = localizedStr.replace(/^error:/i, chalk.red(`${t('common.error')}:`));
|
|
84
|
+
// 替换 "missing required argument" 消息
|
|
85
|
+
const missingArgMatch = localizedStr.match(/missing required argument '(.+?)'/);
|
|
86
|
+
if (missingArgMatch) {
|
|
87
|
+
const argName = missingArgMatch[1];
|
|
88
|
+
localizedStr = localizedStr.replace(/missing required argument '.+?'/, t('cli.missingArgument', { arg: argName }));
|
|
89
|
+
}
|
|
90
|
+
process.stderr.write(localizedStr);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
program
|
|
94
|
+
.name('colyn')
|
|
95
|
+
.description(t('cli.description'))
|
|
96
|
+
.version(version, '-V, --version', t('cli.versionDescription'))
|
|
97
|
+
.helpOption('-h, --help', t('cli.helpDescription'))
|
|
98
|
+
.addHelpCommand(t('cli.helpCommand'), t('cli.helpCommandDescription'))
|
|
99
|
+
.option('-C, --no-color', t('cli.noColorOption'))
|
|
100
|
+
.showHelpAfterError(t('cli.showHelpHint'));
|
|
101
|
+
// 注册所有命令
|
|
102
|
+
registerAllCommands(program);
|
|
103
|
+
export async function run() {
|
|
104
|
+
// 初始化 i18n(尝试读取项目配置)
|
|
105
|
+
let projectPaths = null;
|
|
106
|
+
try {
|
|
107
|
+
projectPaths = await getProjectPaths();
|
|
108
|
+
await initI18n(projectPaths.configDir);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// 不在项目目录中,只使用环境变量和用户配置
|
|
112
|
+
await initI18n();
|
|
113
|
+
}
|
|
114
|
+
program.parse();
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgWzC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO/C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { WorktreeInfo } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 验证分支名称是否有效
|
|
4
|
+
*/
|
|
5
|
+
export declare function isValidBranchName(branchName: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* 检查是否已初始化(通过检查 .colyn 目录是否存在)
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkInitialized(rootDir: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* 检查是否为 git 仓库
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkIsGitRepo(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* 检查主分支 .env.local 是否存在
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkMainEnvFile(rootDir: string, mainDirName: string): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* 处理分支(本地/远程/新建)
|
|
20
|
+
* 注意:此函数会确保分支存在,但不会签出分支(最后会切换回主分支)
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleBranch(branchName: string, mainBranch: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* 创建 worktree
|
|
25
|
+
* 注意:此函数应该在主分支目录(git 仓库所在地)中调用
|
|
26
|
+
* @param rootDir 项目根目录(用于计算相对路径)
|
|
27
|
+
* @param branchName 分支名称
|
|
28
|
+
* @param id worktree ID
|
|
29
|
+
* @param worktrees 已存在的 worktree 列表(用于查找冲突时提供信息)
|
|
30
|
+
*/
|
|
31
|
+
export declare function createWorktree(rootDir: string, branchName: string, id: number, worktrees: WorktreeInfo[]): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* 读取环境变量文件
|
|
34
|
+
*/
|
|
35
|
+
export declare function readEnvFile(filePath: string): Promise<Record<string, string>>;
|
|
36
|
+
/**
|
|
37
|
+
* 写入环境变量文件
|
|
38
|
+
*/
|
|
39
|
+
export declare function writeEnvFile(filePath: string, env: Record<string, string>): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* 配置 worktree 环境变量
|
|
42
|
+
*/
|
|
43
|
+
export declare function configureWorktreeEnv(mainDirPath: string, worktreePath: string, id: number, port: number): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* 显示成功信息(输出到 stderr)
|
|
46
|
+
*/
|
|
47
|
+
export declare function displayAddSuccess(id: number, branch: string, worktreePath: string, port: number, displayPath: string, runCommand?: string): void;
|
|
48
|
+
//# sourceMappingURL=add.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.helpers.d.ts","sourceRoot":"","sources":["../../src/commands/add.helpers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWtD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAoB7D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDxF;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CA+DjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuBnF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAkB,GAC7B,IAAI,CAqBN"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import simpleGit from 'simple-git';
|
|
6
|
+
import { ColynError } from '../types/index.js';
|
|
7
|
+
import { output, outputLine, outputSuccess, outputBold, outputStep } from '../utils/logger.js';
|
|
8
|
+
import { t } from '../i18n/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* 验证分支名称是否有效
|
|
11
|
+
*/
|
|
12
|
+
export function isValidBranchName(branchName) {
|
|
13
|
+
// Git 分支名称规则
|
|
14
|
+
// 允许: 字母、数字、下划线、连字符、斜杠
|
|
15
|
+
const branchNameRegex = /^[a-zA-Z0-9_\-/]+$/;
|
|
16
|
+
if (!branchNameRegex.test(branchName)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
// 不能以 / 开头或结尾
|
|
20
|
+
if (branchName.startsWith('/') || branchName.endsWith('/')) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
// 不能包含连续的斜杠
|
|
24
|
+
if (branchName.includes('//')) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 检查是否已初始化(通过检查 .colyn 目录是否存在)
|
|
31
|
+
*/
|
|
32
|
+
export async function checkInitialized(rootDir) {
|
|
33
|
+
const configDir = path.join(rootDir, '.colyn');
|
|
34
|
+
try {
|
|
35
|
+
await fs.access(configDir);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new ColynError(t('commands.add.notInitialized'), t('commands.add.notInitializedHint'));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 检查是否为 git 仓库
|
|
43
|
+
*/
|
|
44
|
+
export async function checkIsGitRepo() {
|
|
45
|
+
const git = simpleGit();
|
|
46
|
+
const isRepo = await git.checkIsRepo();
|
|
47
|
+
if (!isRepo) {
|
|
48
|
+
throw new ColynError(t('commands.add.notGitRepo'), t('commands.add.notGitRepoHint'));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 检查主分支 .env.local 是否存在
|
|
53
|
+
*/
|
|
54
|
+
export async function checkMainEnvFile(rootDir, mainDirName) {
|
|
55
|
+
const mainDirPath = path.join(rootDir, mainDirName);
|
|
56
|
+
const envFilePath = path.join(mainDirPath, '.env.local');
|
|
57
|
+
try {
|
|
58
|
+
await fs.access(envFilePath);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new ColynError(t('commands.add.missingEnvFile'), t('commands.add.missingEnvFileHint'));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 处理分支(本地/远程/新建)
|
|
66
|
+
* 注意:此函数会确保分支存在,但不会签出分支(最后会切换回主分支)
|
|
67
|
+
*/
|
|
68
|
+
export async function handleBranch(branchName, mainBranch) {
|
|
69
|
+
const git = simpleGit();
|
|
70
|
+
// 检查本地分支是否存在
|
|
71
|
+
const branches = await git.branchLocal();
|
|
72
|
+
const branchExists = branches.all.includes(branchName);
|
|
73
|
+
if (branchExists) {
|
|
74
|
+
// 本地分支存在,直接使用
|
|
75
|
+
output(chalk.gray(t('commands.add.usingLocalBranch', { branch: branchName })));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// 本地分支不存在,检查远程
|
|
79
|
+
const spinner = ora({ text: t('commands.add.checkingRemote'), stream: process.stderr }).start();
|
|
80
|
+
try {
|
|
81
|
+
// Fetch 最新的远程分支信息
|
|
82
|
+
await git.fetch();
|
|
83
|
+
// 检查远程分支是否存在
|
|
84
|
+
const remoteBranches = await git.branch(['-r']);
|
|
85
|
+
const remoteBranchName = `origin/${branchName}`;
|
|
86
|
+
const remoteExists = remoteBranches.all.includes(remoteBranchName);
|
|
87
|
+
if (remoteExists) {
|
|
88
|
+
// 远程分支存在,创建跟踪分支(但不签出)
|
|
89
|
+
spinner.text = t('commands.add.creatingFromRemote', { branch: branchName });
|
|
90
|
+
// 使用 --track 创建分支,但不签出
|
|
91
|
+
await git.raw(['branch', '--track', branchName, remoteBranchName]);
|
|
92
|
+
spinner.succeed(t('commands.add.createdFromRemote', { branch: branchName }));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// 远程也不存在,基于主分支创建新分支
|
|
96
|
+
spinner.text = t('commands.add.creatingNewBranch', { branch: branchName });
|
|
97
|
+
// 确保当前在主分支
|
|
98
|
+
const currentBranch = await git.revparse(['--abbrev-ref', 'HEAD']);
|
|
99
|
+
if (currentBranch.trim() !== mainBranch) {
|
|
100
|
+
await git.checkout(mainBranch);
|
|
101
|
+
}
|
|
102
|
+
// 创建新分支(但不签出)
|
|
103
|
+
await git.raw(['branch', branchName]);
|
|
104
|
+
spinner.succeed(t('commands.add.createdNewBranch', { branch: branchName }));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
spinner.fail(t('commands.add.branchHandleFailed'));
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 创建 worktree
|
|
114
|
+
* 注意:此函数应该在主分支目录(git 仓库所在地)中调用
|
|
115
|
+
* @param rootDir 项目根目录(用于计算相对路径)
|
|
116
|
+
* @param branchName 分支名称
|
|
117
|
+
* @param id worktree ID
|
|
118
|
+
* @param worktrees 已存在的 worktree 列表(用于查找冲突时提供信息)
|
|
119
|
+
*/
|
|
120
|
+
export async function createWorktree(rootDir, branchName, id, worktrees) {
|
|
121
|
+
const spinner = ora({ text: t('commands.add.creatingWorktree'), stream: process.stderr }).start();
|
|
122
|
+
try {
|
|
123
|
+
// worktree 的绝对路径
|
|
124
|
+
const worktreePath = path.join(rootDir, 'worktrees', `task-${id}`);
|
|
125
|
+
// 计算相对于当前目录(主分支目录)的路径
|
|
126
|
+
// 因为 git worktree add 使用的是相对路径
|
|
127
|
+
const relativePath = path.relative(process.cwd(), worktreePath);
|
|
128
|
+
const git = simpleGit();
|
|
129
|
+
// 使用 git worktree add 命令(使用相对路径)
|
|
130
|
+
await git.raw(['worktree', 'add', relativePath, branchName]);
|
|
131
|
+
spinner.succeed(t('commands.add.worktreeCreated', { id: String(id) }));
|
|
132
|
+
return worktreePath;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
spinner.fail(t('commands.add.worktreeCreateFailed'));
|
|
136
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
137
|
+
// 检查是否是分支已被其他 worktree 使用的错误
|
|
138
|
+
if (errorMessage.includes('already used by worktree')) {
|
|
139
|
+
// 尝试从错误信息中提取 worktree 路径
|
|
140
|
+
const pathMatch = errorMessage.match(/already used by worktree at ['"]?([^'"]+)['"]?/);
|
|
141
|
+
const existingPath = pathMatch ? pathMatch[1] : null;
|
|
142
|
+
// 查找已存在的 worktree 中该分支对应的信息
|
|
143
|
+
const existingWorktree = worktrees.find(w => w.branch === branchName);
|
|
144
|
+
if (existingWorktree) {
|
|
145
|
+
// 该分支在当前项目的配置中
|
|
146
|
+
throw new ColynError(t('commands.add.branchAlreadyUsed', { branch: branchName }), t('commands.add.branchAlreadyUsedHint', {
|
|
147
|
+
id: String(existingWorktree.id),
|
|
148
|
+
path: existingWorktree.path,
|
|
149
|
+
port: String(existingWorktree.port)
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
else if (existingPath) {
|
|
153
|
+
// 分支被其他项目或手动创建的 worktree 使用
|
|
154
|
+
throw new ColynError(t('commands.add.branchUsedByOther', { branch: branchName }), t('commands.add.branchUsedByOtherHint', { path: existingPath }));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// 无法提取路径信息,但确定是分支冲突
|
|
158
|
+
throw new ColynError(t('commands.add.branchUsedUnknown', { branch: branchName }), t('commands.add.branchUsedUnknownHint'));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// 其他错误
|
|
162
|
+
throw new ColynError(t('commands.add.worktreeError'), t('commands.add.worktreeErrorHint', { error: errorMessage }));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 读取环境变量文件
|
|
167
|
+
*/
|
|
168
|
+
export async function readEnvFile(filePath) {
|
|
169
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
170
|
+
const env = {};
|
|
171
|
+
const lines = content.split('\n');
|
|
172
|
+
for (const line of lines) {
|
|
173
|
+
const trimmed = line.trim();
|
|
174
|
+
// 跳过注释和空行
|
|
175
|
+
if (trimmed.startsWith('#') || trimmed === '') {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
// 解析环境变量
|
|
179
|
+
const match = trimmed.match(/^([^=]+)=(.*)$/);
|
|
180
|
+
if (match) {
|
|
181
|
+
const key = match[1].trim();
|
|
182
|
+
const value = match[2].trim();
|
|
183
|
+
env[key] = value;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return env;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 写入环境变量文件
|
|
190
|
+
*/
|
|
191
|
+
export async function writeEnvFile(filePath, env) {
|
|
192
|
+
const lines = [];
|
|
193
|
+
// 添加注释
|
|
194
|
+
lines.push('# Environment variables for this worktree');
|
|
195
|
+
lines.push('# Auto-generated by colyn');
|
|
196
|
+
lines.push('');
|
|
197
|
+
// 写入环境变量
|
|
198
|
+
for (const [key, value] of Object.entries(env)) {
|
|
199
|
+
lines.push(`${key}=${value}`);
|
|
200
|
+
}
|
|
201
|
+
lines.push(''); // 末尾空行
|
|
202
|
+
await fs.writeFile(filePath, lines.join('\n'), 'utf-8');
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 配置 worktree 环境变量
|
|
206
|
+
*/
|
|
207
|
+
export async function configureWorktreeEnv(mainDirPath, worktreePath, id, port) {
|
|
208
|
+
const spinner = ora({ text: t('commands.add.configuringEnv'), stream: process.stderr }).start();
|
|
209
|
+
try {
|
|
210
|
+
// 读取主分支的 .env.local
|
|
211
|
+
const mainEnvPath = path.join(mainDirPath, '.env.local');
|
|
212
|
+
const mainEnv = await readEnvFile(mainEnvPath);
|
|
213
|
+
// 复制所有环境变量
|
|
214
|
+
const worktreeEnv = { ...mainEnv };
|
|
215
|
+
// 更新 PORT 和 WORKTREE
|
|
216
|
+
worktreeEnv.PORT = port.toString();
|
|
217
|
+
worktreeEnv.WORKTREE = id.toString();
|
|
218
|
+
// 写入 worktree 的 .env.local
|
|
219
|
+
const worktreeEnvPath = path.join(worktreePath, '.env.local');
|
|
220
|
+
await writeEnvFile(worktreeEnvPath, worktreeEnv);
|
|
221
|
+
spinner.succeed(t('commands.add.envConfigured'));
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
spinner.fail(t('commands.add.envConfigFailed'));
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 显示成功信息(输出到 stderr)
|
|
230
|
+
*/
|
|
231
|
+
export function displayAddSuccess(id, branch, worktreePath, port, displayPath, runCommand = 'npm run') {
|
|
232
|
+
outputLine();
|
|
233
|
+
outputSuccess(t('commands.add.successTitle') + '\n');
|
|
234
|
+
outputBold(t('commands.add.worktreeInfo'));
|
|
235
|
+
output(` ${t('commands.add.infoId', { id: String(id) })}`);
|
|
236
|
+
output(` ${t('commands.add.infoBranch', { branch })}`);
|
|
237
|
+
output(` ${t('commands.add.infoPath', { path: displayPath })}`);
|
|
238
|
+
output(` ${t('commands.add.infoPort', { port: String(port) })}`);
|
|
239
|
+
outputLine();
|
|
240
|
+
outputBold(t('commands.add.nextSteps'));
|
|
241
|
+
outputStep(` ${t('commands.add.step1')}`);
|
|
242
|
+
output(` cd ${displayPath}`);
|
|
243
|
+
outputLine();
|
|
244
|
+
outputStep(` ${t('commands.add.step2')}`);
|
|
245
|
+
output(` ${runCommand} dev`);
|
|
246
|
+
outputLine();
|
|
247
|
+
outputStep(` ${t('commands.add.step3')}`);
|
|
248
|
+
output(' colyn list');
|
|
249
|
+
outputLine();
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=add.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.helpers.js","sourceRoot":"","sources":["../../src/commands/add.helpers.ts"],"names":[],"mappings":"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"}
|