ccjk 16.0.3 → 16.0.5

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.
@@ -18,7 +18,7 @@ import i18next from 'i18next';
18
18
  import Backend from 'i18next-fs-backend';
19
19
  import { edit, stringify, parse, initSync } from '@rainbowatcher/toml-edit-js';
20
20
 
21
- const version = "16.0.3";
21
+ const version = "16.0.5";
22
22
  const homepage = "https://github.com/miounet11/ccjk#readme";
23
23
 
24
24
  const i18n = i18next.createInstance();
@@ -3902,13 +3902,18 @@ function upsertCodexMcpService(serviceId, service) {
3902
3902
  ensureDir(CODEX_DIR);
3903
3903
  writeFile(CODEX_CONFIG_FILE, "");
3904
3904
  }
3905
- let content = readFile(CODEX_CONFIG_FILE) || "";
3905
+ let content = repairBareInlineTableLines(readFile(CODEX_CONFIG_FILE) || "");
3906
3906
  const basePath = `mcp_servers.${serviceId}`;
3907
- const parsed = content ? parseToml(content) : {};
3908
- const existingService = parsed.mcp_servers?.[serviceId];
3907
+ let existingService;
3908
+ try {
3909
+ const parsed = content ? parseToml(content) : {};
3910
+ existingService = parsed.mcp_servers?.[serviceId];
3911
+ } catch {
3912
+ existingService = void 0;
3913
+ }
3909
3914
  if (existingService?.url && !existingService?.command) {
3910
3915
  if (service.env && Object.keys(service.env).length > 0) {
3911
- content = editToml(content, `${basePath}.env`, service.env);
3916
+ content = upsertMcpEnv(content, serviceId, service.env);
3912
3917
  }
3913
3918
  if (service.startup_timeout_sec) {
3914
3919
  content = editToml(content, `${basePath}.startup_timeout_sec`, service.startup_timeout_sec);
@@ -3918,7 +3923,7 @@ function upsertCodexMcpService(serviceId, service) {
3918
3923
  content = editToml(content, `${basePath}.command`, normalizedCommand);
3919
3924
  content = editToml(content, `${basePath}.args`, service.args || []);
3920
3925
  if (service.env && Object.keys(service.env).length > 0) {
3921
- content = editToml(content, `${basePath}.env`, service.env);
3926
+ content = upsertMcpEnv(content, serviceId, service.env);
3922
3927
  }
3923
3928
  if (service.startup_timeout_sec) {
3924
3929
  content = editToml(content, `${basePath}.startup_timeout_sec`, service.startup_timeout_sec);
@@ -3954,6 +3959,41 @@ function batchUpdateCodexMcpServices(services, options = {}) {
3954
3959
  function escapeRegex(str) {
3955
3960
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3956
3961
  }
3962
+ function repairBareInlineTableLines(content) {
3963
+ return content.split("\n").map((line) => {
3964
+ const match = line.match(/^(\s*)(\{.*\})\s*$/);
3965
+ if (!match)
3966
+ return line;
3967
+ const table = match[2];
3968
+ return /[A-Za-z0-9_-]+\s*=/.test(table) ? `${match[1]}env = ${table}` : line;
3969
+ }).join("\n");
3970
+ }
3971
+ function upsertMcpEnv(content, serviceId, env) {
3972
+ const sectionHeader = `[mcp_servers.${serviceId}]`;
3973
+ const sectionIndex = content.indexOf(sectionHeader);
3974
+ if (sectionIndex === -1)
3975
+ return editToml(content, `mcp_servers.${serviceId}.env`, env);
3976
+ const envLine = `env = { ${Object.entries(env).map(([key, value]) => `${formatTomlKey(key)} = ${formatTomlString(value)}`).join(", ")} }`;
3977
+ const bodyStart = sectionIndex + sectionHeader.length;
3978
+ const nextSectionOffset = content.slice(bodyStart).search(/\n\[/);
3979
+ const sectionEnd = nextSectionOffset === -1 ? content.length : bodyStart + nextSectionOffset;
3980
+ const section = content.slice(sectionIndex, sectionEnd);
3981
+ if (/^env\s*=/m.test(section)) {
3982
+ const updatedSection = section.replace(/^env\s*=.*$/m, envLine);
3983
+ return content.slice(0, sectionIndex) + updatedSection + content.slice(sectionEnd);
3984
+ }
3985
+ const insertAt = bodyStart;
3986
+ const prefix = content.slice(0, insertAt);
3987
+ const suffix = content.slice(insertAt);
3988
+ return `${prefix}
3989
+ ${envLine}${suffix}`;
3990
+ }
3991
+ function formatTomlKey(key) {
3992
+ return /^[A-Za-z0-9_-]+$/.test(key) ? key : JSON.stringify(key);
3993
+ }
3994
+ function formatTomlString(value) {
3995
+ return JSON.stringify(normalizeTomlPath(String(value)));
3996
+ }
3957
3997
 
3958
3998
  const codexTomlUpdater = {
3959
3999
  __proto__: null,
@@ -3966,6 +4006,83 @@ const codexTomlUpdater = {
3966
4006
  upsertCodexProvider: upsertCodexProvider
3967
4007
  };
3968
4008
 
4009
+ async function manageCodexMcp() {
4010
+ ensureI18nInitialized();
4011
+ const { action } = await inquirer.prompt({
4012
+ type: "list",
4013
+ name: "action",
4014
+ message: i18n.t("mcp:manageCodexMcp"),
4015
+ choices: [
4016
+ { name: i18n.t("mcp:installOrUpdateMcp"), value: "install" },
4017
+ { name: i18n.t("mcp:removeInstalledMcp"), value: "remove" },
4018
+ { name: i18n.t("mcp:listInstalledMcp"), value: "list" },
4019
+ { name: i18n.t("common:back"), value: "back" }
4020
+ ]
4021
+ });
4022
+ if (action === "install") {
4023
+ await configureCodexMcp();
4024
+ return;
4025
+ }
4026
+ if (action === "remove") {
4027
+ await removeCodexMcpServices();
4028
+ return;
4029
+ }
4030
+ if (action === "list") {
4031
+ listCodexMcpServices();
4032
+ }
4033
+ }
4034
+ function getInstalledCodexMcpServices() {
4035
+ return readCodexConfig()?.mcpServices || [];
4036
+ }
4037
+ function listCodexMcpServices() {
4038
+ const services = getInstalledCodexMcpServices();
4039
+ if (services.length === 0) {
4040
+ console.log(ansis.yellow(i18n.t("codex:noMcpConfigured")));
4041
+ return;
4042
+ }
4043
+ console.log(ansis.bold(i18n.t("mcp:installedMcpCount", { count: services.length })));
4044
+ for (const service of services) {
4045
+ const args = service.args?.length ? ` ${service.args.join(" ")}` : "";
4046
+ console.log(` ${ansis.cyan(service.id)} ${ansis.dim(`${service.command}${args}`)}`);
4047
+ }
4048
+ }
4049
+ async function removeCodexMcpServices() {
4050
+ const services = getInstalledCodexMcpServices();
4051
+ if (services.length === 0) {
4052
+ console.log(ansis.yellow(i18n.t("codex:noMcpConfigured")));
4053
+ return;
4054
+ }
4055
+ const { selected } = await inquirer.prompt({
4056
+ type: "checkbox",
4057
+ name: "selected",
4058
+ message: `${i18n.t("mcp:selectMcpServicesToRemove")}${i18n.t("common:multiSelectHint")}`,
4059
+ choices: services.sort((a, b) => a.id.localeCompare(b.id)).map((service) => ({
4060
+ name: `${service.id} - ${ansis.gray(service.command)}`,
4061
+ value: service.id
4062
+ }))
4063
+ });
4064
+ if (!selected || selected.length === 0) {
4065
+ console.log(ansis.yellow(i18n.t("common:cancelled")));
4066
+ return;
4067
+ }
4068
+ const { confirmed } = await inquirer.prompt({
4069
+ type: "confirm",
4070
+ name: "confirmed",
4071
+ message: i18n.t("mcp:confirmRemoveMcp", { services: selected.join(", ") }),
4072
+ default: true
4073
+ });
4074
+ if (!confirmed) {
4075
+ console.log(ansis.yellow(i18n.t("common:cancelled")));
4076
+ return;
4077
+ }
4078
+ const backupPath = backupCodexComplete();
4079
+ if (backupPath)
4080
+ console.log(ansis.gray(getBackupMessage(backupPath)));
4081
+ for (const id of selected)
4082
+ deleteCodexMcpService(id);
4083
+ updateCcjkConfig({ codeToolType: "codex" });
4084
+ console.log(ansis.green(i18n.t("mcp:mcpRemoved", { services: selected.join(", ") })));
4085
+ }
3969
4086
  async function configureCodexMcp(options) {
3970
4087
  ensureI18nInitialized();
3971
4088
  const { skipPrompt = false } = options ?? {};
@@ -4230,11 +4347,17 @@ function backupCodexFiles() {
4230
4347
  return cachedSkipPromptBackup;
4231
4348
  const timestamp = dayjs().format("YYYY-MM-DD_HH-mm-ss");
4232
4349
  const backupDir = createBackupDirectory(timestamp);
4233
- const tmpDir = join(CODEX_DIR, "tmp");
4234
- const filter = (path) => {
4235
- return !path.includes("/backup") && !path.startsWith(tmpDir);
4236
- };
4237
- copyDir(CODEX_DIR, backupDir, { filter });
4350
+ const files = [
4351
+ ["config.toml", CODEX_CONFIG_FILE],
4352
+ ["auth.json", CODEX_AUTH_FILE],
4353
+ ["AGENTS.md", CODEX_AGENTS_FILE]
4354
+ ];
4355
+ for (const [name, source] of files) {
4356
+ if (exists(source))
4357
+ copyFile(source, join(backupDir, name));
4358
+ }
4359
+ if (exists(CODEX_PROMPTS_DIR))
4360
+ copyDir(CODEX_PROMPTS_DIR, join(backupDir, "prompts"));
4238
4361
  if (process.env.CCJK_CODEX_SKIP_PROMPT_SINGLE_BACKUP === "true")
4239
4362
  cachedSkipPromptBackup = backupDir;
4240
4363
  return backupDir;
@@ -5634,6 +5757,7 @@ const codex = {
5634
5757
  installCodexCli: installCodexCli,
5635
5758
  isCodexInstalled: isCodexInstalled$1,
5636
5759
  listCodexProviders: listCodexProviders,
5760
+ manageCodexMcp: manageCodexMcp,
5637
5761
  migrateEnvKeyInContent: migrateEnvKeyInContent,
5638
5762
  migrateEnvKeyToTempEnvKey: migrateEnvKeyToTempEnvKey,
5639
5763
  needsEnvKeyMigration: needsEnvKeyMigration,
@@ -8330,4 +8454,4 @@ async function openSettingsJson(codeTool) {
8330
8454
  }
8331
8455
  }
8332
8456
 
8333
- export { installClaudeCode as $, AI_OUTPUT_LANGUAGES as A, buildMcpServerConfig as B, CCJK_CONFIG_DIR as C, DEFAULT_CODE_TOOL_TYPE as D, cleanupPermissions as E, commandExists as F, configureApi as G, copyConfigFiles as H, createHomebrewSymlink as I, detectInstalledVersion as J, displayVerificationResult as K, LANG_LABELS as L, ensureApiKeyApproved as M, ensureClaudeDir as N, executeInstallMethod as O, fixWindowsMcpConfig as P, getAiOutputLanguageLabel as Q, getExistingApiConfig as R, SETTINGS_FILE as S, getExistingModelConfig as T, getInstallationStatus as U, getMcpConfigPath as V, getPlatform as W, handleInstallFailure as X, importRecommendedEnv as Y, importRecommendedPermissions as Z, init as _, API_DEFAULT_URL as a, COMETIX_COMMAND_NAME as a$, installCodex as a0, isClaudeCodeInstalled as a1, isCodeToolType as a2, isCodexInstalled as a3, isLocalClaudeCodeInstalled as a4, manageApiKeyApproval as a5, mergeAndCleanPermissions as a6, mergeConfigs as a7, mergeMcpServers as a8, mergeSettingsFile as a9, exists as aA, readJsonConfig as aB, writeTomlConfig as aC, clearModelEnv as aD, normalizeClaudeFamilySettings as aE, copyFile as aF, detectConfigManagementMode as aG, readCodexConfig as aH, backupCodexComplete as aI, writeAuthFile as aJ, updateCcjkConfig as aK, changeLanguage as aL, readCcjkConfig as aM, configureOutputStyle as aN, isClaudeFamilyCodeTool as aO, isWindows as aP, selectMcpServices as aQ, getMcpServices as aR, isCcrInstalled as aS, installCcr as aT, setupCcrConfiguration as aU, modifyApiConfigPartially as aV, formatApiKeyDisplay as aW, readCcrConfig as aX, configureCcrFeature as aY, handleExitPromptError as aZ, handleGeneralError as a_, openSettingsJson as aa, promptApiConfigurationAction as ab, readMcpConfig as ac, removeApiKeyFromRejected as ad, removeLocalClaudeCode as ae, resolveCodeToolType as af, selectInstallMethod as ag, setInstallMethod as ah, setPrimaryApiKey as ai, settingsFileForTool as aj, switchToOfficialLogin$1 as ak, uninstallCodeTool as al, updateCustomModel as am, updateDefaultModel as an, verifyInstallation as ao, writeMcpConfig as ap, ensureI18nInitialized as aq, getActiveCodeTool as ar, i18n as as, addNumbersToChoices as at, validateApiKey as au, promptBoolean as av, resolveClaudeFamilySettingsTarget as aw, ensureDir as ax, readDefaultTomlConfig as ay, createDefaultTomlConfig as az, API_ENV_KEY as b, COMETIX_COMMANDS as b0, installCometixLine as b1, checkAndUpdateTools as b2, runCodexUpdate as b3, resolveCodeType as b4, writeJsonConfig as b5, displayBanner as b6, version as b7, resolveAiOutputLanguage as b8, updatePromptOnly as b9, installer as bA, selectAndInstallWorkflows as ba, checkClaudeCodeVersionAndPrompt as bb, STARTUP_CODE_TOOL_CHOICES as bc, displayBannerWithInfo as bd, runCodexUninstall as be, configureCodexMcp as bf, configureCodexApi as bg, runCodexWorkflowImportWithLanguageSelection as bh, runCodexFullInit as bi, switchCodexProvider as bj, listCodexProviders as bk, switchToOfficialLogin as bl, switchToProvider as bm, readCcjkConfigAsync as bn, initI18n as bo, selectScriptLanguage as bp, index as bq, fsOperations as br, jsonConfig as bs, claudeConfig as bt, config$1 as bu, config as bv, prompts as bw, codexProfileV2 as bx, codexTomlUpdater as by, codex as bz, CCJK_CONFIG_FILE as c, CLAUDE_DIR as d, CLAUDE_MD_FILE as e, CLAUDE_VSC_CONFIG_FILE as f, CLAVUE_CONFIG_FILE as g, CLAVUE_DIR as h, CLAVUE_MD_FILE as i, CLAVUE_SETTINGS_FILE as j, CODEX_AGENTS_FILE as k, CODEX_AUTH_FILE as l, CODEX_CONFIG_FILE as m, CODEX_DIR as n, CODEX_PROMPTS_DIR as o, CODE_TOOL_ALIASES as p, CODE_TOOL_BANNERS as q, CODE_TOOL_TYPES as r, ClAUDE_CONFIG_FILE as s, LEGACY_CCJK_CONFIG_FILES as t, SUPPORTED_LANGS as u, activeSettingsFile as v, addCompletedOnboarding as w, applyAiLanguageDirective as x, backupExistingConfig as y, backupMcpConfig as z };
8457
+ export { installClaudeCode as $, AI_OUTPUT_LANGUAGES as A, buildMcpServerConfig as B, CCJK_CONFIG_DIR as C, DEFAULT_CODE_TOOL_TYPE as D, cleanupPermissions as E, commandExists as F, configureApi as G, copyConfigFiles as H, createHomebrewSymlink as I, detectInstalledVersion as J, displayVerificationResult as K, LANG_LABELS as L, ensureApiKeyApproved as M, ensureClaudeDir as N, executeInstallMethod as O, fixWindowsMcpConfig as P, getAiOutputLanguageLabel as Q, getExistingApiConfig as R, SETTINGS_FILE as S, getExistingModelConfig as T, getInstallationStatus as U, getMcpConfigPath as V, getPlatform as W, handleInstallFailure as X, importRecommendedEnv as Y, importRecommendedPermissions as Z, init as _, API_DEFAULT_URL as a, COMETIX_COMMAND_NAME as a$, installCodex as a0, isClaudeCodeInstalled as a1, isCodeToolType as a2, isCodexInstalled as a3, isLocalClaudeCodeInstalled as a4, manageApiKeyApproval as a5, mergeAndCleanPermissions as a6, mergeConfigs as a7, mergeMcpServers as a8, mergeSettingsFile as a9, exists as aA, readJsonConfig as aB, writeTomlConfig as aC, clearModelEnv as aD, normalizeClaudeFamilySettings as aE, copyFile as aF, detectConfigManagementMode as aG, readCodexConfig as aH, backupCodexComplete as aI, writeAuthFile as aJ, updateCcjkConfig as aK, changeLanguage as aL, readCcjkConfig as aM, configureOutputStyle as aN, isClaudeFamilyCodeTool as aO, isWindows as aP, selectMcpServices as aQ, getMcpServices as aR, isCcrInstalled as aS, installCcr as aT, setupCcrConfiguration as aU, modifyApiConfigPartially as aV, formatApiKeyDisplay as aW, readCcrConfig as aX, configureCcrFeature as aY, handleExitPromptError as aZ, handleGeneralError as a_, openSettingsJson as aa, promptApiConfigurationAction as ab, readMcpConfig as ac, removeApiKeyFromRejected as ad, removeLocalClaudeCode as ae, resolveCodeToolType as af, selectInstallMethod as ag, setInstallMethod as ah, setPrimaryApiKey as ai, settingsFileForTool as aj, switchToOfficialLogin$1 as ak, uninstallCodeTool as al, updateCustomModel as am, updateDefaultModel as an, verifyInstallation as ao, writeMcpConfig as ap, ensureI18nInitialized as aq, getActiveCodeTool as ar, i18n as as, addNumbersToChoices as at, validateApiKey as au, promptBoolean as av, resolveClaudeFamilySettingsTarget as aw, ensureDir as ax, readDefaultTomlConfig as ay, createDefaultTomlConfig as az, API_ENV_KEY as b, COMETIX_COMMANDS as b0, installCometixLine as b1, checkAndUpdateTools as b2, runCodexUpdate as b3, resolveCodeType as b4, writeJsonConfig as b5, displayBanner as b6, version as b7, resolveAiOutputLanguage as b8, updatePromptOnly as b9, installer as bA, selectAndInstallWorkflows as ba, checkClaudeCodeVersionAndPrompt as bb, STARTUP_CODE_TOOL_CHOICES as bc, displayBannerWithInfo as bd, runCodexUninstall as be, manageCodexMcp as bf, configureCodexApi as bg, runCodexWorkflowImportWithLanguageSelection as bh, runCodexFullInit as bi, switchCodexProvider as bj, listCodexProviders as bk, switchToOfficialLogin as bl, switchToProvider as bm, readCcjkConfigAsync as bn, initI18n as bo, selectScriptLanguage as bp, index as bq, fsOperations as br, jsonConfig as bs, claudeConfig as bt, config$1 as bu, config as bv, prompts as bw, codexProfileV2 as bx, codexTomlUpdater as by, codex as bz, CCJK_CONFIG_FILE as c, CLAUDE_DIR as d, CLAUDE_MD_FILE as e, CLAUDE_VSC_CONFIG_FILE as f, CLAVUE_CONFIG_FILE as g, CLAVUE_DIR as h, CLAVUE_MD_FILE as i, CLAVUE_SETTINGS_FILE as j, CODEX_AGENTS_FILE as k, CODEX_AUTH_FILE as l, CODEX_CONFIG_FILE as m, CODEX_DIR as n, CODEX_PROMPTS_DIR as o, CODE_TOOL_ALIASES as p, CODE_TOOL_BANNERS as q, CODE_TOOL_TYPES as r, ClAUDE_CONFIG_FILE as s, LEGACY_CCJK_CONFIG_FILES as t, SUPPORTED_LANGS as u, activeSettingsFile as v, addCompletedOnboarding as w, applyAiLanguageDirective as x, backupExistingConfig as y, backupMcpConfig as z };
package/dist/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import cac from 'cac';
3
3
  import ansis from 'ansis';
4
- import { aq as ensureI18nInitialized, as as i18n, aX as readCcrConfig, aS as isCcrInstalled, aT as installCcr, aY as configureCcrFeature, av as promptBoolean, aZ as handleExitPromptError, a_ as handleGeneralError, a$ as COMETIX_COMMAND_NAME, b0 as COMETIX_COMMANDS, b1 as installCometixLine, at as addNumbersToChoices, b2 as checkAndUpdateTools, b3 as runCodexUpdate, b4 as resolveCodeType$1, aB as readJsonConfig, b5 as writeJsonConfig, c as CCJK_CONFIG_FILE, aM as readCcjkConfig, D as DEFAULT_CODE_TOOL_TYPE, a2 as isCodeToolType, b6 as displayBanner, aK as updateCcjkConfig, b7 as version, b8 as resolveAiOutputLanguage, aO as isClaudeFamilyCodeTool, b9 as updatePromptOnly, ba as selectAndInstallWorkflows, bb as checkClaudeCodeVersionAndPrompt, af as resolveCodeToolType$1, v as activeSettingsFile, C as CCJK_CONFIG_DIR, aL as changeLanguage, u as SUPPORTED_LANGS, L as LANG_LABELS, bc as STARTUP_CODE_TOOL_CHOICES, bd as displayBannerWithInfo, q as CODE_TOOL_BANNERS, _ as init, be as runCodexUninstall, bf as configureCodexMcp, bg as configureCodexApi, bh as runCodexWorkflowImportWithLanguageSelection, bi as runCodexFullInit, bj as switchCodexProvider, bk as listCodexProviders, aH as readCodexConfig, bl as switchToOfficialLogin, bm as switchToProvider, bn as readCcjkConfigAsync, bo as initI18n, bp as selectScriptLanguage } from './chunks/simple-config.mjs';
4
+ import { aq as ensureI18nInitialized, as as i18n, aX as readCcrConfig, aS as isCcrInstalled, aT as installCcr, aY as configureCcrFeature, av as promptBoolean, aZ as handleExitPromptError, a_ as handleGeneralError, a$ as COMETIX_COMMAND_NAME, b0 as COMETIX_COMMANDS, b1 as installCometixLine, at as addNumbersToChoices, b2 as checkAndUpdateTools, b3 as runCodexUpdate, b4 as resolveCodeType$1, aB as readJsonConfig, b5 as writeJsonConfig, c as CCJK_CONFIG_FILE, aM as readCcjkConfig, D as DEFAULT_CODE_TOOL_TYPE, a2 as isCodeToolType, b6 as displayBanner, aK as updateCcjkConfig, b7 as version, b8 as resolveAiOutputLanguage, aO as isClaudeFamilyCodeTool, b9 as updatePromptOnly, ba as selectAndInstallWorkflows, bb as checkClaudeCodeVersionAndPrompt, af as resolveCodeToolType$1, v as activeSettingsFile, C as CCJK_CONFIG_DIR, aL as changeLanguage, u as SUPPORTED_LANGS, L as LANG_LABELS, bc as STARTUP_CODE_TOOL_CHOICES, bd as displayBannerWithInfo, q as CODE_TOOL_BANNERS, _ as init, be as runCodexUninstall, bf as manageCodexMcp, bg as configureCodexApi, bh as runCodexWorkflowImportWithLanguageSelection, bi as runCodexFullInit, bj as switchCodexProvider, bk as listCodexProviders, aH as readCodexConfig, bl as switchToOfficialLogin, bm as switchToProvider, bn as readCcjkConfigAsync, bo as initI18n, bp as selectScriptLanguage } from './chunks/simple-config.mjs';
5
5
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
6
  import { homedir } from 'node:os';
7
7
  import inquirer from 'inquirer';
@@ -2205,7 +2205,7 @@ async function showCodexMenu() {
2205
2205
  await configureCodexApi();
2206
2206
  break;
2207
2207
  case "4":
2208
- await configureCodexMcp();
2208
+ await manageCodexMcp();
2209
2209
  break;
2210
2210
  case "5":
2211
2211
  await configureCodexDefaultModelFeature();
@@ -3,6 +3,14 @@
3
3
  "mcpBackupSuccess": "Original MCP config backed up",
4
4
  "mcpConfigSuccess": "MCP services configured",
5
5
  "selectMcpServices": "Select MCP services to install",
6
+ "manageCodexMcp": "Manage Codex MCP services",
7
+ "installOrUpdateMcp": "Install / update MCP",
8
+ "removeInstalledMcp": "Remove installed MCP",
9
+ "listInstalledMcp": "List installed MCP",
10
+ "selectMcpServicesToRemove": "Select MCP services to remove",
11
+ "confirmRemoveMcp": "Remove MCP: {{services}}?",
12
+ "mcpRemoved": "✔ Removed MCP: {{services}}",
13
+ "installedMcpCount": "Installed MCP ({{count}}):",
6
14
  "services.playwright.description": "Direct browser control for automation",
7
15
  "services.playwright.name": "Playwright Browser Control",
8
16
  "services.context7.description": "Query latest library documentation and code examples",
@@ -30,7 +30,7 @@
30
30
  "menuOptions.codexFullInit": "Full initialization",
31
31
  "menuOptions.codexImportWorkflow": "Import workflow",
32
32
  "menuOptions.codexConfigureApi": "Configure API",
33
- "menuOptions.codexConfigureMcp": "Configure MCP",
33
+ "menuOptions.codexConfigureMcp": "Manage MCP",
34
34
  "menuOptions.codexConfigureModel": "Configure default model",
35
35
  "menuOptions.codexConfigureAiMemory": "Configure Codex global memory",
36
36
  "menuOptions.codexUninstall": "Uninstall Codex",
@@ -45,7 +45,7 @@
45
45
  "menuDescriptions.codexFullInit": "Install Codex + Import workflow + Configure API + Configure MCP",
46
46
  "menuDescriptions.codexImportWorkflow": "Import/update Codex workflow-related files",
47
47
  "menuDescriptions.codexConfigureApi": "Configure Codex API providers",
48
- "menuDescriptions.codexConfigureMcp": "Configure Codex MCP services",
48
+ "menuDescriptions.codexConfigureMcp": "Install, list, or remove Codex MCP services",
49
49
  "menuDescriptions.codexConfigureModel": "Set default model (gpt-5.2/gpt-5.1-codex-max/gpt-5.1-codex-mini/custom)",
50
50
  "menuDescriptions.codexConfigureAiMemory": "Configure AI output language and system prompt style",
51
51
  "menuDescriptions.codexUninstall": "Remove Codex configuration and files",
@@ -3,6 +3,14 @@
3
3
  "mcpBackupSuccess": "已备份原有 MCP 配置",
4
4
  "mcpConfigSuccess": "MCP 服务已配置",
5
5
  "selectMcpServices": "选择要安装的 MCP 服务",
6
+ "manageCodexMcp": "管理 Codex MCP 服务",
7
+ "installOrUpdateMcp": "安装 / 更新 MCP",
8
+ "removeInstalledMcp": "删除已安装的 MCP",
9
+ "listInstalledMcp": "查看已安装的 MCP",
10
+ "selectMcpServicesToRemove": "选择要删除的 MCP 服务",
11
+ "confirmRemoveMcp": "确认删除 MCP:{{services}}?",
12
+ "mcpRemoved": "✔ 已删除 MCP:{{services}}",
13
+ "installedMcpCount": "已安装 MCP({{count}}):",
6
14
  "services.playwright.description": "直接控制浏览器进行自动化操作",
7
15
  "services.playwright.name": "Playwright 浏览器控制",
8
16
  "services.context7.description": "查询最新的库文档和代码示例",
@@ -30,7 +30,7 @@
30
30
  "menuOptions.codexFullInit": "完整初始化",
31
31
  "menuOptions.codexImportWorkflow": "导入工作流",
32
32
  "menuOptions.codexConfigureApi": "配置 API",
33
- "menuOptions.codexConfigureMcp": "配置 MCP",
33
+ "menuOptions.codexConfigureMcp": "管理 MCP",
34
34
  "menuOptions.codexConfigureModel": "配置默认模型",
35
35
  "menuOptions.codexConfigureAiMemory": "配置 Codex 全局记忆",
36
36
  "menuOptions.codexUninstall": "卸载 Codex",
@@ -45,7 +45,7 @@
45
45
  "menuDescriptions.codexFullInit": "安装 Codex + 导入工作流 + 配置 API + 配置 MCP 服务",
46
46
  "menuDescriptions.codexImportWorkflow": "仅导入/更新 Codex 工作流相关文件",
47
47
  "menuDescriptions.codexConfigureApi": "配置 Codex 的 API 提供商",
48
- "menuDescriptions.codexConfigureMcp": "配置 Codex 的 MCP 服务",
48
+ "menuDescriptions.codexConfigureMcp": "安装、查看或删除 Codex 的 MCP 服务",
49
49
  "menuDescriptions.codexConfigureModel": "设置默认模型(gpt-5.2/gpt-5.1-codex-max/gpt-5.1-codex-mini/自定义)",
50
50
  "menuDescriptions.codexConfigureAiMemory": "配置 AI 输出语言和系统提示词风格",
51
51
  "menuDescriptions.codexUninstall": "删除 Codex 配置和相关文件",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccjk",
3
- "version": "16.0.3",
3
+ "version": "16.0.5",
4
4
  "description": "Clavue / Claude Code / Codex / Grok CLI 统一配置工具(ccjk 交互与配置方法)",
5
5
  "type": "module",
6
6
  "bin": {