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
@@ -0,0 +1,545 @@
1
+ /**
2
+ * Tmux Pane 命令配置模块(使用新配置系统)
3
+ *
4
+ * 提供 tmux pane 命令的配置加载和自动检测功能
5
+ *
6
+ * 配置文件层级(优先级从低到高):
7
+ * 1. 内置默认值
8
+ * 2. 用户级配置:~/.config/colyn/settings.{json|yaml|yml}
9
+ * 3. 项目级配置:{projectRoot}/.colyn/settings.{json|yaml|yml}
10
+ *
11
+ * 新配置系统特性:
12
+ * - 支持 JSON5(注释、尾部逗号)和 YAML 格式
13
+ * - 自动配置版本迁移
14
+ * - Zod Schema 验证
15
+ * - 使用 deepmerge 进行配置合并
16
+ */
17
+ import * as fs from 'fs/promises';
18
+ import * as path from 'path';
19
+ import * as os from 'os';
20
+ import { getDevServerCommand } from './dev-server.js';
21
+ // ============================================================================
22
+ // 从新配置系统导入
23
+ // ============================================================================
24
+ import { BUILTIN_COMMANDS, CURRENT_CONFIG_VERSION, loadUserConfig, loadProjectConfig, getUserConfigDir as getNewUserConfigDir, mergeConfigs, mergeTmuxConfigs, applyBranchOverrides as applyBranchOverridesNew, } from './config-new.js';
25
+ // ============================================================================
26
+ // 重新导出类型和常量(保持 API 兼容)
27
+ // ============================================================================
28
+ export { BUILTIN_COMMANDS, CURRENT_CONFIG_VERSION, };
29
+ /**
30
+ * 窗格名称映射表
31
+ * 定义每种布局支持的窗格名称
32
+ */
33
+ export const LAYOUT_PANES = {
34
+ 'single-pane': [],
35
+ 'two-pane-horizontal': ['leftPane', 'rightPane'],
36
+ 'two-pane-vertical': ['topPane', 'bottomPane'],
37
+ 'three-pane': ['leftPane', 'topRightPane', 'bottomRightPane'],
38
+ 'four-pane': [
39
+ 'topLeftPane',
40
+ 'topRightPane',
41
+ 'bottomLeftPane',
42
+ 'bottomRightPane',
43
+ ],
44
+ };
45
+ // ============================================================================
46
+ // 配置文件路径(保持 API 兼容)
47
+ // ============================================================================
48
+ const SETTINGS_FILENAME = 'settings.json';
49
+ const CONFIG_DIR = '.colyn';
50
+ /**
51
+ * 获取用户级配置目录
52
+ * 遵循 XDG Base Directory 规范
53
+ */
54
+ export function getUserConfigDir() {
55
+ return getNewUserConfigDir();
56
+ }
57
+ /**
58
+ * 获取用户级设置文件路径
59
+ */
60
+ export function getUserConfigPath() {
61
+ return path.join(getUserConfigDir(), SETTINGS_FILENAME);
62
+ }
63
+ /**
64
+ * 获取项目级设置文件路径
65
+ * @param projectRoot 项目根目录
66
+ */
67
+ export function getProjectConfigPath(projectRoot) {
68
+ return path.join(projectRoot, CONFIG_DIR, SETTINGS_FILENAME);
69
+ }
70
+ // ============================================================================
71
+ // 默认配置
72
+ // ============================================================================
73
+ /**
74
+ * 默认配置(三窗格布局)
75
+ */
76
+ const DEFAULT_CONFIG = {
77
+ autoRun: true,
78
+ layout: 'three-pane',
79
+ leftPane: {
80
+ command: BUILTIN_COMMANDS.AUTO_CLAUDE,
81
+ size: '60%',
82
+ },
83
+ topRightPane: {
84
+ command: BUILTIN_COMMANDS.AUTO_DEV_SERVER,
85
+ size: '30%',
86
+ },
87
+ bottomRightPane: {
88
+ command: null,
89
+ size: '70%',
90
+ },
91
+ };
92
+ /**
93
+ * 系统内置的分支特定默认配置
94
+ * 优先级最低,会被任何用户或项目配置覆盖
95
+ */
96
+ const BUILTIN_BRANCH_DEFAULTS = {
97
+ // Main 分支默认使用单窗格布局
98
+ main: {
99
+ layout: 'single-pane',
100
+ autoRun: false,
101
+ },
102
+ };
103
+ // ============================================================================
104
+ // 配置加载(使用新系统)
105
+ // ============================================================================
106
+ /**
107
+ * 从设置文件加载完整设置(用于 config 命令显示)
108
+ * 自动执行必要的 migration 并保存更新后的配置
109
+ * @param configPath 设置文件路径
110
+ * @returns 完整设置对象,如果文件不存在或无法解析则返回 null
111
+ */
112
+ export async function loadSettingsFromFile(configPath) {
113
+ // 尝试加载用户配置或项目配置
114
+ const configDir = path.dirname(configPath);
115
+ // 判断是用户级还是项目级
116
+ const userConfigDir = getUserConfigDir();
117
+ const isUserConfig = configDir === userConfigDir;
118
+ if (isUserConfig) {
119
+ return loadUserConfig();
120
+ }
121
+ else {
122
+ // 项目级:从路径提取项目根目录
123
+ const projectRoot = path.dirname(configDir);
124
+ return loadProjectConfig(projectRoot);
125
+ }
126
+ }
127
+ /**
128
+ * 加载 tmux 配置(两层配置机制)
129
+ *
130
+ * 配置加载顺序(优先级从低到高):
131
+ * 1. 内置默认值
132
+ * 2. 用户级配置:~/.config/colyn/settings.{json|yaml|yml} 中的 tmux 字段
133
+ * 3. 项目级配置:{projectRoot}/.colyn/settings.{json|yaml|yml} 中的 tmux 字段
134
+ *
135
+ * @param projectRoot 项目根目录
136
+ * @returns 合并后的配置对象
137
+ */
138
+ export async function loadTmuxConfig(projectRoot) {
139
+ // 并行加载用户级和项目级配置
140
+ const [userSettings, projectSettings] = await Promise.all([
141
+ loadUserConfig(),
142
+ loadProjectConfig(projectRoot),
143
+ ]);
144
+ // 合并配置
145
+ const configs = [
146
+ userSettings?.tmux,
147
+ projectSettings?.tmux,
148
+ ];
149
+ return mergeTmuxConfigs(...configs);
150
+ }
151
+ // ============================================================================
152
+ // Claude Session 检测
153
+ // ============================================================================
154
+ /**
155
+ * 检查 worktree 是否存在 Claude session
156
+ * 通过检查 ~/.claude/projects/{encodedPath} 下是否存在会话文件来判断
157
+ * @param worktreePath worktree 路径
158
+ */
159
+ export async function hasClaudeSession(worktreePath) {
160
+ try {
161
+ const projectDir = getClaudeProjectDir(worktreePath);
162
+ const stat = await fs.stat(projectDir);
163
+ if (!stat.isDirectory()) {
164
+ return false;
165
+ }
166
+ const files = await fs.readdir(projectDir);
167
+ return files.some((file) => file.endsWith('.jsonl'));
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ }
173
+ /**
174
+ * 获取 Claude 项目会话目录
175
+ * Claude CLI 将每个目录的会话写入 ~/.claude/projects/{encodedPath}
176
+ */
177
+ function getClaudeProjectDir(worktreePath) {
178
+ const encodedPath = encodeClaudeProjectPath(worktreePath);
179
+ return path.join(os.homedir(), '.claude', 'projects', encodedPath);
180
+ }
181
+ /**
182
+ * Claude 项目目录编码规则:将路径分隔符替换为 '-'
183
+ * 例:/Users/name/project -> -Users-name-project
184
+ */
185
+ function encodeClaudeProjectPath(worktreePath) {
186
+ return worktreePath.split(path.sep).join('-');
187
+ }
188
+ // ============================================================================
189
+ // 命令解析
190
+ // ============================================================================
191
+ /**
192
+ * 解析 Claude 会话命令
193
+ * - 如果存在 .claude 目录,运行 `claude -c` 继续会话
194
+ * - 否则运行 `claude` 启动新会话
195
+ * @param worktreePath worktree 路径
196
+ * @param claudeCommand 自定义 Claude 命令(默认为 'claude')
197
+ */
198
+ async function resolveClaudeCommand(worktreePath, claudeCommand = 'claude') {
199
+ const hasSession = await hasClaudeSession(worktreePath);
200
+ return hasSession ? `${claudeCommand} -c` : claudeCommand;
201
+ }
202
+ /**
203
+ * 解析 dev server 命令
204
+ * 使用 dev-server 模块检测 dev 命令
205
+ * @param worktreePath worktree 路径
206
+ */
207
+ async function resolveDevServerCommand(worktreePath) {
208
+ return await getDevServerCommand(worktreePath);
209
+ }
210
+ /**
211
+ * 解析单个 pane 命令
212
+ * @param command 命令配置值
213
+ * @param worktreePath worktree 路径
214
+ * @param claudeCommand 自定义 Claude 命令
215
+ */
216
+ async function resolvePaneCommand(command, worktreePath, claudeCommand) {
217
+ // 如果是 null 或 undefined,不执行命令
218
+ if (command === null || command === undefined) {
219
+ return undefined;
220
+ }
221
+ // 处理内置命令
222
+ switch (command) {
223
+ case BUILTIN_COMMANDS.AUTO_CLAUDE:
224
+ return await resolveClaudeCommand(worktreePath, claudeCommand);
225
+ case BUILTIN_COMMANDS.AUTO_DEV_SERVER:
226
+ return await resolveDevServerCommand(worktreePath);
227
+ default:
228
+ // 自定义命令,直接返回
229
+ return command;
230
+ }
231
+ }
232
+ /**
233
+ * 解析百分比字符串为数字
234
+ * @param sizeStr 大小字符串(如 "50%")
235
+ * @param defaultValue 默认值
236
+ */
237
+ function parsePercentage(sizeStr, defaultValue) {
238
+ if (!sizeStr) {
239
+ return defaultValue;
240
+ }
241
+ const match = sizeStr.match(/^(\d+)%?$/);
242
+ if (match) {
243
+ return parseInt(match[1], 10);
244
+ }
245
+ return defaultValue;
246
+ }
247
+ /**
248
+ * 解析所有 pane 命令
249
+ * @param config tmux 配置
250
+ * @param worktreePath worktree 路径
251
+ * @param projectRoot 项目根目录(可选,用于读取 claudeCommand 配置)
252
+ * @param branchName 分支名称(可选,用于读取分支特定的 claudeCommand 配置)
253
+ */
254
+ export async function resolvePaneCommands(config, worktreePath, projectRoot, branchName) {
255
+ // 如果禁用自动运行,返回空对象
256
+ const autoRun = config.autoRun !== undefined ? config.autoRun : DEFAULT_CONFIG.autoRun;
257
+ if (!autoRun) {
258
+ return {};
259
+ }
260
+ // 读取 claude 命令配置
261
+ let claudeCommand = 'claude';
262
+ if (projectRoot && branchName) {
263
+ const settings = await loadSettingsForBranch(projectRoot, branchName);
264
+ claudeCommand = settings.systemCommands?.claude ?? 'claude';
265
+ }
266
+ // 检测布局类型
267
+ const layout = detectLayoutType(config);
268
+ // 根据布局类型解析命令
269
+ switch (layout) {
270
+ case 'single-pane':
271
+ // 单窗格:无命令
272
+ return {};
273
+ case 'two-pane-horizontal':
274
+ return await resolveTwoPaneHorizontalCommands(config, worktreePath, claudeCommand);
275
+ case 'two-pane-vertical':
276
+ return await resolveTwoPaneVerticalCommands(config, worktreePath, claudeCommand);
277
+ case 'three-pane':
278
+ return await resolveThreePaneCommands(config, worktreePath, claudeCommand);
279
+ case 'four-pane':
280
+ return await resolveFourPaneCommands(config, worktreePath, claudeCommand);
281
+ default:
282
+ // 默认使用三窗格
283
+ return await resolveThreePaneCommands(config, worktreePath, claudeCommand);
284
+ }
285
+ }
286
+ /**
287
+ * 解析两窗格水平布局的命令
288
+ */
289
+ async function resolveTwoPaneHorizontalCommands(config, worktreePath, claudeCommand) {
290
+ const leftCommand = config.leftPane?.command;
291
+ const rightCommand = config.rightPane?.command;
292
+ const [pane0, pane1] = await Promise.all([
293
+ resolvePaneCommand(leftCommand, worktreePath, claudeCommand),
294
+ resolvePaneCommand(rightCommand, worktreePath, claudeCommand),
295
+ ]);
296
+ return { pane0, pane1 };
297
+ }
298
+ /**
299
+ * 解析两窗格垂直布局的命令
300
+ */
301
+ async function resolveTwoPaneVerticalCommands(config, worktreePath, claudeCommand) {
302
+ const topCommand = config.topPane?.command;
303
+ const bottomCommand = config.bottomPane?.command;
304
+ const [pane0, pane1] = await Promise.all([
305
+ resolvePaneCommand(topCommand, worktreePath, claudeCommand),
306
+ resolvePaneCommand(bottomCommand, worktreePath, claudeCommand),
307
+ ]);
308
+ return { pane0, pane1 };
309
+ }
310
+ /**
311
+ * 解析三窗格布局的命令
312
+ */
313
+ async function resolveThreePaneCommands(config, worktreePath, claudeCommand) {
314
+ const leftCommand = config.leftPane?.command ?? DEFAULT_CONFIG.leftPane?.command;
315
+ const topRightCommand = config.topRightPane?.command ?? DEFAULT_CONFIG.topRightPane?.command;
316
+ const bottomRightCommand = config.bottomRightPane?.command ?? DEFAULT_CONFIG.bottomRightPane?.command;
317
+ const [pane0, pane1, pane2] = await Promise.all([
318
+ resolvePaneCommand(leftCommand, worktreePath, claudeCommand),
319
+ resolvePaneCommand(topRightCommand, worktreePath, claudeCommand),
320
+ resolvePaneCommand(bottomRightCommand, worktreePath, claudeCommand),
321
+ ]);
322
+ return { pane0, pane1, pane2 };
323
+ }
324
+ /**
325
+ * 解析四窗格布局的命令
326
+ */
327
+ async function resolveFourPaneCommands(config, worktreePath, claudeCommand) {
328
+ const topLeftCommand = config.topLeftPane?.command;
329
+ const topRightCommand = config.topRightPane?.command;
330
+ const bottomLeftCommand = config.bottomLeftPane?.command;
331
+ const bottomRightCommand = config.bottomRightPane?.command;
332
+ const [pane0, pane1, pane2, pane3] = await Promise.all([
333
+ resolvePaneCommand(topLeftCommand, worktreePath, claudeCommand),
334
+ resolvePaneCommand(topRightCommand, worktreePath, claudeCommand),
335
+ resolvePaneCommand(bottomLeftCommand, worktreePath, claudeCommand),
336
+ resolvePaneCommand(bottomRightCommand, worktreePath, claudeCommand),
337
+ ]);
338
+ return { pane0, pane1, pane2, pane3 };
339
+ }
340
+ // ============================================================================
341
+ // 布局解析
342
+ // ============================================================================
343
+ /**
344
+ * 解析 Pane 布局
345
+ * @param config tmux 配置
346
+ * @returns 解析后的布局信息
347
+ */
348
+ export function resolvePaneLayout(config) {
349
+ const layout = detectLayoutType(config);
350
+ const result = {
351
+ layout,
352
+ };
353
+ switch (layout) {
354
+ case 'two-pane-horizontal':
355
+ result.leftSize = parsePercentage(config.leftPane?.size, 50);
356
+ break;
357
+ case 'two-pane-vertical':
358
+ result.topSize = parsePercentage(config.topPane?.size, 50);
359
+ break;
360
+ case 'three-pane':
361
+ result.leftSize = parsePercentage(config.leftPane?.size ?? DEFAULT_CONFIG.leftPane?.size, 60);
362
+ result.rightTopSize = parsePercentage(config.topRightPane?.size ?? DEFAULT_CONFIG.topRightPane?.size, 30);
363
+ break;
364
+ case 'four-pane':
365
+ // 优先使用 horizontalSplit 和 verticalSplit
366
+ if (config.horizontalSplit && config.verticalSplit) {
367
+ result.horizontalSplit = parsePercentage(config.horizontalSplit, 50);
368
+ result.verticalSplit = parsePercentage(config.verticalSplit, 50);
369
+ }
370
+ else {
371
+ // 否则使用各窗格的 size
372
+ result.topLeftSize = parsePercentage(config.topLeftPane?.size, 50);
373
+ result.topRightSize = parsePercentage(config.topRightPane?.size, 50);
374
+ result.bottomLeftSize = parsePercentage(config.bottomLeftPane?.size, 50);
375
+ result.bottomRightSize = parsePercentage(config.bottomRightPane?.size, 50);
376
+ }
377
+ break;
378
+ }
379
+ return result;
380
+ }
381
+ // ============================================================================
382
+ // 分支覆盖(使用新系统)
383
+ // ============================================================================
384
+ /**
385
+ * 从设置中加载特定分支的配置
386
+ * @param settings 完整设置对象
387
+ * @param branchName 分支名称
388
+ * @returns 合并后的设置
389
+ */
390
+ export function loadBranchSettings(settings, branchName) {
391
+ return applyBranchOverridesNew(settings, branchName);
392
+ }
393
+ /**
394
+ * 加载特定分支的完整设置
395
+ *
396
+ * 配置优先级(从低到高):
397
+ * 1. User default(用户级全局配置)
398
+ * 2. Project default(项目级全局配置)
399
+ * 3. User override(用户级分支覆盖)
400
+ * 4. Project override(项目级分支覆盖)
401
+ *
402
+ * @param projectRoot 项目根目录
403
+ * @param branchName 分支名称
404
+ * @returns 合并后的完整设置
405
+ */
406
+ export async function loadSettingsForBranch(projectRoot, branchName) {
407
+ // 并行加载用户级和项目级配置
408
+ const [userSettings, projectSettings] = await Promise.all([
409
+ loadUserConfig(),
410
+ loadProjectConfig(projectRoot),
411
+ ]);
412
+ // 合并配置(优先级:项目 > 用户)
413
+ const configs = [];
414
+ if (userSettings)
415
+ configs.push(userSettings);
416
+ if (projectSettings)
417
+ configs.push(projectSettings);
418
+ // 如果没有任何配置,返回最小配置
419
+ if (configs.length === 0) {
420
+ return { version: CURRENT_CONFIG_VERSION };
421
+ }
422
+ let mergedSettings = mergeConfigs(...configs);
423
+ // 应用分支覆盖
424
+ mergedSettings = applyBranchOverridesNew(mergedSettings, branchName);
425
+ return mergedSettings;
426
+ }
427
+ /**
428
+ * 加载特定分支的 tmux 配置
429
+ *
430
+ * 配置优先级(从低到高):
431
+ * 1. System builtin(系统内置默认,如 main 分支默认单窗格)
432
+ * 2. User default(用户级全局配置,~/.config/colyn/settings.{json|yaml|yml} 的 tmux)
433
+ * 3. Project default(项目级全局配置,.colyn/settings.{json|yaml|yml} 的 tmux)
434
+ * 4. User override(用户级分支覆盖,~/.config/colyn/settings.{json|yaml|yml} 的 branchOverrides[branch].tmux)
435
+ * 5. Project override(项目级分支覆盖,.colyn/settings.{json|yaml|yml} 的 branchOverrides[branch].tmux)
436
+ *
437
+ * 全部按照字段级覆盖(field-level override)
438
+ *
439
+ * @param projectRoot 项目根目录
440
+ * @param branchName 分支名称
441
+ * @returns 合并后的 tmux 配置
442
+ */
443
+ export async function loadTmuxConfigForBranch(projectRoot, branchName) {
444
+ // 加载完整设置
445
+ const settings = await loadSettingsForBranch(projectRoot, branchName);
446
+ // 合并配置
447
+ const configs = [];
448
+ // 1. System builtin
449
+ const builtinBranchDefault = BUILTIN_BRANCH_DEFAULTS[branchName];
450
+ if (builtinBranchDefault) {
451
+ configs.push(builtinBranchDefault);
452
+ }
453
+ // 2-5. 从合并后的 settings 中获取 tmux 配置(已包含所有层级和分支覆盖)
454
+ if (settings.tmux) {
455
+ configs.push(settings.tmux);
456
+ }
457
+ return mergeTmuxConfigs(...configs);
458
+ }
459
+ /**
460
+ * 检测布局类型
461
+ * 根据配置的窗格自动检测布局类型(向后兼容)
462
+ * @param config tmux 配置
463
+ * @returns 检测到的布局类型
464
+ */
465
+ export function detectLayoutType(config) {
466
+ // 如果明确指定了 layout,直接返回
467
+ if (config.layout) {
468
+ return config.layout;
469
+ }
470
+ // 检查是否配置了任何窗格
471
+ const hasLeftPane = config.leftPane !== undefined;
472
+ const hasTopRightPane = config.topRightPane !== undefined;
473
+ const hasBottomRightPane = config.bottomRightPane !== undefined;
474
+ const hasRightPane = config.rightPane !== undefined;
475
+ const hasTopPane = config.topPane !== undefined;
476
+ const hasBottomPane = config.bottomPane !== undefined;
477
+ const hasTopLeftPane = config.topLeftPane !== undefined;
478
+ const hasBottomLeftPane = config.bottomLeftPane !== undefined;
479
+ // 四窗格:配置了任何一个四窗格特有的窗格
480
+ if (hasTopLeftPane || hasBottomLeftPane) {
481
+ return 'four-pane';
482
+ }
483
+ // 两窗格水平:配置了 rightPane
484
+ if (hasRightPane) {
485
+ return 'two-pane-horizontal';
486
+ }
487
+ // 两窗格垂直:配置了 topPane 或 bottomPane
488
+ if (hasTopPane || hasBottomPane) {
489
+ return 'two-pane-vertical';
490
+ }
491
+ // 三窗格:配置了 leftPane, topRightPane 或 bottomRightPane
492
+ if (hasLeftPane || hasTopRightPane || hasBottomRightPane) {
493
+ return 'three-pane';
494
+ }
495
+ // 默认:三窗格布局
496
+ return 'three-pane';
497
+ }
498
+ /**
499
+ * 验证 tmux 配置
500
+ * @param config tmux 配置
501
+ * @returns 验证结果
502
+ */
503
+ export function validateTmuxConfig(config) {
504
+ const errors = [];
505
+ const warnings = [];
506
+ // 检测布局类型
507
+ const layout = detectLayoutType(config);
508
+ const supportedPanes = LAYOUT_PANES[layout];
509
+ // 检查所有可能的窗格配置
510
+ const allPaneNames = [
511
+ 'leftPane',
512
+ 'rightPane',
513
+ 'topPane',
514
+ 'bottomPane',
515
+ 'topRightPane',
516
+ 'bottomRightPane',
517
+ 'topLeftPane',
518
+ 'bottomLeftPane',
519
+ ];
520
+ for (const paneName of allPaneNames) {
521
+ const paneConfig = config[paneName];
522
+ if (paneConfig === undefined) {
523
+ continue;
524
+ }
525
+ // 检查当前布局是否支持此窗格
526
+ if (!supportedPanes.includes(paneName)) {
527
+ warnings.push(`Layout "${layout}" does not support pane "${paneName}", it will be ignored. ` +
528
+ `Supported panes: ${supportedPanes.join(', ')}`);
529
+ }
530
+ // 验证 size 配置
531
+ if (paneConfig.size) {
532
+ const size = parsePercentage(paneConfig.size, -1);
533
+ if (size < 0 || size > 100) {
534
+ warnings.push(`Pane "${paneName}" size "${paneConfig.size}" is out of reasonable range (0%-100%), ` +
535
+ `using default value`);
536
+ }
537
+ }
538
+ }
539
+ return {
540
+ hasError: errors.length > 0,
541
+ errors,
542
+ warnings,
543
+ };
544
+ }
545
+ //# sourceMappingURL=tmux-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-config.js","sourceRoot":"","sources":["../../src/core/tmux-config.ts"],"names":[],"mappings":"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"}