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.
- package/dist/index.js +83 -20
- 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.
|
|
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("
|
|
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\
|
|
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
|
|
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
|
-
|
|
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(
|
|
6350
|
-
|
|
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(
|
|
6374
|
-
|
|
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
|