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,438 @@
1
+ /**
2
+ * Xcode 内置工具链插件
3
+ *
4
+ * 支持 Apple 平台原生应用(iOS / macOS / tvOS / watchOS)项目。
5
+ * 通过检测 .xcworkspace / .xcodeproj / Package.swift 识别项目类型。
6
+ *
7
+ * 特殊机制:通过 repairSettings 在 colyn init / colyn repair 时交互式
8
+ * 询问 scheme 和 destination,保存到 pluginSettings.xcode,供 build 命令使用。
9
+ */
10
+ import * as fs from 'fs/promises';
11
+ import * as fsSync from 'fs';
12
+ import * as path from 'path';
13
+ import { execSync } from 'child_process';
14
+ import Enquirer from 'enquirer';
15
+ const { prompt } = Enquirer;
16
+ import { PluginCommandError, } from '../../types/plugin.js';
17
+ import { extractOutput } from '../utils.js';
18
+ import { loadProjectConfig } from '../../core/config-loader.js';
19
+ import { findProjectRoot } from '../../core/paths.js';
20
+ import { outputInfo } from '../../utils/logger.js';
21
+ import { t } from '../../i18n/index.js';
22
+ // ════════════════════════════════════════════
23
+ // 辅助函数
24
+ // ════════════════════════════════════════════
25
+ /**
26
+ * 扫描目录,找到 xcworkspace / xcodeproj / Package.swift
27
+ */
28
+ async function scanXcodeDir(dir) {
29
+ let entries = [];
30
+ try {
31
+ entries = await fs.readdir(dir);
32
+ }
33
+ catch {
34
+ return { workspace: undefined, project: undefined, hasSPM: false };
35
+ }
36
+ // 真实的 xcworkspace(排除 xcodeproj 内部自动生成的 project.xcworkspace)
37
+ const workspace = entries.find(e => e.endsWith('.xcworkspace') && e !== 'project.xcworkspace');
38
+ // xcodeproj
39
+ const project = entries.find(e => e.endsWith('.xcodeproj'));
40
+ // Package.swift
41
+ const hasSPM = entries.includes('Package.swift');
42
+ return { workspace, project, hasSPM };
43
+ }
44
+ /**
45
+ * 从 xcodeproj 中找到所有 shared scheme 名称
46
+ */
47
+ async function findSharedSchemes(worktreePath, projectFile) {
48
+ const schemesDir = path.join(worktreePath, projectFile, 'xcshareddata', 'xcschemes');
49
+ try {
50
+ const entries = await fs.readdir(schemesDir);
51
+ return entries
52
+ .filter(e => e.endsWith('.xcscheme'))
53
+ .map(e => e.replace(/\.xcscheme$/, ''))
54
+ .sort();
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
60
+ /**
61
+ * 从 project.pbxproj 推断目标平台(通过 SDKROOT)
62
+ * 返回 xcodebuild -destination 参数字符串,或 null(无法推断)
63
+ */
64
+ async function inferDestination(worktreePath, projectFile) {
65
+ const pbxprojPath = path.join(worktreePath, projectFile, 'project.pbxproj');
66
+ try {
67
+ const content = await fs.readFile(pbxprojPath, 'utf-8');
68
+ // 统计 SDKROOT 各取值的出现次数
69
+ const counts = {};
70
+ const matches = content.matchAll(/SDKROOT\s*=\s*([^;]+);/g);
71
+ for (const match of matches) {
72
+ const sdk = match[1].trim().toLowerCase();
73
+ counts[sdk] = (counts[sdk] ?? 0) + 1;
74
+ }
75
+ // 找出出现次数最多的 SDKROOT
76
+ let maxCount = 0;
77
+ let dominantSDK = '';
78
+ for (const [sdk, count] of Object.entries(counts)) {
79
+ if (count > maxCount) {
80
+ maxCount = count;
81
+ dominantSDK = sdk;
82
+ }
83
+ }
84
+ if (!dominantSDK)
85
+ return null;
86
+ if (dominantSDK.includes('iphoneos'))
87
+ return 'generic/platform=iOS Simulator';
88
+ if (dominantSDK.includes('macosx'))
89
+ return 'platform=macOS';
90
+ if (dominantSDK.includes('appletvos'))
91
+ return 'generic/platform=tvOS Simulator';
92
+ if (dominantSDK.includes('watchos'))
93
+ return 'generic/platform=watchOS Simulator';
94
+ return null;
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * 从 xcworkspace 名称派生对应的 xcodeproj 名称
102
+ * 例如:'MyApp.xcworkspace' → 'MyApp.xcodeproj'
103
+ */
104
+ function deriveProjectFromWorkspace(workspace) {
105
+ return workspace.replace(/\.xcworkspace$/, '.xcodeproj');
106
+ }
107
+ // ════════════════════════════════════════════
108
+ // 插件定义
109
+ // ════════════════════════════════════════════
110
+ export const xcodePlugin = {
111
+ name: 'xcode',
112
+ displayName: 'Xcode (Apple platforms)',
113
+ // ────────────────────────────────────────
114
+ // 检测
115
+ // ────────────────────────────────────────
116
+ async detect(worktreePath) {
117
+ const xcProject = await scanXcodeDir(worktreePath);
118
+ return !!(xcProject.workspace ?? xcProject.project ?? xcProject.hasSPM);
119
+ },
120
+ // ────────────────────────────────────────
121
+ // 端口配置(原生 App 无需端口)
122
+ // ────────────────────────────────────────
123
+ portConfig() {
124
+ return null;
125
+ },
126
+ // ────────────────────────────────────────
127
+ // 运行时配置文件名(Xcode 无标准运行时配置文件)
128
+ // ────────────────────────────────────────
129
+ getRuntimeConfigFileName() {
130
+ return null;
131
+ },
132
+ // ────────────────────────────────────────
133
+ // 插件专属配置修复(核心功能:交互式收集 scheme/destination)
134
+ // ────────────────────────────────────────
135
+ async repairSettings(context) {
136
+ const { worktreePath, currentSettings, nonInteractive } = context;
137
+ // 以当前已保存配置为基础(幂等)
138
+ const result = { ...currentSettings };
139
+ // 扫描项目文件
140
+ const xcProject = await scanXcodeDir(worktreePath);
141
+ if (!xcProject.workspace && !xcProject.project && !xcProject.hasSPM) {
142
+ // 没有找到任何 Xcode 项目文件,不修改配置
143
+ return result;
144
+ }
145
+ // 清理旧版本可能遗留的 subdir 配置
146
+ delete result.subdir;
147
+ // 更新 workspace / project 引用(保持与项目实际状态一致)
148
+ if (xcProject.workspace) {
149
+ result.workspace = xcProject.workspace;
150
+ }
151
+ else {
152
+ delete result.workspace;
153
+ }
154
+ if (xcProject.project) {
155
+ result.project = xcProject.project;
156
+ }
157
+ else if (!xcProject.workspace) {
158
+ delete result.project;
159
+ }
160
+ // 纯 SPM 项目(无 xcodeproj),不需要 scheme 配置
161
+ if (!xcProject.project && !xcProject.workspace) {
162
+ return result;
163
+ }
164
+ // 确定用于查找 scheme 的 xcodeproj 路径
165
+ const projectFile = xcProject.project ??
166
+ (xcProject.workspace ? deriveProjectFromWorkspace(xcProject.workspace) : undefined);
167
+ if (!projectFile)
168
+ return result;
169
+ // ── 处理 scheme ──────────────────────────────────
170
+ const schemes = await findSharedSchemes(worktreePath, projectFile);
171
+ // 检查当前 scheme 是否仍然有效
172
+ const currentScheme = typeof result.scheme === 'string' ? result.scheme : undefined;
173
+ const schemeStillValid = currentScheme !== undefined &&
174
+ (schemes.length === 0 || schemes.includes(currentScheme));
175
+ if (!schemeStillValid) {
176
+ if (schemes.length === 1) {
177
+ // 只有一个 scheme,自动选择
178
+ result.scheme = schemes[0];
179
+ if (!nonInteractive) {
180
+ outputInfo(t('plugins.xcode.autoSelectedScheme', { scheme: schemes[0] }));
181
+ }
182
+ }
183
+ else if (schemes.length > 1) {
184
+ // 多个 scheme,让用户选择
185
+ if (nonInteractive) {
186
+ result.scheme = schemes[0];
187
+ }
188
+ else {
189
+ const response = await prompt({
190
+ type: 'select',
191
+ name: 'scheme',
192
+ message: t('plugins.xcode.selectScheme'),
193
+ choices: schemes,
194
+ stdout: process.stderr,
195
+ });
196
+ result.scheme = response.scheme;
197
+ }
198
+ }
199
+ else {
200
+ // 没有 shared scheme,让用户手动输入
201
+ if (nonInteractive) {
202
+ delete result.scheme;
203
+ }
204
+ else {
205
+ outputInfo(t('plugins.xcode.noSharedSchemes'));
206
+ const response = await prompt({
207
+ type: 'input',
208
+ name: 'scheme',
209
+ message: t('plugins.xcode.inputScheme'),
210
+ stdout: process.stderr,
211
+ });
212
+ const schemeInput = response.scheme.trim();
213
+ if (schemeInput) {
214
+ result.scheme = schemeInput;
215
+ }
216
+ else {
217
+ delete result.scheme;
218
+ }
219
+ }
220
+ }
221
+ }
222
+ // ── 处理 destination ─────────────────────────────
223
+ if (!result.destination) {
224
+ const inferred = await inferDestination(worktreePath, projectFile);
225
+ if (inferred) {
226
+ result.destination = inferred;
227
+ if (!nonInteractive) {
228
+ outputInfo(t('plugins.xcode.inferredDestination', { destination: inferred }));
229
+ }
230
+ }
231
+ else if (!nonInteractive) {
232
+ // 无法推断,让用户选择
233
+ const destChoices = [
234
+ 'generic/platform=iOS Simulator',
235
+ 'generic/platform=iOS',
236
+ 'platform=macOS',
237
+ 'generic/platform=tvOS Simulator',
238
+ 'generic/platform=watchOS Simulator',
239
+ ];
240
+ const response = await prompt({
241
+ type: 'select',
242
+ name: 'destination',
243
+ message: t('plugins.xcode.selectDestination'),
244
+ choices: destChoices,
245
+ stdout: process.stderr,
246
+ });
247
+ result.destination = response.destination;
248
+ }
249
+ }
250
+ return result;
251
+ },
252
+ // ────────────────────────────────────────
253
+ // 安装依赖
254
+ // ────────────────────────────────────────
255
+ async install(worktreePath) {
256
+ const hasPodfile = fsSync.existsSync(path.join(worktreePath, 'Podfile'));
257
+ const hasPackageSwift = fsSync.existsSync(path.join(worktreePath, 'Package.swift'));
258
+ if (hasPodfile) {
259
+ try {
260
+ execSync('pod install', {
261
+ cwd: worktreePath,
262
+ stdio: ['ignore', 'pipe', 'pipe'],
263
+ });
264
+ }
265
+ catch (error) {
266
+ const output = extractOutput(error);
267
+ throw new PluginCommandError('pod install failed', output);
268
+ }
269
+ }
270
+ else if (hasPackageSwift) {
271
+ try {
272
+ execSync('swift package resolve', {
273
+ cwd: worktreePath,
274
+ stdio: ['ignore', 'pipe', 'pipe'],
275
+ });
276
+ }
277
+ catch (error) {
278
+ const output = extractOutput(error);
279
+ throw new PluginCommandError('swift package resolve failed', output);
280
+ }
281
+ }
282
+ // 两者都没有:静默跳过
283
+ },
284
+ // ────────────────────────────────────────
285
+ // 代码质量检查(SwiftLint)
286
+ // ────────────────────────────────────────
287
+ async lint(worktreePath) {
288
+ const hasLintConfig = fsSync.existsSync(path.join(worktreePath, '.swiftlint.yml')) ||
289
+ fsSync.existsSync(path.join(worktreePath, '.swiftlint.yaml'));
290
+ if (!hasLintConfig)
291
+ return; // 无 swiftlint 配置,静默跳过
292
+ // 检查 swiftlint 是否已安装
293
+ try {
294
+ execSync('which swiftlint', { stdio: 'ignore' });
295
+ }
296
+ catch {
297
+ return; // swiftlint 未安装,静默跳过
298
+ }
299
+ try {
300
+ execSync('swiftlint lint', {
301
+ cwd: worktreePath,
302
+ stdio: ['ignore', 'pipe', 'pipe'],
303
+ });
304
+ }
305
+ catch (error) {
306
+ const output = extractOutput(error);
307
+ throw new PluginCommandError('swiftlint lint failed', output);
308
+ }
309
+ },
310
+ // ────────────────────────────────────────
311
+ // 构建(从 pluginSettings.xcode 读取参数)
312
+ // ────────────────────────────────────────
313
+ async build(worktreePath) {
314
+ // 从 settings.json 读取插件配置
315
+ let projectRoot;
316
+ try {
317
+ projectRoot = await findProjectRoot(worktreePath);
318
+ }
319
+ catch {
320
+ return; // 找不到项目根目录,静默跳过
321
+ }
322
+ const settings = await loadProjectConfig(projectRoot);
323
+ // V4: 从 toolchain.settings 或 projects[i].toolchain.settings 读取 xcode 配置
324
+ let xcodeSettings = {};
325
+ if (settings?.toolchain?.type === 'xcode') {
326
+ xcodeSettings = settings.toolchain.settings ?? {};
327
+ }
328
+ else if (settings?.projects) {
329
+ for (const project of settings.projects) {
330
+ if (project.toolchain?.type === 'xcode') {
331
+ xcodeSettings = project.toolchain.settings ?? {};
332
+ break;
333
+ }
334
+ }
335
+ }
336
+ const scheme = xcodeSettings.scheme;
337
+ const destination = xcodeSettings.destination ?? 'generic/platform=iOS Simulator';
338
+ const workspace = xcodeSettings.workspace;
339
+ const project = xcodeSettings.project;
340
+ if (!scheme) {
341
+ // 没有配置 scheme:如果是纯 SPM 则使用 swift build,否则静默跳过
342
+ const xcProject = await scanXcodeDir(worktreePath);
343
+ if (xcProject.hasSPM && !xcProject.project && !xcProject.workspace) {
344
+ // 纯 SPM 项目
345
+ try {
346
+ execSync('swift build', {
347
+ cwd: worktreePath,
348
+ stdio: ['ignore', 'pipe', 'pipe'],
349
+ });
350
+ }
351
+ catch (error) {
352
+ const output = extractOutput(error);
353
+ throw new PluginCommandError('swift build failed', output);
354
+ }
355
+ }
356
+ // 有 xcodeproj 但未配置 scheme:静默跳过
357
+ return;
358
+ }
359
+ // 使用 xcodebuild
360
+ let cmd;
361
+ if (workspace) {
362
+ cmd = `xcodebuild -workspace "${workspace}" -scheme "${scheme}" -destination "${destination}" build`;
363
+ }
364
+ else if (project) {
365
+ cmd = `xcodebuild -project "${project}" -scheme "${scheme}" -destination "${destination}" build`;
366
+ }
367
+ else {
368
+ // scheme 已配置但找不到 workspace/project 文件,静默跳过
369
+ return;
370
+ }
371
+ try {
372
+ execSync(cmd, {
373
+ cwd: worktreePath,
374
+ stdio: ['ignore', 'pipe', 'pipe'],
375
+ });
376
+ }
377
+ catch (error) {
378
+ const output = extractOutput(error);
379
+ throw new PluginCommandError('xcodebuild failed', output);
380
+ }
381
+ },
382
+ // ────────────────────────────────────────
383
+ // 更新版本号(agvtool 优先,fallback 修改 project.pbxproj)
384
+ // ────────────────────────────────────────
385
+ async bumpVersion(worktreePath, version) {
386
+ const xcProject = await scanXcodeDir(worktreePath);
387
+ // 优先使用 agvtool(Apple 官方工具,需要 VERSIONING_SYSTEM = apple-generic)
388
+ try {
389
+ execSync(`agvtool new-marketing-version ${version}`, {
390
+ cwd: worktreePath,
391
+ stdio: ['ignore', 'pipe', 'pipe'],
392
+ });
393
+ return; // 成功
394
+ }
395
+ catch {
396
+ // agvtool 失败(未安装或项目未配置 VERSIONING_SYSTEM),尝试 fallback
397
+ }
398
+ // Fallback:直接修改 project.pbxproj 中的 MARKETING_VERSION
399
+ const projectFile = xcProject.project;
400
+ if (!projectFile) {
401
+ throw new PluginCommandError('Cannot bump Xcode version: no .xcodeproj found', 'No .xcodeproj directory found. Please ensure the project has a .xcodeproj file.');
402
+ }
403
+ const pbxprojPath = path.join(worktreePath, projectFile, 'project.pbxproj');
404
+ let content;
405
+ try {
406
+ content = await fs.readFile(pbxprojPath, 'utf-8');
407
+ }
408
+ catch (error) {
409
+ const output = extractOutput(error);
410
+ throw new PluginCommandError('Cannot read project.pbxproj', output);
411
+ }
412
+ const updated = content.replace(/MARKETING_VERSION\s*=\s*[^;]+;/g, `MARKETING_VERSION = ${version};`);
413
+ if (updated === content) {
414
+ throw new PluginCommandError('Cannot bump Xcode version: MARKETING_VERSION not found in project.pbxproj', `${pbxprojPath} does not contain MARKETING_VERSION.\n` +
415
+ 'Please set VERSIONING_SYSTEM = apple-generic in Xcode Build Settings, or use agvtool.');
416
+ }
417
+ try {
418
+ await fs.writeFile(pbxprojPath, updated, 'utf-8');
419
+ }
420
+ catch (error) {
421
+ const output = extractOutput(error);
422
+ throw new PluginCommandError('Failed to write project.pbxproj', output);
423
+ }
424
+ },
425
+ async publish(worktreePath) {
426
+ const xcProject = await scanXcodeDir(worktreePath);
427
+ // Swift Package 通常通过 Git tag 分发,release 的 push 阶段已完成该动作。
428
+ // 原生 App 的发布通常走 CI/CD + App Store Connect,不在此处执行。
429
+ if (xcProject.hasSPM) {
430
+ return;
431
+ }
432
+ },
433
+ async checkPublishable(_worktreePath) {
434
+ // 原生应用发布通常走 CI/CD + App Store Connect,默认不在 colyn release 内执行
435
+ return false;
436
+ },
437
+ };
438
+ //# sourceMappingURL=xcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xcode.js","sourceRoot":"","sources":["../../../src/plugins/builtin/xcode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 插件系统入口
3
+ *
4
+ * 创建全局 PluginManager 单例并注册所有内置插件。
5
+ */
6
+ import { PluginManager } from './manager.js';
7
+ /**
8
+ * 全局 PluginManager 单例
9
+ */
10
+ export declare const pluginManager: PluginManager;
11
+ export { PluginManager } from './manager.js';
12
+ export { PluginCommandError, type ToolchainPlugin, type PortConfig } from '../types/plugin.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO7C;;GAEG;AACH,eAAO,MAAM,aAAa,eAAsB,CAAC;AASjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 插件系统入口
3
+ *
4
+ * 创建全局 PluginManager 单例并注册所有内置插件。
5
+ */
6
+ import { PluginManager } from './manager.js';
7
+ import { npmPlugin } from './builtin/npm.js';
8
+ import { mavenPlugin } from './builtin/maven.js';
9
+ import { gradlePlugin } from './builtin/gradle.js';
10
+ import { pipPlugin } from './builtin/pip.js';
11
+ import { xcodePlugin } from './builtin/xcode.js';
12
+ /**
13
+ * 全局 PluginManager 单例
14
+ */
15
+ export const pluginManager = new PluginManager();
16
+ // 注册内置插件(注册顺序决定"first non-null wins"的优先级)
17
+ pluginManager.register(npmPlugin);
18
+ pluginManager.register(mavenPlugin);
19
+ pluginManager.register(gradlePlugin);
20
+ pluginManager.register(pipPlugin);
21
+ pluginManager.register(xcodePlugin);
22
+ export { PluginManager } from './manager.js';
23
+ export { PluginCommandError } from '../types/plugin.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAEjD,0CAA0C;AAC1C,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAClC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACrC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAClC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAyC,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * PluginManager — 工具链插件管理器
3
+ *
4
+ * 负责:
5
+ * - 维护已注册插件列表
6
+ * - 根据激活插件名称列表分发各扩展点调用
7
+ * - 统一处理 PluginCommandError(verbose 模式下展示命令输出)
8
+ */
9
+ import { type ToolchainPlugin, type PortConfig } from '../types/plugin.js';
10
+ export declare class PluginManager {
11
+ private readonly plugins;
12
+ /**
13
+ * 注册插件
14
+ */
15
+ register(plugin: ToolchainPlugin): void;
16
+ /**
17
+ * 获取所有已注册的插件列表
18
+ */
19
+ getAllPlugins(): ToolchainPlugin[];
20
+ /**
21
+ * 获取激活的插件列表
22
+ * @param activePluginNames 激活插件名称数组(工具链类型标识符列表)
23
+ */
24
+ private getActivePlugins;
25
+ /**
26
+ * 自动检测并返回匹配的插件名称列表
27
+ * @param worktreePath 检测目录
28
+ */
29
+ detectPlugins(worktreePath: string): Promise<string[]>;
30
+ /**
31
+ * 返回第一个非 null 的端口配置
32
+ */
33
+ getPortConfig(activePluginNames: string[]): PortConfig | null;
34
+ /**
35
+ * 读取运行时配置 — 返回第一个非 null 的结果
36
+ */
37
+ readRuntimeConfig(worktreePath: string, activePluginNames: string[]): Promise<Record<string, string> | null>;
38
+ /**
39
+ * 写入运行时配置 — 调用所有激活插件的 writeRuntimeConfig
40
+ */
41
+ writeRuntimeConfig(worktreePath: string, config: Record<string, string>, activePluginNames: string[]): Promise<void>;
42
+ /**
43
+ * 获取 dev server 命令 — 返回第一个非 null 的结果
44
+ */
45
+ getDevServerCommand(worktreePath: string, activePluginNames: string[]): Promise<string[] | null>;
46
+ /**
47
+ * 确保激活插件的运行时配置文件被 .gitignore 忽略
48
+ */
49
+ ensureRuntimeConfigIgnored(worktreePath: string, activePluginNames: string[]): Promise<void>;
50
+ /**
51
+ * 运行指定工具链插件的 repairSettings,返回更新后的配置
52
+ *
53
+ * 插件通过 repairSettings 检查项目配置,自动发现或交互询问必要的配置项。
54
+ * 调用方负责将结果保存到 settings 文件(通过 saveRepairSettingsResult)。
55
+ *
56
+ * @param worktreePath 子项目目录路径
57
+ * @param toolchainName 工具链名称(插件标识符)
58
+ * @param currentSettings 当前已保存的工具链专属配置
59
+ * @param nonInteractive 是否非交互模式(默认 false)
60
+ * @returns 更新后的配置,若插件未实现 repairSettings 则返回 null
61
+ */
62
+ runRepairSettings(worktreePath: string, toolchainName: string, currentSettings: Record<string, unknown>, nonInteractive?: boolean): Promise<Record<string, unknown> | null>;
63
+ /**
64
+ * 运行所有激活插件的 install
65
+ */
66
+ runInstall(worktreePath: string, activePluginNames: string[], verbose?: boolean): Promise<void>;
67
+ /**
68
+ * 运行所有激活插件的 lint
69
+ */
70
+ runLint(worktreePath: string, activePluginNames: string[], verbose?: boolean): Promise<void>;
71
+ /**
72
+ * 运行所有激活插件的 build
73
+ */
74
+ runBuild(worktreePath: string, activePluginNames: string[], verbose?: boolean): Promise<void>;
75
+ /**
76
+ * 运行所有激活插件的 publish
77
+ */
78
+ runPublish(worktreePath: string, activePluginNames: string[], verbose?: boolean): Promise<void>;
79
+ /**
80
+ * 检查激活插件是否满足发布条件
81
+ */
82
+ runCheckPublishable(worktreePath: string, activePluginNames: string[]): Promise<boolean>;
83
+ /**
84
+ * 读取当前版本号 — 返回第一个非 null 的结果
85
+ */
86
+ runReadVersion(worktreePath: string, activePluginNames: string[]): Promise<string | null>;
87
+ /**
88
+ * 运行所有激活插件的 bumpVersion
89
+ * 若已激活插件未实现此方法,则报错终止
90
+ */
91
+ runBumpVersion(worktreePath: string, version: string, activePluginNames: string[]): Promise<void>;
92
+ }
93
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAkD,MAAM,oBAAoB,CAAC;AAI3H,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIvC;;OAEG;IACH,aAAa,IAAI,eAAe,EAAE;IAIlC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;OAGG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc5D;;OAEG;IACH,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI;IAU7D;;OAEG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IASzC;;OAEG;IACG,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACG,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAa3B;;OAEG;IACG,0BAA0B,CAC9B,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC;IAchB;;;;;;;;;;;OAWG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,cAAc,UAAQ,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAc1C;;OAEG;IACG,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACG,OAAO,CACX,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACG,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACG,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACG,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,OAAO,CAAC;IAqBnB;;OAEG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASzB;;;OAGG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC;CAWjB"}