ccman 2.1.5 → 2.1.7
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/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/static-env.d.ts +1 -1
- package/dist/config/static-env.js +1 -1
- package/dist/core/ClaudeConfigManager.d.ts +3 -6
- package/dist/core/ClaudeConfigManager.d.ts.map +1 -1
- package/dist/core/ClaudeConfigManager.js +16 -19
- package/dist/core/ClaudeConfigManager.js.map +1 -1
- package/dist/core/EnvironmentManager.d.ts +27 -0
- package/dist/core/EnvironmentManager.d.ts.map +1 -0
- package/dist/core/EnvironmentManager.js +46 -0
- package/dist/core/EnvironmentManager.js.map +1 -0
- package/dist/i18n/messages.d.ts +30 -0
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/i18n/messages.js +62 -0
- package/dist/i18n/messages.js.map +1 -1
- package/dist/providers/ProviderManager.js +3 -3
- package/dist/providers/ProviderManager.js.map +1 -1
- package/dist/setup/checker.d.ts +33 -0
- package/dist/setup/checker.d.ts.map +1 -0
- package/dist/setup/checker.js +169 -0
- package/dist/setup/checker.js.map +1 -0
- package/dist/setup/installer.d.ts +17 -0
- package/dist/setup/installer.d.ts.map +1 -0
- package/dist/setup/installer.js +108 -0
- package/dist/setup/installer.js.map +1 -0
- package/dist/setup/planner.d.ts +22 -0
- package/dist/setup/planner.d.ts.map +1 -0
- package/dist/setup/planner.js +213 -0
- package/dist/setup/planner.js.map +1 -0
- package/dist/setup/strategies/base.d.ts +26 -0
- package/dist/setup/strategies/base.d.ts.map +1 -0
- package/dist/setup/strategies/base.js +32 -0
- package/dist/setup/strategies/base.js.map +1 -0
- package/dist/setup/strategies/node.d.ts +9 -0
- package/dist/setup/strategies/node.d.ts.map +1 -0
- package/dist/setup/strategies/node.js +141 -0
- package/dist/setup/strategies/node.js.map +1 -0
- package/dist/setup/strategies/nvm.d.ts +9 -0
- package/dist/setup/strategies/nvm.d.ts.map +1 -0
- package/dist/setup/strategies/nvm.js +106 -0
- package/dist/setup/strategies/nvm.js.map +1 -0
- package/dist/setup/strategies/volta.d.ts +9 -0
- package/dist/setup/strategies/volta.d.ts.map +1 -0
- package/dist/setup/strategies/volta.js +111 -0
- package/dist/setup/strategies/volta.js.map +1 -0
- package/dist/setup/types.d.ts +95 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +6 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/utils/command.d.ts +33 -0
- package/dist/utils/command.d.ts.map +1 -0
- package/dist/utils/command.js +73 -0
- package/dist/utils/command.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoltaStrategy = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Volta 安装策略
|
|
6
|
+
*/
|
|
7
|
+
const base_1 = require("./base");
|
|
8
|
+
class VoltaStrategy extends base_1.InstallStrategy {
|
|
9
|
+
async getOptions() {
|
|
10
|
+
const options = [];
|
|
11
|
+
const tools = await this.checkPlatformTools();
|
|
12
|
+
// macOS / Linux
|
|
13
|
+
if (this.platform === 'darwin' || this.platform === 'linux') {
|
|
14
|
+
// 选项1: 官方脚本(优先推荐)
|
|
15
|
+
options.push({
|
|
16
|
+
id: 'volta-script',
|
|
17
|
+
name: '使用官方脚本安装 Volta(推荐)',
|
|
18
|
+
description: '简单快速,一键安装',
|
|
19
|
+
priority: 1,
|
|
20
|
+
steps: [
|
|
21
|
+
{
|
|
22
|
+
name: 'install-volta',
|
|
23
|
+
description: '下载并安装 Volta',
|
|
24
|
+
command: 'curl https://get.volta.sh | bash'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'reload-shell',
|
|
28
|
+
description: '重新加载 shell 配置',
|
|
29
|
+
command: 'source ~/.bashrc || source ~/.zshrc',
|
|
30
|
+
optional: true
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
});
|
|
34
|
+
// 选项2: Homebrew(如果已安装)
|
|
35
|
+
if (tools.brew) {
|
|
36
|
+
options.push({
|
|
37
|
+
id: 'volta-brew',
|
|
38
|
+
name: '使用 Homebrew 安装 Volta',
|
|
39
|
+
description: '如果你更喜欢使用 Homebrew',
|
|
40
|
+
priority: 2,
|
|
41
|
+
steps: [
|
|
42
|
+
{
|
|
43
|
+
name: 'install-volta',
|
|
44
|
+
description: '通过 Homebrew 安装 Volta',
|
|
45
|
+
command: 'brew install volta'
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Windows
|
|
52
|
+
if (this.platform === 'win32') {
|
|
53
|
+
// 选项1: 官方安装器(优先)
|
|
54
|
+
options.push({
|
|
55
|
+
id: 'volta-installer',
|
|
56
|
+
name: '下载 Volta 官方安装器(推荐)',
|
|
57
|
+
description: '访问官网下载 .msi 安装器',
|
|
58
|
+
priority: 1,
|
|
59
|
+
steps: [
|
|
60
|
+
{
|
|
61
|
+
name: 'download-volta',
|
|
62
|
+
description: '访问 https://github.com/volta-cli/volta/releases',
|
|
63
|
+
command: 'open https://github.com/volta-cli/volta/releases',
|
|
64
|
+
manual: true
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'install-volta',
|
|
68
|
+
description: '下载并运行 volta-x.x.x-windows-x86_64.msi',
|
|
69
|
+
command: 'manual',
|
|
70
|
+
manual: true
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
// 选项2: Chocolatey(如果已安装)
|
|
75
|
+
if (tools.choco) {
|
|
76
|
+
options.push({
|
|
77
|
+
id: 'volta-choco',
|
|
78
|
+
name: '使用 Chocolatey 安装 Volta',
|
|
79
|
+
description: '通过 Chocolatey 包管理器',
|
|
80
|
+
priority: 2,
|
|
81
|
+
steps: [
|
|
82
|
+
{
|
|
83
|
+
name: 'install-volta',
|
|
84
|
+
description: '通过 Chocolatey 安装 Volta',
|
|
85
|
+
command: 'choco install volta'
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// 选项3: Scoop(如果已安装)
|
|
91
|
+
if (tools.scoop) {
|
|
92
|
+
options.push({
|
|
93
|
+
id: 'volta-scoop',
|
|
94
|
+
name: '使用 Scoop 安装 Volta',
|
|
95
|
+
description: '通过 Scoop 包管理器',
|
|
96
|
+
priority: 3,
|
|
97
|
+
steps: [
|
|
98
|
+
{
|
|
99
|
+
name: 'install-volta',
|
|
100
|
+
description: '通过 Scoop 安装 Volta',
|
|
101
|
+
command: 'scoop install volta'
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return options;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.VoltaStrategy = VoltaStrategy;
|
|
111
|
+
//# sourceMappingURL=volta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volta.js","sourceRoot":"","sources":["../../../src/setup/strategies/volta.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,iCAAyC;AAGzC,MAAa,aAAc,SAAQ,sBAAe;IAChD,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE9C,gBAAgB;QAChB,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC5D,kBAAkB;YAClB,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,cAAc;gBAClB,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,WAAW;gBACxB,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,eAAe;wBACrB,WAAW,EAAE,aAAa;wBAC1B,OAAO,EAAE,kCAAkC;qBAC5C;oBACD;wBACE,IAAI,EAAE,cAAc;wBACpB,WAAW,EAAE,eAAe;wBAC5B,OAAO,EAAE,qCAAqC;wBAC9C,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,YAAY;oBAChB,IAAI,EAAE,sBAAsB;oBAC5B,WAAW,EAAE,mBAAmB;oBAChC,QAAQ,EAAE,CAAC;oBACX,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,eAAe;4BACrB,WAAW,EAAE,sBAAsB;4BACnC,OAAO,EAAE,oBAAoB;yBAC9B;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,UAAU;QACV,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,iBAAiB;YACjB,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,iBAAiB;gBACrB,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,iBAAiB;gBAC9B,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,gBAAgB;wBACtB,WAAW,EAAE,gDAAgD;wBAC7D,OAAO,EAAE,kDAAkD;wBAC3D,MAAM,EAAE,IAAI;qBACb;oBACD;wBACE,IAAI,EAAE,eAAe;wBACrB,WAAW,EAAE,sCAAsC;wBACnD,OAAO,EAAE,QAAQ;wBACjB,MAAM,EAAE,IAAI;qBACb;iBACF;aACF,CAAC,CAAC;YAEH,yBAAyB;YACzB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,aAAa;oBACjB,IAAI,EAAE,wBAAwB;oBAC9B,WAAW,EAAE,oBAAoB;oBACjC,QAAQ,EAAE,CAAC;oBACX,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,eAAe;4BACrB,WAAW,EAAE,wBAAwB;4BACrC,OAAO,EAAE,qBAAqB;yBAC/B;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;YAED,oBAAoB;YACpB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,aAAa;oBACjB,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EAAE,eAAe;oBAC5B,QAAQ,EAAE,CAAC;oBACX,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,eAAe;4BACrB,WAAW,EAAE,mBAAmB;4BAChC,OAAO,EAAE,qBAAqB;yBAC/B;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA3GD,sCA2GC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup 模块类型定义
|
|
3
|
+
*/
|
|
4
|
+
export type Platform = 'darwin' | 'linux' | 'win32';
|
|
5
|
+
/**
|
|
6
|
+
* 工具信息
|
|
7
|
+
*/
|
|
8
|
+
export interface ToolInfo {
|
|
9
|
+
installed: boolean;
|
|
10
|
+
version: string | null;
|
|
11
|
+
path?: string | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Node.js 信息
|
|
15
|
+
*/
|
|
16
|
+
export interface NodeInfo extends ToolInfo {
|
|
17
|
+
versionValid?: boolean;
|
|
18
|
+
requiredVersion?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 版本管理器信息
|
|
22
|
+
*/
|
|
23
|
+
export interface VersionManagerInfo {
|
|
24
|
+
volta: boolean;
|
|
25
|
+
nvm: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Claude Code 依赖要求
|
|
29
|
+
*/
|
|
30
|
+
export interface ClaudeCodeRequirements {
|
|
31
|
+
nodeVersion: string;
|
|
32
|
+
requiredTools: string[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 环境检查结果
|
|
36
|
+
*/
|
|
37
|
+
export interface EnvironmentCheckResult {
|
|
38
|
+
status: 'ready' | 'needs-setup' | 'warning' | 'error';
|
|
39
|
+
claudeCode: ToolInfo;
|
|
40
|
+
node: NodeInfo;
|
|
41
|
+
npm: ToolInfo;
|
|
42
|
+
versionManagers: VersionManagerInfo;
|
|
43
|
+
requirements: ClaudeCodeRequirements;
|
|
44
|
+
platform: Platform;
|
|
45
|
+
issues: string[];
|
|
46
|
+
suggestions: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 安装步骤
|
|
50
|
+
*/
|
|
51
|
+
export interface InstallStep {
|
|
52
|
+
name: string;
|
|
53
|
+
description: string;
|
|
54
|
+
command: string;
|
|
55
|
+
manual?: boolean;
|
|
56
|
+
optional?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 安装选项
|
|
60
|
+
*/
|
|
61
|
+
export interface InstallOption {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
description: string;
|
|
65
|
+
priority: number;
|
|
66
|
+
steps: InstallStep[];
|
|
67
|
+
reason?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 安装计划
|
|
71
|
+
*/
|
|
72
|
+
export interface InstallationPlan {
|
|
73
|
+
needsNode: boolean;
|
|
74
|
+
needsClaudeCode: boolean;
|
|
75
|
+
nodeOptions: InstallOption[];
|
|
76
|
+
claudeCodeSteps: InstallStep[];
|
|
77
|
+
selectedNodeOption?: InstallOption;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 安装结果
|
|
81
|
+
*/
|
|
82
|
+
export interface InstallationResult {
|
|
83
|
+
success: boolean;
|
|
84
|
+
message: string;
|
|
85
|
+
stepsExecuted: string[];
|
|
86
|
+
stepsFailed: string[];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 安装执行选项
|
|
90
|
+
*/
|
|
91
|
+
export interface InstallerOptions {
|
|
92
|
+
dryRun?: boolean;
|
|
93
|
+
auto?: boolean;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/setup/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;IACtD,UAAU,EAAE,QAAQ,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,QAAQ,CAAC;IACd,eAAe,EAAE,kBAAkB,CAAC;IACpC,YAAY,EAAE,sBAAsB,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,kBAAkB,CAAC,EAAE,aAAa,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/setup/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令执行结果
|
|
3
|
+
*/
|
|
4
|
+
export interface CommandResult {
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
code: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 命令执行选项
|
|
11
|
+
*/
|
|
12
|
+
export interface CommandOptions {
|
|
13
|
+
timeout?: number;
|
|
14
|
+
cwd?: string;
|
|
15
|
+
env?: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 执行命令
|
|
19
|
+
*/
|
|
20
|
+
export declare function executeCommand(cmd: string, options?: CommandOptions): Promise<CommandResult>;
|
|
21
|
+
/**
|
|
22
|
+
* 检查命令是否存在
|
|
23
|
+
*/
|
|
24
|
+
export declare function commandExists(cmd: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* 获取命令版本
|
|
27
|
+
*/
|
|
28
|
+
export declare function getCommandVersion(cmd: string): Promise<string | null>;
|
|
29
|
+
/**
|
|
30
|
+
* 获取命令路径
|
|
31
|
+
*/
|
|
32
|
+
export declare function getCommandPath(cmd: string): Promise<string | null>;
|
|
33
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CAoBxB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeCommand = executeCommand;
|
|
4
|
+
exports.commandExists = commandExists;
|
|
5
|
+
exports.getCommandVersion = getCommandVersion;
|
|
6
|
+
exports.getCommandPath = getCommandPath;
|
|
7
|
+
/**
|
|
8
|
+
* 命令执行工具函数
|
|
9
|
+
*/
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const util_1 = require("util");
|
|
12
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
13
|
+
/**
|
|
14
|
+
* 执行命令
|
|
15
|
+
*/
|
|
16
|
+
async function executeCommand(cmd, options) {
|
|
17
|
+
try {
|
|
18
|
+
const { stdout, stderr } = await execAsync(cmd, {
|
|
19
|
+
timeout: options?.timeout || 30000,
|
|
20
|
+
cwd: options?.cwd,
|
|
21
|
+
env: { ...process.env, ...options?.env }
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
stdout: stdout.trim(),
|
|
25
|
+
stderr: stderr.trim(),
|
|
26
|
+
code: 0
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return {
|
|
31
|
+
stdout: error.stdout?.trim() || '',
|
|
32
|
+
stderr: error.stderr?.trim() || error.message,
|
|
33
|
+
code: error.code || 1
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 检查命令是否存在
|
|
39
|
+
*/
|
|
40
|
+
async function commandExists(cmd) {
|
|
41
|
+
const checkCmd = process.platform === 'win32'
|
|
42
|
+
? `where ${cmd}`
|
|
43
|
+
: `command -v ${cmd}`;
|
|
44
|
+
const result = await executeCommand(checkCmd);
|
|
45
|
+
return result.code === 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 获取命令版本
|
|
49
|
+
*/
|
|
50
|
+
async function getCommandVersion(cmd) {
|
|
51
|
+
const result = await executeCommand(`${cmd} --version`);
|
|
52
|
+
if (result.code !== 0) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
// 提取版本号(匹配常见格式 x.y.z)
|
|
56
|
+
const versionMatch = result.stdout.match(/\d+\.\d+\.\d+/);
|
|
57
|
+
return versionMatch ? versionMatch[0] : result.stdout.split('\n')[0];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 获取命令路径
|
|
61
|
+
*/
|
|
62
|
+
async function getCommandPath(cmd) {
|
|
63
|
+
const checkCmd = process.platform === 'win32'
|
|
64
|
+
? `where ${cmd}`
|
|
65
|
+
: `which ${cmd}`;
|
|
66
|
+
const result = await executeCommand(checkCmd);
|
|
67
|
+
if (result.code !== 0) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// Windows 的 where 可能返回多个路径,取第一个
|
|
71
|
+
return result.stdout.split('\n')[0].trim();
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":";;AA6BA,wCAuBC;AAKD,sCAOC;AAKD,8CAUC;AAKD,wCAaC;AAjGD;;GAEG;AACH,iDAAqC;AACrC,+BAAiC;AAEjC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAoBlC;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,OAAwB;IAExB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK;YAClC,GAAG,EAAE,OAAO,EAAE,GAAG;YACjB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE;SACzC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,IAAI,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;YAClC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO;YAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;SACtB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC3C,CAAC,CAAC,SAAS,GAAG,EAAE;QAChB,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IAExD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC3C,CAAC,CAAC,SAAS,GAAG,EAAE;QAChB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;IAEnB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccman",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.7",
|
|
4
4
|
"description": "Claude Code Manager - A TypeScript tool to manage Claude Code API configurations",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"packageManager": "pnpm@7.33.7",
|
|
@@ -60,13 +60,16 @@
|
|
|
60
60
|
"chalk": "^4.1.2",
|
|
61
61
|
"commander": "^11.0.0",
|
|
62
62
|
"fs-extra": "^11.0.0",
|
|
63
|
-
"inquirer": "^8.2.6"
|
|
63
|
+
"inquirer": "^8.2.6",
|
|
64
|
+
"semver": "^7.7.2"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
67
|
+
"@esbuild/darwin-arm64": "^0.25.10",
|
|
66
68
|
"@types/fs-extra": "^11.0.0",
|
|
67
69
|
"@types/inquirer": "^9.0.0",
|
|
68
70
|
"@types/jest": "^29.0.0",
|
|
69
71
|
"@types/node": "^20.0.0",
|
|
72
|
+
"@types/semver": "^7.7.1",
|
|
70
73
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
71
74
|
"@typescript-eslint/parser": "^6.0.0",
|
|
72
75
|
"eslint": "^8.0.0",
|