@liuzijian625/code-cli 1.0.7 → 1.0.8

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/bin/cli.js CHANGED
@@ -5,6 +5,7 @@ import chalk from 'chalk';
5
5
  import { applyConfig, clearConfig } from '../lib/config.js';
6
6
  import { addPreset, listPresets, deletePreset, getPresets } from '../lib/preset.js';
7
7
  import { clearRemotePassword, fetchRemotePresets, getRemoteSettings, setRemotePassword, setRemoteUrl } from '../lib/remote.js';
8
+ import { getInstallCommand, installTool } from '../lib/installer.js';
8
9
 
9
10
  const TOOL_NAMES = { codex: 'Codex', claude: 'Claude Code', gemini: 'Gemini CLI' };
10
11
 
@@ -20,8 +21,9 @@ async function mainMenu() {
20
21
  { name: '1. 应用配置', value: 'apply' },
21
22
  { name: '2. 管理预设', value: 'manage' },
22
23
  { name: '3. 删除配置', value: 'clear' },
23
- { name: '4. 远程配置', value: 'remote' },
24
- { name: '5. 退出', value: 'exit' }
24
+ { name: '4. 安装工具', value: 'install' },
25
+ { name: '5. 远程配置', value: 'remote' },
26
+ { name: '6. 退出', value: 'exit' }
25
27
  ]
26
28
  }]);
27
29
 
@@ -35,6 +37,9 @@ async function mainMenu() {
35
37
  case 'clear':
36
38
  await clearConfigMenu();
37
39
  break;
40
+ case 'install':
41
+ await installToolsMenu();
42
+ break;
38
43
  case 'remote':
39
44
  await remoteConfigMenu();
40
45
  break;
@@ -210,6 +215,41 @@ async function clearConfigMenu() {
210
215
  return mainMenu();
211
216
  }
212
217
 
218
+ async function installToolsMenu() {
219
+ const tool = await selectTool('选择要安装的工具:', true);
220
+ if (tool === 'back') return mainMenu();
221
+
222
+ const tools = tool === 'all' ? ['codex', 'claude', 'gemini'] : [tool];
223
+ const commands = tools.map(t => getInstallCommand(t)?.display).filter(Boolean);
224
+
225
+ console.log(chalk.cyan('\n将执行以下命令:\n'));
226
+ commands.forEach((c) => console.log(` ${c}`));
227
+
228
+ const { confirm } = await inquirer.prompt([{
229
+ type: 'confirm',
230
+ name: 'confirm',
231
+ message: '\n确认开始安装?',
232
+ default: true
233
+ }]);
234
+
235
+ if (!confirm) return mainMenu();
236
+
237
+ for (const t of tools) {
238
+ console.log(chalk.cyan(`\n开始安装 ${TOOL_NAMES[t]}...`));
239
+ try {
240
+ await installTool(t);
241
+ console.log(chalk.green(`${TOOL_NAMES[t]} 安装完成`));
242
+ } catch (err) {
243
+ const message = err instanceof Error ? err.message : String(err);
244
+ console.log(chalk.red(`${TOOL_NAMES[t]} 安装失败: ${message}`));
245
+ if (tool !== 'all') break;
246
+ }
247
+ }
248
+
249
+ await pause();
250
+ return mainMenu();
251
+ }
252
+
213
253
  async function ensureRemoteSettings() {
214
254
  let { url, password } = getRemoteSettings();
215
255
 
@@ -0,0 +1,42 @@
1
+ import { spawn } from 'child_process';
2
+
3
+ const NPM_COMMAND = process.platform === 'win32' ? 'npm.cmd' : 'npm';
4
+
5
+ const INSTALL_COMMANDS = {
6
+ codex: {
7
+ display: 'npm i -g @openai/codex',
8
+ args: ['i', '-g', '@openai/codex']
9
+ },
10
+ gemini: {
11
+ display: 'npm install -g @google/gemini-cli',
12
+ args: ['install', '-g', '@google/gemini-cli']
13
+ },
14
+ claude: {
15
+ display: 'npm install -g @anthropic-ai/claude-code',
16
+ args: ['install', '-g', '@anthropic-ai/claude-code']
17
+ }
18
+ };
19
+
20
+ export function getInstallCommand(tool) {
21
+ return INSTALL_COMMANDS[tool];
22
+ }
23
+
24
+ export async function installTool(tool) {
25
+ const cmd = getInstallCommand(tool);
26
+ if (!cmd) throw new Error(`未知工具: ${tool}`);
27
+
28
+ await new Promise((resolve, reject) => {
29
+ const child = spawn(NPM_COMMAND, cmd.args, {
30
+ stdio: 'inherit'
31
+ });
32
+
33
+ child.on('error', (err) => {
34
+ reject(err);
35
+ });
36
+ child.on('close', (code) => {
37
+ if (code === 0) return resolve();
38
+ reject(new Error(`安装失败 (exit code: ${code})`));
39
+ });
40
+ });
41
+ }
42
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liuzijian625/code-cli",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "AI CLI 配置管理工具 - 管理 Codex、Claude Code、Gemini CLI 的配置",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {