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.
- package/README-en.md +85 -0
- package/README.md +85 -0
- package/bin/colyn +25 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.helpers.d.ts +48 -0
- package/dist/commands/add.helpers.d.ts.map +1 -0
- package/dist/commands/add.helpers.js +251 -0
- package/dist/commands/add.helpers.js.map +1 -0
- package/dist/commands/add.js +286 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/checkout.d.ts +16 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +428 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/completion.d.ts +10 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +380 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +338 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +41 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/info.d.ts +6 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +374 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.handlers.d.ts +27 -0
- package/dist/commands/init.handlers.d.ts.map +1 -0
- package/dist/commands/init.handlers.js +314 -0
- package/dist/commands/init.handlers.js.map +1 -0
- package/dist/commands/init.helpers.d.ts +42 -0
- package/dist/commands/init.helpers.d.ts.map +1 -0
- package/dist/commands/init.helpers.js +275 -0
- package/dist/commands/init.helpers.js.map +1 -0
- package/dist/commands/init.js +61 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.helpers.d.ts +32 -0
- package/dist/commands/install.helpers.d.ts.map +1 -0
- package/dist/commands/install.helpers.js +124 -0
- package/dist/commands/install.helpers.js.map +1 -0
- package/dist/commands/install.js +104 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list-project.d.ts +11 -0
- package/dist/commands/list-project.d.ts.map +1 -0
- package/dist/commands/list-project.js +260 -0
- package/dist/commands/list-project.js.map +1 -0
- package/dist/commands/list.d.ts +15 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.helpers.d.ts +50 -0
- package/dist/commands/list.helpers.d.ts.map +1 -0
- package/dist/commands/list.helpers.js +143 -0
- package/dist/commands/list.helpers.js.map +1 -0
- package/dist/commands/list.js +530 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/merge.d.ts +6 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.helpers.d.ts +74 -0
- package/dist/commands/merge.helpers.d.ts.map +1 -0
- package/dist/commands/merge.helpers.js +307 -0
- package/dist/commands/merge.helpers.js.map +1 -0
- package/dist/commands/merge.js +260 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/release.d.ts +6 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.helpers.d.ts +61 -0
- package/dist/commands/release.helpers.d.ts.map +1 -0
- package/dist/commands/release.helpers.js +277 -0
- package/dist/commands/release.helpers.js.map +1 -0
- package/dist/commands/release.js +127 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/remove.d.ts +6 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.helpers.d.ts +59 -0
- package/dist/commands/remove.helpers.d.ts.map +1 -0
- package/dist/commands/remove.helpers.js +190 -0
- package/dist/commands/remove.helpers.js.map +1 -0
- package/dist/commands/remove.js +137 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/repair.d.ts +6 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.helpers.d.ts +5 -0
- package/dist/commands/repair.helpers.d.ts.map +1 -0
- package/dist/commands/repair.helpers.js +499 -0
- package/dist/commands/repair.helpers.js.map +1 -0
- package/dist/commands/repair.js +28 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +116 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/system-integration.d.ts +6 -0
- package/dist/commands/system-integration.d.ts.map +1 -0
- package/dist/commands/system-integration.helpers.d.ts +70 -0
- package/dist/commands/system-integration.helpers.d.ts.map +1 -0
- package/dist/commands/system-integration.helpers.js +313 -0
- package/dist/commands/system-integration.helpers.js.map +1 -0
- package/dist/commands/system-integration.js +132 -0
- package/dist/commands/system-integration.js.map +1 -0
- package/dist/commands/tmux.d.ts +11 -0
- package/dist/commands/tmux.d.ts.map +1 -0
- package/dist/commands/tmux.js +500 -0
- package/dist/commands/tmux.js.map +1 -0
- package/dist/commands/todo.d.ts +6 -0
- package/dist/commands/todo.d.ts.map +1 -0
- package/dist/commands/todo.helpers.d.ts +50 -0
- package/dist/commands/todo.helpers.d.ts.map +1 -0
- package/dist/commands/todo.helpers.js +297 -0
- package/dist/commands/todo.helpers.js.map +1 -0
- package/dist/commands/todo.js +579 -0
- package/dist/commands/todo.js.map +1 -0
- package/dist/commands/update.d.ts +18 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.helpers.d.ts +89 -0
- package/dist/commands/update.helpers.d.ts.map +1 -0
- package/dist/commands/update.helpers.js +335 -0
- package/dist/commands/update.helpers.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/config-loader.d.ts +47 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +188 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/config-merger.d.ts +29 -0
- package/dist/core/config-merger.d.ts.map +1 -0
- package/dist/core/config-merger.js +100 -0
- package/dist/core/config-merger.js.map +1 -0
- package/dist/core/config-migration.d.ts +64 -0
- package/dist/core/config-migration.d.ts.map +1 -0
- package/dist/core/config-migration.js +340 -0
- package/dist/core/config-migration.js.map +1 -0
- package/dist/core/config-new.d.ts +19 -0
- package/dist/core/config-new.d.ts.map +1 -0
- package/dist/core/config-new.js +58 -0
- package/dist/core/config-new.js.map +1 -0
- package/dist/core/config-schema.d.ts +221 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +168 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/config.d.ts +55 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +143 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dev-server.d.ts +29 -0
- package/dist/core/dev-server.d.ts.map +1 -0
- package/dist/core/dev-server.js +54 -0
- package/dist/core/dev-server.js.map +1 -0
- package/dist/core/discovery.d.ts +51 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +247 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/env.d.ts +13 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +75 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/git.d.ts +31 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +56 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/paths.d.ts +86 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +256 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/tmux-config.d.ts +174 -0
- package/dist/core/tmux-config.d.ts.map +1 -0
- package/dist/core/tmux-config.js +545 -0
- package/dist/core/tmux-config.js.map +1 -0
- package/dist/core/tmux-config.legacy.d.ts +243 -0
- package/dist/core/tmux-config.legacy.d.ts.map +1 -0
- package/dist/core/tmux-config.legacy.js +896 -0
- package/dist/core/tmux-config.legacy.js.map +1 -0
- package/dist/core/tmux.d.ts +214 -0
- package/dist/core/tmux.d.ts.map +1 -0
- package/dist/core/tmux.js +712 -0
- package/dist/core/tmux.js.map +1 -0
- package/dist/core/toolchain-resolver.d.ts +51 -0
- package/dist/core/toolchain-resolver.d.ts.map +1 -0
- package/dist/core/toolchain-resolver.js +364 -0
- package/dist/core/toolchain-resolver.js.map +1 -0
- package/dist/core/worktree-status.d.ts +20 -0
- package/dist/core/worktree-status.d.ts.map +1 -0
- package/dist/core/worktree-status.js +67 -0
- package/dist/core/worktree-status.js.map +1 -0
- package/dist/i18n/index.d.ts +36 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +157 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +866 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +985 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/zh-CN.d.ts +865 -0
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
- package/dist/i18n/locales/zh-CN.js +985 -0
- package/dist/i18n/locales/zh-CN.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/builtin/gradle.d.ts +9 -0
- package/dist/plugins/builtin/gradle.d.ts.map +1 -0
- package/dist/plugins/builtin/gradle.js +164 -0
- package/dist/plugins/builtin/gradle.js.map +1 -0
- package/dist/plugins/builtin/maven.d.ts +9 -0
- package/dist/plugins/builtin/maven.d.ts.map +1 -0
- package/dist/plugins/builtin/maven.js +127 -0
- package/dist/plugins/builtin/maven.js.map +1 -0
- package/dist/plugins/builtin/npm.d.ts +9 -0
- package/dist/plugins/builtin/npm.d.ts.map +1 -0
- package/dist/plugins/builtin/npm.js +238 -0
- package/dist/plugins/builtin/npm.js.map +1 -0
- package/dist/plugins/builtin/pip.d.ts +9 -0
- package/dist/plugins/builtin/pip.d.ts.map +1 -0
- package/dist/plugins/builtin/pip.js +210 -0
- package/dist/plugins/builtin/pip.js.map +1 -0
- package/dist/plugins/builtin/xcode.d.ts +12 -0
- package/dist/plugins/builtin/xcode.d.ts.map +1 -0
- package/dist/plugins/builtin/xcode.js +438 -0
- package/dist/plugins/builtin/xcode.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +24 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/manager.d.ts +93 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +270 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/utils.d.ts +42 -0
- package/dist/plugins/utils.d.ts.map +1 -0
- package/dist/plugins/utils.js +175 -0
- package/dist/plugins/utils.js.map +1 -0
- package/dist/types/index.d.ts +104 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/plugin.d.ts +200 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +19 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +80 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/en/manual/04-command-reference/README.md +58 -0
- package/docs/en/manual/README.md +108 -0
- package/docs/zh-CN/manual/04-command-reference/README.md +58 -0
- package/docs/zh-CN/manual/README.md +108 -0
- package/package.json +65 -0
- package/shell/colyn.sh +55 -0
- package/shell/completion.bash +270 -0
- 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 @@
|
|
|
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
|