ccman 2.1.4 → 2.1.6

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 (55) hide show
  1. package/README.md +75 -225
  2. package/README_en.md +51 -201
  3. package/dist/cli.js +219 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/static-env.d.ts +1 -1
  6. package/dist/config/static-env.js +1 -1
  7. package/dist/core/ClaudeConfigManager.d.ts +1 -1
  8. package/dist/core/ClaudeConfigManager.d.ts.map +1 -1
  9. package/dist/core/ClaudeConfigManager.js +2 -4
  10. package/dist/core/ClaudeConfigManager.js.map +1 -1
  11. package/dist/core/EnvironmentManager.d.ts +27 -0
  12. package/dist/core/EnvironmentManager.d.ts.map +1 -0
  13. package/dist/core/EnvironmentManager.js +46 -0
  14. package/dist/core/EnvironmentManager.js.map +1 -0
  15. package/dist/i18n/messages.d.ts +30 -0
  16. package/dist/i18n/messages.d.ts.map +1 -1
  17. package/dist/i18n/messages.js +62 -0
  18. package/dist/i18n/messages.js.map +1 -1
  19. package/dist/setup/checker.d.ts +33 -0
  20. package/dist/setup/checker.d.ts.map +1 -0
  21. package/dist/setup/checker.js +169 -0
  22. package/dist/setup/checker.js.map +1 -0
  23. package/dist/setup/installer.d.ts +17 -0
  24. package/dist/setup/installer.d.ts.map +1 -0
  25. package/dist/setup/installer.js +108 -0
  26. package/dist/setup/installer.js.map +1 -0
  27. package/dist/setup/planner.d.ts +22 -0
  28. package/dist/setup/planner.d.ts.map +1 -0
  29. package/dist/setup/planner.js +213 -0
  30. package/dist/setup/planner.js.map +1 -0
  31. package/dist/setup/strategies/base.d.ts +26 -0
  32. package/dist/setup/strategies/base.d.ts.map +1 -0
  33. package/dist/setup/strategies/base.js +32 -0
  34. package/dist/setup/strategies/base.js.map +1 -0
  35. package/dist/setup/strategies/node.d.ts +9 -0
  36. package/dist/setup/strategies/node.d.ts.map +1 -0
  37. package/dist/setup/strategies/node.js +141 -0
  38. package/dist/setup/strategies/node.js.map +1 -0
  39. package/dist/setup/strategies/nvm.d.ts +9 -0
  40. package/dist/setup/strategies/nvm.d.ts.map +1 -0
  41. package/dist/setup/strategies/nvm.js +106 -0
  42. package/dist/setup/strategies/nvm.js.map +1 -0
  43. package/dist/setup/strategies/volta.d.ts +9 -0
  44. package/dist/setup/strategies/volta.d.ts.map +1 -0
  45. package/dist/setup/strategies/volta.js +111 -0
  46. package/dist/setup/strategies/volta.js.map +1 -0
  47. package/dist/setup/types.d.ts +95 -0
  48. package/dist/setup/types.d.ts.map +1 -0
  49. package/dist/setup/types.js +6 -0
  50. package/dist/setup/types.js.map +1 -0
  51. package/dist/utils/command.d.ts +33 -0
  52. package/dist/utils/command.d.ts.map +1 -0
  53. package/dist/utils/command.js +73 -0
  54. package/dist/utils/command.js.map +1 -0
  55. package/package.json +5 -2
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.EnvironmentChecker = void 0;
37
+ /**
38
+ * 环境检查器
39
+ */
40
+ const semver = __importStar(require("semver"));
41
+ const command_1 = require("../utils/command");
42
+ /**
43
+ * 环境检查器类
44
+ */
45
+ class EnvironmentChecker {
46
+ constructor() {
47
+ // TODO: 从官方文档获取实际要求
48
+ // 临时使用假设的要求
49
+ this.requirements = {
50
+ nodeVersion: '>=18.0.0',
51
+ requiredTools: ['node', 'npm']
52
+ };
53
+ }
54
+ /**
55
+ * 执行完整的环境检查
56
+ */
57
+ async check() {
58
+ const issues = [];
59
+ const suggestions = [];
60
+ // 检查 Claude Code
61
+ const claudeCode = await this.checkClaudeCode();
62
+ // 检查 Node.js(总是检查,即使 Claude Code 已安装)
63
+ const node = await this.checkNode();
64
+ // 检查 npm
65
+ const npm = await this.checkNpm();
66
+ // 检查版本管理器
67
+ const versionManagers = await this.checkVersionManagers();
68
+ // 获取平台信息
69
+ const platform = process.platform;
70
+ // 分析检查结果,生成问题和建议
71
+ let status = 'ready';
72
+ if (!claudeCode.installed) {
73
+ status = 'needs-setup';
74
+ issues.push('Claude Code 未安装');
75
+ suggestions.push('运行 "ccman setup" 安装 Claude Code');
76
+ }
77
+ if (!node.installed) {
78
+ status = 'error';
79
+ issues.push('Node.js 未安装');
80
+ suggestions.push('需要先安装 Node.js (推荐使用 volta 或 nvm)');
81
+ }
82
+ else if (!node.versionValid) {
83
+ status = node.installed && claudeCode.installed ? 'warning' : 'error';
84
+ issues.push(`Node.js 版本不满足要求 (当前: ${node.version}, 需要: ${this.requirements.nodeVersion})`);
85
+ suggestions.push('升级 Node.js 到推荐版本');
86
+ }
87
+ if (!npm.installed) {
88
+ status = 'error';
89
+ issues.push('npm 未找到');
90
+ suggestions.push('重新安装 Node.js 或修复 npm');
91
+ }
92
+ // 如果所有检查都通过
93
+ if (claudeCode.installed && node.versionValid && npm.installed) {
94
+ status = 'ready';
95
+ }
96
+ return {
97
+ status,
98
+ claudeCode,
99
+ node,
100
+ npm,
101
+ versionManagers,
102
+ requirements: this.requirements,
103
+ platform,
104
+ issues,
105
+ suggestions
106
+ };
107
+ }
108
+ /**
109
+ * 检查 Claude Code
110
+ */
111
+ async checkClaudeCode() {
112
+ const installed = await (0, command_1.commandExists)('claude');
113
+ const version = installed ? await (0, command_1.getCommandVersion)('claude') : null;
114
+ const path = installed ? await (0, command_1.getCommandPath)('claude') : null;
115
+ return { installed, version, path };
116
+ }
117
+ /**
118
+ * 检查 Node.js
119
+ */
120
+ async checkNode() {
121
+ const installed = await (0, command_1.commandExists)('node');
122
+ const version = installed ? await (0, command_1.getCommandVersion)('node') : null;
123
+ const path = installed ? await (0, command_1.getCommandPath)('node') : null;
124
+ let versionValid = false;
125
+ if (installed && version) {
126
+ try {
127
+ // 清理版本号格式 (v20.11.0 → 20.11.0)
128
+ const cleanVersion = version.replace(/^v/, '');
129
+ versionValid = semver.satisfies(cleanVersion, this.requirements.nodeVersion);
130
+ }
131
+ catch (error) {
132
+ // 版本格式无效
133
+ versionValid = false;
134
+ }
135
+ }
136
+ return {
137
+ installed,
138
+ version,
139
+ path,
140
+ versionValid,
141
+ requiredVersion: this.requirements.nodeVersion
142
+ };
143
+ }
144
+ /**
145
+ * 检查 npm
146
+ */
147
+ async checkNpm() {
148
+ const installed = await (0, command_1.commandExists)('npm');
149
+ const version = installed ? await (0, command_1.getCommandVersion)('npm') : null;
150
+ const path = installed ? await (0, command_1.getCommandPath)('npm') : null;
151
+ return { installed, version, path };
152
+ }
153
+ /**
154
+ * 检查版本管理器
155
+ */
156
+ async checkVersionManagers() {
157
+ const volta = await (0, command_1.commandExists)('volta');
158
+ const nvm = await (0, command_1.commandExists)('nvm');
159
+ return { volta, nvm };
160
+ }
161
+ /**
162
+ * 获取 Claude Code 要求(供外部使用)
163
+ */
164
+ getRequirements() {
165
+ return this.requirements;
166
+ }
167
+ }
168
+ exports.EnvironmentChecker = EnvironmentChecker;
169
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/setup/checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { InstallStep, InstallationResult, InstallerOptions } from './types';
2
+ /**
3
+ * 安装执行器类
4
+ */
5
+ export declare class Installer {
6
+ private options;
7
+ constructor(options?: InstallerOptions);
8
+ /**
9
+ * 执行安装步骤
10
+ */
11
+ executeSteps(steps: InstallStep[]): Promise<InstallationResult>;
12
+ /**
13
+ * 设置选项
14
+ */
15
+ setOptions(options: InstallerOptions): void;
16
+ }
17
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/setup/installer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5E;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,GAAE,gBAAqB;IAO1C;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuFrE;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;CAG5C"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Installer = void 0;
7
+ /**
8
+ * 安装执行器
9
+ */
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ /**
12
+ * 安装执行器类
13
+ */
14
+ class Installer {
15
+ constructor(options = {}) {
16
+ this.options = {
17
+ dryRun: options.dryRun ?? false,
18
+ auto: options.auto ?? false
19
+ };
20
+ }
21
+ /**
22
+ * 执行安装步骤
23
+ */
24
+ async executeSteps(steps) {
25
+ const stepsExecuted = [];
26
+ const stepsFailed = [];
27
+ console.log();
28
+ if (this.options.dryRun) {
29
+ console.log(chalk_1.default.yellow('🔍 演示模式: 不会真正执行安装命令'));
30
+ console.log();
31
+ }
32
+ for (const step of steps) {
33
+ console.log(chalk_1.default.blue(`➤ ${step.description}`));
34
+ // 跳过可选步骤的提示
35
+ if (step.optional) {
36
+ console.log(chalk_1.default.gray(' (可选步骤,可以跳过)'));
37
+ }
38
+ // 手动步骤
39
+ if (step.manual) {
40
+ console.log(chalk_1.default.cyan(` 📋 ${step.command}`));
41
+ console.log(chalk_1.default.gray(' 请手动完成此步骤'));
42
+ stepsExecuted.push(step.name);
43
+ console.log();
44
+ continue;
45
+ }
46
+ // 显示命令
47
+ console.log(chalk_1.default.gray(` $ ${step.command}`));
48
+ // Dry run 模式:不执行,只显示
49
+ if (this.options.dryRun) {
50
+ console.log(chalk_1.default.green(' ✓ (演示模式,未实际执行)'));
51
+ stepsExecuted.push(step.name);
52
+ console.log();
53
+ continue;
54
+ }
55
+ // 实际执行模式(当前不实现,避免真正安装)
56
+ // 如果需要实际执行,取消下面的注释
57
+ /*
58
+ try {
59
+ const result = await executeCommand(step.command, { timeout: 120000 });
60
+
61
+ if (result.code === 0) {
62
+ console.log(chalk.green(' ✓ 完成'));
63
+ stepsExecuted.push(step.name);
64
+ } else {
65
+ console.log(chalk.red(' ✗ 失败'));
66
+ console.log(chalk.red(` Error: ${result.stderr}`));
67
+ stepsFailed.push(step.name);
68
+
69
+ if (!step.optional) {
70
+ // 非可选步骤失败,终止安装
71
+ break;
72
+ }
73
+ }
74
+ } catch (error) {
75
+ console.log(chalk.red(' ✗ 执行出错'));
76
+ console.log(chalk.red(` ${error}`));
77
+ stepsFailed.push(step.name);
78
+
79
+ if (!step.optional) {
80
+ break;
81
+ }
82
+ }
83
+ */
84
+ // 当前版本:所有非手动步骤在非 dry-run 模式下也只显示
85
+ console.log(chalk_1.default.yellow(' ⚠️ 实际执行功能尚未启用(避免意外安装)'));
86
+ stepsExecuted.push(step.name);
87
+ console.log();
88
+ }
89
+ const success = stepsFailed.length === 0;
90
+ const message = success
91
+ ? `✅ 所有步骤完成 (${stepsExecuted.length}/${steps.length})`
92
+ : `⚠️ 部分步骤失败 (${stepsFailed.length} 失败)`;
93
+ return {
94
+ success,
95
+ message,
96
+ stepsExecuted,
97
+ stepsFailed
98
+ };
99
+ }
100
+ /**
101
+ * 设置选项
102
+ */
103
+ setOptions(options) {
104
+ this.options = { ...this.options, ...options };
105
+ }
106
+ }
107
+ exports.Installer = Installer;
108
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/setup/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 安装计划生成器
3
+ */
4
+ import { EnvironmentCheckResult, InstallationPlan } from './types';
5
+ /**
6
+ * 安装计划生成器类
7
+ */
8
+ export declare class InstallationPlanner {
9
+ /**
10
+ * 根据环境检查结果生成安装计划
11
+ */
12
+ generatePlan(checkResult: EnvironmentCheckResult): Promise<InstallationPlan>;
13
+ /**
14
+ * 生成 Node.js 安装选项
15
+ */
16
+ private generateNodeOptions;
17
+ /**
18
+ * 生成 Claude Code 安装步骤
19
+ */
20
+ private generateClaudeCodeSteps;
21
+ }
22
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/setup/planner.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAA8B,MAAM,SAAS,CAAC;AAK/F;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuBlF;;OAEG;YACW,mBAAmB;IA4KjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAWhC"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InstallationPlanner = void 0;
4
+ const volta_1 = require("./strategies/volta");
5
+ const nvm_1 = require("./strategies/nvm");
6
+ const node_1 = require("./strategies/node");
7
+ /**
8
+ * 安装计划生成器类
9
+ */
10
+ class InstallationPlanner {
11
+ /**
12
+ * 根据环境检查结果生成安装计划
13
+ */
14
+ async generatePlan(checkResult) {
15
+ const plan = {
16
+ needsNode: false,
17
+ needsClaudeCode: false,
18
+ nodeOptions: [],
19
+ claudeCodeSteps: []
20
+ };
21
+ // 判断是否需要安装/升级 Node.js
22
+ if (!checkResult.node.installed || !checkResult.node.versionValid) {
23
+ plan.needsNode = true;
24
+ plan.nodeOptions = await this.generateNodeOptions(checkResult);
25
+ }
26
+ // 判断是否需要安装 Claude Code
27
+ if (!checkResult.claudeCode.installed) {
28
+ plan.needsClaudeCode = true;
29
+ plan.claudeCodeSteps = this.generateClaudeCodeSteps();
30
+ }
31
+ return plan;
32
+ }
33
+ /**
34
+ * 生成 Node.js 安装选项
35
+ */
36
+ async generateNodeOptions(checkResult) {
37
+ const options = [];
38
+ // 场景1: Node.js 已安装但版本过低
39
+ if (checkResult.node.installed && !checkResult.node.versionValid) {
40
+ // 如果已有版本管理器,使用它升级
41
+ if (checkResult.versionManagers.volta) {
42
+ options.push({
43
+ id: 'upgrade-via-volta',
44
+ name: '使用已安装的 Volta 升级 Node.js',
45
+ description: `当前版本 ${checkResult.node.version},需要 ${checkResult.requirements.nodeVersion}`,
46
+ priority: 1,
47
+ reason: '检测到 Volta 已安装',
48
+ steps: [
49
+ {
50
+ name: 'install-node',
51
+ description: '安装 Node.js 20 LTS',
52
+ command: 'volta install node@20'
53
+ }
54
+ ]
55
+ });
56
+ }
57
+ else if (checkResult.versionManagers.nvm) {
58
+ options.push({
59
+ id: 'upgrade-via-nvm',
60
+ name: '使用已安装的 nvm 升级 Node.js',
61
+ description: `当前版本 ${checkResult.node.version},需要 ${checkResult.requirements.nodeVersion}`,
62
+ priority: 1,
63
+ reason: '检测到 nvm 已安装',
64
+ steps: [
65
+ {
66
+ name: 'install-node',
67
+ description: '安装 Node.js 20',
68
+ command: 'nvm install 20'
69
+ },
70
+ {
71
+ name: 'use-node',
72
+ description: '切换到 Node.js 20',
73
+ command: 'nvm use 20'
74
+ },
75
+ {
76
+ name: 'set-default',
77
+ description: '设置为默认版本',
78
+ command: 'nvm alias default 20'
79
+ }
80
+ ]
81
+ });
82
+ }
83
+ else {
84
+ // 没有版本管理器,提供安装版本管理器的选项
85
+ options.push({
86
+ id: 'upgrade-manual',
87
+ name: '手动升级 Node.js',
88
+ description: '访问 nodejs.org 下载最新版本',
89
+ priority: 3,
90
+ steps: [
91
+ {
92
+ name: 'download-node',
93
+ description: '访问 https://nodejs.org/',
94
+ command: 'open https://nodejs.org/',
95
+ manual: true
96
+ }
97
+ ]
98
+ });
99
+ // 同时提供安装版本管理器的选项
100
+ const voltaOptions = await new volta_1.VoltaStrategy().getOptions();
101
+ const nvmOptions = await new nvm_1.NvmStrategy().getOptions();
102
+ options.push(...voltaOptions, ...nvmOptions);
103
+ }
104
+ }
105
+ // 场景2: Node.js 未安装
106
+ if (!checkResult.node.installed) {
107
+ // 如果已有版本管理器,使用它安装
108
+ if (checkResult.versionManagers.volta) {
109
+ options.push({
110
+ id: 'install-via-volta',
111
+ name: '使用已安装的 Volta 安装 Node.js',
112
+ description: '推荐使用 Volta 管理 Node.js 版本',
113
+ priority: 1,
114
+ reason: '检测到 Volta 已安装',
115
+ steps: [
116
+ {
117
+ name: 'install-node',
118
+ description: '安装 Node.js 20 LTS',
119
+ command: 'volta install node@20'
120
+ }
121
+ ]
122
+ });
123
+ }
124
+ else if (checkResult.versionManagers.nvm) {
125
+ options.push({
126
+ id: 'install-via-nvm',
127
+ name: '使用已安装的 nvm 安装 Node.js',
128
+ description: '使用 nvm 管理 Node.js 版本',
129
+ priority: 1,
130
+ reason: '检测到 nvm 已安装',
131
+ steps: [
132
+ {
133
+ name: 'install-node',
134
+ description: '安装 Node.js 20',
135
+ command: 'nvm install 20'
136
+ },
137
+ {
138
+ name: 'use-node',
139
+ description: '切换到 Node.js 20',
140
+ command: 'nvm use 20'
141
+ },
142
+ {
143
+ name: 'set-default',
144
+ description: '设置为默认版本',
145
+ command: 'nvm alias default 20'
146
+ }
147
+ ]
148
+ });
149
+ }
150
+ else {
151
+ // 没有版本管理器,提供多种安装选项
152
+ // 选项1: 推荐安装 Volta + Node.js
153
+ const voltaStrategy = new volta_1.VoltaStrategy();
154
+ const voltaOptions = await voltaStrategy.getOptions();
155
+ // 为 Volta 选项添加安装 Node.js 的步骤
156
+ voltaOptions.forEach(option => {
157
+ option.steps.push({
158
+ name: 'install-node',
159
+ description: '安装 Node.js 20 LTS',
160
+ command: 'volta install node@20'
161
+ });
162
+ option.name = option.name.replace('安装 Volta', '安装 Volta + Node.js');
163
+ });
164
+ // 选项2: 安装 nvm + Node.js
165
+ const nvmStrategy = new nvm_1.NvmStrategy();
166
+ const nvmOptions = await nvmStrategy.getOptions();
167
+ nvmOptions.forEach(option => {
168
+ option.priority += 1; // 降低优先级
169
+ option.steps.push({
170
+ name: 'install-node',
171
+ description: '安装 Node.js 20',
172
+ command: 'nvm install 20'
173
+ }, {
174
+ name: 'use-node',
175
+ description: '切换到 Node.js 20',
176
+ command: 'nvm use 20'
177
+ }, {
178
+ name: 'set-default',
179
+ description: '设置为默认版本',
180
+ command: 'nvm alias default 20'
181
+ });
182
+ option.name = option.name.replace('安装 nvm', '安装 nvm + Node.js');
183
+ });
184
+ // 选项3: 直接安装 Node.js(无版本管理)
185
+ const nodeStrategy = new node_1.NodeStrategy();
186
+ const nodeOptions = await nodeStrategy.getOptions();
187
+ nodeOptions.forEach(option => {
188
+ option.priority += 2; // 最低优先级
189
+ });
190
+ options.push(...voltaOptions, ...nvmOptions, ...nodeOptions);
191
+ }
192
+ }
193
+ // 按优先级排序
194
+ options.sort((a, b) => a.priority - b.priority);
195
+ return options;
196
+ }
197
+ /**
198
+ * 生成 Claude Code 安装步骤
199
+ */
200
+ generateClaudeCodeSteps() {
201
+ // TODO: 从官方文档获取实际的安装命令
202
+ // 这里使用假设的安装方式
203
+ return [
204
+ {
205
+ name: 'install-claude-code',
206
+ description: '全局安装 Claude Code CLI',
207
+ command: 'npm install -g @anthropic-ai/claude-code'
208
+ }
209
+ ];
210
+ }
211
+ }
212
+ exports.InstallationPlanner = InstallationPlanner;
213
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/setup/planner.ts"],"names":[],"mappings":";;;AAIA,8CAAmD;AACnD,0CAA+C;AAC/C,4CAAiD;AAEjD;;GAEG;AACH,MAAa,mBAAmB;IAC9B;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,WAAmC;QACpD,MAAM,IAAI,GAAqB;YAC7B,SAAS,EAAE,KAAK;YAChB,eAAe,EAAE,KAAK;YACtB,WAAW,EAAE,EAAE;YACf,eAAe,EAAE,EAAE;SACpB,CAAC;QAEF,sBAAsB;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACxD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,WAAmC;QACnE,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,wBAAwB;QACxB,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACjE,kBAAkB;YAClB,IAAI,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,mBAAmB;oBACvB,IAAI,EAAE,yBAAyB;oBAC/B,WAAW,EAAE,QAAQ,WAAW,CAAC,IAAI,CAAC,OAAO,OAAO,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE;oBAC1F,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,eAAe;oBACvB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,cAAc;4BACpB,WAAW,EAAE,mBAAmB;4BAChC,OAAO,EAAE,uBAAuB;yBACjC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,iBAAiB;oBACrB,IAAI,EAAE,uBAAuB;oBAC7B,WAAW,EAAE,QAAQ,WAAW,CAAC,IAAI,CAAC,OAAO,OAAO,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE;oBAC1F,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,aAAa;oBACrB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,cAAc;4BACpB,WAAW,EAAE,eAAe;4BAC5B,OAAO,EAAE,gBAAgB;yBAC1B;wBACD;4BACE,IAAI,EAAE,UAAU;4BAChB,WAAW,EAAE,gBAAgB;4BAC7B,OAAO,EAAE,YAAY;yBACtB;wBACD;4BACE,IAAI,EAAE,aAAa;4BACnB,WAAW,EAAE,SAAS;4BACtB,OAAO,EAAE,sBAAsB;yBAChC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,gBAAgB;oBACpB,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,sBAAsB;oBACnC,QAAQ,EAAE,CAAC;oBACX,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,eAAe;4BACrB,WAAW,EAAE,wBAAwB;4BACrC,OAAO,EAAE,0BAA0B;4BACnC,MAAM,EAAE,IAAI;yBACb;qBACF;iBACF,CAAC,CAAC;gBAEH,iBAAiB;gBACjB,MAAM,YAAY,GAAG,MAAM,IAAI,qBAAa,EAAE,CAAC,UAAU,EAAE,CAAC;gBAC5D,MAAM,UAAU,GAAG,MAAM,IAAI,iBAAW,EAAE,CAAC,UAAU,EAAE,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,kBAAkB;YAClB,IAAI,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,mBAAmB;oBACvB,IAAI,EAAE,yBAAyB;oBAC/B,WAAW,EAAE,0BAA0B;oBACvC,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,eAAe;oBACvB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,cAAc;4BACpB,WAAW,EAAE,mBAAmB;4BAChC,OAAO,EAAE,uBAAuB;yBACjC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,iBAAiB;oBACrB,IAAI,EAAE,uBAAuB;oBAC7B,WAAW,EAAE,sBAAsB;oBACnC,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,aAAa;oBACrB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,cAAc;4BACpB,WAAW,EAAE,eAAe;4BAC5B,OAAO,EAAE,gBAAgB;yBAC1B;wBACD;4BACE,IAAI,EAAE,UAAU;4BAChB,WAAW,EAAE,gBAAgB;4BAC7B,OAAO,EAAE,YAAY;yBACtB;wBACD;4BACE,IAAI,EAAE,aAAa;4BACnB,WAAW,EAAE,SAAS;4BACtB,OAAO,EAAE,sBAAsB;yBAChC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,mBAAmB;gBACnB,4BAA4B;gBAC5B,MAAM,aAAa,GAAG,IAAI,qBAAa,EAAE,CAAC;gBAC1C,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;gBAEtD,6BAA6B;gBAC7B,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,cAAc;wBACpB,WAAW,EAAE,mBAAmB;wBAChC,OAAO,EAAE,uBAAuB;qBACjC,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;gBAEH,wBAAwB;gBACxB,MAAM,WAAW,GAAG,IAAI,iBAAW,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;gBAElD,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAC1B,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAE,QAAQ;oBAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CACf;wBACE,IAAI,EAAE,cAAc;wBACpB,WAAW,EAAE,eAAe;wBAC5B,OAAO,EAAE,gBAAgB;qBAC1B,EACD;wBACE,IAAI,EAAE,UAAU;wBAChB,WAAW,EAAE,gBAAgB;wBAC7B,OAAO,EAAE,YAAY;qBACtB,EACD;wBACE,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,SAAS;wBACtB,OAAO,EAAE,sBAAsB;qBAChC,CACF,CAAC;oBACF,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;gBAEH,2BAA2B;gBAC3B,MAAM,YAAY,GAAG,IAAI,mBAAY,EAAE,CAAC;gBACxC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;gBACpD,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAC3B,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAE,QAAQ;gBACjC,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,SAAS;QACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEhD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,uBAAuB;QAC7B,uBAAuB;QACvB,cAAc;QACd,OAAO;YACL;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,WAAW,EAAE,sBAAsB;gBACnC,OAAO,EAAE,0CAA0C;aACpD;SACF,CAAC;IACJ,CAAC;CACF;AAxND,kDAwNC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 安装策略基础类
3
+ */
4
+ import { InstallOption, Platform } from '../types';
5
+ /**
6
+ * 安装策略基类
7
+ */
8
+ export declare abstract class InstallStrategy {
9
+ protected platform: Platform;
10
+ constructor();
11
+ /**
12
+ * 获取安装选项
13
+ */
14
+ abstract getOptions(): Promise<InstallOption[]>;
15
+ /**
16
+ * 检查平台工具是否存在
17
+ */
18
+ protected checkPlatformTools(): Promise<{
19
+ brew?: boolean;
20
+ apt?: boolean;
21
+ yum?: boolean;
22
+ choco?: boolean;
23
+ scoop?: boolean;
24
+ }>;
25
+ }
26
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/setup/strategies/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAe,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGhE;;GAEG;AACH,8BAAsB,eAAe;IACnC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;;IAM7B;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAE/C;;OAEG;cACa,kBAAkB,IAAI,OAAO,CAAC;QAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;CAeH"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InstallStrategy = void 0;
4
+ const command_1 = require("../../utils/command");
5
+ /**
6
+ * 安装策略基类
7
+ */
8
+ class InstallStrategy {
9
+ constructor() {
10
+ this.platform = process.platform;
11
+ }
12
+ /**
13
+ * 检查平台工具是否存在
14
+ */
15
+ async checkPlatformTools() {
16
+ const tools = {};
17
+ if (this.platform === 'darwin') {
18
+ tools.brew = await (0, command_1.commandExists)('brew');
19
+ }
20
+ else if (this.platform === 'linux') {
21
+ tools.apt = await (0, command_1.commandExists)('apt');
22
+ tools.yum = await (0, command_1.commandExists)('yum');
23
+ }
24
+ else if (this.platform === 'win32') {
25
+ tools.choco = await (0, command_1.commandExists)('choco');
26
+ tools.scoop = await (0, command_1.commandExists)('scoop');
27
+ }
28
+ return tools;
29
+ }
30
+ }
31
+ exports.InstallStrategy = InstallStrategy;
32
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/setup/strategies/base.ts"],"names":[],"mappings":";;;AAIA,iDAAoD;AAEpD;;GAEG;AACH,MAAsB,eAAe;IAGnC;QACE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAoB,CAAC;IAC/C,CAAC;IAOD;;OAEG;IACO,KAAK,CAAC,kBAAkB;QAOhC,MAAM,KAAK,GAAQ,EAAE,CAAC;QAEtB,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,GAAG,MAAM,IAAA,uBAAa,EAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACrC,KAAK,CAAC,GAAG,GAAG,MAAM,IAAA,uBAAa,EAAC,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,GAAG,GAAG,MAAM,IAAA,uBAAa,EAAC,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACrC,KAAK,CAAC,KAAK,GAAG,MAAM,IAAA,uBAAa,EAAC,OAAO,CAAC,CAAC;YAC3C,KAAK,CAAC,KAAK,GAAG,MAAM,IAAA,uBAAa,EAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AApCD,0CAoCC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 直接安装 Node.js 策略
3
+ */
4
+ import { InstallStrategy } from './base';
5
+ import { InstallOption } from '../types';
6
+ export declare class NodeStrategy extends InstallStrategy {
7
+ getOptions(): Promise<InstallOption[]>;
8
+ }
9
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/setup/strategies/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qBAAa,YAAa,SAAQ,eAAe;IACzC,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CAyI7C"}