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,116 @@
1
+ import chalk from 'chalk';
2
+ import { getLocationInfo, getProjectPaths } from '../core/paths.js';
3
+ import { getWorktreeStatus, setWorktreeStatus, VALID_STATUSES } from '../core/worktree-status.js';
4
+ import { ColynError } from '../types/index.js';
5
+ import { output, outputSuccess, formatError } from '../utils/logger.js';
6
+ import { t } from '../i18n/index.js';
7
+ /**
8
+ * 格式化 ISO 时间为本地可读格式
9
+ */
10
+ function formatDate(isoString) {
11
+ const d = new Date(isoString);
12
+ const pad = (n) => String(n).padStart(2, '0');
13
+ return (`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
14
+ `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`);
15
+ }
16
+ /**
17
+ * get 子命令实现
18
+ */
19
+ async function getStatusCommand(options) {
20
+ const info = await getLocationInfo();
21
+ const paths = await getProjectPaths();
22
+ const effectiveDir = info.isMainBranch ? 'main' : info.worktreeDir;
23
+ const { status, updatedAt } = await getWorktreeStatus(paths.configDir, effectiveDir);
24
+ if (options.json) {
25
+ const result = {
26
+ worktreeDir: effectiveDir,
27
+ worktreeId: info.worktreeId,
28
+ status,
29
+ updatedAt,
30
+ };
31
+ output(JSON.stringify(result));
32
+ }
33
+ else {
34
+ output(chalk.bold(t('commands.status.labelStatus')) + ' ' + chalk.cyan(status));
35
+ if (updatedAt) {
36
+ output(chalk.bold(t('commands.status.labelUpdatedAt')) + ' ' + formatDate(updatedAt));
37
+ }
38
+ else {
39
+ output(chalk.bold(t('commands.status.labelUpdatedAt')) +
40
+ ' ' +
41
+ chalk.gray(t('commands.status.neverUpdated')));
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * set 子命令实现
47
+ */
48
+ async function setStatusCommand(statusValue) {
49
+ if (!VALID_STATUSES.includes(statusValue)) {
50
+ throw new ColynError(t('commands.status.invalidStatus', { status: statusValue }), t('commands.status.invalidStatusHint'));
51
+ }
52
+ const info = await getLocationInfo();
53
+ const paths = await getProjectPaths();
54
+ const effectiveDir = info.isMainBranch ? 'main' : info.worktreeDir;
55
+ await setWorktreeStatus(paths.configDir, effectiveDir, info.projectPath, statusValue);
56
+ outputSuccess(t('commands.status.statusUpdated', { status: statusValue }));
57
+ }
58
+ /**
59
+ * 注册 status 命令
60
+ */
61
+ export function register(program) {
62
+ const statusCmd = program
63
+ .command('status')
64
+ .alias('st')
65
+ .description(t('commands.status.description'))
66
+ // --json 定义在父命令,commander 会在路由子命令前先解析它
67
+ .option('--json', t('commands.status.jsonOption'));
68
+ // get 子命令 - 通过 command.parent.opts() 读取 --json
69
+ statusCmd
70
+ .command('get')
71
+ .description(t('commands.status.getDescription'))
72
+ .action(async (_options, command) => {
73
+ try {
74
+ const json = command.parent?.opts()?.json;
75
+ await getStatusCommand({ json });
76
+ }
77
+ catch (error) {
78
+ if (error instanceof ColynError) {
79
+ formatError(error);
80
+ process.exit(1);
81
+ }
82
+ throw error;
83
+ }
84
+ });
85
+ // set 子命令
86
+ statusCmd
87
+ .command('set')
88
+ .description(t('commands.status.setDescription'))
89
+ .argument('<status>', t('commands.status.statusArgument'))
90
+ .action(async (statusValue) => {
91
+ try {
92
+ await setStatusCommand(statusValue);
93
+ }
94
+ catch (error) {
95
+ if (error instanceof ColynError) {
96
+ formatError(error);
97
+ process.exit(1);
98
+ }
99
+ throw error;
100
+ }
101
+ });
102
+ // 默认 action:无子命令时执行 get(--json 已在父命令定义)
103
+ statusCmd.action(async (options) => {
104
+ try {
105
+ await getStatusCommand(options);
106
+ }
107
+ catch (error) {
108
+ if (error instanceof ColynError) {
109
+ formatError(error);
110
+ process.exit(1);
111
+ }
112
+ throw error;
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * 注册 setup 命令
4
+ */
5
+ export declare function register(program: Command): void;
6
+ //# sourceMappingURL=system-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-integration.d.ts","sourceRoot":"","sources":["../../src/commands/system-integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqJzC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO/C"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Install 命令辅助函数
3
+ */
4
+ /**
5
+ * Shell 配置信息
6
+ */
7
+ export interface ShellConfig {
8
+ shellType: string;
9
+ configPath: string;
10
+ configExists: boolean;
11
+ }
12
+ /**
13
+ * 检测用户的 shell 类型和配置文件
14
+ */
15
+ export declare function detectShellConfig(): Promise<ShellConfig>;
16
+ /**
17
+ * 获取 colyn.sh 的绝对路径
18
+ */
19
+ export declare function getColynShellPath(): string;
20
+ /**
21
+ * 获取补全脚本的绝对路径
22
+ *
23
+ * @param shellType - shell 类型(bash/zsh)
24
+ */
25
+ export declare function getCompletionScriptPath(shellType: string): string;
26
+ /**
27
+ * 添加或更新 shell 配置文件中的 colyn 集成
28
+ *
29
+ * @param configPath - shell 配置文件路径
30
+ * @param colynShellPath - colyn.sh 文件路径
31
+ * @param completionPath - 补全脚本文件路径(可选)
32
+ * @returns 'added' | 'updated' - 添加还是更新
33
+ */
34
+ export declare function updateShellConfig(configPath: string, colynShellPath: string, completionPath?: string): Promise<'added' | 'updated'>;
35
+ /**
36
+ * 检查 colyn.sh 文件是否存在
37
+ */
38
+ export declare function checkColynShellExists(colynShellPath: string): Promise<boolean>;
39
+ /**
40
+ * 检查补全脚本文件是否存在
41
+ */
42
+ export declare function checkCompletionScriptExists(completionPath: string): Promise<boolean>;
43
+ /**
44
+ * 获取 colyn 二进制文件的绝对路径
45
+ */
46
+ export declare function getColynBinPath(): string;
47
+ /**
48
+ * 在 ~/.claude/settings.json 中添加或更新 colyn status hooks
49
+ *
50
+ * 配置三个 hooks:
51
+ * - UserPromptSubmit: colyn status set running
52
+ * - PreToolUse (AskUserQuestion): colyn status set waiting-confirm
53
+ * - Stop: colyn status set finish
54
+ *
55
+ * @param colynBinPath - colyn 二进制文件的绝对路径
56
+ * @returns 'added' | 'updated'
57
+ */
58
+ export declare function updateClaudeHooks(colynBinPath: string): Promise<'added' | 'updated'>;
59
+ /**
60
+ * 获取补全脚本的缓存路径
61
+ */
62
+ export declare function getCachedCompletionPath(shellType: string): string;
63
+ /**
64
+ * 为 zsh 生成动态补全脚本并缓存到 ~/.config/colyn/completion.zsh
65
+ * 为 bash 返回静态脚本路径
66
+ *
67
+ * @returns 缓存文件路径(供 shell config source)
68
+ */
69
+ export declare function generateAndCacheCompletionScript(shellType: string): Promise<string>;
70
+ //# sourceMappingURL=system-integration.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-integration.helpers.d.ts","sourceRoot":"","sources":["../../src/commands/system-integration.helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CA6C9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAa1C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAajE;AAOD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAyE9B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpF;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1F;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AA2ED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CA+C1F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED;;;;;GAKG;AACH,wBAAsB,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAezF"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Install 命令辅助函数
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ import { fileURLToPath } from 'url';
8
+ import { generateZshCompletionScript } from './completion.js';
9
+ /**
10
+ * 检测用户的 shell 类型和配置文件
11
+ */
12
+ export async function detectShellConfig() {
13
+ const homeDir = os.homedir();
14
+ const shell = process.env.SHELL || '';
15
+ let shellType = 'bash';
16
+ const candidates = [];
17
+ // 根据 SHELL 环境变量确定类型和候选文件
18
+ if (shell.includes('zsh')) {
19
+ shellType = 'zsh';
20
+ candidates.push(path.join(homeDir, '.zshrc'));
21
+ }
22
+ else if (shell.includes('bash')) {
23
+ shellType = 'bash';
24
+ candidates.push(path.join(homeDir, '.bashrc'));
25
+ candidates.push(path.join(homeDir, '.bash_profile'));
26
+ }
27
+ // 添加默认候选文件
28
+ if (!candidates.includes(path.join(homeDir, '.zshrc'))) {
29
+ candidates.push(path.join(homeDir, '.zshrc'));
30
+ }
31
+ if (!candidates.includes(path.join(homeDir, '.bashrc'))) {
32
+ candidates.push(path.join(homeDir, '.bashrc'));
33
+ }
34
+ // 检测第一个存在的配置文件
35
+ for (const configPath of candidates) {
36
+ try {
37
+ await fs.access(configPath);
38
+ return {
39
+ shellType,
40
+ configPath,
41
+ configExists: true
42
+ };
43
+ }
44
+ catch {
45
+ // 文件不存在,继续检查下一个
46
+ }
47
+ }
48
+ // 如果都不存在,返回第一个候选文件(稍后会创建)
49
+ return {
50
+ shellType,
51
+ configPath: candidates[0],
52
+ configExists: false
53
+ };
54
+ }
55
+ /**
56
+ * 获取 colyn.sh 的绝对路径
57
+ */
58
+ export function getColynShellPath() {
59
+ // 获取当前模块的路径
60
+ const currentModulePath = fileURLToPath(import.meta.url);
61
+ // 从 dist/commands/install.helpers.js 向上找到项目根目录
62
+ // dist/commands/install.helpers.js -> dist/commands -> dist -> root
63
+ const distDir = path.dirname(path.dirname(currentModulePath));
64
+ const rootDir = path.dirname(distDir);
65
+ // colyn.sh 位于 shell/colyn.sh
66
+ const colynShellPath = path.join(rootDir, 'shell', 'colyn.sh');
67
+ return colynShellPath;
68
+ }
69
+ /**
70
+ * 获取补全脚本的绝对路径
71
+ *
72
+ * @param shellType - shell 类型(bash/zsh)
73
+ */
74
+ export function getCompletionScriptPath(shellType) {
75
+ // 获取当前模块的路径
76
+ const currentModulePath = fileURLToPath(import.meta.url);
77
+ // 从 dist/commands/install.helpers.js 向上找到项目根目录
78
+ const distDir = path.dirname(path.dirname(currentModulePath));
79
+ const rootDir = path.dirname(distDir);
80
+ // 补全脚本位于 shell/completion.bash 或 shell/completion.zsh
81
+ const scriptName = shellType === 'zsh' ? 'completion.zsh' : 'completion.bash';
82
+ const completionPath = path.join(rootDir, 'shell', scriptName);
83
+ return completionPath;
84
+ }
85
+ /**
86
+ * 配置标记
87
+ */
88
+ const CONFIG_MARKER = '# Colyn shell integration';
89
+ /**
90
+ * 添加或更新 shell 配置文件中的 colyn 集成
91
+ *
92
+ * @param configPath - shell 配置文件路径
93
+ * @param colynShellPath - colyn.sh 文件路径
94
+ * @param completionPath - 补全脚本文件路径(可选)
95
+ * @returns 'added' | 'updated' - 添加还是更新
96
+ */
97
+ export async function updateShellConfig(configPath, colynShellPath, completionPath) {
98
+ const sourceLine = `source "${colynShellPath}"`;
99
+ const completionLine = completionPath ? `source "${completionPath}"` : null;
100
+ let content = '';
101
+ let fileExists = true;
102
+ try {
103
+ content = await fs.readFile(configPath, 'utf-8');
104
+ }
105
+ catch {
106
+ // 文件不存在,创建新文件
107
+ fileExists = false;
108
+ }
109
+ // 检查是否已经添加过配置
110
+ if (content.includes(CONFIG_MARKER)) {
111
+ // 已存在,更新路径
112
+ const lines = content.split('\n');
113
+ const newLines = [];
114
+ let inColynSection = false;
115
+ for (const line of lines) {
116
+ if (line.includes(CONFIG_MARKER)) {
117
+ inColynSection = true;
118
+ newLines.push(line);
119
+ continue;
120
+ }
121
+ if (inColynSection) {
122
+ // 跳过旧的 source 行
123
+ if (line.trim().startsWith('source') && line.includes('colyn')) {
124
+ continue;
125
+ }
126
+ // 遇到空行或新的注释,结束 colyn 区域
127
+ if (line.trim() === '' || (line.startsWith('#') && !line.includes('colyn'))) {
128
+ inColynSection = false;
129
+ // 插入新的配置
130
+ newLines.push(sourceLine);
131
+ if (completionLine) {
132
+ newLines.push(completionLine);
133
+ }
134
+ }
135
+ }
136
+ newLines.push(line);
137
+ }
138
+ // 如果还在 colyn 区域(文件末尾),添加配置
139
+ if (inColynSection) {
140
+ newLines.push(sourceLine);
141
+ if (completionLine) {
142
+ newLines.push(completionLine);
143
+ }
144
+ }
145
+ await fs.writeFile(configPath, newLines.join('\n'), 'utf-8');
146
+ return 'updated';
147
+ }
148
+ // 添加新配置
149
+ const configLines = [CONFIG_MARKER, sourceLine];
150
+ if (completionLine) {
151
+ configLines.push(completionLine);
152
+ }
153
+ const configBlock = fileExists
154
+ ? `\n\n${configLines.join('\n')}\n`
155
+ : `${configLines.join('\n')}\n`;
156
+ const newContent = content.trimEnd() + configBlock;
157
+ await fs.writeFile(configPath, newContent, 'utf-8');
158
+ return 'added';
159
+ }
160
+ /**
161
+ * 检查 colyn.sh 文件是否存在
162
+ */
163
+ export async function checkColynShellExists(colynShellPath) {
164
+ try {
165
+ await fs.access(colynShellPath);
166
+ return true;
167
+ }
168
+ catch {
169
+ return false;
170
+ }
171
+ }
172
+ /**
173
+ * 检查补全脚本文件是否存在
174
+ */
175
+ export async function checkCompletionScriptExists(completionPath) {
176
+ try {
177
+ await fs.access(completionPath);
178
+ return true;
179
+ }
180
+ catch {
181
+ return false;
182
+ }
183
+ }
184
+ /**
185
+ * 获取 colyn 二进制文件的绝对路径
186
+ */
187
+ export function getColynBinPath() {
188
+ const currentModulePath = fileURLToPath(import.meta.url);
189
+ const distDir = path.dirname(path.dirname(currentModulePath));
190
+ const rootDir = path.dirname(distDir);
191
+ return path.join(rootDir, 'bin', 'colyn');
192
+ }
193
+ /**
194
+ * 在 hooks 数组中查找并更新包含 marker 的命令,返回是否找到
195
+ */
196
+ function findAndUpdateHook(configs, marker, newCommand) {
197
+ for (const config of configs) {
198
+ const hook = config.hooks.find(h => h.command.includes(marker));
199
+ if (hook) {
200
+ hook.command = newCommand;
201
+ return true;
202
+ }
203
+ }
204
+ return false;
205
+ }
206
+ /**
207
+ * 在指定事件下添加或更新 hook(无 matcher)
208
+ * 返回 true 表示新增,false 表示更新
209
+ */
210
+ function addOrUpdateSimpleHook(hooksRecord, event, command, marker) {
211
+ if (!hooksRecord[event]) {
212
+ hooksRecord[event] = [];
213
+ }
214
+ const configs = hooksRecord[event];
215
+ if (findAndUpdateHook(configs, marker, command)) {
216
+ return false;
217
+ }
218
+ const configWithoutMatcher = configs.find(c => !c.matcher);
219
+ if (configWithoutMatcher) {
220
+ configWithoutMatcher.hooks.push({ type: 'command', command });
221
+ }
222
+ else {
223
+ configs.push({ hooks: [{ type: 'command', command }] });
224
+ }
225
+ return true;
226
+ }
227
+ /**
228
+ * 在 PreToolUse 事件的 AskUserQuestion matcher 下添加或更新 hook
229
+ * 返回 true 表示新增,false 表示更新
230
+ */
231
+ function addOrUpdatePreToolUseHook(hooksRecord, command, marker) {
232
+ if (!hooksRecord['PreToolUse']) {
233
+ hooksRecord['PreToolUse'] = [];
234
+ }
235
+ const configs = hooksRecord['PreToolUse'];
236
+ if (findAndUpdateHook(configs, marker, command)) {
237
+ return false;
238
+ }
239
+ const matcherConfig = configs.find(c => c.matcher === 'AskUserQuestion');
240
+ if (matcherConfig) {
241
+ matcherConfig.hooks.push({ type: 'command', command });
242
+ }
243
+ else {
244
+ configs.push({ matcher: 'AskUserQuestion', hooks: [{ type: 'command', command }] });
245
+ }
246
+ return true;
247
+ }
248
+ /**
249
+ * 在 ~/.claude/settings.json 中添加或更新 colyn status hooks
250
+ *
251
+ * 配置三个 hooks:
252
+ * - UserPromptSubmit: colyn status set running
253
+ * - PreToolUse (AskUserQuestion): colyn status set waiting-confirm
254
+ * - Stop: colyn status set finish
255
+ *
256
+ * @param colynBinPath - colyn 二进制文件的绝对路径
257
+ * @returns 'added' | 'updated'
258
+ */
259
+ export async function updateClaudeHooks(colynBinPath) {
260
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
261
+ let rawSettings = {};
262
+ try {
263
+ const content = await fs.readFile(settingsPath, 'utf-8');
264
+ const parsed = JSON.parse(content);
265
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
266
+ rawSettings = parsed;
267
+ }
268
+ }
269
+ catch {
270
+ // 文件不存在或 JSON 无效,从空配置开始
271
+ }
272
+ const rawHooks = rawSettings['hooks'];
273
+ const hooksRecord = rawHooks && typeof rawHooks === 'object' && !Array.isArray(rawHooks)
274
+ ? rawHooks
275
+ : {};
276
+ const makeCommand = (status) => `${colynBinPath} status set ${status} 2>/dev/null || true`;
277
+ const runningAdded = addOrUpdateSimpleHook(hooksRecord, 'UserPromptSubmit', makeCommand('running'), 'status set running');
278
+ const waitingAdded = addOrUpdatePreToolUseHook(hooksRecord, makeCommand('waiting-confirm'), 'status set waiting-confirm');
279
+ const finishAdded = addOrUpdateSimpleHook(hooksRecord, 'Stop', makeCommand('finish'), 'status set finish');
280
+ const newSettings = { ...rawSettings, hooks: hooksRecord };
281
+ await fs.mkdir(path.dirname(settingsPath), { recursive: true });
282
+ await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2) + '\n', 'utf-8');
283
+ return runningAdded || waitingAdded || finishAdded ? 'added' : 'updated';
284
+ }
285
+ /**
286
+ * 获取补全脚本的缓存路径
287
+ */
288
+ export function getCachedCompletionPath(shellType) {
289
+ const homeDir = os.homedir();
290
+ const ext = shellType === 'zsh' ? 'zsh' : 'bash';
291
+ return path.join(homeDir, '.config', 'colyn', `completion.${ext}`);
292
+ }
293
+ /**
294
+ * 为 zsh 生成动态补全脚本并缓存到 ~/.config/colyn/completion.zsh
295
+ * 为 bash 返回静态脚本路径
296
+ *
297
+ * @returns 缓存文件路径(供 shell config source)
298
+ */
299
+ export async function generateAndCacheCompletionScript(shellType) {
300
+ const cachedPath = getCachedCompletionPath(shellType);
301
+ if (shellType === 'zsh') {
302
+ // zsh: 动态生成带 i18n 的补全脚本并缓存
303
+ const script = generateZshCompletionScript();
304
+ const cacheDir = path.dirname(cachedPath);
305
+ await fs.mkdir(cacheDir, { recursive: true });
306
+ await fs.writeFile(cachedPath, script, 'utf-8');
307
+ return cachedPath;
308
+ }
309
+ // bash: 使用静态文件
310
+ const staticPath = getCompletionScriptPath(shellType);
311
+ return staticPath;
312
+ }
313
+ //# sourceMappingURL=system-integration.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-integration.helpers.js","sourceRoot":"","sources":["../../src/commands/system-integration.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import chalk from 'chalk';
2
+ import { ColynError } from '../types/index.js';
3
+ import { formatError, output, outputResult, outputSuccess } from '../utils/logger.js';
4
+ import { detectShellConfig, getColynShellPath, getColynBinPath, updateShellConfig, updateClaudeHooks, checkColynShellExists, generateAndCacheCompletionScript } from './system-integration.helpers.js';
5
+ import { t } from '../i18n/index.js';
6
+ /**
7
+ * System Integration 命令:配置 shell 集成
8
+ *
9
+ * 功能:
10
+ * 1. 检测用户的 shell 类型和配置文件
11
+ * 2. 定位 colyn.sh 文件
12
+ * 3. 添加 source 命令到 shell 配置文件
13
+ * 4. 支持更新已有配置
14
+ */
15
+ async function systemIntegrationCommand() {
16
+ try {
17
+ // 检查平台
18
+ if (process.platform === 'win32') {
19
+ output('');
20
+ output(chalk.yellow(t('commands.systemIntegration.windowsNotSupported')));
21
+ output('');
22
+ output(t('commands.systemIntegration.windowsManualHint'));
23
+ output(' https://github.com/your-repo/colyn#windows-setup');
24
+ output('');
25
+ outputResult({ success: false });
26
+ process.exit(1);
27
+ }
28
+ // 步骤 1: 检测系统环境
29
+ output('');
30
+ output(t('commands.systemIntegration.detectingEnv'));
31
+ const shellConfig = await detectShellConfig();
32
+ const colynShellPath = getColynShellPath();
33
+ output(chalk.green(t('commands.systemIntegration.shellType', { type: shellConfig.shellType })));
34
+ output(chalk.green(t('commands.systemIntegration.configFile', { path: shellConfig.configPath })));
35
+ output(chalk.green(t('commands.systemIntegration.installPath', { path: colynShellPath })));
36
+ // 步骤 2: 检查 colyn.sh 是否存在
37
+ const shellExists = await checkColynShellExists(colynShellPath);
38
+ if (!shellExists) {
39
+ throw new ColynError(t('commands.systemIntegration.shellScriptNotFound'), t('commands.systemIntegration.shellScriptNotFoundHint', { path: colynShellPath }));
40
+ }
41
+ // 步骤 3: 生成补全脚本(动态生成并缓存,支持 i18n)
42
+ let completionPath;
43
+ try {
44
+ completionPath = await generateAndCacheCompletionScript(shellConfig.shellType);
45
+ }
46
+ catch {
47
+ output(chalk.yellow(t('commands.systemIntegration.completionNotFound', { path: '' })));
48
+ output(chalk.yellow(` ${t('commands.systemIntegration.completionNotFoundHint')}`));
49
+ }
50
+ // 步骤 4: 配置 shell 集成
51
+ output('');
52
+ output(t('commands.systemIntegration.configuringShell'));
53
+ const result = await updateShellConfig(shellConfig.configPath, colynShellPath, completionPath);
54
+ const configFileName = shellConfig.configPath.replace(process.env.HOME || '', '~');
55
+ if (result === 'added') {
56
+ if (!shellConfig.configExists) {
57
+ output(chalk.green(t('commands.systemIntegration.configCreated', { file: configFileName })));
58
+ }
59
+ output(chalk.green(t('commands.systemIntegration.configAdded', { file: configFileName })));
60
+ if (completionPath) {
61
+ output(chalk.green(t('commands.systemIntegration.completionAdded', { file: configFileName })));
62
+ }
63
+ }
64
+ else {
65
+ output(chalk.green(t('commands.systemIntegration.configUpdated', { file: configFileName })));
66
+ if (completionPath) {
67
+ output(chalk.green(t('commands.systemIntegration.completionUpdated')));
68
+ }
69
+ }
70
+ // 步骤 5: 配置 Claude Code hooks
71
+ output('');
72
+ output(t('commands.systemIntegration.configuringClaudeHooks'));
73
+ try {
74
+ const colynBinPath = getColynBinPath();
75
+ const claudeResult = await updateClaudeHooks(colynBinPath);
76
+ if (claudeResult === 'added') {
77
+ output(chalk.green(t('commands.systemIntegration.claudeHooksAdded')));
78
+ }
79
+ else {
80
+ output(chalk.green(t('commands.systemIntegration.claudeHooksUpdated')));
81
+ }
82
+ }
83
+ catch {
84
+ output(chalk.yellow(t('commands.systemIntegration.claudeHooksFailed')));
85
+ }
86
+ // 步骤 6: 显示完成信息
87
+ output('');
88
+ outputSuccess(result === 'added' ? t('commands.systemIntegration.installComplete') : t('commands.systemIntegration.updateComplete'));
89
+ output('');
90
+ // 生效配置指引
91
+ output(chalk.cyan(t('commands.systemIntegration.activateConfig')));
92
+ if (result === 'added') {
93
+ output(` ${t('commands.systemIntegration.activateMethod1')}`);
94
+ output(` ${t('commands.systemIntegration.activateMethod2')} ${chalk.gray(`source ${shellConfig.configPath}`)}`);
95
+ }
96
+ else {
97
+ output(` ${t('commands.systemIntegration.activateMethod2')} ${chalk.gray(`source ${shellConfig.configPath}`)}`);
98
+ }
99
+ output('');
100
+ // 功能说明
101
+ if (result === 'added') {
102
+ output(chalk.cyan(t('commands.systemIntegration.features')));
103
+ output(` ${t('commands.systemIntegration.featureAutoSwitch')}`);
104
+ if (completionPath) {
105
+ output(` ${t('commands.systemIntegration.featureCompletion')}`);
106
+ }
107
+ output('');
108
+ }
109
+ // 输出 JSON 结果
110
+ const jsonResult = {
111
+ success: true
112
+ };
113
+ outputResult(jsonResult);
114
+ }
115
+ catch (error) {
116
+ formatError(error);
117
+ outputResult({ success: false });
118
+ process.exit(1);
119
+ }
120
+ }
121
+ /**
122
+ * 注册 setup 命令
123
+ */
124
+ export function register(program) {
125
+ program
126
+ .command('setup')
127
+ .description(t('commands.systemIntegration.description'))
128
+ .action(async () => {
129
+ await systemIntegrationCommand();
130
+ });
131
+ }
132
+ //# sourceMappingURL=system-integration.js.map