zcf 1.1.2 → 1.1.3

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
@@ -1,5 +1,8 @@
1
1
  # ZCF - Zero-Config Claude-Code Flow
2
2
 
3
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
+ [![Claude Code](https://img.shields.io/badge/Claude-Code-blue)](https://claude.ai/code)
5
+
3
6
  **中文** | [English](README_EN.md)
4
7
 
5
8
  > 零配置,一键搞定 Claude Code 环境设置 - 支持中英文双语配置和智能代理系统
@@ -29,6 +32,7 @@ npx zcf u # 仅导入工作流:快速添加 AI 工作流和命令系统
29
32
  完整初始化(`npx zcf`)会自动:
30
33
 
31
34
  - ✅ 检测并安装 Claude Code
35
+ - ✅ 选择 AI 输出语言(新增)
32
36
  - ✅ 配置 API 密钥
33
37
  - ✅ 选择并配置 MCP 服务
34
38
  - ✅ 设置所有必要的配置文件
@@ -49,10 +53,11 @@ npx zcf u # 仅导入工作流:快速添加 AI 工作流和命令系统
49
53
 
50
54
  ## ✨ ZCF 工具特性
51
55
 
52
- ### 🌏 双语支持
56
+ ### 🌏 多语言支持
53
57
 
54
58
  - 脚本交互语言:控制安装过程的提示语言
55
59
  - 配置文件语言:决定安装哪套配置文件(zh-CN/en)
60
+ - AI 输出语言:选择 AI 回复使用的语言(支持简体中文、English 及自定义语言)
56
61
 
57
62
  ### 🔧 智能安装
58
63
 
@@ -96,6 +101,13 @@ $ npx zcf
96
101
  ❯ 简体中文 (zh-CN) - 中文版(便于中文用户自定义)
97
102
  English (en) - 英文版(推荐,token 消耗更低)
98
103
 
104
+ ? 选择 AI 输出语言:
105
+ AI 将使用此语言回复你的问题
106
+ ❯ 简体中文
107
+ English
108
+ Custom
109
+ (支持日语、法语、德语等多种语言)
110
+
99
111
  ? 检测到 Claude Code 未安装,是否自动安装?(Y/n)
100
112
 
101
113
  ✔ Claude Code 安装成功
@@ -198,9 +210,9 @@ claude-code-config/
198
210
  │ ├── utils/ # 工具函数
199
211
  │ └── constants.ts # 常量定义
200
212
  ├── templates/ # 配置模板
213
+ │ ├── settings.json # 基础配置(含隐私保护环境变量)
201
214
  │ ├── en/ # 英文版
202
215
  │ │ ├── CLAUDE.md # 核心原则
203
- │ │ ├── settings.json
204
216
  │ │ ├── agents/ # AI 代理
205
217
  │ │ └── commands/ # 命令定义
206
218
  │ └── zh-CN/ # 中文版
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 { s as displayBanner, t as readZcfConfig, b as SUPPORTED_LANGS, L as LANG_LABELS, u as updateZcfConfig, v as version, I as I18N, S as SETTINGS_FILE, x as updatePromptOnly, i as init } from './shared/zcf.3cK6W2AW.mjs';
4
+ import { t as displayBanner, u as selectScriptLanguage, v as readZcfConfig, I as I18N, S as SETTINGS_FILE, b as SUPPORTED_LANGS, L as LANG_LABELS, x as resolveAiOutputLanguage, y as updatePromptOnly, z as updateZcfConfig, B as version, i as init } from './shared/zcf.EL2e1-Wq.mjs';
5
5
  import prompts from '@posva/prompts';
6
6
  import { existsSync } from 'node:fs';
7
7
  import 'node:os';
@@ -12,30 +12,8 @@ import 'tinyexec';
12
12
  async function update(options = {}) {
13
13
  try {
14
14
  displayBanner("Update configuration for Claude Code");
15
- let zcfConfig = readZcfConfig();
16
- let scriptLang;
17
- if (!zcfConfig) {
18
- const langResponse = await prompts({
19
- type: "select",
20
- name: "lang",
21
- message: "Select script language / \u9009\u62E9\u811A\u672C\u8BED\u8A00",
22
- choices: SUPPORTED_LANGS.map((l) => ({
23
- title: LANG_LABELS[l],
24
- value: l
25
- }))
26
- });
27
- if (!langResponse.lang) {
28
- console.log(ansis.yellow("Operation cancelled / \u64CD\u4F5C\u5DF2\u53D6\u6D88"));
29
- process.exit(0);
30
- }
31
- scriptLang = langResponse.lang;
32
- updateZcfConfig({
33
- version,
34
- preferredLang: scriptLang
35
- });
36
- } else {
37
- scriptLang = zcfConfig.preferredLang;
38
- }
15
+ const scriptLang = await selectScriptLanguage();
16
+ const zcfConfig = readZcfConfig();
39
17
  const i18n = I18N[scriptLang];
40
18
  if (!existsSync(SETTINGS_FILE)) {
41
19
  console.log(ansis.yellow(i18n.noExistingConfig));
@@ -61,13 +39,15 @@ async function update(options = {}) {
61
39
  }
62
40
  configLang = configResponse.lang;
63
41
  }
42
+ const aiOutputLang = await resolveAiOutputLanguage(scriptLang, options.aiOutputLang, zcfConfig);
64
43
  console.log(ansis.cyan(`
65
44
  ${i18n.updatingPrompts}
66
45
  `));
67
- await updatePromptOnly(configLang, scriptLang);
46
+ await updatePromptOnly(configLang, scriptLang, aiOutputLang);
68
47
  updateZcfConfig({
69
48
  version,
70
- preferredLang: scriptLang
49
+ preferredLang: scriptLang,
50
+ aiOutputLang
71
51
  });
72
52
  } catch (error) {
73
53
  const zcfConfig = readZcfConfig();
package/dist/index.d.mts CHANGED
@@ -38,10 +38,28 @@ declare const LANG_LABELS: {
38
38
  readonly 'zh-CN': "简体中文";
39
39
  readonly en: "English";
40
40
  };
41
+ declare const AI_OUTPUT_LANGUAGES: {
42
+ readonly 'zh-CN': {
43
+ readonly label: "简体中文";
44
+ readonly directive: "Always respond in Chinese-simplified";
45
+ };
46
+ readonly en: {
47
+ readonly label: "English";
48
+ readonly directive: "Always respond in English";
49
+ };
50
+ readonly custom: {
51
+ readonly label: "Custom";
52
+ readonly directive: "";
53
+ };
54
+ };
55
+ type AiOutputLanguage = keyof typeof AI_OUTPUT_LANGUAGES;
41
56
  declare const I18N: {
42
57
  'zh-CN': {
43
58
  selectScriptLang: string;
44
59
  selectConfigLang: string;
60
+ selectAiOutputLang: string;
61
+ aiOutputLangHint: string;
62
+ enterCustomLanguage: string;
45
63
  configLangHint: {
46
64
  'zh-CN': string;
47
65
  en: string;
@@ -89,6 +107,9 @@ declare const I18N: {
89
107
  en: {
90
108
  selectScriptLang: string;
91
109
  selectConfigLang: string;
110
+ selectAiOutputLang: string;
111
+ aiOutputLangHint: string;
112
+ enterCustomLanguage: string;
92
113
  configLangHint: {
93
114
  'zh-CN': string;
94
115
  en: string;
@@ -139,6 +160,7 @@ declare const MCP_SERVICES: McpService[];
139
160
  interface InitOptions {
140
161
  lang?: SupportedLang;
141
162
  configLang?: SupportedLang;
163
+ aiOutputLang?: AiOutputLanguage | string;
142
164
  force?: boolean;
143
165
  }
144
166
  declare function init(options?: InitOptions): Promise<void>;
@@ -158,6 +180,7 @@ interface ApiConfig {
158
180
  }
159
181
  declare function configureApi(apiConfig: ApiConfig | null): void;
160
182
  declare function mergeConfigs(sourceFile: string, targetFile: string): void;
183
+ declare function applyAiLanguageDirective(aiOutputLang: AiOutputLanguage | string): void;
161
184
 
162
185
  declare function getMcpConfigPath(): string;
163
186
  declare function readMcpConfig(): McpConfiguration | null;
@@ -166,5 +189,5 @@ declare function backupMcpConfig(): string | null;
166
189
  declare function mergeMcpServers(existing: McpConfiguration | null, newServers: Record<string, McpServerConfig>): McpConfiguration;
167
190
  declare function buildMcpServerConfig(baseConfig: McpServerConfig, apiKey?: string, placeholder?: string): McpServerConfig;
168
191
 
169
- export { CLAUDE_DIR, CLAUDE_MD_FILE, I18N, LANG_LABELS, MCP_CONFIG_FILE, MCP_SERVICES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_FILE, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, commandExists, configureApi, copyConfigFiles, ensureClaudeDir, getMcpConfigPath, getPlatform, init, installClaudeCode, isClaudeCodeInstalled, mergeConfigs, mergeMcpServers, readMcpConfig, writeMcpConfig };
170
- export type { ApiConfig, McpConfiguration, McpServerConfig, McpService, SupportedLang };
192
+ export { AI_OUTPUT_LANGUAGES, CLAUDE_DIR, CLAUDE_MD_FILE, I18N, LANG_LABELS, MCP_CONFIG_FILE, MCP_SERVICES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_FILE, applyAiLanguageDirective, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, commandExists, configureApi, copyConfigFiles, ensureClaudeDir, getMcpConfigPath, getPlatform, init, installClaudeCode, isClaudeCodeInstalled, mergeConfigs, mergeMcpServers, readMcpConfig, writeMcpConfig };
193
+ export type { AiOutputLanguage, ApiConfig, McpConfiguration, McpServerConfig, McpService, SupportedLang };
package/dist/index.d.ts CHANGED
@@ -38,10 +38,28 @@ declare const LANG_LABELS: {
38
38
  readonly 'zh-CN': "简体中文";
39
39
  readonly en: "English";
40
40
  };
41
+ declare const AI_OUTPUT_LANGUAGES: {
42
+ readonly 'zh-CN': {
43
+ readonly label: "简体中文";
44
+ readonly directive: "Always respond in Chinese-simplified";
45
+ };
46
+ readonly en: {
47
+ readonly label: "English";
48
+ readonly directive: "Always respond in English";
49
+ };
50
+ readonly custom: {
51
+ readonly label: "Custom";
52
+ readonly directive: "";
53
+ };
54
+ };
55
+ type AiOutputLanguage = keyof typeof AI_OUTPUT_LANGUAGES;
41
56
  declare const I18N: {
42
57
  'zh-CN': {
43
58
  selectScriptLang: string;
44
59
  selectConfigLang: string;
60
+ selectAiOutputLang: string;
61
+ aiOutputLangHint: string;
62
+ enterCustomLanguage: string;
45
63
  configLangHint: {
46
64
  'zh-CN': string;
47
65
  en: string;
@@ -89,6 +107,9 @@ declare const I18N: {
89
107
  en: {
90
108
  selectScriptLang: string;
91
109
  selectConfigLang: string;
110
+ selectAiOutputLang: string;
111
+ aiOutputLangHint: string;
112
+ enterCustomLanguage: string;
92
113
  configLangHint: {
93
114
  'zh-CN': string;
94
115
  en: string;
@@ -139,6 +160,7 @@ declare const MCP_SERVICES: McpService[];
139
160
  interface InitOptions {
140
161
  lang?: SupportedLang;
141
162
  configLang?: SupportedLang;
163
+ aiOutputLang?: AiOutputLanguage | string;
142
164
  force?: boolean;
143
165
  }
144
166
  declare function init(options?: InitOptions): Promise<void>;
@@ -158,6 +180,7 @@ interface ApiConfig {
158
180
  }
159
181
  declare function configureApi(apiConfig: ApiConfig | null): void;
160
182
  declare function mergeConfigs(sourceFile: string, targetFile: string): void;
183
+ declare function applyAiLanguageDirective(aiOutputLang: AiOutputLanguage | string): void;
161
184
 
162
185
  declare function getMcpConfigPath(): string;
163
186
  declare function readMcpConfig(): McpConfiguration | null;
@@ -166,5 +189,5 @@ declare function backupMcpConfig(): string | null;
166
189
  declare function mergeMcpServers(existing: McpConfiguration | null, newServers: Record<string, McpServerConfig>): McpConfiguration;
167
190
  declare function buildMcpServerConfig(baseConfig: McpServerConfig, apiKey?: string, placeholder?: string): McpServerConfig;
168
191
 
169
- export { CLAUDE_DIR, CLAUDE_MD_FILE, I18N, LANG_LABELS, MCP_CONFIG_FILE, MCP_SERVICES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_FILE, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, commandExists, configureApi, copyConfigFiles, ensureClaudeDir, getMcpConfigPath, getPlatform, init, installClaudeCode, isClaudeCodeInstalled, mergeConfigs, mergeMcpServers, readMcpConfig, writeMcpConfig };
170
- export type { ApiConfig, McpConfiguration, McpServerConfig, McpService, SupportedLang };
192
+ export { AI_OUTPUT_LANGUAGES, CLAUDE_DIR, CLAUDE_MD_FILE, I18N, LANG_LABELS, MCP_CONFIG_FILE, MCP_SERVICES, SETTINGS_FILE, SUPPORTED_LANGS, ZCF_CONFIG_FILE, applyAiLanguageDirective, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, commandExists, configureApi, copyConfigFiles, ensureClaudeDir, getMcpConfigPath, getPlatform, init, installClaudeCode, isClaudeCodeInstalled, mergeConfigs, mergeMcpServers, readMcpConfig, writeMcpConfig };
193
+ export type { AiOutputLanguage, ApiConfig, McpConfiguration, McpServerConfig, McpService, SupportedLang };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { C as CLAUDE_DIR, a as CLAUDE_MD_FILE, I as I18N, L as LANG_LABELS, M as MCP_CONFIG_FILE, d as MCP_SERVICES, S as SETTINGS_FILE, b as SUPPORTED_LANGS, Z as ZCF_CONFIG_FILE, j as backupExistingConfig, o as backupMcpConfig, q as buildMcpServerConfig, c as commandExists, l as configureApi, k as copyConfigFiles, h as ensureClaudeDir, n as getMcpConfigPath, g as getPlatform, i as init, f as installClaudeCode, e as isClaudeCodeInstalled, m as mergeConfigs, p as mergeMcpServers, r as readMcpConfig, w as writeMcpConfig } from './shared/zcf.3cK6W2AW.mjs';
1
+ export { A as AI_OUTPUT_LANGUAGES, C as CLAUDE_DIR, a as CLAUDE_MD_FILE, I as I18N, L as LANG_LABELS, M as MCP_CONFIG_FILE, d as MCP_SERVICES, S as SETTINGS_FILE, b as SUPPORTED_LANGS, Z as ZCF_CONFIG_FILE, n as applyAiLanguageDirective, j as backupExistingConfig, p as backupMcpConfig, s as buildMcpServerConfig, c as commandExists, l as configureApi, k as copyConfigFiles, h as ensureClaudeDir, o as getMcpConfigPath, g as getPlatform, i as init, f as installClaudeCode, e as isClaudeCodeInstalled, m as mergeConfigs, q as mergeMcpServers, r as readMcpConfig, w as writeMcpConfig } from './shared/zcf.EL2e1-Wq.mjs';
2
2
  import '@posva/prompts';
3
3
  import 'ansis';
4
4
  import 'node:fs';
@@ -6,7 +6,7 @@ import { join, dirname } from 'pathe';
6
6
  import dayjs from 'dayjs';
7
7
  import { exec } from 'tinyexec';
8
8
 
9
- const version = "1.1.2";
9
+ const version = "1.1.3";
10
10
 
11
11
  const CLAUDE_DIR = join(homedir(), ".claude");
12
12
  const SETTINGS_FILE = join(CLAUDE_DIR, "settings.json");
@@ -18,10 +18,18 @@ const LANG_LABELS = {
18
18
  "zh-CN": "\u7B80\u4F53\u4E2D\u6587",
19
19
  en: "English"
20
20
  };
21
+ const AI_OUTPUT_LANGUAGES = {
22
+ "zh-CN": { label: "\u7B80\u4F53\u4E2D\u6587", directive: "Always respond in Chinese-simplified" },
23
+ en: { label: "English", directive: "Always respond in English" },
24
+ custom: { label: "Custom", directive: "" }
25
+ };
21
26
  const I18N = {
22
27
  "zh-CN": {
23
28
  selectScriptLang: "\u9009\u62E9\u811A\u672C\u8BED\u8A00",
24
29
  selectConfigLang: "\u9009\u62E9 Claude Code \u914D\u7F6E\u8BED\u8A00",
30
+ selectAiOutputLang: "\u9009\u62E9 AI \u8F93\u51FA\u8BED\u8A00",
31
+ aiOutputLangHint: "AI \u5C06\u4F7F\u7528\u6B64\u8BED\u8A00\u56DE\u590D\u4F60\u7684\u95EE\u9898",
32
+ enterCustomLanguage: "\u8BF7\u8F93\u5165\u81EA\u5B9A\u4E49\u8BED\u8A00\uFF08\u4F8B\u5982\uFF1AJapanese, French \u7B49\uFF09",
25
33
  configLangHint: {
26
34
  "zh-CN": "\u4E2D\u6587\u7248\uFF08\u4FBF\u4E8E\u4E2D\u6587\u7528\u6237\u81EA\u5B9A\u4E49\uFF09",
27
35
  en: "\u82F1\u6587\u7248\uFF08\u63A8\u8350\uFF0Ctoken \u6D88\u8017\u66F4\u4F4E\uFF09"
@@ -63,12 +71,15 @@ const I18N = {
63
71
  updateConfigLangPrompt: "\u9009\u62E9\u914D\u7F6E\u8BED\u8A00",
64
72
  updateConfigLangChoice: {
65
73
  "zh-CN": "\u4E2D\u6587\u7248\u914D\u7F6E",
66
- "en": "\u82F1\u6587\u7248\u914D\u7F6E"
74
+ en: "\u82F1\u6587\u7248\u914D\u7F6E"
67
75
  }
68
76
  },
69
77
  en: {
70
78
  selectScriptLang: "Select script language",
71
79
  selectConfigLang: "Select Claude Code configuration language",
80
+ selectAiOutputLang: "Select AI output language",
81
+ aiOutputLangHint: "AI will respond to you in this language",
82
+ enterCustomLanguage: "Enter custom language (e.g., Japanese, French, etc.)",
72
83
  configLangHint: {
73
84
  "zh-CN": "Chinese (easier for Chinese users to customize)",
74
85
  en: "English (recommended, lower token consumption)"
@@ -110,7 +121,7 @@ const I18N = {
110
121
  updateConfigLangPrompt: "Select configuration language",
111
122
  updateConfigLangChoice: {
112
123
  "zh-CN": "Chinese configuration",
113
- "en": "English configuration"
124
+ en: "English configuration"
114
125
  }
115
126
  }
116
127
  };
@@ -238,6 +249,7 @@ function copyConfigFiles(lang, onlyMd = false) {
238
249
  const distDir = dirname(dirname(currentFilePath));
239
250
  const rootDir = dirname(distDir);
240
251
  const sourceDir = join(rootDir, "templates", lang);
252
+ const baseTemplateDir = join(rootDir, "templates");
241
253
  if (!existsSync(sourceDir)) {
242
254
  throw new Error(`Template directory not found: ${sourceDir}`);
243
255
  }
@@ -245,6 +257,11 @@ function copyConfigFiles(lang, onlyMd = false) {
245
257
  copyMdFiles(sourceDir, CLAUDE_DIR);
246
258
  } else {
247
259
  copyDirectory(sourceDir, CLAUDE_DIR);
260
+ const baseSettingsPath = join(baseTemplateDir, "settings.json");
261
+ const destSettingsPath = join(CLAUDE_DIR, "settings.json");
262
+ if (existsSync(baseSettingsPath)) {
263
+ copyFileSync(baseSettingsPath, destSettingsPath);
264
+ }
248
265
  }
249
266
  }
250
267
  function copyMdFiles(src, dest) {
@@ -269,6 +286,9 @@ function copyDirectory(src, dest) {
269
286
  }
270
287
  const entries = readdirSync(src);
271
288
  for (const entry of entries) {
289
+ if (entry === "settings.json") {
290
+ continue;
291
+ }
272
292
  const srcPath = join(src, entry);
273
293
  const destPath = join(dest, entry);
274
294
  const stat = statSync(srcPath);
@@ -318,7 +338,7 @@ function configureApi(apiConfig) {
318
338
  console.error("Failed to parse existing settings.json, using defaults:", error);
319
339
  }
320
340
  }
321
- settings.env.ANTHROPIC_API_KEY = apiConfig.key;
341
+ settings.env.ANTHROPIC_AUTH_TOKEN = apiConfig.key;
322
342
  settings.env.ANTHROPIC_BASE_URL = apiConfig.url;
323
343
  writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2));
324
344
  }
@@ -348,6 +368,30 @@ function deepMerge(target, source) {
348
368
  }
349
369
  return result;
350
370
  }
371
+ function applyAiLanguageDirective(aiOutputLang) {
372
+ if (!existsSync(CLAUDE_MD_FILE)) {
373
+ return;
374
+ }
375
+ let content = readFileSync(CLAUDE_MD_FILE, "utf-8");
376
+ const lines = content.split("\n");
377
+ if (lines[0] && lines[0].startsWith("Always respond in")) {
378
+ lines.shift();
379
+ if (lines[0] === "") {
380
+ lines.shift();
381
+ }
382
+ content = lines.join("\n");
383
+ }
384
+ let directive = "";
385
+ if (aiOutputLang === "custom") {
386
+ return;
387
+ } else if (AI_OUTPUT_LANGUAGES[aiOutputLang]) {
388
+ directive = AI_OUTPUT_LANGUAGES[aiOutputLang].directive;
389
+ } else {
390
+ directive = `Always respond in ${aiOutputLang}`;
391
+ }
392
+ const newContent = directive + "\n\n" + content;
393
+ writeFileSync(CLAUDE_MD_FILE, newContent, "utf-8");
394
+ }
351
395
 
352
396
  function getPlatform() {
353
397
  const p = platform();
@@ -470,18 +514,99 @@ function updateZcfConfig(updates) {
470
514
  const newConfig = {
471
515
  version: updates.version || existingConfig?.version || "1.0.0",
472
516
  preferredLang: updates.preferredLang || existingConfig?.preferredLang || "en",
517
+ aiOutputLang: updates.aiOutputLang || existingConfig?.aiOutputLang,
473
518
  lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
474
519
  };
475
520
  writeZcfConfig(newConfig);
476
521
  }
477
522
 
478
- async function updatePromptOnly(configLang, scriptLang) {
523
+ async function selectAiOutputLanguage(scriptLang, defaultLang) {
524
+ const i18n = I18N[scriptLang];
525
+ console.log(ansis.dim(`
526
+ ${i18n.aiOutputLangHint}
527
+ `));
528
+ const aiLangChoices = Object.entries(AI_OUTPUT_LANGUAGES).map(([key, value]) => ({
529
+ title: value.label,
530
+ value: key
531
+ }));
532
+ const defaultChoice = defaultLang || (scriptLang === "zh-CN" ? "zh-CN" : "en");
533
+ const aiLangResponse = await prompts({
534
+ type: "select",
535
+ name: "lang",
536
+ message: i18n.selectAiOutputLang,
537
+ choices: aiLangChoices,
538
+ initial: aiLangChoices.findIndex((c) => c.value === defaultChoice)
539
+ });
540
+ if (!aiLangResponse.lang) {
541
+ console.log(ansis.yellow(i18n.cancelled));
542
+ process.exit(0);
543
+ }
544
+ let aiOutputLang = aiLangResponse.lang;
545
+ if (aiOutputLang === "custom") {
546
+ const customLangResponse = await prompts({
547
+ type: "text",
548
+ name: "customLang",
549
+ message: i18n.enterCustomLanguage,
550
+ validate: (value) => !!value || "Language is required"
551
+ });
552
+ if (!customLangResponse.customLang) {
553
+ console.log(ansis.yellow(i18n.cancelled));
554
+ process.exit(0);
555
+ }
556
+ return customLangResponse.customLang;
557
+ }
558
+ return aiOutputLang;
559
+ }
560
+ async function selectScriptLanguage(currentLang) {
561
+ const zcfConfig = readZcfConfig();
562
+ if (zcfConfig?.preferredLang) {
563
+ return zcfConfig.preferredLang;
564
+ }
565
+ if (currentLang) {
566
+ return currentLang;
567
+ }
568
+ const response = await prompts({
569
+ type: "select",
570
+ name: "lang",
571
+ message: "Select script language / \u9009\u62E9\u811A\u672C\u8BED\u8A00",
572
+ choices: SUPPORTED_LANGS.map((l) => ({
573
+ title: LANG_LABELS[l],
574
+ value: l
575
+ }))
576
+ });
577
+ if (!response.lang) {
578
+ console.log(ansis.yellow("Operation cancelled / \u64CD\u4F5C\u5DF2\u53D6\u6D88"));
579
+ process.exit(0);
580
+ }
581
+ const scriptLang = response.lang;
582
+ updateZcfConfig({
583
+ version,
584
+ preferredLang: scriptLang
585
+ });
586
+ return scriptLang;
587
+ }
588
+ async function resolveAiOutputLanguage(scriptLang, commandLineOption, savedConfig) {
589
+ const i18n = I18N[scriptLang];
590
+ if (commandLineOption) {
591
+ return commandLineOption;
592
+ }
593
+ if (savedConfig?.aiOutputLang) {
594
+ console.log(ansis.gray(`\u2714 ${i18n.aiOutputLangHint}: ${savedConfig.aiOutputLang}`));
595
+ return savedConfig.aiOutputLang;
596
+ }
597
+ return await selectAiOutputLanguage(scriptLang, scriptLang);
598
+ }
599
+
600
+ async function updatePromptOnly(configLang, scriptLang, aiOutputLang) {
479
601
  const i18n = I18N[scriptLang];
480
602
  const backupDir = backupExistingConfig();
481
603
  if (backupDir) {
482
604
  console.log(ansis.gray(`\u2714 ${i18n.backupSuccess}: ${backupDir}`));
483
605
  }
484
606
  copyConfigFiles(configLang, true);
607
+ if (aiOutputLang) {
608
+ applyAiLanguageDirective(aiOutputLang);
609
+ }
485
610
  console.log(ansis.green(`\u2714 ${i18n.configSuccess} ${CLAUDE_DIR}`));
486
611
  console.log("\n" + ansis.cyan(i18n.complete));
487
612
  }
@@ -490,27 +615,7 @@ async function init(options = {}) {
490
615
  displayBanner();
491
616
  console.log(ansis.gray(` Version: ${ansis.cyan(version)} | ${ansis.cyan("https://github.com/UfoMiao/zcf")}
492
617
  `));
493
- let scriptLang = options.lang;
494
- if (!scriptLang) {
495
- const response = await prompts({
496
- type: "select",
497
- name: "lang",
498
- message: "Select script language / \u9009\u62E9\u811A\u672C\u8BED\u8A00",
499
- choices: SUPPORTED_LANGS.map((l) => ({
500
- title: LANG_LABELS[l],
501
- value: l
502
- }))
503
- });
504
- if (!response.lang) {
505
- console.log(ansis.yellow("\u64CD\u4F5C\u5DF2\u53D6\u6D88 / Operation cancelled"));
506
- process.exit(0);
507
- }
508
- scriptLang = response.lang;
509
- }
510
- if (!scriptLang) {
511
- console.error(ansis.red("Language not selected"));
512
- process.exit(1);
513
- }
618
+ const scriptLang = await selectScriptLanguage(options.lang);
514
619
  const i18n = I18N[scriptLang];
515
620
  let configLang = options.configLang;
516
621
  if (!configLang) {
@@ -529,6 +634,8 @@ async function init(options = {}) {
529
634
  }
530
635
  configLang = response.lang;
531
636
  }
637
+ const zcfConfig = readZcfConfig();
638
+ const aiOutputLang = await resolveAiOutputLanguage(scriptLang, options.aiOutputLang, zcfConfig);
532
639
  const installed = await isClaudeCodeInstalled();
533
640
  if (!installed) {
534
641
  const response = await prompts({
@@ -649,6 +756,7 @@ async function init(options = {}) {
649
756
  } else if (action === "new") {
650
757
  copyConfigFiles(configLang, false);
651
758
  }
759
+ applyAiLanguageDirective(aiOutputLang);
652
760
  if (apiConfig && !onlyUpdateDocs) {
653
761
  configureApi(apiConfig);
654
762
  console.log(ansis.green(`\u2714 ${i18n.apiConfigSuccess}`));
@@ -735,7 +843,8 @@ async function init(options = {}) {
735
843
  }
736
844
  updateZcfConfig({
737
845
  version,
738
- preferredLang: scriptLang
846
+ preferredLang: scriptLang,
847
+ aiOutputLang
739
848
  });
740
849
  console.log(ansis.green(`\u2714 ${i18n.configSuccess} ${CLAUDE_DIR}`));
741
850
  console.log("\n" + ansis.cyan(i18n.complete));
@@ -745,4 +854,4 @@ async function init(options = {}) {
745
854
  }
746
855
  }
747
856
 
748
- export { CLAUDE_DIR as C, I18N as I, LANG_LABELS as L, MCP_CONFIG_FILE as M, SETTINGS_FILE as S, ZCF_CONFIG_FILE as Z, CLAUDE_MD_FILE as a, SUPPORTED_LANGS as b, commandExists as c, MCP_SERVICES as d, isClaudeCodeInstalled as e, installClaudeCode as f, getPlatform as g, ensureClaudeDir as h, init as i, backupExistingConfig as j, copyConfigFiles as k, configureApi as l, mergeConfigs as m, getMcpConfigPath as n, backupMcpConfig as o, mergeMcpServers as p, buildMcpServerConfig as q, readMcpConfig as r, displayBanner as s, readZcfConfig as t, updateZcfConfig as u, version as v, writeMcpConfig as w, updatePromptOnly as x };
857
+ export { AI_OUTPUT_LANGUAGES as A, version as B, CLAUDE_DIR as C, I18N as I, LANG_LABELS as L, MCP_CONFIG_FILE as M, SETTINGS_FILE as S, ZCF_CONFIG_FILE as Z, CLAUDE_MD_FILE as a, SUPPORTED_LANGS as b, commandExists as c, MCP_SERVICES as d, isClaudeCodeInstalled as e, installClaudeCode as f, getPlatform as g, ensureClaudeDir as h, init as i, backupExistingConfig as j, copyConfigFiles as k, configureApi as l, mergeConfigs as m, applyAiLanguageDirective as n, getMcpConfigPath as o, backupMcpConfig as p, mergeMcpServers as q, readMcpConfig as r, buildMcpServerConfig as s, displayBanner as t, selectScriptLanguage as u, readZcfConfig as v, writeMcpConfig as w, resolveAiOutputLanguage as x, updatePromptOnly as y, updateZcfConfig as z };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zcf",
3
3
  "type": "module",
4
- "version": "1.1.2",
4
+ "version": "1.1.3",
5
5
  "description": "Zero-Config Claude-Code Flow - One-click configuration tool for Claude Code",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/UfoMiao/zcf#readme",
@@ -1,5 +1,3 @@
1
- Always respond in Chinese-simplified
2
-
3
1
  You are an experienced [professional domain, e.g., Software Development Engineer / System Designer / Code Architect], specializing in building [core strengths, e.g., high-performance / maintainable / robust / domain-driven] solutions.
4
2
 
5
3
  Your mission is: **Review, understand, and iteratively improve/advance a [project type, e.g., existing codebase / software project / technical process].**
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
- "env": {},
3
+ "env": {
4
+ "DISABLE_TELEMETRY": "1",
5
+ "DISABLE_ERROR_REPORTING": "1",
6
+ "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
7
+ },
4
8
  "includeCoAuthoredBy": false,
5
9
  "permissions": {
6
10
  "allow": [
@@ -22,4 +26,4 @@
22
26
  },
23
27
  "hooks": {},
24
28
  "model": "opus"
25
- }
29
+ }
@@ -1,5 +1,3 @@
1
- Always respond in Chinese-simplified
2
-
3
1
  你是一名经验丰富的[专业领域,例如:软件开发工程师 / 系统设计师 / 代码架构师],专注于构建[核心特长,例如:高性能 / 可维护 / 健壮 / 领域驱动]的解决方案。
4
2
 
5
3
  你的任务是:**审查、理解并迭代式地改进/推进一个[项目类型,例如:现有代码库 / 软件项目 / 技术流程]。**
@@ -1,25 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
- "env": {},
4
- "includeCoAuthoredBy": false,
5
- "permissions": {
6
- "allow": [
7
- "Bash(*)",
8
- "LS(*)",
9
- "Read(*)",
10
- "Write(*)",
11
- "Edit(*)",
12
- "MultiEdit(*)",
13
- "Glob(*)",
14
- "Grep(*)",
15
- "WebFetch(*)",
16
- "WebSearch(*)",
17
- "TodoWrite(*)",
18
- "NotebookRead(*)",
19
- "NotebookEdit(*)"
20
- ],
21
- "deny": []
22
- },
23
- "hooks": {},
24
- "model": "opus"
25
- }