ccman 3.3.2 → 3.3.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 (2) hide show
  1. package/dist/index.js +83 -20
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "../core/package.json"() {
16
16
  package_default = {
17
17
  name: "@ccman/core",
18
- version: "3.3.2",
18
+ version: "3.3.4",
19
19
  type: "module",
20
20
  description: "Core business logic for ccman - Manage Codex, Claude Code, Gemini CLI, and MCP configurations",
21
21
  main: "./dist/index.js",
@@ -3006,7 +3006,7 @@ function printLogo() {
3006
3006
  `
3007
3007
  )
3008
3008
  );
3009
- console.log(chalk.gray(" Codex/Claude Code API \u670D\u52A1\u5546\u914D\u7F6E\u7BA1\u7406\u5DE5\u5177"));
3009
+ console.log(chalk.gray(" \u591A\u5DE5\u5177 AI \u670D\u52A1\u5546\u914D\u7F6E\u7BA1\u7406\u5DE5\u5177"));
3010
3010
  console.log(chalk.gray(` \u7248\u672C ${VERSION}
3011
3011
  `));
3012
3012
  }
@@ -6231,6 +6231,41 @@ var GMN_OPENAI_BASE_URLS = {
6231
6231
  cn: "https://gmn.chuangzuoli.cn/openai",
6232
6232
  com: "https://gmn.chuangzuoli.com"
6233
6233
  };
6234
+ var TOTAL_STEPS = 4;
6235
+ function renderStep(current, total, title) {
6236
+ const barLength = total;
6237
+ const filledLength = Math.min(current, total);
6238
+ const bar = `${"\u25A0".repeat(filledLength)}${"\u25A1".repeat(barLength - filledLength)}`;
6239
+ return `\u6B65\u9AA4 ${current}/${total} [${bar}] ${title}`;
6240
+ }
6241
+ function printBanner() {
6242
+ printLogo();
6243
+ console.log(
6244
+ chalk47.cyanBright(
6245
+ [
6246
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557",
6247
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551",
6248
+ " \u2588\u2588\u2551 \u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551",
6249
+ " \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551",
6250
+ " \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551",
6251
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D",
6252
+ " CCMAN GMN \u4E00\u952E\u914D\u7F6E\u5411\u5BFC"
6253
+ ].join("\n")
6254
+ )
6255
+ );
6256
+ console.log(chalk47.gray("\u81EA\u52A8\u5199\u5165\u9009\u4E2D\u5DE5\u5177\u914D\u7F6E\uFF0C\u652F\u6301\u591A\u9009\u4E0E\u7AEF\u70B9\u9009\u62E9\u3002\n"));
6257
+ }
6258
+ function printKeyNotice() {
6259
+ console.log(
6260
+ chalk47.yellow(
6261
+ [
6262
+ "\u63D0\u793A\uFF1ACodex \u4E0E OpenCode \u5171\u4EAB OpenAI \u5957\u9910/\u7AEF\u70B9\uFF1BGemini \u4E0E Claude \u9700\u5355\u72EC\u8BA2\u9605\u3002",
6263
+ "\u4F8B\u5982\uFF1AGemini \u5957\u9910\u4E0D\u80FD\u7528\u4E8E Codex/OpenCode\uFF0CClaude \u5957\u9910\u4E5F\u4E0D\u80FD\u901A\u7528\u3002",
6264
+ "VS Code \u7684 Codex \u63D2\u4EF6\u82E5\u4F7F\u7528\u672C\u673A\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u4E5F\u4F1A\u8DDF\u968F\u672C\u6B21\u5199\u5165\u751F\u6548\u3002"
6265
+ ].join("\n")
6266
+ )
6267
+ );
6268
+ }
6234
6269
  function parsePlatforms(platformArg) {
6235
6270
  if (platformArg === "all") {
6236
6271
  return [...VALID_PLATFORMS];
@@ -6263,13 +6298,14 @@ async function promptPlatforms() {
6263
6298
  {
6264
6299
  type: "checkbox",
6265
6300
  name: "platforms",
6266
- message: "\u9009\u62E9\u5E73\u53F0:",
6301
+ message: "\u9009\u62E9\u8981\u914D\u7F6E\u7684\u5DE5\u5177\uFF08\u53EF\u591A\u9009\uFF0C\u7A7A\u683C\u9009\u62E9 / a\u5168\u9009 / i\u53CD\u9009 / \u56DE\u8F66\u786E\u8BA4\uFF09:",
6302
+ dontShowHints: true,
6267
6303
  choices: [
6268
- { name: "Claude Code", value: "claude" },
6269
- { name: "Codex", value: "codex" },
6270
- { name: "Gemini CLI", value: "gemini" },
6271
- { name: "OpenCode", value: "opencode" },
6272
- { name: "\u5168\u90E8 (all)", value: "all" }
6304
+ { name: "Claude Code\uFF08\u9700\u5355\u72EC\u8BA2\u9605 Claude \u5957\u9910\uFF09", value: "claude" },
6305
+ { name: "Codex\uFF08\u9700\u5355\u72EC\u8BA2\u9605 OpenAI \u5957\u9910\uFF09", value: "codex" },
6306
+ { name: "Gemini CLI\uFF08\u9700\u5355\u72EC\u8BA2\u9605 Gemini \u5957\u9910\uFF09", value: "gemini" },
6307
+ { name: "OpenCode\uFF08\u4E0E Codex \u5171\u4EAB OpenAI \u5957\u9910\uFF09", value: "opencode" },
6308
+ { name: "\u5168\u90E8\uFF08\u5C06\u4F9D\u6B21\u914D\u7F6E\u6240\u6709\u5DE5\u5177\uFF09", value: "all" }
6273
6309
  ],
6274
6310
  default: DEFAULT_PLATFORMS,
6275
6311
  validate: (value) => {
@@ -6306,10 +6342,10 @@ async function resolveOpenAIDomain(domainArg, platforms) {
6306
6342
  {
6307
6343
  type: "list",
6308
6344
  name: "domain",
6309
- message: "\u9009\u62E9 Codex/OpenCode \u7684 OpenAI Base URL:",
6345
+ message: "\u9009\u62E9 Codex/OpenCode \u7684 OpenAI Base URL\uFF08\u53EA\u5F71\u54CD\u8FD9\u4E24\u4E2A\u5DE5\u5177\uFF09:",
6310
6346
  choices: [
6311
- { name: `CN ${GMN_OPENAI_BASE_URLS.cn}`, value: "cn" },
6312
- { name: `COM ${GMN_OPENAI_BASE_URLS.com}`, value: "com" }
6347
+ { name: `CN\uFF08\u56FD\u5185\uFF09 ${GMN_OPENAI_BASE_URLS.cn}`, value: "cn" },
6348
+ { name: `COM\uFF08\u56FD\u9645\uFF09 ${GMN_OPENAI_BASE_URLS.com}`, value: "com" }
6313
6349
  ],
6314
6350
  default: "cn"
6315
6351
  }
@@ -6317,24 +6353,43 @@ async function resolveOpenAIDomain(domainArg, platforms) {
6317
6353
  return answers.domain;
6318
6354
  }
6319
6355
  async function gmnCommand(apiKey, platformArg, domainArg) {
6320
- let resolvedApiKey = apiKey?.trim();
6321
- if (!resolvedApiKey) {
6322
- resolvedApiKey = await promptApiKey();
6323
- }
6356
+ printBanner();
6324
6357
  let platforms;
6325
6358
  try {
6359
+ console.log(chalk47.cyan(`
6360
+ ${renderStep(1, TOTAL_STEPS, "\u9009\u62E9\u8981\u914D\u7F6E\u7684\u5DE5\u5177")}`));
6326
6361
  platforms = await resolvePlatforms(platformArg);
6327
6362
  } catch (error) {
6328
6363
  console.error(chalk47.red(`\u274C ${error.message}`));
6329
6364
  process.exit(1);
6330
6365
  }
6366
+ console.log(chalk47.gray(`\u5DF2\u9009\u62E9: ${platforms.join(", ")}`));
6367
+ printKeyNotice();
6331
6368
  let openaiDomain;
6332
6369
  try {
6370
+ if (platforms.includes("codex") || platforms.includes("opencode")) {
6371
+ console.log(
6372
+ chalk47.cyan(`
6373
+ ${renderStep(2, TOTAL_STEPS, "\u9009\u62E9 OpenAI \u7AEF\u70B9 (\u4EC5 Codex/OpenCode)")}`)
6374
+ );
6375
+ } else {
6376
+ console.log(chalk47.cyan(`
6377
+ ${renderStep(2, TOTAL_STEPS, "\u9009\u62E9 OpenAI \u7AEF\u70B9 (\u5DF2\u8DF3\u8FC7)")}`));
6378
+ console.log(chalk47.gray("\u672A\u9009\u62E9 Codex/OpenCode\uFF0C\u5C06\u8DF3\u8FC7\u6B64\u6B65\u9AA4\u3002"));
6379
+ }
6333
6380
  openaiDomain = await resolveOpenAIDomain(domainArg, platforms);
6334
6381
  } catch (error) {
6335
6382
  console.error(chalk47.red(`\u274C ${error.message}`));
6336
6383
  process.exit(1);
6337
6384
  }
6385
+ let resolvedApiKey = apiKey?.trim();
6386
+ console.log(chalk47.cyan(`
6387
+ ${renderStep(3, TOTAL_STEPS, "\u8F93\u5165 API Key")}`));
6388
+ if (!resolvedApiKey) {
6389
+ resolvedApiKey = await promptApiKey();
6390
+ } else {
6391
+ console.log(chalk47.gray("\u5DF2\u901A\u8FC7\u53C2\u6570\u63D0\u4F9B API Key\uFF08\u5DF2\u9690\u85CF\uFF09"));
6392
+ }
6338
6393
  if (!resolvedApiKey?.trim()) {
6339
6394
  console.error(chalk47.red("\u274C \u9519\u8BEF: API Key \u4E0D\u80FD\u4E3A\u7A7A"));
6340
6395
  process.exit(1);
@@ -6346,9 +6401,13 @@ async function gmnCommand(apiKey, platformArg, domainArg) {
6346
6401
  gemini: GMN_BASE_URLS.gemini,
6347
6402
  opencode: openaiBaseUrl
6348
6403
  };
6349
- console.log(chalk47.cyan("\u{1F680} \u5F00\u59CB\u914D\u7F6E GMN..."));
6350
- console.log(chalk47.gray(`\u5E73\u53F0: ${platforms.join(", ")}
6351
- `));
6404
+ console.log(chalk47.cyan(`
6405
+ ${renderStep(4, TOTAL_STEPS, "\u5F00\u59CB\u5199\u5165\u914D\u7F6E")}`));
6406
+ console.log(chalk47.gray(`\u5DF2\u9009\u62E9\u5E73\u53F0: ${platforms.join(", ")}`));
6407
+ if (platforms.includes("codex") || platforms.includes("opencode")) {
6408
+ console.log(chalk47.gray(`OpenAI \u7AEF\u70B9: ${openaiBaseUrl}`));
6409
+ }
6410
+ console.log();
6352
6411
  const ALL_TOOLS = {
6353
6412
  claude: { name: "Claude Code", manager: createClaudeManager() },
6354
6413
  codex: { name: "Codex", manager: createCodexManager() },
@@ -6359,19 +6418,23 @@ async function gmnCommand(apiKey, platformArg, domainArg) {
6359
6418
  platform,
6360
6419
  ...ALL_TOOLS[platform]
6361
6420
  }));
6421
+ let completed = 0;
6362
6422
  for (const { platform, name, manager } of tools) {
6363
6423
  try {
6424
+ console.log(chalk47.gray(`\u2192 \u914D\u7F6E ${name}...`));
6364
6425
  const baseUrl = platformBaseUrls[platform];
6365
6426
  const existing = manager.findByName(PROVIDER_NAME);
6366
6427
  const provider = existing ? manager.edit(existing.id, { baseUrl, apiKey: resolvedApiKey }) : manager.add({ name: PROVIDER_NAME, baseUrl, apiKey: resolvedApiKey });
6367
6428
  manager.switch(provider.id);
6429
+ completed += 1;
6368
6430
  console.log(chalk47.green(`\u2705 ${name}`));
6369
6431
  } catch (error) {
6370
6432
  console.error(chalk47.red(`\u274C ${name}: ${error.message}`));
6371
6433
  }
6372
6434
  }
6373
- console.log(chalk47.green("\n\u{1F389} GMN \u914D\u7F6E\u5B8C\u6210\uFF01"));
6374
- console.log(chalk47.gray("\u63D0\u793A\uFF1A\u8BF7\u91CD\u542F\u5BF9\u5E94\u7684\u5DE5\u5177\u4EE5\u4F7F\u914D\u7F6E\u751F\u6548\u3002"));
6435
+ console.log(chalk47.green(`
6436
+ \u{1F389} GMN \u914D\u7F6E\u5B8C\u6210\uFF01(${completed}/${tools.length})`));
6437
+ console.log(chalk47.gray("\u63D0\u793A\uFF1A\u8BF7\u91CD\u542F\u5BF9\u5E94\u5DE5\u5177/\u63D2\u4EF6\u4EE5\u4F7F\u914D\u7F6E\u751F\u6548\u3002"));
6375
6438
  }
6376
6439
 
6377
6440
  // src/index.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccman",
3
- "version": "3.3.2",
3
+ "version": "3.3.4",
4
4
  "type": "module",
5
5
  "description": "Manage Codex, Claude Code, Gemini CLI, OpenCode, and MCP API service provider configurations",
6
6
  "main": "./dist/index.js",