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,270 @@
1
+ /**
2
+ * PluginManager — 工具链插件管理器
3
+ *
4
+ * 负责:
5
+ * - 维护已注册插件列表
6
+ * - 根据激活插件名称列表分发各扩展点调用
7
+ * - 统一处理 PluginCommandError(verbose 模式下展示命令输出)
8
+ */
9
+ import { PluginCommandError } from '../types/plugin.js';
10
+ import { outputError } from '../utils/logger.js';
11
+ import { addToGitignore } from './utils.js';
12
+ export class PluginManager {
13
+ plugins = new Map();
14
+ /**
15
+ * 注册插件
16
+ */
17
+ register(plugin) {
18
+ this.plugins.set(plugin.name, plugin);
19
+ }
20
+ /**
21
+ * 获取所有已注册的插件列表
22
+ */
23
+ getAllPlugins() {
24
+ return Array.from(this.plugins.values());
25
+ }
26
+ /**
27
+ * 获取激活的插件列表
28
+ * @param activePluginNames 激活插件名称数组(工具链类型标识符列表)
29
+ */
30
+ getActivePlugins(activePluginNames) {
31
+ return activePluginNames
32
+ .map((name) => this.plugins.get(name))
33
+ .filter((p) => p !== undefined);
34
+ }
35
+ /**
36
+ * 自动检测并返回匹配的插件名称列表
37
+ * @param worktreePath 检测目录
38
+ */
39
+ async detectPlugins(worktreePath) {
40
+ const matched = [];
41
+ for (const plugin of this.plugins.values()) {
42
+ if (await plugin.detect(worktreePath)) {
43
+ matched.push(plugin.name);
44
+ }
45
+ }
46
+ return matched;
47
+ }
48
+ // ════════════════════════════════════════════
49
+ // 环境配置扩展点
50
+ // ════════════════════════════════════════════
51
+ /**
52
+ * 返回第一个非 null 的端口配置
53
+ */
54
+ getPortConfig(activePluginNames) {
55
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
56
+ const config = plugin.portConfig?.();
57
+ if (config !== undefined && config !== null) {
58
+ return config;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * 读取运行时配置 — 返回第一个非 null 的结果
65
+ */
66
+ async readRuntimeConfig(worktreePath, activePluginNames) {
67
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
68
+ if (!plugin.readRuntimeConfig)
69
+ continue;
70
+ const config = await plugin.readRuntimeConfig(worktreePath);
71
+ if (config !== null)
72
+ return config;
73
+ }
74
+ return null;
75
+ }
76
+ /**
77
+ * 写入运行时配置 — 调用所有激活插件的 writeRuntimeConfig
78
+ */
79
+ async writeRuntimeConfig(worktreePath, config, activePluginNames) {
80
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
81
+ if (plugin.writeRuntimeConfig) {
82
+ await plugin.writeRuntimeConfig(worktreePath, config);
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * 获取 dev server 命令 — 返回第一个非 null 的结果
88
+ */
89
+ async getDevServerCommand(worktreePath, activePluginNames) {
90
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
91
+ if (!plugin.devServerCommand)
92
+ continue;
93
+ const cmd = await plugin.devServerCommand(worktreePath);
94
+ if (cmd !== null)
95
+ return cmd;
96
+ }
97
+ return null;
98
+ }
99
+ // ════════════════════════════════════════════
100
+ // 生命周期操作
101
+ // ════════════════════════════════════════════
102
+ /**
103
+ * 确保激活插件的运行时配置文件被 .gitignore 忽略
104
+ */
105
+ async ensureRuntimeConfigIgnored(worktreePath, activePluginNames) {
106
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
107
+ if (!plugin.getRuntimeConfigFileName)
108
+ continue;
109
+ const filename = plugin.getRuntimeConfigFileName();
110
+ if (!filename)
111
+ continue;
112
+ await addToGitignore(worktreePath, filename, [filename], 'Runtime config (auto-generated by colyn)');
113
+ }
114
+ }
115
+ /**
116
+ * 运行指定工具链插件的 repairSettings,返回更新后的配置
117
+ *
118
+ * 插件通过 repairSettings 检查项目配置,自动发现或交互询问必要的配置项。
119
+ * 调用方负责将结果保存到 settings 文件(通过 saveRepairSettingsResult)。
120
+ *
121
+ * @param worktreePath 子项目目录路径
122
+ * @param toolchainName 工具链名称(插件标识符)
123
+ * @param currentSettings 当前已保存的工具链专属配置
124
+ * @param nonInteractive 是否非交互模式(默认 false)
125
+ * @returns 更新后的配置,若插件未实现 repairSettings 则返回 null
126
+ */
127
+ async runRepairSettings(worktreePath, toolchainName, currentSettings, nonInteractive = false) {
128
+ const plugin = this.plugins.get(toolchainName);
129
+ if (!plugin || !plugin.repairSettings)
130
+ return null;
131
+ const context = {
132
+ projectRoot: '',
133
+ worktreePath,
134
+ currentSettings,
135
+ nonInteractive,
136
+ };
137
+ return await plugin.repairSettings(context);
138
+ }
139
+ /**
140
+ * 运行所有激活插件的 install
141
+ */
142
+ async runInstall(worktreePath, activePluginNames, verbose) {
143
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
144
+ if (!plugin.install)
145
+ continue;
146
+ try {
147
+ await plugin.install(worktreePath);
148
+ }
149
+ catch (error) {
150
+ if (error instanceof PluginCommandError) {
151
+ if (verbose) {
152
+ outputError(error.output);
153
+ }
154
+ throw error;
155
+ }
156
+ throw error;
157
+ }
158
+ }
159
+ }
160
+ /**
161
+ * 运行所有激活插件的 lint
162
+ */
163
+ async runLint(worktreePath, activePluginNames, verbose) {
164
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
165
+ if (!plugin.lint)
166
+ continue;
167
+ try {
168
+ await plugin.lint(worktreePath);
169
+ }
170
+ catch (error) {
171
+ if (error instanceof PluginCommandError) {
172
+ if (verbose) {
173
+ outputError(error.output);
174
+ }
175
+ throw error;
176
+ }
177
+ throw error;
178
+ }
179
+ }
180
+ }
181
+ /**
182
+ * 运行所有激活插件的 build
183
+ */
184
+ async runBuild(worktreePath, activePluginNames, verbose) {
185
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
186
+ if (!plugin.build)
187
+ continue;
188
+ try {
189
+ await plugin.build(worktreePath);
190
+ }
191
+ catch (error) {
192
+ if (error instanceof PluginCommandError) {
193
+ if (verbose) {
194
+ outputError(error.output);
195
+ }
196
+ throw error;
197
+ }
198
+ throw error;
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * 运行所有激活插件的 publish
204
+ */
205
+ async runPublish(worktreePath, activePluginNames, verbose) {
206
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
207
+ if (!plugin.publish)
208
+ continue;
209
+ try {
210
+ await plugin.publish(worktreePath);
211
+ }
212
+ catch (error) {
213
+ if (error instanceof PluginCommandError) {
214
+ if (verbose) {
215
+ outputError(error.output);
216
+ }
217
+ throw error;
218
+ }
219
+ throw error;
220
+ }
221
+ }
222
+ }
223
+ /**
224
+ * 检查激活插件是否满足发布条件
225
+ */
226
+ async runCheckPublishable(worktreePath, activePluginNames) {
227
+ const activePlugins = this.getActivePlugins(activePluginNames);
228
+ for (const plugin of activePlugins) {
229
+ // 插件未实现 publish,则视为不可发布
230
+ if (!plugin.publish) {
231
+ return false;
232
+ }
233
+ if (!plugin.checkPublishable) {
234
+ continue;
235
+ }
236
+ const publishable = await plugin.checkPublishable(worktreePath);
237
+ if (!publishable) {
238
+ return false;
239
+ }
240
+ }
241
+ return true;
242
+ }
243
+ /**
244
+ * 读取当前版本号 — 返回第一个非 null 的结果
245
+ */
246
+ async runReadVersion(worktreePath, activePluginNames) {
247
+ for (const plugin of this.getActivePlugins(activePluginNames)) {
248
+ if (!plugin.readVersion)
249
+ continue;
250
+ const version = await plugin.readVersion(worktreePath);
251
+ if (version !== null)
252
+ return version;
253
+ }
254
+ return null;
255
+ }
256
+ /**
257
+ * 运行所有激活插件的 bumpVersion
258
+ * 若已激活插件未实现此方法,则报错终止
259
+ */
260
+ async runBumpVersion(worktreePath, version, activePluginNames) {
261
+ const activePlugins = this.getActivePlugins(activePluginNames);
262
+ for (const plugin of activePlugins) {
263
+ if (!plugin.bumpVersion) {
264
+ throw new Error(`Plugin "${plugin.name}" does not implement bumpVersion. Cannot proceed with release.`);
265
+ }
266
+ await plugin.bumpVersion(worktreePath, version);
267
+ }
268
+ }
269
+ }
270
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAqE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3H,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,OAAO,aAAa;IACP,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAC;IAEnE;;OAEG;IACH,QAAQ,CAAC,MAAuB;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,iBAA2B;QAClD,OAAO,iBAAiB;aACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,+CAA+C;IAC/C,UAAU;IACV,+CAA+C;IAE/C;;OAEG;IACH,aAAa,CAAC,iBAA2B;QACvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC5C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,YAAoB,EACpB,iBAA2B;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,iBAAiB;gBAAE,SAAS;YACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAC5D,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,YAAoB,EACpB,MAA8B,EAC9B,iBAA2B;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC9B,MAAM,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,YAAoB,EACpB,iBAA2B;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,gBAAgB;gBAAE,SAAS;YACvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACxD,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,GAAG,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAC/C,SAAS;IACT,+CAA+C;IAE/C;;OAEG;IACH,KAAK,CAAC,0BAA0B,CAC9B,YAAoB,EACpB,iBAA2B;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,wBAAwB;gBAAE,SAAS;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,wBAAwB,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,cAAc,CAClB,YAAY,EACZ,QAAQ,EACR,CAAC,QAAQ,CAAC,EACV,0CAA0C,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,iBAAiB,CACrB,YAAoB,EACpB,aAAqB,EACrB,eAAwC,EACxC,cAAc,GAAG,KAAK;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAEnD,MAAM,OAAO,GAA0B;YACrC,WAAW,EAAE,EAAE;YACf,YAAY;YACZ,eAAe;YACf,cAAc;SACf,CAAC;QAEF,OAAO,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,YAAoB,EACpB,iBAA2B,EAC3B,OAAiB;QAEjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBACxC,IAAI,OAAO,EAAE,CAAC;wBACZ,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC5B,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,YAAoB,EACpB,iBAA2B,EAC3B,OAAiB;QAEjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBACxC,IAAI,OAAO,EAAE,CAAC;wBACZ,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC5B,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,YAAoB,EACpB,iBAA2B,EAC3B,OAAiB;QAEjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,SAAS;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBACxC,IAAI,OAAO,EAAE,CAAC;wBACZ,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC5B,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,YAAoB,EACpB,iBAA2B,EAC3B,OAAiB;QAEjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBACxC,IAAI,OAAO,EAAE,CAAC;wBACZ,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC5B,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,YAAoB,EACpB,iBAA2B;QAE3B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAC/D,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,wBAAwB;YACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC7B,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAChE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,YAAoB,EACpB,iBAA2B;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,SAAS;YAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,OAAO,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,YAAoB,EACpB,OAAe,EACf,iBAA2B;QAE3B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAC/D,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,IAAI,gEAAgE,CACvF,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 插件共享工具函数
3
+ */
4
+ /**
5
+ * 将 execSync 错误中的 stdout/stderr 合并为字符串
6
+ */
7
+ export declare function extractOutput(error: unknown): string;
8
+ /**
9
+ * 在 .gitignore 中添加规则
10
+ * @param worktreePath 项目目录
11
+ * @param rule 要添加的规则字符串(如 `.env.local`)
12
+ * @param existsPatterns 若 .gitignore 中已含这些字符串之一则跳过
13
+ * @param sectionComment 新增规则前的注释(不含 #)
14
+ */
15
+ export declare function addToGitignore(worktreePath: string, rule: string, existsPatterns: string[], sectionComment: string): Promise<void>;
16
+ /**
17
+ * 解析 Java .properties 文件
18
+ * 格式:key=value(支持 # 注释,忽略空行)
19
+ */
20
+ export declare function parseProperties(content: string): Record<string, string>;
21
+ /**
22
+ * 将键值对序列化为 .properties 文件格式
23
+ */
24
+ export declare function stringifyProperties(data: Record<string, string>): string;
25
+ /**
26
+ * 读取 Spring Boot 本地运行时配置
27
+ *
28
+ * 优先级:
29
+ * 1. src/main/resources/application-local.properties
30
+ * 2. src/main/resources/application-local.yaml
31
+ * 3. src/main/resources/application.properties(fallback)
32
+ * 4. src/main/resources/application.yaml(fallback)
33
+ *
34
+ * 以上均不存在则返回 null。
35
+ */
36
+ export declare function readSpringRuntimeConfig(worktreePath: string): Promise<Record<string, string> | null>;
37
+ /**
38
+ * 写入 Spring Boot 本地运行时配置
39
+ * 写入 src/main/resources/application-local.properties
40
+ */
41
+ export declare function writeSpringRuntimeConfig(worktreePath: string, config: Record<string, string>): Promise<void>;
42
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/plugins/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWpD;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,EACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAavE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAMxE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CA4BxC;AAsBD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * 插件共享工具函数
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ /**
7
+ * 将 execSync 错误中的 stdout/stderr 合并为字符串
8
+ */
9
+ export function extractOutput(error) {
10
+ if (error && typeof error === 'object') {
11
+ const err = error;
12
+ const stdout = err.stdout ? err.stdout.toString() : '';
13
+ const stderr = err.stderr ? err.stderr.toString() : '';
14
+ return [stdout, stderr].filter(Boolean).join('\n');
15
+ }
16
+ return String(error);
17
+ }
18
+ /**
19
+ * 在 .gitignore 中添加规则
20
+ * @param worktreePath 项目目录
21
+ * @param rule 要添加的规则字符串(如 `.env.local`)
22
+ * @param existsPatterns 若 .gitignore 中已含这些字符串之一则跳过
23
+ * @param sectionComment 新增规则前的注释(不含 #)
24
+ */
25
+ export async function addToGitignore(worktreePath, rule, existsPatterns, sectionComment) {
26
+ const gitignorePath = path.join(worktreePath, '.gitignore');
27
+ let content = '';
28
+ try {
29
+ content = await fs.readFile(gitignorePath, 'utf-8');
30
+ }
31
+ catch {
32
+ // 文件不存在,将创建新的
33
+ }
34
+ // 如果已有相关规则,跳过
35
+ if (existsPatterns.some((p) => content.includes(p)))
36
+ return;
37
+ const newContent = content.trim()
38
+ ? `${content}\n\n# ${sectionComment}\n${rule}\n`
39
+ : `# ${sectionComment}\n${rule}\n`;
40
+ await fs.writeFile(gitignorePath, newContent, 'utf-8');
41
+ }
42
+ /**
43
+ * 解析 Java .properties 文件
44
+ * 格式:key=value(支持 # 注释,忽略空行)
45
+ */
46
+ export function parseProperties(content) {
47
+ const result = {};
48
+ for (const line of content.split('\n')) {
49
+ const trimmed = line.trim();
50
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!'))
51
+ continue;
52
+ const eq = trimmed.indexOf('=');
53
+ if (eq > 0) {
54
+ const key = trimmed.slice(0, eq).trim();
55
+ const value = trimmed.slice(eq + 1).trim();
56
+ result[key] = value;
57
+ }
58
+ }
59
+ return result;
60
+ }
61
+ /**
62
+ * 将键值对序列化为 .properties 文件格式
63
+ */
64
+ export function stringifyProperties(data) {
65
+ return (Object.entries(data)
66
+ .map(([k, v]) => `${k}=${v}`)
67
+ .join('\n') + '\n');
68
+ }
69
+ /**
70
+ * 读取 Spring Boot 本地运行时配置
71
+ *
72
+ * 优先级:
73
+ * 1. src/main/resources/application-local.properties
74
+ * 2. src/main/resources/application-local.yaml
75
+ * 3. src/main/resources/application.properties(fallback)
76
+ * 4. src/main/resources/application.yaml(fallback)
77
+ *
78
+ * 以上均不存在则返回 null。
79
+ */
80
+ export async function readSpringRuntimeConfig(worktreePath) {
81
+ const resourcesDir = path.join(worktreePath, 'src', 'main', 'resources');
82
+ const candidates = [
83
+ { file: path.join(resourcesDir, 'application-local.properties'), type: 'properties' },
84
+ { file: path.join(resourcesDir, 'application-local.yaml'), type: 'yaml' },
85
+ { file: path.join(resourcesDir, 'application.properties'), type: 'properties' },
86
+ { file: path.join(resourcesDir, 'application.yaml'), type: 'yaml' },
87
+ ];
88
+ for (const candidate of candidates) {
89
+ try {
90
+ const content = await fs.readFile(candidate.file, 'utf-8');
91
+ if (candidate.type === 'properties') {
92
+ return parseProperties(content);
93
+ }
94
+ else {
95
+ // 将 YAML 扁平化为 key=value(仅支持顶层单值键)
96
+ const yaml = await import('js-yaml');
97
+ const parsed = yaml.load(content);
98
+ if (parsed && typeof parsed === 'object') {
99
+ return flattenYaml(parsed);
100
+ }
101
+ }
102
+ }
103
+ catch {
104
+ // 文件不存在,尝试下一个
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ /**
110
+ * 将 YAML 对象扁平化为 dot-notation 键值对
111
+ * 例如:{ server: { port: 8080 } } → { 'server.port': '8080' }
112
+ */
113
+ function flattenYaml(obj, prefix = '') {
114
+ const result = {};
115
+ for (const [key, value] of Object.entries(obj)) {
116
+ const fullKey = prefix ? `${prefix}.${key}` : key;
117
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
118
+ Object.assign(result, flattenYaml(value, fullKey));
119
+ }
120
+ else {
121
+ result[fullKey] = String(value ?? '');
122
+ }
123
+ }
124
+ return result;
125
+ }
126
+ /**
127
+ * 写入 Spring Boot 本地运行时配置
128
+ * 写入 src/main/resources/application-local.properties
129
+ */
130
+ export async function writeSpringRuntimeConfig(worktreePath, config) {
131
+ const resourcesDir = path.join(worktreePath, 'src', 'main', 'resources');
132
+ await fs.mkdir(resourcesDir, { recursive: true });
133
+ const localPropertiesPath = path.join(resourcesDir, 'application-local.properties');
134
+ let existingContent = '';
135
+ try {
136
+ existingContent = await fs.readFile(localPropertiesPath, 'utf-8');
137
+ }
138
+ catch {
139
+ // 文件不存在,写入全新内容
140
+ await fs.writeFile(localPropertiesPath, stringifyProperties(config), 'utf-8');
141
+ return;
142
+ }
143
+ // 保留注释,更新已有 key,追加新 key
144
+ const lines = existingContent.split('\n');
145
+ const result = [];
146
+ const updatedKeys = new Set();
147
+ for (const line of lines) {
148
+ const trimmed = line.trim();
149
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!')) {
150
+ result.push(line);
151
+ continue;
152
+ }
153
+ const eq = trimmed.indexOf('=');
154
+ if (eq > 0) {
155
+ const key = trimmed.slice(0, eq).trim();
156
+ if (config[key] !== undefined) {
157
+ result.push(`${key}=${config[key]}`);
158
+ updatedKeys.add(key);
159
+ }
160
+ else {
161
+ result.push(line);
162
+ }
163
+ }
164
+ else {
165
+ result.push(line);
166
+ }
167
+ }
168
+ for (const [key, value] of Object.entries(config)) {
169
+ if (!updatedKeys.has(key)) {
170
+ result.push(`${key}=${value}`);
171
+ }
172
+ }
173
+ await fs.writeFile(localPropertiesPath, result.join('\n') + '\n', 'utf-8');
174
+ }
175
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/plugins/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * 目录状态枚举
4
+ */
5
+ export declare enum DirectoryStatus {
6
+ Empty = "empty",// 空目录
7
+ Initialized = "initialized",// 已初始化
8
+ ExistingProject = "existing"
9
+ }
10
+ /**
11
+ * 目录信息接口
12
+ */
13
+ export interface DirectoryInfo {
14
+ status: DirectoryStatus;
15
+ isEmpty: boolean;
16
+ hasMainDir: boolean;
17
+ hasWorktreesDir: boolean;
18
+ hasConfigDir: boolean;
19
+ hasGitRepo: boolean;
20
+ fileCount: number;
21
+ currentDirName: string;
22
+ }
23
+ /**
24
+ * Worktree 信息接口
25
+ */
26
+ export interface WorktreeInfo {
27
+ id: number;
28
+ branch: string;
29
+ path: string;
30
+ port: number;
31
+ createdAt: string;
32
+ }
33
+ /**
34
+ * 自定义错误类
35
+ */
36
+ export declare class ColynError extends Error {
37
+ hint?: string | undefined;
38
+ constructor(message: string, hint?: string | undefined);
39
+ }
40
+ /**
41
+ * 命令执行结果
42
+ * 用于 bash 入口脚本解析,实现自动目录切换
43
+ */
44
+ export interface CommandResult {
45
+ /** 是否成功 */
46
+ success: boolean;
47
+ /** 需要切换到的目录(绝对路径,bash 用于 cd) */
48
+ targetDir?: string;
49
+ /** 相对于项目根目录的路径(显示给用户) */
50
+ displayPath?: string;
51
+ /** 需要连接的 tmux session 名称 */
52
+ attachSession?: string;
53
+ }
54
+ /**
55
+ * 命令模块接口
56
+ * 每个命令文件应导出一个 register 函数
57
+ */
58
+ export interface CommandModule {
59
+ /** 注册命令到 program */
60
+ register: (program: Command) => void;
61
+ }
62
+ /**
63
+ * Todo 状态
64
+ */
65
+ export type TodoStatus = 'pending' | 'completed';
66
+ /**
67
+ * Todo 条目
68
+ */
69
+ export interface TodoItem {
70
+ /** 类型,例如 "feature", "bug", "chore" */
71
+ type: string;
72
+ /** 名称,例如 "login", "fix-auth" */
73
+ name: string;
74
+ /** 任务描述 */
75
+ message: string;
76
+ /** 状态 */
77
+ status: TodoStatus;
78
+ /** 创建时间(ISO 时间戳) */
79
+ createdAt: string;
80
+ /** 开始时间(todo start 执行时间) */
81
+ startedAt?: string;
82
+ /** 创建的分支名 */
83
+ branch?: string;
84
+ }
85
+ /**
86
+ * Todo 文件结构
87
+ */
88
+ export interface TodoFile {
89
+ todos: TodoItem[];
90
+ }
91
+ /**
92
+ * 归档的 Todo 条目
93
+ */
94
+ export interface ArchivedTodoItem extends TodoItem {
95
+ /** 归档时间(ISO 时间戳) */
96
+ archivedAt: string;
97
+ }
98
+ /**
99
+ * 归档 Todo 文件结构
100
+ */
101
+ export interface ArchivedTodoFile {
102
+ todos: ArchivedTodoItem[];
103
+ }
104
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;GAEG;AACH,oBAAY,eAAe;IACzB,KAAK,UAAU,CAAe,MAAM;IACpC,WAAW,gBAAgB,CAAG,OAAO;IACrC,eAAe,aAAa;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IAG1B,IAAI,CAAC,EAAE,MAAM;gBADpB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA;CAKvB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS;IACT,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 目录状态枚举
3
+ */
4
+ export var DirectoryStatus;
5
+ (function (DirectoryStatus) {
6
+ DirectoryStatus["Empty"] = "empty";
7
+ DirectoryStatus["Initialized"] = "initialized";
8
+ DirectoryStatus["ExistingProject"] = "existing"; // 已有项目
9
+ })(DirectoryStatus || (DirectoryStatus = {}));
10
+ /**
11
+ * 自定义错误类
12
+ */
13
+ export class ColynError extends Error {
14
+ hint;
15
+ constructor(message, hint) {
16
+ super(message);
17
+ this.hint = hint;
18
+ this.name = 'ColynError';
19
+ }
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,kCAAe,CAAA;IACf,8CAA2B,CAAA;IAC3B,+CAA4B,CAAA,CAAE,OAAO;AACvC,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AA2BD;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAG1B;IAFT,YACE,OAAe,EACR,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}