zcf 3.2.0 → 3.2.1

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/README.md CHANGED
@@ -122,7 +122,7 @@ When using `--skip-prompt`, the following parameters are available:
122
122
  | `--api-type, -t` | API configuration type | `auth_token`, `api_key`, `ccr_proxy`, `skip` | No | `skip` |
123
123
  | `--api-key, -k` | API key (for both API key and auth token types) | string | Required when `api-type` is not `skip` | - |
124
124
  | `--api-url, -u` | Custom API URL | URL string | No | official API |
125
- | `--mcp-services, -m` | MCP services to install (multi-select, comma-separated) | `context7`, `open-websearch`, `spec-workflow`, `mcp-deepwiki`, `Playwright`, `exa`, or `skip` for none | No | `all` |
125
+ | `--mcp-services, -m` | MCP services to install (multi-select, comma-separated) | `context7`, `open-websearch`, `spec-workflow`, `mcp-deepwiki`, `Playwright`, `exa`, `serena`, or `skip` for none | No | `all` |
126
126
  | `--workflows, -w` | Workflows to install (multi-select, comma-separated) | `commonTools`, `sixStepsWorkflow`, `featPlanUx`, `gitWorkflow`, `bmadWorkflow`, or `skip` for none | No | `all` |
127
127
  | `--output-styles, -o` | Output styles to install (multi-select, comma-separated) | `engineer-professional`, `nekomata-engineer`, `laowang-engineer`, `ojousama-engineer`, or `skip` for none | No | `all` |
128
128
  | `--default-output-style, -d` | Default output style | Same as output styles plus built-in: `default`, `explanatory`, `learning` | No | `engineer-professional` |
@@ -179,6 +179,7 @@ npx zcf → Select 4 # Configure Codex MCP services
179
179
  4. **MCP Services**: Full compatibility with existing MCP services including:
180
180
  - Context7, Open WebSearch, Spec Workflow
181
181
  - DeepWiki, Playwright, EXA search
182
+ - Serena Assistant for semantic code retrieval and editing
182
183
  - Automatic service configuration with API key management
183
184
 
184
185
  **File Locations:**
@@ -543,6 +544,7 @@ Enter your choice: _
543
544
  ◉ DeepWiki - Query GitHub repository docs and examples
544
545
  ◉ Playwright Browser Control - Direct browser automation control
545
546
  ◉ Exa AI Search - Web search using Exa AI
547
+ ◉ Serena Assistant - Semantic code retrieval and editing akin to an IDE
546
548
  ◯ Install all services
547
549
 
548
550
  ✔ MCP services configured
@@ -1,6 +1,6 @@
1
1
  import dayjs from 'dayjs';
2
2
  import { join } from 'pathe';
3
- import { j as ZCF_CONFIG_FILE, Z as ZCF_CONFIG_DIR, a6 as ensureDir, a7 as readDefaultTomlConfig, a8 as createDefaultTomlConfig, a9 as exists, aa as readJsonConfig, ab as writeTomlConfig, S as SETTINGS_FILE, ac as copyFile } from './simple-config.mjs';
3
+ import { j as ZCF_CONFIG_FILE, Z as ZCF_CONFIG_DIR, a8 as ensureDir, a9 as readDefaultTomlConfig, aa as createDefaultTomlConfig, ab as exists, ac as readJsonConfig, ad as writeTomlConfig, S as SETTINGS_FILE, ae as copyFile } from './simple-config.mjs';
4
4
  import 'node:fs';
5
5
  import 'node:process';
6
6
  import 'ansis';
@@ -182,15 +182,15 @@ class ClaudeCodeConfigManager {
182
182
  * Apply profile settings to Claude Code runtime
183
183
  */
184
184
  static async applyProfileSettings(profile) {
185
- const { ensureI18nInitialized, i18n } = await import('./simple-config.mjs').then(function (n) { return n.aY; });
185
+ const { ensureI18nInitialized, i18n } = await import('./simple-config.mjs').then(function (n) { return n.a_; });
186
186
  ensureI18nInitialized();
187
187
  try {
188
188
  if (!profile) {
189
- const { switchToOfficialLogin } = await import('./simple-config.mjs').then(function (n) { return n.b0; });
189
+ const { switchToOfficialLogin } = await import('./simple-config.mjs').then(function (n) { return n.b2; });
190
190
  switchToOfficialLogin();
191
191
  return;
192
192
  }
193
- const { readJsonConfig: readJsonConfig2, writeJsonConfig } = await import('./simple-config.mjs').then(function (n) { return n.a_; });
193
+ const { readJsonConfig: readJsonConfig2, writeJsonConfig } = await import('./simple-config.mjs').then(function (n) { return n.b0; });
194
194
  const settings = readJsonConfig2(SETTINGS_FILE) || {};
195
195
  if (!settings.env)
196
196
  settings.env = {};
@@ -202,7 +202,7 @@ class ClaudeCodeConfigManager {
202
202
  settings.env.ANTHROPIC_AUTH_TOKEN = profile.apiKey;
203
203
  delete settings.env.ANTHROPIC_API_KEY;
204
204
  } else if (profile.authType === "ccr_proxy") {
205
- const { readCcrConfig } = await import('./simple-config.mjs').then(function (n) { return n.b1; });
205
+ const { readCcrConfig } = await import('./simple-config.mjs').then(function (n) { return n.b3; });
206
206
  const ccrConfig = readCcrConfig();
207
207
  if (!ccrConfig) {
208
208
  throw new Error(i18n.t("ccr:ccrNotConfigured") || "CCR proxy configuration not found");
@@ -222,7 +222,7 @@ class ClaudeCodeConfigManager {
222
222
  delete settings.env.ANTHROPIC_BASE_URL;
223
223
  }
224
224
  writeJsonConfig(SETTINGS_FILE, settings);
225
- const { setPrimaryApiKey } = await import('./simple-config.mjs').then(function (n) { return n.a$; });
225
+ const { setPrimaryApiKey } = await import('./simple-config.mjs').then(function (n) { return n.b1; });
226
226
  setPrimaryApiKey();
227
227
  if (shouldRestartCcr) {
228
228
  const { runCcrRestart } = await import('./commands.mjs');
@@ -574,7 +574,7 @@ class ClaudeCodeConfigManager {
574
574
  */
575
575
  static async syncCcrProfile() {
576
576
  try {
577
- const { readCcrConfig } = await import('./simple-config.mjs').then(function (n) { return n.b1; });
577
+ const { readCcrConfig } = await import('./simple-config.mjs').then(function (n) { return n.b3; });
578
578
  const ccrConfig = readCcrConfig();
579
579
  if (!ccrConfig) {
580
580
  await this.ensureCcrProfileExists(ccrConfig);
@@ -1,6 +1,6 @@
1
1
  import ansis from 'ansis';
2
2
  import inquirer from 'inquirer';
3
- import { a2 as ensureI18nInitialized, a3 as i18n, a4 as addNumbersToChoices, a5 as validateApiKey } from './simple-config.mjs';
3
+ import { a4 as ensureI18nInitialized, a5 as i18n, a6 as addNumbersToChoices, a7 as validateApiKey } from './simple-config.mjs';
4
4
  import { ClaudeCodeConfigManager } from './claude-code-config-manager.mjs';
5
5
  import 'node:fs';
6
6
  import 'node:process';
@@ -1,6 +1,6 @@
1
1
  import ansis from 'ansis';
2
2
  import inquirer from 'inquirer';
3
- import { a2 as ensureI18nInitialized, ad as detectConfigManagementMode, a3 as i18n, a4 as addNumbersToChoices } from './simple-config.mjs';
3
+ import { a4 as ensureI18nInitialized, af as detectConfigManagementMode, a5 as i18n, a6 as addNumbersToChoices } from './simple-config.mjs';
4
4
  import { deleteProviders, editExistingProvider, addProviderToExisting } from './codex-provider-manager.mjs';
5
5
  import 'node:fs';
6
6
  import 'node:process';
@@ -1,4 +1,4 @@
1
- import { ae as readCodexConfig, af as backupCodexComplete, ag as writeCodexConfig, ah as writeAuthFile } from './simple-config.mjs';
1
+ import { ag as readCodexConfig, ah as backupCodexComplete, ai as writeCodexConfig, aj as writeAuthFile } from './simple-config.mjs';
2
2
  import 'node:fs';
3
3
  import 'node:process';
4
4
  import 'ansis';
@@ -2,7 +2,7 @@ import { homedir } from 'node:os';
2
2
  import { pathExists } from 'fs-extra';
3
3
  import { join } from 'pathe';
4
4
  import { exec } from 'tinyexec';
5
- import { a3 as i18n } from './simple-config.mjs';
5
+ import { a5 as i18n } from './simple-config.mjs';
6
6
  import { m as moveToTrash } from '../shared/zcf.DGjQxTq_.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:process';
@@ -1,7 +1,7 @@
1
1
  import { exec } from 'node:child_process';
2
2
  import { promisify } from 'node:util';
3
3
  import ansis from 'ansis';
4
- import { a2 as ensureI18nInitialized, a3 as i18n } from './simple-config.mjs';
4
+ import { a4 as ensureI18nInitialized, a5 as i18n } from './simple-config.mjs';
5
5
  import 'node:fs';
6
6
  import 'node:process';
7
7
  import 'inquirer';
@@ -16,7 +16,7 @@ import { rm, mkdir, copyFile as copyFile$1 } from 'node:fs/promises';
16
16
  import i18next from 'i18next';
17
17
  import Backend from 'i18next-fs-backend';
18
18
 
19
- const version = "3.2.0";
19
+ const version = "3.2.1";
20
20
  const homepage = "https://github.com/UfoMiao/zcf";
21
21
 
22
22
  const i18n = i18next.createInstance();
@@ -200,6 +200,16 @@ const MCP_SERVICE_CONFIGS = [
200
200
  EXA_API_KEY: "YOUR_EXA_API_KEY"
201
201
  }
202
202
  }
203
+ },
204
+ {
205
+ id: "serena",
206
+ requiresApiKey: false,
207
+ config: {
208
+ type: "stdio",
209
+ command: "uvx",
210
+ args: ["--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--context", "ide-assistant", "--enable-web-dashboard", "false"],
211
+ env: {}
212
+ }
203
213
  }
204
214
  ];
205
215
  async function getMcpServices() {
@@ -235,6 +245,11 @@ async function getMcpServices() {
235
245
  name: i18n.t("mcp:services.exa.name"),
236
246
  description: i18n.t("mcp:services.exa.description"),
237
247
  apiKeyPrompt: i18n.t("mcp:services.exa.apiKeyPrompt")
248
+ },
249
+ {
250
+ id: "serena",
251
+ name: i18n.t("mcp:services.serena.name"),
252
+ description: i18n.t("mcp:services.serena.description")
238
253
  }
239
254
  ];
240
255
  return MCP_SERVICE_CONFIGS.map((config) => {
@@ -385,6 +400,8 @@ const CODE_TOOL_ALIASES = {
385
400
  function isCodeToolType(value) {
386
401
  return CODE_TOOL_TYPES.includes(value);
387
402
  }
403
+ const API_DEFAULT_URL = "https://api.anthropic.com";
404
+ const API_ENV_KEY = "ANTHROPIC_API_KEY";
388
405
  function resolveCodeToolType(value) {
389
406
  if (isCodeToolType(value)) {
390
407
  return value;
@@ -420,6 +437,8 @@ function getAiOutputLanguageLabel(lang) {
420
437
  const constants = {
421
438
  __proto__: null,
422
439
  AI_OUTPUT_LANGUAGES: AI_OUTPUT_LANGUAGES,
440
+ API_DEFAULT_URL: API_DEFAULT_URL,
441
+ API_ENV_KEY: API_ENV_KEY,
423
442
  CLAUDE_DIR: CLAUDE_DIR,
424
443
  CLAUDE_MD_FILE: CLAUDE_MD_FILE,
425
444
  CLAUDE_VSC_CONFIG_FILE: CLAUDE_VSC_CONFIG_FILE,
@@ -2822,6 +2841,14 @@ async function configureCodexMcp(options) {
2822
2841
  const serviceMeta = servicesMeta.find((service) => service.id === id);
2823
2842
  let command = configInfo.config.command || id;
2824
2843
  let args = (configInfo.config.args || []).map((arg) => String(arg));
2844
+ if (id === "serena") {
2845
+ const idx = args.indexOf("--context");
2846
+ if (idx >= 0 && idx + 1 < args.length) {
2847
+ args[idx + 1] = "codex";
2848
+ } else {
2849
+ args.push("--context", "codex");
2850
+ }
2851
+ }
2825
2852
  const serviceConfig = { id: id.toLowerCase(), command, args };
2826
2853
  applyCodexPlatformCommand(serviceConfig);
2827
2854
  command = serviceConfig.command;
@@ -5063,7 +5090,7 @@ function validateSkipPromptOptions(options) {
5063
5090
  );
5064
5091
  }
5065
5092
  if (options.apiConfigs && options.apiConfigsFile) {
5066
- throw new Error("Cannot specify both --api-configs and --api-configs-file at the same time");
5093
+ throw new Error(i18n.t("multi-config:conflictingParams"));
5067
5094
  }
5068
5095
  if (options.apiType === "api_key" && !options.apiKey) {
5069
5096
  throw new Error(i18n.t("errors:apiKeyRequiredForApiKey"));
@@ -5376,13 +5403,13 @@ async function init(options = {}) {
5376
5403
  apiConfig = {
5377
5404
  authType: "auth_token",
5378
5405
  key: options.apiKey,
5379
- url: options.apiUrl || "https://api.anthropic.com"
5406
+ url: options.apiUrl || API_DEFAULT_URL
5380
5407
  };
5381
5408
  } else if (options.apiType === "api_key" && options.apiKey) {
5382
5409
  apiConfig = {
5383
5410
  authType: "api_key",
5384
5411
  key: options.apiKey,
5385
- url: options.apiUrl || "https://api.anthropic.com"
5412
+ url: options.apiUrl || API_DEFAULT_URL
5386
5413
  };
5387
5414
  } else if (options.apiType === "ccr_proxy") {
5388
5415
  const ccrStatus = await isCcrInstalled();
@@ -5536,6 +5563,16 @@ async function init(options = {}) {
5536
5563
  if (!service)
5537
5564
  continue;
5538
5565
  let config = service.config;
5566
+ if (service.id === "serena" && Array.isArray(config.args)) {
5567
+ const adjusted = { ...config, args: [...config.args || []] };
5568
+ const idx = adjusted.args.indexOf("--context");
5569
+ if (idx >= 0 && idx + 1 < adjusted.args.length) {
5570
+ adjusted.args[idx + 1] = codeToolType === "codex" ? "codex" : "ide-assistant";
5571
+ } else {
5572
+ adjusted.args.push("--context", codeToolType === "codex" ? "codex" : "ide-assistant");
5573
+ }
5574
+ config = adjusted;
5575
+ }
5539
5576
  if (service.requiresApiKey) {
5540
5577
  if (options.skipPrompt) {
5541
5578
  console.log(ansis.yellow(`${i18n.t("common:skip")}: ${service.name} (requires API key)`));
@@ -5621,7 +5658,7 @@ async function handleMultiConfigurations(options, codeToolType) {
5621
5658
  try {
5622
5659
  configs = JSON.parse(options.apiConfigs);
5623
5660
  } catch (error) {
5624
- throw new Error(`Invalid API configs JSON: ${error instanceof Error ? error.message : String(error)}`);
5661
+ throw new Error(i18n.t("multi-config:invalidJson", { error: error instanceof Error ? error.message : String(error) }));
5625
5662
  }
5626
5663
  }
5627
5664
  if (options.apiConfigsFile) {
@@ -5630,7 +5667,7 @@ async function handleMultiConfigurations(options, codeToolType) {
5630
5667
  const fileContent = readFile(options.apiConfigsFile);
5631
5668
  configs = JSON.parse(fileContent);
5632
5669
  } catch (error) {
5633
- throw new Error(`Failed to read API configs file: ${error instanceof Error ? error.message : String(error)}`);
5670
+ throw new Error(i18n.t("multi-config:fileReadFailed", { error: error instanceof Error ? error.message : String(error) }));
5634
5671
  }
5635
5672
  }
5636
5673
  validateApiConfigs(configs);
@@ -5647,22 +5684,22 @@ async function handleMultiConfigurations(options, codeToolType) {
5647
5684
  }
5648
5685
  function validateApiConfigs(configs) {
5649
5686
  if (!Array.isArray(configs)) {
5650
- throw new TypeError("API configs must be an array");
5687
+ throw new TypeError(i18n.t("multi-config:mustBeArray"));
5651
5688
  }
5652
5689
  const names = /* @__PURE__ */ new Set();
5653
5690
  for (const config of configs) {
5654
5691
  if (!config.name || typeof config.name !== "string" || config.name.trim() === "") {
5655
- throw new Error("Each config must have a valid name");
5692
+ throw new Error(i18n.t("multi-config:mustHaveValidName"));
5656
5693
  }
5657
5694
  if (!["api_key", "auth_token", "ccr_proxy"].includes(config.type)) {
5658
- throw new Error(`Invalid auth type: ${config.type}`);
5695
+ throw new Error(i18n.t("multi-config:invalidAuthType", { type: config.type }));
5659
5696
  }
5660
5697
  if (names.has(config.name)) {
5661
- throw new Error(`Duplicate config name: ${config.name}`);
5698
+ throw new Error(i18n.t("multi-config:duplicateName", { name: config.name }));
5662
5699
  }
5663
5700
  names.add(config.name);
5664
5701
  if (config.type !== "ccr_proxy" && !config.key) {
5665
- throw new Error(`Config "${config.name}" requires API key`);
5702
+ throw new Error(i18n.t("multi-config:configApiKeyRequired", { name: config.name }));
5666
5703
  }
5667
5704
  }
5668
5705
  }
@@ -5671,12 +5708,12 @@ async function handleClaudeCodeConfigs(configs) {
5671
5708
  const addedProfiles = [];
5672
5709
  for (const config of configs) {
5673
5710
  if (config.type === "ccr_proxy") {
5674
- throw new Error(`CCR proxy type is reserved and cannot be added manually (config: "${config.name}")`);
5711
+ throw new Error(i18n.t("multi-config:ccrProxyReserved", { name: config.name }));
5675
5712
  }
5676
5713
  const profile = await convertToClaudeCodeProfile(config);
5677
5714
  const result = await ClaudeCodeConfigManager.addProfile(profile);
5678
5715
  if (!result.success) {
5679
- throw new Error(`Failed to add profile "${config.name}": ${result.error}`);
5716
+ throw new Error(i18n.t("multi-config:configProfileAddFailed", { name: config.name, error: result.error }));
5680
5717
  }
5681
5718
  const storedProfile = result.addedProfile || ClaudeCodeConfigManager.getProfileByName(config.name) || profile;
5682
5719
  addedProfiles.push(storedProfile);
@@ -5704,11 +5741,14 @@ async function handleCodexConfigs(configs) {
5704
5741
  const provider = convertToCodexProvider(config);
5705
5742
  const result = await addProviderToExisting(provider, config.key || "");
5706
5743
  if (!result.success) {
5707
- throw new Error(`Failed to add provider "${config.name}": ${result.error}`);
5744
+ throw new Error(i18n.t("multi-config:providerAddFailed", { name: config.name, error: result.error }));
5708
5745
  }
5709
5746
  console.log(ansis.green(`\u2714 ${i18n.t("multi-config:providerAdded", { name: config.name })}`));
5710
5747
  } catch (error) {
5711
- console.error(ansis.red(`Failed to add provider "${config.name}": ${error instanceof Error ? error.message : String(error)}`));
5748
+ console.error(ansis.red(i18n.t("multi-config:providerAddFailed", {
5749
+ name: config.name,
5750
+ error: error instanceof Error ? error.message : String(error)
5751
+ })));
5712
5752
  throw error;
5713
5753
  }
5714
5754
  }
@@ -5734,9 +5774,9 @@ function convertToCodexProvider(config) {
5734
5774
  return {
5735
5775
  id: config.name.toLowerCase().replace(/[^a-z0-9]/g, "-"),
5736
5776
  name: config.name,
5737
- baseUrl: config.url || "https://api.anthropic.com",
5777
+ baseUrl: config.url || API_DEFAULT_URL,
5738
5778
  wireApi: "chat",
5739
- envKey: "ANTHROPIC_API_KEY",
5779
+ envKey: API_ENV_KEY,
5740
5780
  requiresOpenaiAuth: false
5741
5781
  };
5742
5782
  }
@@ -5819,4 +5859,4 @@ async function openSettingsJson() {
5819
5859
  }
5820
5860
  }
5821
5861
 
5822
- export { isLocalClaudeCodeInstalled as $, AI_OUTPUT_LANGUAGES as A, fixWindowsMcpConfig as B, CLAUDE_DIR as C, DEFAULT_CODE_TOOL_TYPE as D, addCompletedOnboarding as E, ensureApiKeyApproved as F, removeApiKeyFromRejected as G, manageApiKeyApproval as H, setPrimaryApiKey as I, ensureClaudeDir as J, backupExistingConfig as K, LEGACY_ZCF_CONFIG_FILES as L, copyConfigFiles as M, configureApi as N, mergeConfigs as O, updateCustomModel as P, updateDefaultModel as Q, mergeSettingsFile as R, SETTINGS_FILE as S, getExistingModelConfig as T, getExistingApiConfig as U, applyAiLanguageDirective as V, switchToOfficialLogin$1 as W, promptApiConfigurationAction as X, isClaudeCodeInstalled as Y, ZCF_CONFIG_DIR as Z, installClaudeCode as _, commandExists as a, claudeConfig as a$, getInstallationStatus as a0, removeLocalClaudeCode as a1, ensureI18nInitialized as a2, i18n as a3, addNumbersToChoices as a4, validateApiKey as a5, ensureDir as a6, readDefaultTomlConfig as a7, createDefaultTomlConfig as a8, exists as a9, installCometixLine as aA, checkAndUpdateTools as aB, runCodexUpdate as aC, resolveCodeType as aD, writeJsonConfig as aE, displayBanner as aF, version as aG, resolveAiOutputLanguage as aH, updatePromptOnly as aI, selectAndInstallWorkflows as aJ, checkClaudeCodeVersionAndPrompt as aK, displayBannerWithInfo as aL, runCodexUninstall as aM, configureCodexMcp as aN, configureCodexApi as aO, runCodexWorkflowImportWithLanguageSelection as aP, runCodexFullInit as aQ, switchCodexProvider as aR, listCodexProviders as aS, switchToOfficialLogin as aT, switchToProvider as aU, readZcfConfigAsync as aV, initI18n as aW, selectScriptLanguage as aX, index as aY, fsOperations as aZ, jsonConfig as a_, readJsonConfig as aa, writeTomlConfig as ab, copyFile as ac, detectConfigManagementMode as ad, readCodexConfig as ae, backupCodexComplete as af, writeCodexConfig as ag, writeAuthFile as ah, readCcrConfig as ai, isCcrInstalled as aj, installCcr as ak, configureCcrFeature as al, handleExitPromptError as am, handleGeneralError as an, updateZcfConfig as ao, changeLanguage as ap, readZcfConfig as aq, configureOutputStyle as ar, isWindows as as, selectMcpServices as at, getMcpServices as au, setupCcrConfiguration as av, modifyApiConfigPartially as aw, formatApiKeyDisplay as ax, COMETIX_COMMAND_NAME as ay, COMETIX_COMMANDS as az, importRecommendedEnv as b, config$1 as b0, config as b1, prompts as b2, codex as b3, cleanupPermissions as c, importRecommendedPermissions as d, CLAUDE_MD_FILE as e, ClAUDE_CONFIG_FILE as f, getPlatform as g, CLAUDE_VSC_CONFIG_FILE as h, init as i, ZCF_CONFIG_FILE as j, CODE_TOOL_TYPES as k, CODE_TOOL_BANNERS as l, mergeAndCleanPermissions as m, CODE_TOOL_ALIASES as n, openSettingsJson as o, isCodeToolType as p, SUPPORTED_LANGS as q, resolveCodeToolType as r, LANG_LABELS as s, getAiOutputLanguageLabel as t, getMcpConfigPath as u, readMcpConfig as v, writeMcpConfig as w, backupMcpConfig as x, mergeMcpServers as y, buildMcpServerConfig as z };
5862
+ export { isClaudeCodeInstalled as $, API_DEFAULT_URL as A, mergeMcpServers as B, CLAUDE_DIR as C, DEFAULT_CODE_TOOL_TYPE as D, buildMcpServerConfig as E, fixWindowsMcpConfig as F, addCompletedOnboarding as G, ensureApiKeyApproved as H, removeApiKeyFromRejected as I, manageApiKeyApproval as J, setPrimaryApiKey as K, LEGACY_ZCF_CONFIG_FILES as L, ensureClaudeDir as M, backupExistingConfig as N, copyConfigFiles as O, configureApi as P, mergeConfigs as Q, updateCustomModel as R, SETTINGS_FILE as S, updateDefaultModel as T, mergeSettingsFile as U, getExistingModelConfig as V, getExistingApiConfig as W, applyAiLanguageDirective as X, switchToOfficialLogin$1 as Y, ZCF_CONFIG_DIR as Z, promptApiConfigurationAction as _, commandExists as a, fsOperations as a$, installClaudeCode as a0, isLocalClaudeCodeInstalled as a1, getInstallationStatus as a2, removeLocalClaudeCode as a3, ensureI18nInitialized as a4, i18n as a5, addNumbersToChoices as a6, validateApiKey as a7, ensureDir as a8, readDefaultTomlConfig as a9, COMETIX_COMMAND_NAME as aA, COMETIX_COMMANDS as aB, installCometixLine as aC, checkAndUpdateTools as aD, runCodexUpdate as aE, resolveCodeType as aF, writeJsonConfig as aG, displayBanner as aH, version as aI, resolveAiOutputLanguage as aJ, updatePromptOnly as aK, selectAndInstallWorkflows as aL, checkClaudeCodeVersionAndPrompt as aM, displayBannerWithInfo as aN, runCodexUninstall as aO, configureCodexMcp as aP, configureCodexApi as aQ, runCodexWorkflowImportWithLanguageSelection as aR, runCodexFullInit as aS, switchCodexProvider as aT, listCodexProviders as aU, switchToOfficialLogin as aV, switchToProvider as aW, readZcfConfigAsync as aX, initI18n as aY, selectScriptLanguage as aZ, index as a_, createDefaultTomlConfig as aa, exists as ab, readJsonConfig as ac, writeTomlConfig as ad, copyFile as ae, detectConfigManagementMode as af, readCodexConfig as ag, backupCodexComplete as ah, writeCodexConfig as ai, writeAuthFile as aj, readCcrConfig as ak, isCcrInstalled as al, installCcr as am, configureCcrFeature as an, handleExitPromptError as ao, handleGeneralError as ap, updateZcfConfig as aq, changeLanguage as ar, readZcfConfig as as, configureOutputStyle as at, isWindows as au, selectMcpServices as av, getMcpServices as aw, setupCcrConfiguration as ax, modifyApiConfigPartially as ay, formatApiKeyDisplay as az, importRecommendedEnv as b, jsonConfig as b0, claudeConfig as b1, config$1 as b2, config as b3, prompts as b4, codex as b5, cleanupPermissions as c, importRecommendedPermissions as d, CLAUDE_MD_FILE as e, ClAUDE_CONFIG_FILE as f, getPlatform as g, CLAUDE_VSC_CONFIG_FILE as h, init as i, ZCF_CONFIG_FILE as j, CODE_TOOL_TYPES as k, CODE_TOOL_BANNERS as l, mergeAndCleanPermissions as m, CODE_TOOL_ALIASES as n, openSettingsJson as o, isCodeToolType as p, API_ENV_KEY as q, resolveCodeToolType as r, SUPPORTED_LANGS as s, LANG_LABELS as t, AI_OUTPUT_LANGUAGES as u, getAiOutputLanguageLabel as v, getMcpConfigPath as w, readMcpConfig as x, writeMcpConfig 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 { a2 as ensureI18nInitialized, a3 as i18n, ai as readCcrConfig, aj as isCcrInstalled, ak as installCcr, al as configureCcrFeature, am as handleExitPromptError, an as handleGeneralError, q as SUPPORTED_LANGS, a4 as addNumbersToChoices, s as LANG_LABELS, ao as updateZcfConfig, ap as changeLanguage, aq as readZcfConfig, o as openSettingsJson, d as importRecommendedPermissions, b as importRecommendedEnv, V as applyAiLanguageDirective, ar as configureOutputStyle, T as getExistingModelConfig, P as updateCustomModel, Q as updateDefaultModel, as as isWindows, v as readMcpConfig, B as fixWindowsMcpConfig, w as writeMcpConfig, at as selectMcpServices, x as backupMcpConfig, au as getMcpServices, z as buildMcpServerConfig, y as mergeMcpServers, av as setupCcrConfiguration, U as getExistingApiConfig, X as promptApiConfigurationAction, aw as modifyApiConfigPartially, a5 as validateApiKey, N as configureApi, ax as formatApiKeyDisplay, W as switchToOfficialLogin, ay as COMETIX_COMMAND_NAME, az as COMETIX_COMMANDS, aA as installCometixLine, aB as checkAndUpdateTools, aC as runCodexUpdate, aD as resolveCodeType$1, aa as readJsonConfig, aE as writeJsonConfig, j as ZCF_CONFIG_FILE, aF as displayBanner, aG as version, aH as resolveAiOutputLanguage, aI as updatePromptOnly, aJ as selectAndInstallWorkflows, aK as checkClaudeCodeVersionAndPrompt, r as resolveCodeToolType$1, D as DEFAULT_CODE_TOOL_TYPE, p as isCodeToolType, aL as displayBannerWithInfo, l as CODE_TOOL_BANNERS, aM as runCodexUninstall, aN as configureCodexMcp, aO as configureCodexApi, aP as runCodexWorkflowImportWithLanguageSelection, aQ as runCodexFullInit, i as init, aR as switchCodexProvider, aS as listCodexProviders, ae as readCodexConfig, aT as switchToOfficialLogin$1, aU as switchToProvider, aV as readZcfConfigAsync, aW as initI18n, aX as selectScriptLanguage } from './chunks/simple-config.mjs';
4
+ import { a4 as ensureI18nInitialized, a5 as i18n, ak as readCcrConfig, al as isCcrInstalled, am as installCcr, an as configureCcrFeature, ao as handleExitPromptError, ap as handleGeneralError, s as SUPPORTED_LANGS, a6 as addNumbersToChoices, t as LANG_LABELS, aq as updateZcfConfig, ar as changeLanguage, as as readZcfConfig, o as openSettingsJson, d as importRecommendedPermissions, b as importRecommendedEnv, X as applyAiLanguageDirective, at as configureOutputStyle, V as getExistingModelConfig, R as updateCustomModel, T as updateDefaultModel, au as isWindows, x as readMcpConfig, F as fixWindowsMcpConfig, y as writeMcpConfig, av as selectMcpServices, z as backupMcpConfig, aw as getMcpServices, E as buildMcpServerConfig, B as mergeMcpServers, ax as setupCcrConfiguration, W as getExistingApiConfig, _ as promptApiConfigurationAction, ay as modifyApiConfigPartially, a7 as validateApiKey, P as configureApi, az as formatApiKeyDisplay, Y as switchToOfficialLogin, aA as COMETIX_COMMAND_NAME, aB as COMETIX_COMMANDS, aC as installCometixLine, aD as checkAndUpdateTools, aE as runCodexUpdate, aF as resolveCodeType$1, ac as readJsonConfig, aG as writeJsonConfig, j as ZCF_CONFIG_FILE, aH as displayBanner, aI as version, aJ as resolveAiOutputLanguage, aK as updatePromptOnly, aL as selectAndInstallWorkflows, aM as checkClaudeCodeVersionAndPrompt, r as resolveCodeToolType$1, D as DEFAULT_CODE_TOOL_TYPE, p as isCodeToolType, aN as displayBannerWithInfo, l as CODE_TOOL_BANNERS, aO as runCodexUninstall, aP as configureCodexMcp, aQ as configureCodexApi, aR as runCodexWorkflowImportWithLanguageSelection, aS as runCodexFullInit, i as init, aT as switchCodexProvider, aU as listCodexProviders, ag as readCodexConfig, aV as switchToOfficialLogin$1, aW as switchToProvider, aX as readZcfConfigAsync, aY as initI18n, aZ as selectScriptLanguage } from './chunks/simple-config.mjs';
5
5
  import { existsSync } from 'node:fs';
6
6
  import { homedir } from 'node:os';
7
7
  import inquirer from 'inquirer';
@@ -465,7 +465,7 @@ ${ansis.blue(`\u2139 ${i18n.t("configuration:existingLanguageConfig") || "Existi
465
465
  return;
466
466
  }
467
467
  }
468
- const { selectAiOutputLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b2; });
468
+ const { selectAiOutputLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b4; });
469
469
  const aiOutputLang = await selectAiOutputLanguage();
470
470
  applyAiLanguageDirective(aiOutputLang);
471
471
  updateZcfConfig({ aiOutputLang });
@@ -498,7 +498,7 @@ async function changeScriptLanguageFeature(currentLang) {
498
498
  }
499
499
  async function configureCodexDefaultModelFeature() {
500
500
  ensureI18nInitialized();
501
- const { readCodexConfig } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b3; });
501
+ const { readCodexConfig } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b5; });
502
502
  const existingConfig = readCodexConfig();
503
503
  const currentModel = existingConfig?.model;
504
504
  if (currentModel) {
@@ -603,7 +603,7 @@ ${ansis.blue(`\u2139 ${i18n.t("configuration:existingLanguageConfig") || "Existi
603
603
  return;
604
604
  }
605
605
  }
606
- const { selectAiOutputLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b2; });
606
+ const { selectAiOutputLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b4; });
607
607
  const aiOutputLang = await selectAiOutputLanguage();
608
608
  await updateCodexLanguageDirective(aiOutputLang);
609
609
  updateZcfConfig({ aiOutputLang });
@@ -611,14 +611,14 @@ ${ansis.blue(`\u2139 ${i18n.t("configuration:existingLanguageConfig") || "Existi
611
611
  } else if (option === "systemPrompt") {
612
612
  const zcfConfig = readZcfConfig();
613
613
  const currentLang = zcfConfig?.aiOutputLang || "English";
614
- const { runCodexSystemPromptSelection } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b3; });
614
+ const { runCodexSystemPromptSelection } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b5; });
615
615
  await runCodexSystemPromptSelection();
616
616
  await ensureLanguageDirectiveInAgents(currentLang);
617
617
  console.log(ansis.green(`\u2714 ${i18n.t("configuration:systemPromptConfigured")}`));
618
618
  }
619
619
  }
620
620
  async function updateCodexModelProvider(modelProvider) {
621
- const { readCodexConfig, writeCodexConfig, backupCodexConfig, getBackupMessage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b3; });
621
+ const { readCodexConfig, writeCodexConfig, backupCodexConfig, getBackupMessage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b5; });
622
622
  const backupPath = backupCodexConfig();
623
623
  if (backupPath) {
624
624
  console.log(ansis.gray(getBackupMessage(backupPath)));
@@ -639,7 +639,7 @@ async function updateCodexModelProvider(modelProvider) {
639
639
  writeCodexConfig(updatedConfig);
640
640
  }
641
641
  async function ensureLanguageDirectiveInAgents(aiOutputLang) {
642
- const { readFile, writeFile, exists } = await import('./chunks/simple-config.mjs').then(function (n) { return n.aZ; });
642
+ const { readFile, writeFile, exists } = await import('./chunks/simple-config.mjs').then(function (n) { return n.a$; });
643
643
  const { homedir } = await import('node:os');
644
644
  const { join } = await import('pathe');
645
645
  const CODEX_AGENTS_FILE = join(homedir(), ".codex", "AGENTS.md");
@@ -657,7 +657,7 @@ async function ensureLanguageDirectiveInAgents(aiOutputLang) {
657
657
  const langLabel = languageLabels[aiOutputLang] || aiOutputLang;
658
658
  const hasLanguageDirective = /\*\*Most Important:\s*Always respond in [^*]+\*\*/i.test(content);
659
659
  if (!hasLanguageDirective) {
660
- const { backupCodexAgents, getBackupMessage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b3; });
660
+ const { backupCodexAgents, getBackupMessage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b5; });
661
661
  const backupPath = backupCodexAgents();
662
662
  if (backupPath) {
663
663
  console.log(ansis.gray(getBackupMessage(backupPath)));
@@ -674,8 +674,8 @@ async function ensureLanguageDirectiveInAgents(aiOutputLang) {
674
674
  }
675
675
  }
676
676
  async function updateCodexLanguageDirective(aiOutputLang) {
677
- const { readFile, writeFile, exists } = await import('./chunks/simple-config.mjs').then(function (n) { return n.aZ; });
678
- const { backupCodexAgents, getBackupMessage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b3; });
677
+ const { readFile, writeFile, exists } = await import('./chunks/simple-config.mjs').then(function (n) { return n.a$; });
678
+ const { backupCodexAgents, getBackupMessage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b5; });
679
679
  const { homedir } = await import('node:os');
680
680
  const { join } = await import('pathe');
681
681
  const CODEX_AGENTS_FILE = join(homedir(), ".codex", "AGENTS.md");
@@ -1784,7 +1784,7 @@ async function update(options = {}) {
1784
1784
  }
1785
1785
  return;
1786
1786
  }
1787
- const { resolveTemplateLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b2; });
1787
+ const { resolveTemplateLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.b4; });
1788
1788
  const configLang = await resolveTemplateLanguage(
1789
1789
  options.configLang,
1790
1790
  // Command line option
@@ -16,6 +16,8 @@
16
16
  "services.mcp-deepwiki.name": "DeepWiki",
17
17
  "services.spec-workflow.description": "Structured feature development workflow, systematic approach from requirements to implementation",
18
18
  "services.spec-workflow.name": "Spec Workflow",
19
+ "services.serena.name": "Serena Assistant",
20
+ "services.serena.description": "Semantic code retrieval and editing akin to an IDE; extracts symbol-level entities and leverages relations to greatly improve token efficiency with coding agents",
19
21
  "apiKeyApprovalFailed": "Failed to manage API key approval status",
20
22
  "apiKeyPrompt": "Enter API Key",
21
23
  "primaryApiKeySetFailed": "Failed to set primaryApiKey"
@@ -57,5 +57,16 @@
57
57
  "newDefaultProfile": "ℹ️ New default profile: {{profile}}",
58
58
  "settingsApplied": "✔ Settings applied",
59
59
  "failedToApplySettings": "Failed to apply settings",
60
- "profileNameNotFound": "Profile \"{{name}}\" not found"
60
+ "profileNameNotFound": "Profile \"{{name}}\" not found",
61
+ "conflictingParams": "Cannot specify both --api-configs and --api-configs-file at the same time",
62
+ "mustBeArray": "API configs must be an array",
63
+ "mustHaveValidName": "Each config must have a valid name",
64
+ "invalidAuthType": "Invalid auth type: {{type}}",
65
+ "duplicateName": "Duplicate config name: {{name}}",
66
+ "configApiKeyRequired": "Config \"{{name}}\" requires API key",
67
+ "ccrProxyReserved": "CCR proxy type is reserved and cannot be added manually (config: \"{{name}}\")",
68
+ "configProfileAddFailed": "Failed to add profile \"{{name}}\": {{error}}",
69
+ "providerAddFailed": "Failed to add provider \"{{name}}\": {{error}}",
70
+ "invalidJson": "Invalid API configs JSON: {{error}}",
71
+ "fileReadFailed": "Failed to read API configs file: {{error}}"
61
72
  }
@@ -16,6 +16,8 @@
16
16
  "services.mcp-deepwiki.name": "DeepWiki",
17
17
  "services.spec-workflow.description": "规范化特性开发工作流程,从需求到实现的系统化方法",
18
18
  "services.spec-workflow.name": "Spec 工作流",
19
+ "services.serena.name": "Serena 助手",
20
+ "services.serena.description": "提供类似 IDE 的语义代码检索与编辑,支持符号级实体提取与关系结构利用;与现有编码代理配合可显著提升标记效率",
19
21
  "apiKeyApprovalFailed": "API密钥批准状态管理失败",
20
22
  "apiKeyPrompt": "请输入 API Key",
21
23
  "primaryApiKeySetFailed": "设置 primaryApiKey 失败"
@@ -57,5 +57,16 @@
57
57
  "newDefaultProfile": "ℹ️ 新的默认配置:{{profile}}",
58
58
  "settingsApplied": "✔ 设置已生效",
59
59
  "failedToApplySettings": "应用设置失败",
60
- "profileNameNotFound": "未找到名为「{{name}}」的配置"
60
+ "profileNameNotFound": "未找到名为「{{name}}」的配置",
61
+ "conflictingParams": "不能同时指定 --api-configs 和 --api-configs-file",
62
+ "mustBeArray": "API配置必须是数组格式",
63
+ "mustHaveValidName": "每个配置必须具有有效的名称",
64
+ "invalidAuthType": "无效的认证类型:{{type}}",
65
+ "duplicateName": "重复的配置名称:{{name}}",
66
+ "configApiKeyRequired": "配置 \"{{name}}\" 需要API密钥",
67
+ "ccrProxyReserved": "CCR代理类型为保留类型,不能手动添加(配置:\"{{name}}\")",
68
+ "configProfileAddFailed": "添加配置文件 \"{{name}}\" 失败:{{error}}",
69
+ "providerAddFailed": "添加提供商 \"{{name}}\" 失败:{{error}}",
70
+ "invalidJson": "无效的API配置JSON:{{error}}",
71
+ "fileReadFailed": "读取API配置文件失败:{{error}}"
61
72
  }
package/dist/index.d.mts CHANGED
@@ -12,6 +12,8 @@ declare const DEFAULT_CODE_TOOL_TYPE: CodeToolType;
12
12
  declare const CODE_TOOL_BANNERS: Record<CodeToolType, string>;
13
13
  declare const CODE_TOOL_ALIASES: Record<string, CodeToolType>;
14
14
  declare function isCodeToolType(value: any): value is CodeToolType;
15
+ declare const API_DEFAULT_URL = "https://api.anthropic.com";
16
+ declare const API_ENV_KEY = "ANTHROPIC_API_KEY";
15
17
  declare function resolveCodeToolType(value: unknown): CodeToolType;
16
18
  declare const SUPPORTED_LANGS: readonly ["zh-CN", "en"];
17
19
  type SupportedLang = (typeof SUPPORTED_LANGS)[number];
@@ -218,5 +220,5 @@ declare function importRecommendedEnv(): Promise<void>;
218
220
  declare function importRecommendedPermissions(): Promise<void>;
219
221
  declare function openSettingsJson(): Promise<void>;
220
222
 
221
- export { AI_OUTPUT_LANGUAGES, CLAUDE_DIR, CLAUDE_MD_FILE, CLAUDE_VSC_CONFIG_FILE, CODE_TOOL_ALIASES, CODE_TOOL_BANNERS, CODE_TOOL_TYPES, ClAUDE_CONFIG_FILE, DEFAULT_CODE_TOOL_TYPE, LANG_LABELS, LEGACY_ZCF_CONFIG_FILES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_DIR, ZCF_CONFIG_FILE, addCompletedOnboarding, applyAiLanguageDirective, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, cleanupPermissions, commandExists, configureApi, copyConfigFiles, ensureApiKeyApproved, ensureClaudeDir, fixWindowsMcpConfig, getAiOutputLanguageLabel, getExistingApiConfig, getExistingModelConfig, getInstallationStatus, getMcpConfigPath, getPlatform, importRecommendedEnv, importRecommendedPermissions, init, installClaudeCode, isClaudeCodeInstalled, isCodeToolType, isLocalClaudeCodeInstalled, manageApiKeyApproval, mergeAndCleanPermissions, mergeConfigs, mergeMcpServers, mergeSettingsFile, openSettingsJson, promptApiConfigurationAction, readMcpConfig, removeApiKeyFromRejected, removeLocalClaudeCode, resolveCodeToolType, setPrimaryApiKey, switchToOfficialLogin, updateCustomModel, updateDefaultModel, writeMcpConfig };
223
+ export { AI_OUTPUT_LANGUAGES, API_DEFAULT_URL, API_ENV_KEY, CLAUDE_DIR, CLAUDE_MD_FILE, CLAUDE_VSC_CONFIG_FILE, CODE_TOOL_ALIASES, CODE_TOOL_BANNERS, CODE_TOOL_TYPES, ClAUDE_CONFIG_FILE, DEFAULT_CODE_TOOL_TYPE, LANG_LABELS, LEGACY_ZCF_CONFIG_FILES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_DIR, ZCF_CONFIG_FILE, addCompletedOnboarding, applyAiLanguageDirective, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, cleanupPermissions, commandExists, configureApi, copyConfigFiles, ensureApiKeyApproved, ensureClaudeDir, fixWindowsMcpConfig, getAiOutputLanguageLabel, getExistingApiConfig, getExistingModelConfig, getInstallationStatus, getMcpConfigPath, getPlatform, importRecommendedEnv, importRecommendedPermissions, init, installClaudeCode, isClaudeCodeInstalled, isCodeToolType, isLocalClaudeCodeInstalled, manageApiKeyApproval, mergeAndCleanPermissions, mergeConfigs, mergeMcpServers, mergeSettingsFile, openSettingsJson, promptApiConfigurationAction, readMcpConfig, removeApiKeyFromRejected, removeLocalClaudeCode, resolveCodeToolType, setPrimaryApiKey, switchToOfficialLogin, updateCustomModel, updateDefaultModel, writeMcpConfig };
222
224
  export type { AiOutputLanguage, ApiConfig, ClaudeConfiguration, CodeToolType, InstallationStatus, McpServerConfig, McpService, SupportedLang };
package/dist/index.d.ts CHANGED
@@ -12,6 +12,8 @@ declare const DEFAULT_CODE_TOOL_TYPE: CodeToolType;
12
12
  declare const CODE_TOOL_BANNERS: Record<CodeToolType, string>;
13
13
  declare const CODE_TOOL_ALIASES: Record<string, CodeToolType>;
14
14
  declare function isCodeToolType(value: any): value is CodeToolType;
15
+ declare const API_DEFAULT_URL = "https://api.anthropic.com";
16
+ declare const API_ENV_KEY = "ANTHROPIC_API_KEY";
15
17
  declare function resolveCodeToolType(value: unknown): CodeToolType;
16
18
  declare const SUPPORTED_LANGS: readonly ["zh-CN", "en"];
17
19
  type SupportedLang = (typeof SUPPORTED_LANGS)[number];
@@ -218,5 +220,5 @@ declare function importRecommendedEnv(): Promise<void>;
218
220
  declare function importRecommendedPermissions(): Promise<void>;
219
221
  declare function openSettingsJson(): Promise<void>;
220
222
 
221
- export { AI_OUTPUT_LANGUAGES, CLAUDE_DIR, CLAUDE_MD_FILE, CLAUDE_VSC_CONFIG_FILE, CODE_TOOL_ALIASES, CODE_TOOL_BANNERS, CODE_TOOL_TYPES, ClAUDE_CONFIG_FILE, DEFAULT_CODE_TOOL_TYPE, LANG_LABELS, LEGACY_ZCF_CONFIG_FILES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_DIR, ZCF_CONFIG_FILE, addCompletedOnboarding, applyAiLanguageDirective, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, cleanupPermissions, commandExists, configureApi, copyConfigFiles, ensureApiKeyApproved, ensureClaudeDir, fixWindowsMcpConfig, getAiOutputLanguageLabel, getExistingApiConfig, getExistingModelConfig, getInstallationStatus, getMcpConfigPath, getPlatform, importRecommendedEnv, importRecommendedPermissions, init, installClaudeCode, isClaudeCodeInstalled, isCodeToolType, isLocalClaudeCodeInstalled, manageApiKeyApproval, mergeAndCleanPermissions, mergeConfigs, mergeMcpServers, mergeSettingsFile, openSettingsJson, promptApiConfigurationAction, readMcpConfig, removeApiKeyFromRejected, removeLocalClaudeCode, resolveCodeToolType, setPrimaryApiKey, switchToOfficialLogin, updateCustomModel, updateDefaultModel, writeMcpConfig };
223
+ export { AI_OUTPUT_LANGUAGES, API_DEFAULT_URL, API_ENV_KEY, CLAUDE_DIR, CLAUDE_MD_FILE, CLAUDE_VSC_CONFIG_FILE, CODE_TOOL_ALIASES, CODE_TOOL_BANNERS, CODE_TOOL_TYPES, ClAUDE_CONFIG_FILE, DEFAULT_CODE_TOOL_TYPE, LANG_LABELS, LEGACY_ZCF_CONFIG_FILES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_DIR, ZCF_CONFIG_FILE, addCompletedOnboarding, applyAiLanguageDirective, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, cleanupPermissions, commandExists, configureApi, copyConfigFiles, ensureApiKeyApproved, ensureClaudeDir, fixWindowsMcpConfig, getAiOutputLanguageLabel, getExistingApiConfig, getExistingModelConfig, getInstallationStatus, getMcpConfigPath, getPlatform, importRecommendedEnv, importRecommendedPermissions, init, installClaudeCode, isClaudeCodeInstalled, isCodeToolType, isLocalClaudeCodeInstalled, manageApiKeyApproval, mergeAndCleanPermissions, mergeConfigs, mergeMcpServers, mergeSettingsFile, openSettingsJson, promptApiConfigurationAction, readMcpConfig, removeApiKeyFromRejected, removeLocalClaudeCode, resolveCodeToolType, setPrimaryApiKey, switchToOfficialLogin, updateCustomModel, updateDefaultModel, writeMcpConfig };
222
224
  export type { AiOutputLanguage, ApiConfig, ClaudeConfiguration, CodeToolType, InstallationStatus, McpServerConfig, McpService, SupportedLang };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AI_OUTPUT_LANGUAGES, C as CLAUDE_DIR, e as CLAUDE_MD_FILE, h as CLAUDE_VSC_CONFIG_FILE, n as CODE_TOOL_ALIASES, l as CODE_TOOL_BANNERS, k as CODE_TOOL_TYPES, f as ClAUDE_CONFIG_FILE, D as DEFAULT_CODE_TOOL_TYPE, s as LANG_LABELS, L as LEGACY_ZCF_CONFIG_FILES, S as SETTINGS_FILE, q as SUPPORTED_LANGS, Z as ZCF_CONFIG_DIR, j as ZCF_CONFIG_FILE, E as addCompletedOnboarding, V as applyAiLanguageDirective, K as backupExistingConfig, x as backupMcpConfig, z as buildMcpServerConfig, c as cleanupPermissions, a as commandExists, N as configureApi, M as copyConfigFiles, F as ensureApiKeyApproved, J as ensureClaudeDir, B as fixWindowsMcpConfig, t as getAiOutputLanguageLabel, U as getExistingApiConfig, T as getExistingModelConfig, a0 as getInstallationStatus, u as getMcpConfigPath, g as getPlatform, b as importRecommendedEnv, d as importRecommendedPermissions, i as init, _ as installClaudeCode, Y as isClaudeCodeInstalled, p as isCodeToolType, $ as isLocalClaudeCodeInstalled, H as manageApiKeyApproval, m as mergeAndCleanPermissions, O as mergeConfigs, y as mergeMcpServers, R as mergeSettingsFile, o as openSettingsJson, X as promptApiConfigurationAction, v as readMcpConfig, G as removeApiKeyFromRejected, a1 as removeLocalClaudeCode, r as resolveCodeToolType, I as setPrimaryApiKey, W as switchToOfficialLogin, P as updateCustomModel, Q as updateDefaultModel, w as writeMcpConfig } from './chunks/simple-config.mjs';
1
+ export { u as AI_OUTPUT_LANGUAGES, A as API_DEFAULT_URL, q as API_ENV_KEY, C as CLAUDE_DIR, e as CLAUDE_MD_FILE, h as CLAUDE_VSC_CONFIG_FILE, n as CODE_TOOL_ALIASES, l as CODE_TOOL_BANNERS, k as CODE_TOOL_TYPES, f as ClAUDE_CONFIG_FILE, D as DEFAULT_CODE_TOOL_TYPE, t as LANG_LABELS, L as LEGACY_ZCF_CONFIG_FILES, S as SETTINGS_FILE, s as SUPPORTED_LANGS, Z as ZCF_CONFIG_DIR, j as ZCF_CONFIG_FILE, G as addCompletedOnboarding, X as applyAiLanguageDirective, N as backupExistingConfig, z as backupMcpConfig, E as buildMcpServerConfig, c as cleanupPermissions, a as commandExists, P as configureApi, O as copyConfigFiles, H as ensureApiKeyApproved, M as ensureClaudeDir, F as fixWindowsMcpConfig, v as getAiOutputLanguageLabel, W as getExistingApiConfig, V as getExistingModelConfig, a2 as getInstallationStatus, w as getMcpConfigPath, g as getPlatform, b as importRecommendedEnv, d as importRecommendedPermissions, i as init, a0 as installClaudeCode, $ as isClaudeCodeInstalled, p as isCodeToolType, a1 as isLocalClaudeCodeInstalled, J as manageApiKeyApproval, m as mergeAndCleanPermissions, Q as mergeConfigs, B as mergeMcpServers, U as mergeSettingsFile, o as openSettingsJson, _ as promptApiConfigurationAction, x as readMcpConfig, I as removeApiKeyFromRejected, a3 as removeLocalClaudeCode, r as resolveCodeToolType, K as setPrimaryApiKey, Y as switchToOfficialLogin, R as updateCustomModel, T as updateDefaultModel, y as writeMcpConfig } from './chunks/simple-config.mjs';
2
2
  import 'node:fs';
3
3
  import 'node:process';
4
4
  import 'ansis';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zcf",
3
3
  "type": "module",
4
- "version": "3.2.0",
4
+ "version": "3.2.1",
5
5
  "description": "Zero-Config Code Flow - One-click configuration tool for Claude Code",
6
6
  "author": {
7
7
  "name": "Miao Da",