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,168 @@
1
+ /**
2
+ * 配置文件 Schema 定义
3
+ *
4
+ * 使用 Zod 定义配置文件的结构和验证规则
5
+ * - 类型定义和运行时验证合二为一
6
+ * - 自动类型推断,无需手写 interface
7
+ * - 支持配置版本迁移
8
+ */
9
+ import { z } from 'zod';
10
+ /**
11
+ * 内置命令常量
12
+ */
13
+ export const BUILTIN_COMMANDS = {
14
+ /** 启动 dev server */
15
+ AUTO_DEV_SERVER: 'start dev server',
16
+ /** 继续 Claude 会话 */
17
+ AUTO_CLAUDE: 'continue claude session',
18
+ };
19
+ /**
20
+ * 布局类型
21
+ */
22
+ export const LayoutTypeSchema = z.enum([
23
+ 'single-pane',
24
+ 'two-pane-horizontal',
25
+ 'two-pane-vertical',
26
+ 'three-pane',
27
+ 'four-pane',
28
+ ]);
29
+ /**
30
+ * Pane 命令 Schema
31
+ * - 内置命令:使用预定义的自动检测逻辑
32
+ * - string: 自定义命令
33
+ * - null: 不执行任何命令
34
+ */
35
+ export const PaneCommandSchema = z.union([
36
+ z.literal(BUILTIN_COMMANDS.AUTO_DEV_SERVER),
37
+ z.literal(BUILTIN_COMMANDS.AUTO_CLAUDE),
38
+ z.string(),
39
+ z.null(),
40
+ ]);
41
+ /**
42
+ * 单个 Pane 的配置 Schema
43
+ */
44
+ export const PaneConfigSchema = z.object({
45
+ /** 要执行的命令 */
46
+ command: PaneCommandSchema.optional(),
47
+ /** Pane 大小(百分比,如 "50%") */
48
+ size: z.string().optional(),
49
+ });
50
+ /**
51
+ * Tmux 配置 Schema
52
+ */
53
+ export const TmuxConfigSchema = z.object({
54
+ /** 是否自动运行命令 */
55
+ autoRun: z.boolean().optional(),
56
+ /** 布局类型 */
57
+ layout: LayoutTypeSchema.optional(),
58
+ /** 窗格配置 */
59
+ leftPane: PaneConfigSchema.optional(),
60
+ rightPane: PaneConfigSchema.optional(),
61
+ topPane: PaneConfigSchema.optional(),
62
+ bottomPane: PaneConfigSchema.optional(),
63
+ topRightPane: PaneConfigSchema.optional(),
64
+ bottomRightPane: PaneConfigSchema.optional(),
65
+ topLeftPane: PaneConfigSchema.optional(),
66
+ bottomLeftPane: PaneConfigSchema.optional(),
67
+ /** 四窗格布局的分割配置 */
68
+ horizontalSplit: z.string().optional(),
69
+ verticalSplit: z.string().optional(),
70
+ });
71
+ /**
72
+ * 系统命令配置 Schema
73
+ */
74
+ export const SystemCommandsSchema = z.object({
75
+ /** 包管理器命令(默认为 'npm') */
76
+ npm: z.string().optional(),
77
+ /** Claude 命令(默认为 'claude') */
78
+ claude: z.string().optional(),
79
+ });
80
+ /**
81
+ * 工具链配置 Schema
82
+ * 描述单个子项目(或根目录)使用的工具链类型和专属配置
83
+ */
84
+ export const ToolchainConfigSchema = z.object({
85
+ /** 工具链类型,如 'npm'、'maven'、'xcode' */
86
+ type: z.string(),
87
+ /** 工具链专属配置(由各插件的 repairSettings 写入,如 xcode 的 scheme/destination) */
88
+ settings: z.record(z.string(), z.unknown()).default({}),
89
+ });
90
+ /**
91
+ * 子项目配置 Schema(Mono Repo 模式)
92
+ */
93
+ export const SubProjectSchema = z.object({
94
+ /** 子项目相对路径(相对于 worktree 根目录) */
95
+ path: z.string(),
96
+ /** 子项目使用的工具链,null 表示无工具链 */
97
+ toolchain: z.union([ToolchainConfigSchema, z.null()]),
98
+ });
99
+ /**
100
+ * Settings Schema 基础部分(不包含递归的 branchOverrides)
101
+ */
102
+ const SettingsSchemaBase = z.object({
103
+ /** 配置文件版本号 */
104
+ version: z.number(),
105
+ /** 界面语言 */
106
+ lang: z.enum(['en', 'zh-CN']).optional(),
107
+ /** 系统命令配置 */
108
+ systemCommands: SystemCommandsSchema.optional(),
109
+ /** tmux 相关配置 */
110
+ tmux: TmuxConfigSchema.optional(),
111
+ /**
112
+ * 单项目模式:根目录工具链配置
113
+ * - undefined: 尚未检测(触发按需发现)
114
+ * - null: 明确无工具链
115
+ * - ToolchainConfig: 已配置的工具链
116
+ */
117
+ toolchain: z.union([ToolchainConfigSchema, z.null()]).optional(),
118
+ /**
119
+ * Mono Repo 模式:子项目列表
120
+ * - undefined: 尚未检测
121
+ * - 数组:已配置的子项目列表
122
+ */
123
+ projects: z.array(SubProjectSchema).optional(),
124
+ });
125
+ /**
126
+ * Settings Schema(支持递归的 branchOverrides)
127
+ */
128
+ export const SettingsSchema = SettingsSchemaBase.extend({
129
+ /** 分支特定配置覆盖 */
130
+ branchOverrides: z
131
+ .record(z.string(), z.lazy(() => SettingsSchema))
132
+ .optional(),
133
+ });
134
+ /**
135
+ * 当前配置文件版本号
136
+ */
137
+ export const CURRENT_CONFIG_VERSION = 4;
138
+ /**
139
+ * 验证配置对象
140
+ * @param data 待验证的数据
141
+ * @returns 验证后的配置对象
142
+ * @throws ZodError 如果验证失败
143
+ */
144
+ export function validateSettings(data) {
145
+ return SettingsSchema.parse(data);
146
+ }
147
+ /**
148
+ * 验证配置对象(带友好的错误提示)
149
+ * @param filepath 配置文件路径(用于错误提示)
150
+ * @param data 待验证的数据
151
+ * @returns 验证后的配置对象
152
+ * @throws Error 如果验证失败,包含友好的错误信息
153
+ */
154
+ export function validateSettingsWithFriendlyError(filepath, data) {
155
+ try {
156
+ return SettingsSchema.parse(data);
157
+ }
158
+ catch (error) {
159
+ if (error instanceof z.ZodError) {
160
+ const messages = error.issues
161
+ .map((e) => ` - ${e.path.join('.')}: ${e.message}`)
162
+ .join('\n');
163
+ throw new Error(`配置文件验证失败 (${filepath}):\n${messages}`);
164
+ }
165
+ throw error;
166
+ }
167
+ }
168
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Colyn 全局配置管理模块
3
+ *
4
+ * 配置优先级(从高到低):
5
+ * 1. 环境变量(仅 COLYN_LANG)
6
+ * 2. 项目配置文件 (.colyn/config.json)
7
+ * 3. 用户配置文件 (~/.colyn/config.json)
8
+ * 4. 默认值
9
+ */
10
+ /**
11
+ * Colyn 配置接口
12
+ */
13
+ export interface ColynConfig {
14
+ /** 包管理器命令,默认为 'npm' */
15
+ npm: string;
16
+ /** 界面语言,默认为 'en' */
17
+ lang: string;
18
+ }
19
+ /**
20
+ * 导出用户配置目录路径(供其他模块使用)
21
+ */
22
+ export declare function getGlobalConfigDir(): string;
23
+ /**
24
+ * 获取配置(带缓存)
25
+ * @param configDir .colyn 目录路径(可选,如果不提供则只使用环境变量、用户配置和默认值)
26
+ */
27
+ export declare function getConfig(configDir?: string): Promise<ColynConfig>;
28
+ /**
29
+ * 获取包管理器命令
30
+ * @param configDir .colyn 目录路径(可选)
31
+ */
32
+ export declare function getNpmCommand(configDir?: string): Promise<string>;
33
+ /**
34
+ * 获取语言配置
35
+ * @param configDir .colyn 目录路径(可选)
36
+ */
37
+ export declare function getLang(configDir?: string): Promise<string>;
38
+ /**
39
+ * 获取运行脚本的命令
40
+ * 例如:如果 npm='yarn',返回 'yarn';如果 npm='npm',返回 'npm run'
41
+ * @param configDir .colyn 目录路径(可选)
42
+ */
43
+ export declare function getRunCommand(configDir?: string): Promise<string>;
44
+ /**
45
+ * 清除配置缓存
46
+ * 用于测试或配置更新后
47
+ */
48
+ export declare function clearConfigCache(): void;
49
+ /**
50
+ * 保存配置到文件
51
+ * @param configDir .colyn 目录路径
52
+ * @param updates 要更新的配置项
53
+ */
54
+ export declare function saveConfig(configDir: string, updates: Partial<ColynConfig>): Promise<void>;
55
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAwDD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAUD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4BxE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGjE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Colyn 全局配置管理模块
3
+ *
4
+ * 配置优先级(从高到低):
5
+ * 1. 环境变量(仅 COLYN_LANG)
6
+ * 2. 项目配置文件 (.colyn/config.json)
7
+ * 3. 用户配置文件 (~/.colyn/config.json)
8
+ * 4. 默认值
9
+ */
10
+ import * as fs from 'fs/promises';
11
+ import * as path from 'path';
12
+ import * as os from 'os';
13
+ /**
14
+ * 默认配置
15
+ */
16
+ const DEFAULT_CONFIG = {
17
+ npm: 'npm',
18
+ lang: 'en'
19
+ };
20
+ /**
21
+ * 配置缓存
22
+ */
23
+ let cachedConfig = null;
24
+ let cachedConfigDir = null;
25
+ /**
26
+ * 从配置文件读取配置
27
+ * @param configDir .colyn 目录路径
28
+ */
29
+ async function readConfigFile(configDir) {
30
+ const configPath = path.join(configDir, 'settings.json');
31
+ try {
32
+ const content = await fs.readFile(configPath, 'utf-8');
33
+ return JSON.parse(content);
34
+ }
35
+ catch {
36
+ // 配置文件不存在或解析失败,返回空对象
37
+ return {};
38
+ }
39
+ }
40
+ /**
41
+ * 获取用户配置目录路径
42
+ */
43
+ function getUserConfigDir() {
44
+ return path.join(os.homedir(), '.config', 'colyn');
45
+ }
46
+ /**
47
+ * 导出用户配置目录路径(供其他模块使用)
48
+ */
49
+ export function getGlobalConfigDir() {
50
+ return getUserConfigDir();
51
+ }
52
+ /**
53
+ * 读取用户配置文件
54
+ */
55
+ async function readUserConfigFile() {
56
+ const userConfigDir = getUserConfigDir();
57
+ return readConfigFile(userConfigDir);
58
+ }
59
+ /**
60
+ * 获取配置(带缓存)
61
+ * @param configDir .colyn 目录路径(可选,如果不提供则只使用环境变量、用户配置和默认值)
62
+ */
63
+ export async function getConfig(configDir) {
64
+ // 如果缓存有效,直接返回
65
+ if (cachedConfig && cachedConfigDir === configDir) {
66
+ return cachedConfig;
67
+ }
68
+ // 读取项目配置文件
69
+ const projectConfig = configDir ? await readConfigFile(configDir) : {};
70
+ // 读取用户配置文件
71
+ const userConfig = await readUserConfigFile();
72
+ // 合并配置(项目配置 > 用户配置 > 默认值)
73
+ // 支持新的 systemCommands 结构,同时向后兼容旧的扁平结构
74
+ const config = {
75
+ npm: projectConfig.systemCommands?.npm ||
76
+ projectConfig.npm ||
77
+ userConfig.systemCommands?.npm ||
78
+ userConfig.npm ||
79
+ DEFAULT_CONFIG.npm,
80
+ lang: process.env.COLYN_LANG || projectConfig.lang || userConfig.lang || DEFAULT_CONFIG.lang
81
+ };
82
+ // 缓存配置
83
+ cachedConfig = config;
84
+ cachedConfigDir = configDir ?? null;
85
+ return config;
86
+ }
87
+ /**
88
+ * 获取包管理器命令
89
+ * @param configDir .colyn 目录路径(可选)
90
+ */
91
+ export async function getNpmCommand(configDir) {
92
+ const config = await getConfig(configDir);
93
+ return config.npm;
94
+ }
95
+ /**
96
+ * 获取语言配置
97
+ * @param configDir .colyn 目录路径(可选)
98
+ */
99
+ export async function getLang(configDir) {
100
+ const config = await getConfig(configDir);
101
+ return config.lang;
102
+ }
103
+ /**
104
+ * 获取运行脚本的命令
105
+ * 例如:如果 npm='yarn',返回 'yarn';如果 npm='npm',返回 'npm run'
106
+ * @param configDir .colyn 目录路径(可选)
107
+ */
108
+ export async function getRunCommand(configDir) {
109
+ const npm = await getNpmCommand(configDir);
110
+ // npm 需要加 'run',yarn 和 pnpm 不需要
111
+ if (npm === 'npm') {
112
+ return 'npm run';
113
+ }
114
+ return npm;
115
+ }
116
+ /**
117
+ * 清除配置缓存
118
+ * 用于测试或配置更新后
119
+ */
120
+ export function clearConfigCache() {
121
+ cachedConfig = null;
122
+ cachedConfigDir = null;
123
+ }
124
+ /**
125
+ * 保存配置到文件
126
+ * @param configDir .colyn 目录路径
127
+ * @param updates 要更新的配置项
128
+ */
129
+ export async function saveConfig(configDir, updates) {
130
+ const configPath = path.join(configDir, 'settings.json');
131
+ // 读取现有配置
132
+ const existingConfig = await readConfigFile(configDir);
133
+ // 合并配置
134
+ const newConfig = {
135
+ ...existingConfig,
136
+ ...updates
137
+ };
138
+ // 写入文件
139
+ await fs.writeFile(configPath, JSON.stringify(newConfig, null, 2) + '\n', 'utf-8');
140
+ // 清除缓存
141
+ clearConfigCache();
142
+ }
143
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Dev Server 检测模块
3
+ *
4
+ * 检测项目的开发服务器配置并提供启动命令
5
+ */
6
+ /**
7
+ * Dev Server 信息
8
+ */
9
+ export interface DevServerInfo {
10
+ /** 是否检测到 dev 命令 */
11
+ hasDevCommand: boolean;
12
+ /** 启动命令(如果检测到) */
13
+ command?: string;
14
+ }
15
+ /**
16
+ * 检测 dev server 信息
17
+ * @param projectDir 项目目录
18
+ * @param configDir .colyn 配置目录(可选,用于读取 npm 命令配置)
19
+ * @returns Dev server 信息
20
+ */
21
+ export declare function detectDevServer(projectDir: string, configDir?: string): Promise<DevServerInfo>;
22
+ /**
23
+ * 获取 dev server 启动命令
24
+ * @param projectDir 项目目录
25
+ * @param configDir .colyn 配置目录(可选)
26
+ * @returns 启动命令,如果没有 dev 脚本返回 undefined
27
+ */
28
+ export declare function getDevServerCommand(projectDir: string, configDir?: string): Promise<string | undefined>;
29
+ //# sourceMappingURL=dev-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/core/dev-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CA+BxB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG7B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Dev Server 检测模块
3
+ *
4
+ * 检测项目的开发服务器配置并提供启动命令
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { getRunCommand } from './config.js';
9
+ /**
10
+ * 检测 dev server 信息
11
+ * @param projectDir 项目目录
12
+ * @param configDir .colyn 配置目录(可选,用于读取 npm 命令配置)
13
+ * @returns Dev server 信息
14
+ */
15
+ export async function detectDevServer(projectDir, configDir) {
16
+ try {
17
+ // 读取 package.json
18
+ const packageJsonPath = path.join(projectDir, 'package.json');
19
+ const content = await fs.readFile(packageJsonPath, 'utf-8');
20
+ const packageJson = JSON.parse(content);
21
+ // 检查是否有 dev 脚本
22
+ const devScript = packageJson.scripts?.dev;
23
+ if (devScript) {
24
+ // 获取运行命令
25
+ const runCommand = await getRunCommand(configDir);
26
+ const command = `${runCommand} dev`;
27
+ return {
28
+ hasDevCommand: true,
29
+ command
30
+ };
31
+ }
32
+ // 没有 dev 脚本
33
+ return {
34
+ hasDevCommand: false
35
+ };
36
+ }
37
+ catch {
38
+ // package.json 不存在或无法解析
39
+ return {
40
+ hasDevCommand: false
41
+ };
42
+ }
43
+ }
44
+ /**
45
+ * 获取 dev server 启动命令
46
+ * @param projectDir 项目目录
47
+ * @param configDir .colyn 配置目录(可选)
48
+ * @returns 启动命令,如果没有 dev 脚本返回 undefined
49
+ */
50
+ export async function getDevServerCommand(projectDir, configDir) {
51
+ const info = await detectDevServer(projectDir, configDir);
52
+ return info.command;
53
+ }
54
+ //# sourceMappingURL=dev-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/core/dev-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,SAAkB;IAElB,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAExC,eAAe;QACf,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;QAE3C,IAAI,SAAS,EAAE,CAAC;YACd,SAAS;YACT,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,GAAG,UAAU,MAAM,CAAC;YAEpC,OAAO;gBACL,aAAa,EAAE,IAAI;gBACnB,OAAO;aACR,CAAC;QACJ,CAAC;QAED,YAAY;QACZ,OAAO;YACL,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;QACxB,OAAO;YACL,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,SAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { WorktreeInfo } from '../types/index.js';
2
+ /**
3
+ * 项目发现信息
4
+ * 从文件系统动态获取,替代 config.json
5
+ */
6
+ export interface ProjectInfo {
7
+ /** 主分支名称(从主分支目录的 git 获取) */
8
+ mainBranch: string;
9
+ /** 主分支端口(从 .env.local 获取) */
10
+ mainPort: number;
11
+ /** 下一个 worktree ID */
12
+ nextWorktreeId: number;
13
+ /** 所有 worktree 信息 */
14
+ worktrees: WorktreeInfo[];
15
+ }
16
+ /**
17
+ * 从主分支目录获取当前分支名称
18
+ */
19
+ export declare function getMainBranch(mainDir: string): Promise<string>;
20
+ /**
21
+ * 从主分支的 .env.local 获取端口
22
+ */
23
+ export declare function getMainPort(mainDir: string): Promise<number>;
24
+ /**
25
+ * 扫描 worktrees 目录获取下一个可用 ID
26
+ */
27
+ export declare function getNextWorktreeId(worktreesDir: string): Promise<number>;
28
+ /**
29
+ * 发现所有 worktree 信息
30
+ * 结合 git worktree list 和各目录的 .env.local
31
+ */
32
+ export declare function discoverWorktrees(mainDir: string, worktreesDir: string): Promise<WorktreeInfo[]>;
33
+ /**
34
+ * 获取完整的项目信息
35
+ * 这是获取项目配置的主入口,替代原来的 loadConfig
36
+ */
37
+ export declare function discoverProjectInfo(mainDir: string, worktreesDir: string): Promise<ProjectInfo>;
38
+ /**
39
+ * 检查分支是否已有 worktree
40
+ */
41
+ export declare function findWorktreeByBranch(mainDir: string, worktreesDir: string, branch: string): Promise<WorktreeInfo | undefined>;
42
+ /**
43
+ * 获取当前目录的 worktree ID
44
+ *
45
+ * 从当前目录的 .env.local 读取 WORKTREE 变量,并验证与目录名一致
46
+ *
47
+ * @returns worktree ID,如果不在 worktree 目录中返回 null
48
+ * @throws ColynError 如果 .env.local 中的 WORKTREE 与目录名不一致
49
+ */
50
+ export declare function getCurrentWorktreeId(): Promise<number | null>;
51
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAkCD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAalE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa7E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC,CA8GzB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC,CActB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAGnC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8CnE"}