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.
Files changed (263) hide show
  1. package/README-en.md +85 -0
  2. package/README.md +85 -0
  3. package/bin/colyn +25 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +116 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/add.d.ts +6 -0
  9. package/dist/commands/add.d.ts.map +1 -0
  10. package/dist/commands/add.helpers.d.ts +48 -0
  11. package/dist/commands/add.helpers.d.ts.map +1 -0
  12. package/dist/commands/add.helpers.js +251 -0
  13. package/dist/commands/add.helpers.js.map +1 -0
  14. package/dist/commands/add.js +286 -0
  15. package/dist/commands/add.js.map +1 -0
  16. package/dist/commands/checkout.d.ts +16 -0
  17. package/dist/commands/checkout.d.ts.map +1 -0
  18. package/dist/commands/checkout.js +428 -0
  19. package/dist/commands/checkout.js.map +1 -0
  20. package/dist/commands/completion.d.ts +10 -0
  21. package/dist/commands/completion.d.ts.map +1 -0
  22. package/dist/commands/completion.js +380 -0
  23. package/dist/commands/completion.js.map +1 -0
  24. package/dist/commands/config.d.ts +11 -0
  25. package/dist/commands/config.d.ts.map +1 -0
  26. package/dist/commands/config.js +338 -0
  27. package/dist/commands/config.js.map +1 -0
  28. package/dist/commands/index.d.ts +10 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +41 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/info.d.ts +6 -0
  33. package/dist/commands/info.d.ts.map +1 -0
  34. package/dist/commands/info.js +374 -0
  35. package/dist/commands/info.js.map +1 -0
  36. package/dist/commands/init.d.ts +6 -0
  37. package/dist/commands/init.d.ts.map +1 -0
  38. package/dist/commands/init.handlers.d.ts +27 -0
  39. package/dist/commands/init.handlers.d.ts.map +1 -0
  40. package/dist/commands/init.handlers.js +314 -0
  41. package/dist/commands/init.handlers.js.map +1 -0
  42. package/dist/commands/init.helpers.d.ts +42 -0
  43. package/dist/commands/init.helpers.d.ts.map +1 -0
  44. package/dist/commands/init.helpers.js +275 -0
  45. package/dist/commands/init.helpers.js.map +1 -0
  46. package/dist/commands/init.js +61 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/install.d.ts +6 -0
  49. package/dist/commands/install.d.ts.map +1 -0
  50. package/dist/commands/install.helpers.d.ts +32 -0
  51. package/dist/commands/install.helpers.d.ts.map +1 -0
  52. package/dist/commands/install.helpers.js +124 -0
  53. package/dist/commands/install.helpers.js.map +1 -0
  54. package/dist/commands/install.js +104 -0
  55. package/dist/commands/install.js.map +1 -0
  56. package/dist/commands/list-project.d.ts +11 -0
  57. package/dist/commands/list-project.d.ts.map +1 -0
  58. package/dist/commands/list-project.js +260 -0
  59. package/dist/commands/list-project.js.map +1 -0
  60. package/dist/commands/list.d.ts +15 -0
  61. package/dist/commands/list.d.ts.map +1 -0
  62. package/dist/commands/list.helpers.d.ts +50 -0
  63. package/dist/commands/list.helpers.d.ts.map +1 -0
  64. package/dist/commands/list.helpers.js +143 -0
  65. package/dist/commands/list.helpers.js.map +1 -0
  66. package/dist/commands/list.js +530 -0
  67. package/dist/commands/list.js.map +1 -0
  68. package/dist/commands/merge.d.ts +6 -0
  69. package/dist/commands/merge.d.ts.map +1 -0
  70. package/dist/commands/merge.helpers.d.ts +74 -0
  71. package/dist/commands/merge.helpers.d.ts.map +1 -0
  72. package/dist/commands/merge.helpers.js +307 -0
  73. package/dist/commands/merge.helpers.js.map +1 -0
  74. package/dist/commands/merge.js +260 -0
  75. package/dist/commands/merge.js.map +1 -0
  76. package/dist/commands/release.d.ts +6 -0
  77. package/dist/commands/release.d.ts.map +1 -0
  78. package/dist/commands/release.helpers.d.ts +61 -0
  79. package/dist/commands/release.helpers.d.ts.map +1 -0
  80. package/dist/commands/release.helpers.js +277 -0
  81. package/dist/commands/release.helpers.js.map +1 -0
  82. package/dist/commands/release.js +127 -0
  83. package/dist/commands/release.js.map +1 -0
  84. package/dist/commands/remove.d.ts +6 -0
  85. package/dist/commands/remove.d.ts.map +1 -0
  86. package/dist/commands/remove.helpers.d.ts +59 -0
  87. package/dist/commands/remove.helpers.d.ts.map +1 -0
  88. package/dist/commands/remove.helpers.js +190 -0
  89. package/dist/commands/remove.helpers.js.map +1 -0
  90. package/dist/commands/remove.js +137 -0
  91. package/dist/commands/remove.js.map +1 -0
  92. package/dist/commands/repair.d.ts +6 -0
  93. package/dist/commands/repair.d.ts.map +1 -0
  94. package/dist/commands/repair.helpers.d.ts +5 -0
  95. package/dist/commands/repair.helpers.d.ts.map +1 -0
  96. package/dist/commands/repair.helpers.js +499 -0
  97. package/dist/commands/repair.helpers.js.map +1 -0
  98. package/dist/commands/repair.js +28 -0
  99. package/dist/commands/repair.js.map +1 -0
  100. package/dist/commands/status.d.ts +6 -0
  101. package/dist/commands/status.d.ts.map +1 -0
  102. package/dist/commands/status.js +116 -0
  103. package/dist/commands/status.js.map +1 -0
  104. package/dist/commands/system-integration.d.ts +6 -0
  105. package/dist/commands/system-integration.d.ts.map +1 -0
  106. package/dist/commands/system-integration.helpers.d.ts +70 -0
  107. package/dist/commands/system-integration.helpers.d.ts.map +1 -0
  108. package/dist/commands/system-integration.helpers.js +313 -0
  109. package/dist/commands/system-integration.helpers.js.map +1 -0
  110. package/dist/commands/system-integration.js +132 -0
  111. package/dist/commands/system-integration.js.map +1 -0
  112. package/dist/commands/tmux.d.ts +11 -0
  113. package/dist/commands/tmux.d.ts.map +1 -0
  114. package/dist/commands/tmux.js +500 -0
  115. package/dist/commands/tmux.js.map +1 -0
  116. package/dist/commands/todo.d.ts +6 -0
  117. package/dist/commands/todo.d.ts.map +1 -0
  118. package/dist/commands/todo.helpers.d.ts +50 -0
  119. package/dist/commands/todo.helpers.d.ts.map +1 -0
  120. package/dist/commands/todo.helpers.js +297 -0
  121. package/dist/commands/todo.helpers.js.map +1 -0
  122. package/dist/commands/todo.js +579 -0
  123. package/dist/commands/todo.js.map +1 -0
  124. package/dist/commands/update.d.ts +18 -0
  125. package/dist/commands/update.d.ts.map +1 -0
  126. package/dist/commands/update.helpers.d.ts +89 -0
  127. package/dist/commands/update.helpers.d.ts.map +1 -0
  128. package/dist/commands/update.helpers.js +335 -0
  129. package/dist/commands/update.helpers.js.map +1 -0
  130. package/dist/commands/update.js +187 -0
  131. package/dist/commands/update.js.map +1 -0
  132. package/dist/core/config-loader.d.ts +47 -0
  133. package/dist/core/config-loader.d.ts.map +1 -0
  134. package/dist/core/config-loader.js +188 -0
  135. package/dist/core/config-loader.js.map +1 -0
  136. package/dist/core/config-merger.d.ts +29 -0
  137. package/dist/core/config-merger.d.ts.map +1 -0
  138. package/dist/core/config-merger.js +100 -0
  139. package/dist/core/config-merger.js.map +1 -0
  140. package/dist/core/config-migration.d.ts +64 -0
  141. package/dist/core/config-migration.d.ts.map +1 -0
  142. package/dist/core/config-migration.js +340 -0
  143. package/dist/core/config-migration.js.map +1 -0
  144. package/dist/core/config-new.d.ts +19 -0
  145. package/dist/core/config-new.d.ts.map +1 -0
  146. package/dist/core/config-new.js +58 -0
  147. package/dist/core/config-new.js.map +1 -0
  148. package/dist/core/config-schema.d.ts +221 -0
  149. package/dist/core/config-schema.d.ts.map +1 -0
  150. package/dist/core/config-schema.js +168 -0
  151. package/dist/core/config-schema.js.map +1 -0
  152. package/dist/core/config.d.ts +55 -0
  153. package/dist/core/config.d.ts.map +1 -0
  154. package/dist/core/config.js +143 -0
  155. package/dist/core/config.js.map +1 -0
  156. package/dist/core/dev-server.d.ts +29 -0
  157. package/dist/core/dev-server.d.ts.map +1 -0
  158. package/dist/core/dev-server.js +54 -0
  159. package/dist/core/dev-server.js.map +1 -0
  160. package/dist/core/discovery.d.ts +51 -0
  161. package/dist/core/discovery.d.ts.map +1 -0
  162. package/dist/core/discovery.js +247 -0
  163. package/dist/core/discovery.js.map +1 -0
  164. package/dist/core/env.d.ts +13 -0
  165. package/dist/core/env.d.ts.map +1 -0
  166. package/dist/core/env.js +75 -0
  167. package/dist/core/env.js.map +1 -0
  168. package/dist/core/git.d.ts +31 -0
  169. package/dist/core/git.d.ts.map +1 -0
  170. package/dist/core/git.js +56 -0
  171. package/dist/core/git.js.map +1 -0
  172. package/dist/core/paths.d.ts +86 -0
  173. package/dist/core/paths.d.ts.map +1 -0
  174. package/dist/core/paths.js +256 -0
  175. package/dist/core/paths.js.map +1 -0
  176. package/dist/core/tmux-config.d.ts +174 -0
  177. package/dist/core/tmux-config.d.ts.map +1 -0
  178. package/dist/core/tmux-config.js +545 -0
  179. package/dist/core/tmux-config.js.map +1 -0
  180. package/dist/core/tmux-config.legacy.d.ts +243 -0
  181. package/dist/core/tmux-config.legacy.d.ts.map +1 -0
  182. package/dist/core/tmux-config.legacy.js +896 -0
  183. package/dist/core/tmux-config.legacy.js.map +1 -0
  184. package/dist/core/tmux.d.ts +214 -0
  185. package/dist/core/tmux.d.ts.map +1 -0
  186. package/dist/core/tmux.js +712 -0
  187. package/dist/core/tmux.js.map +1 -0
  188. package/dist/core/toolchain-resolver.d.ts +51 -0
  189. package/dist/core/toolchain-resolver.d.ts.map +1 -0
  190. package/dist/core/toolchain-resolver.js +364 -0
  191. package/dist/core/toolchain-resolver.js.map +1 -0
  192. package/dist/core/worktree-status.d.ts +20 -0
  193. package/dist/core/worktree-status.d.ts.map +1 -0
  194. package/dist/core/worktree-status.js +67 -0
  195. package/dist/core/worktree-status.js.map +1 -0
  196. package/dist/i18n/index.d.ts +36 -0
  197. package/dist/i18n/index.d.ts.map +1 -0
  198. package/dist/i18n/index.js +157 -0
  199. package/dist/i18n/index.js.map +1 -0
  200. package/dist/i18n/locales/en.d.ts +866 -0
  201. package/dist/i18n/locales/en.d.ts.map +1 -0
  202. package/dist/i18n/locales/en.js +985 -0
  203. package/dist/i18n/locales/en.js.map +1 -0
  204. package/dist/i18n/locales/zh-CN.d.ts +865 -0
  205. package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
  206. package/dist/i18n/locales/zh-CN.js +985 -0
  207. package/dist/i18n/locales/zh-CN.js.map +1 -0
  208. package/dist/index.d.ts +2 -0
  209. package/dist/index.d.ts.map +1 -0
  210. package/dist/index.js +4 -0
  211. package/dist/index.js.map +1 -0
  212. package/dist/plugins/builtin/gradle.d.ts +9 -0
  213. package/dist/plugins/builtin/gradle.d.ts.map +1 -0
  214. package/dist/plugins/builtin/gradle.js +164 -0
  215. package/dist/plugins/builtin/gradle.js.map +1 -0
  216. package/dist/plugins/builtin/maven.d.ts +9 -0
  217. package/dist/plugins/builtin/maven.d.ts.map +1 -0
  218. package/dist/plugins/builtin/maven.js +127 -0
  219. package/dist/plugins/builtin/maven.js.map +1 -0
  220. package/dist/plugins/builtin/npm.d.ts +9 -0
  221. package/dist/plugins/builtin/npm.d.ts.map +1 -0
  222. package/dist/plugins/builtin/npm.js +238 -0
  223. package/dist/plugins/builtin/npm.js.map +1 -0
  224. package/dist/plugins/builtin/pip.d.ts +9 -0
  225. package/dist/plugins/builtin/pip.d.ts.map +1 -0
  226. package/dist/plugins/builtin/pip.js +210 -0
  227. package/dist/plugins/builtin/pip.js.map +1 -0
  228. package/dist/plugins/builtin/xcode.d.ts +12 -0
  229. package/dist/plugins/builtin/xcode.d.ts.map +1 -0
  230. package/dist/plugins/builtin/xcode.js +438 -0
  231. package/dist/plugins/builtin/xcode.js.map +1 -0
  232. package/dist/plugins/index.d.ts +13 -0
  233. package/dist/plugins/index.d.ts.map +1 -0
  234. package/dist/plugins/index.js +24 -0
  235. package/dist/plugins/index.js.map +1 -0
  236. package/dist/plugins/manager.d.ts +93 -0
  237. package/dist/plugins/manager.d.ts.map +1 -0
  238. package/dist/plugins/manager.js +270 -0
  239. package/dist/plugins/manager.js.map +1 -0
  240. package/dist/plugins/utils.d.ts +42 -0
  241. package/dist/plugins/utils.d.ts.map +1 -0
  242. package/dist/plugins/utils.js +175 -0
  243. package/dist/plugins/utils.js.map +1 -0
  244. package/dist/types/index.d.ts +104 -0
  245. package/dist/types/index.d.ts.map +1 -0
  246. package/dist/types/index.js +21 -0
  247. package/dist/types/index.js.map +1 -0
  248. package/dist/types/plugin.d.ts +200 -0
  249. package/dist/types/plugin.d.ts.map +1 -0
  250. package/dist/types/plugin.js +19 -0
  251. package/dist/types/plugin.js.map +1 -0
  252. package/dist/utils/logger.d.ts +42 -0
  253. package/dist/utils/logger.d.ts.map +1 -0
  254. package/dist/utils/logger.js +80 -0
  255. package/dist/utils/logger.js.map +1 -0
  256. package/docs/en/manual/04-command-reference/README.md +58 -0
  257. package/docs/en/manual/README.md +108 -0
  258. package/docs/zh-CN/manual/04-command-reference/README.md +58 -0
  259. package/docs/zh-CN/manual/README.md +108 -0
  260. package/package.json +65 -0
  261. package/shell/colyn.sh +55 -0
  262. package/shell/completion.bash +270 -0
  263. 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,2 @@
1
+ export declare function run(): Promise<void>;
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * 注册 add 命令
4
+ */
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=add.d.ts.map
@@ -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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"}