zcf 1.0.3 → 1.1.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/LICENSE +21 -0
- package/README.md +75 -22
- package/dist/cli.mjs +117 -9
- package/dist/index.d.mts +19 -3
- package/dist/index.d.ts +19 -3
- package/dist/index.mjs +1 -1
- package/dist/shared/{zcf.BuHXwv0P.mjs → zcf.CUoxYhz9.mjs} +150 -24
- package/package.json +1 -1
- package/templates/en/commands/workflow.md +4 -3
- package/templates/zh-CN/commands/workflow.md +4 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 UfoMiao
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -6,54 +6,72 @@
|
|
|
6
6
|
|
|
7
7
|
## 🚀 快速开始
|
|
8
8
|
|
|
9
|
+
### 根据你的情况选择:
|
|
10
|
+
|
|
11
|
+
#### 🆕 首次使用 Claude Code
|
|
9
12
|
```bash
|
|
10
|
-
npx zcf
|
|
13
|
+
npx zcf # 完整初始化:安装 Claude Code + 配置 API + 设置 MCP 服务
|
|
11
14
|
```
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
#### 🔄 已有 Claude Code 环境
|
|
17
|
+
```bash
|
|
18
|
+
npx zcf u # 仅导入工作流:快速添加 AI 工作流和命令系统
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> **提示**:`zcf u` 是 `zcf update` 的缩写,专为已配置用户设计,只更新工作流相关文件,保留你的 API 和 MCP 配置。
|
|
22
|
+
|
|
23
|
+
### 初始化流程
|
|
24
|
+
|
|
25
|
+
完整初始化(`npx zcf`)会自动:
|
|
26
|
+
|
|
27
|
+
- ✅ 检测并安装 Claude Code
|
|
28
|
+
- ✅ 配置 API 密钥
|
|
29
|
+
- ✅ 选择并配置 MCP 服务
|
|
30
|
+
- ✅ 设置所有必要的配置文件
|
|
18
31
|
|
|
19
32
|
### 使用方式
|
|
20
33
|
|
|
21
34
|
配置完成后:
|
|
22
35
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
36
|
+
- **项目第一次使用强烈建议先运行 `/init` 进行初始化,生成 CLAUDE.md 便于 AI 理解项目架构**
|
|
37
|
+
- `<任务描述>` - 不使用任何工作流直接执行,会遵循 SOLID、KISS、DRY 和 YAGNI 原则,适合修复 Bug 等小任务
|
|
38
|
+
- `/feat <任务描述>` - 开始新功能开发,分为 plan 和 ui 两个阶段
|
|
39
|
+
- `/workflow <任务描述>` - 执行完整开发工作流,不是自动化,开始会给出多套方案,每一步会询问用户意见,可随时修改方案,掌控力 MAX
|
|
27
40
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
41
|
+
> **PS**:
|
|
42
|
+
>
|
|
43
|
+
> - feat 和 workflow 这两套各有优势,可以都试试比较一下
|
|
44
|
+
> - 生成的文档位置默认都是项目根目录下的 `.claude/xxx.md`,可以把 `.claude/` 加入项目的 `.gitignore` 里
|
|
32
45
|
|
|
33
46
|
## ✨ ZCF 工具特性
|
|
34
47
|
|
|
35
48
|
### 🌏 双语支持
|
|
49
|
+
|
|
36
50
|
- 脚本交互语言:控制安装过程的提示语言
|
|
37
51
|
- 配置文件语言:决定安装哪套配置文件(zh-CN/en)
|
|
38
52
|
|
|
39
53
|
### 🔧 智能安装
|
|
54
|
+
|
|
40
55
|
- 自动检测 Claude Code 安装状态
|
|
41
|
-
-
|
|
56
|
+
- 使用 npm 进行自动安装(确保兼容性)
|
|
42
57
|
- 跨平台支持(Windows/macOS/Linux)
|
|
43
58
|
- 自动配置 MCP 服务(新增)
|
|
44
59
|
|
|
45
60
|
### 📦 完整配置
|
|
61
|
+
|
|
46
62
|
- CLAUDE.md 系统指令
|
|
47
63
|
- settings.json 设置文件
|
|
48
64
|
- commands 自定义命令
|
|
49
65
|
- agents AI 代理配置
|
|
50
66
|
|
|
51
67
|
### 🔐 API 配置
|
|
68
|
+
|
|
52
69
|
- 自定义 API 支持
|
|
53
70
|
- API Key 自动配置
|
|
54
71
|
- 支持稍后在 claude 命令中配置(如 OAuth)
|
|
55
72
|
|
|
56
73
|
### 💾 配置管理
|
|
74
|
+
|
|
57
75
|
- 智能备份现有配置(所有备份保存在 ~/.claude/backup/)
|
|
58
76
|
- 配置合并选项
|
|
59
77
|
- 安全的覆盖机制
|
|
@@ -87,7 +105,7 @@ $ npx zcf
|
|
|
87
105
|
|
|
88
106
|
? 检测到已有配置文件,如何处理?
|
|
89
107
|
❯ 备份并覆盖全部
|
|
90
|
-
|
|
108
|
+
仅更新工作流相关md并备份旧配置
|
|
91
109
|
合并配置
|
|
92
110
|
跳过
|
|
93
111
|
|
|
@@ -113,18 +131,53 @@ $ npx zcf
|
|
|
113
131
|
|
|
114
132
|
### 命令行参数
|
|
115
133
|
|
|
134
|
+
#### 命令速查表
|
|
135
|
+
|
|
136
|
+
| 命令 | 缩写 | 说明 |
|
|
137
|
+
| ------------ | ------- | ---------------------- |
|
|
138
|
+
| `zcf` | - | 初始化配置(默认命令) |
|
|
139
|
+
| `zcf update` | `zcf u` | 更新 Prompt 文档并备份旧配置 |
|
|
140
|
+
|
|
141
|
+
#### 常用选项
|
|
142
|
+
|
|
116
143
|
```bash
|
|
117
144
|
# 指定配置语言
|
|
118
145
|
npx zcf --config-lang zh-CN
|
|
146
|
+
npx zcf -c zh-CN # 使用缩写
|
|
119
147
|
|
|
120
148
|
# 强制覆盖现有配置
|
|
121
149
|
npx zcf --force
|
|
150
|
+
npx zcf -f # 使用缩写
|
|
122
151
|
|
|
123
|
-
#
|
|
124
|
-
npx zcf
|
|
152
|
+
# 更新 Prompt 文档并备份旧配置(保留 API 和 MCP 配置)
|
|
153
|
+
npx zcf u # 使用 update 命令
|
|
154
|
+
npx zcf update # 完整命令
|
|
125
155
|
|
|
126
|
-
#
|
|
156
|
+
# 查看帮助信息
|
|
127
157
|
npx zcf --help
|
|
158
|
+
npx zcf -h
|
|
159
|
+
|
|
160
|
+
# 查看版本
|
|
161
|
+
npx zcf --version
|
|
162
|
+
npx zcf -v
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
#### 使用示例
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# 首次安装,交互式配置
|
|
169
|
+
npx zcf
|
|
170
|
+
|
|
171
|
+
# 更新 Prompt 文档并备份旧配置,保留 API 和 MCP 配置
|
|
172
|
+
npx zcf u
|
|
173
|
+
|
|
174
|
+
# 强制使用中文配置重新初始化
|
|
175
|
+
npx zcf --config-lang zh-CN --force
|
|
176
|
+
npx zcf -c zh-CN -f # 使用缩写
|
|
177
|
+
|
|
178
|
+
# 更新到英文版 Prompt(降低 token 消耗)
|
|
179
|
+
npx zcf u --config-lang en
|
|
180
|
+
npx zcf u -c en # 使用缩写
|
|
128
181
|
```
|
|
129
182
|
|
|
130
183
|
## 📁 项目结构
|
|
@@ -190,8 +243,8 @@ claude-code-config/
|
|
|
190
243
|
|
|
191
244
|
```bash
|
|
192
245
|
# 克隆项目
|
|
193
|
-
git clone https://github.com/UfoMiao/
|
|
194
|
-
cd
|
|
246
|
+
git clone https://github.com/UfoMiao/zcf.git
|
|
247
|
+
cd zcf
|
|
195
248
|
|
|
196
249
|
# 安装依赖(使用 pnpm)
|
|
197
250
|
pnpm install
|
|
@@ -235,4 +288,4 @@ MIT 许可证
|
|
|
235
288
|
|
|
236
289
|
如果这个项目对你有帮助,请给我一个 ⭐️ Star!
|
|
237
290
|
|
|
238
|
-
[](https://star-history.com/#UfoMiao/claude-code-config&Date)
|
|
291
|
+
[](https://star-history.com/#UfoMiao/claude-code-config&Date)
|
package/dist/cli.mjs
CHANGED
|
@@ -1,25 +1,133 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import cac from 'cac';
|
|
3
|
-
import
|
|
4
|
-
import '
|
|
5
|
-
import '
|
|
6
|
-
import 'node:fs';
|
|
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.CUoxYhz9.mjs';
|
|
5
|
+
import prompts from '@posva/prompts';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
7
|
import 'node:os';
|
|
8
8
|
import 'pathe';
|
|
9
9
|
import 'dayjs';
|
|
10
10
|
import 'tinyexec';
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
async function update(options = {}) {
|
|
13
|
+
try {
|
|
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
|
+
}
|
|
39
|
+
const i18n = I18N[scriptLang];
|
|
40
|
+
if (!existsSync(SETTINGS_FILE)) {
|
|
41
|
+
console.log(ansis.yellow(i18n.noExistingConfig));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
let configLang = options.configLang;
|
|
45
|
+
if (!configLang) {
|
|
46
|
+
console.log(ansis.dim(` ${i18n.configLangHint["zh-CN"]}`));
|
|
47
|
+
console.log(ansis.dim(` ${i18n.configLangHint["en"]}
|
|
48
|
+
`));
|
|
49
|
+
const configResponse = await prompts({
|
|
50
|
+
type: "select",
|
|
51
|
+
name: "lang",
|
|
52
|
+
message: i18n.updateConfigLangPrompt,
|
|
53
|
+
choices: SUPPORTED_LANGS.map((l) => ({
|
|
54
|
+
title: `${LANG_LABELS[l]} - ${i18n.configLangHint[l]}`,
|
|
55
|
+
value: l
|
|
56
|
+
}))
|
|
57
|
+
});
|
|
58
|
+
if (!configResponse.lang) {
|
|
59
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
configLang = configResponse.lang;
|
|
63
|
+
}
|
|
64
|
+
console.log(ansis.cyan(`
|
|
65
|
+
${i18n.updatingPrompts}
|
|
66
|
+
`));
|
|
67
|
+
await updatePromptOnly(configLang, scriptLang);
|
|
68
|
+
updateZcfConfig({
|
|
69
|
+
version,
|
|
70
|
+
preferredLang: scriptLang
|
|
71
|
+
});
|
|
72
|
+
} catch (error) {
|
|
73
|
+
const zcfConfig = readZcfConfig();
|
|
74
|
+
const defaultLang = zcfConfig?.preferredLang || "en";
|
|
75
|
+
const errorMsg = I18N[defaultLang].error;
|
|
76
|
+
console.error(ansis.red(`${errorMsg}:`), error);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
13
80
|
|
|
14
81
|
const cli = cac("zcf");
|
|
15
|
-
cli.command("[lang]", "Initialize Claude Code configuration").option("--config-lang <lang>", "Configuration language (zh-CN, en)").option("--force", "Force overwrite existing configuration").
|
|
82
|
+
cli.command("[lang]", "Initialize Claude Code configuration (default)").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").option("--force, -f", "Force overwrite existing configuration").action(async (lang, options) => {
|
|
16
83
|
await init({
|
|
17
84
|
lang: lang || options.lang,
|
|
18
85
|
configLang: options.configLang,
|
|
19
|
-
force: options.force
|
|
20
|
-
skipInstall: options.skipInstall
|
|
86
|
+
force: options.force
|
|
21
87
|
});
|
|
22
88
|
});
|
|
23
|
-
cli.
|
|
89
|
+
cli.command("update", "Update Claude Code prompts only").alias("u").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").action(async (options) => {
|
|
90
|
+
await update({ configLang: options.configLang });
|
|
91
|
+
});
|
|
92
|
+
cli.help((sections) => {
|
|
93
|
+
sections.unshift({
|
|
94
|
+
title: "",
|
|
95
|
+
body: ansis.cyan.bold(`ZCF - Zero-Config Claude-Code Flow v${version}`)
|
|
96
|
+
});
|
|
97
|
+
sections.push({
|
|
98
|
+
title: ansis.yellow("Commands / \u547D\u4EE4:"),
|
|
99
|
+
body: [
|
|
100
|
+
` ${ansis.cyan("zcf")} Initialize configuration (default) / \u521D\u59CB\u5316\u914D\u7F6E\uFF08\u9ED8\u8BA4\uFF09`,
|
|
101
|
+
` ${ansis.cyan("zcf update")} | ${ansis.cyan("u")} Update workflow-related md files / \u4EC5\u66F4\u65B0\u5DE5\u4F5C\u6D41\u76F8\u5173md`,
|
|
102
|
+
"",
|
|
103
|
+
ansis.gray(" Shortcut / \u5FEB\u6377\u65B9\u5F0F:"),
|
|
104
|
+
` ${ansis.cyan("zcf u")} Quick update / \u5FEB\u901F\u66F4\u65B0`
|
|
105
|
+
].join("\n")
|
|
106
|
+
});
|
|
107
|
+
sections.push({
|
|
108
|
+
title: ansis.yellow("Options / \u9009\u9879:"),
|
|
109
|
+
body: [
|
|
110
|
+
` ${ansis.green("--config-lang, -c")} <lang> Configuration language / \u914D\u7F6E\u8BED\u8A00 (zh-CN, en)`,
|
|
111
|
+
` ${ansis.green("--force, -f")} Force overwrite / \u5F3A\u5236\u8986\u76D6\u73B0\u6709\u914D\u7F6E`,
|
|
112
|
+
` ${ansis.green("--help, -h")} Display help / \u663E\u793A\u5E2E\u52A9`,
|
|
113
|
+
` ${ansis.green("--version, -v")} Display version / \u663E\u793A\u7248\u672C`
|
|
114
|
+
].join("\n")
|
|
115
|
+
});
|
|
116
|
+
sections.push({
|
|
117
|
+
title: ansis.yellow("Examples / \u793A\u4F8B:"),
|
|
118
|
+
body: [
|
|
119
|
+
ansis.gray(" # Initialize with interactive prompts / \u4EA4\u4E92\u5F0F\u521D\u59CB\u5316"),
|
|
120
|
+
` ${ansis.cyan("npx zcf")}`,
|
|
121
|
+
"",
|
|
122
|
+
ansis.gray(" # Update workflow-related md files only / \u4EC5\u66F4\u65B0\u5DE5\u4F5C\u6D41\u76F8\u5173md\u6587\u4EF6"),
|
|
123
|
+
` ${ansis.cyan("npx zcf u")}`,
|
|
124
|
+
"",
|
|
125
|
+
ansis.gray(" # Force overwrite with Chinese config / \u5F3A\u5236\u4F7F\u7528\u4E2D\u6587\u914D\u7F6E\u8986\u76D6"),
|
|
126
|
+
` ${ansis.cyan("npx zcf -c zh-CN -f")}`,
|
|
127
|
+
` ${ansis.cyan("npx zcf --config-lang zh-CN --force")}`
|
|
128
|
+
].join("\n")
|
|
129
|
+
});
|
|
130
|
+
return sections;
|
|
131
|
+
});
|
|
24
132
|
cli.version(version);
|
|
25
133
|
cli.parse();
|
package/dist/index.d.mts
CHANGED
|
@@ -31,8 +31,9 @@ declare const CLAUDE_DIR: string;
|
|
|
31
31
|
declare const SETTINGS_FILE: string;
|
|
32
32
|
declare const CLAUDE_MD_FILE: string;
|
|
33
33
|
declare const MCP_CONFIG_FILE: string;
|
|
34
|
+
declare const ZCF_CONFIG_FILE: string;
|
|
34
35
|
declare const SUPPORTED_LANGS: readonly ["zh-CN", "en"];
|
|
35
|
-
type SupportedLang = typeof SUPPORTED_LANGS[number];
|
|
36
|
+
type SupportedLang = (typeof SUPPORTED_LANGS)[number];
|
|
36
37
|
declare const LANG_LABELS: {
|
|
37
38
|
readonly 'zh-CN': "简体中文";
|
|
38
39
|
readonly en: "English";
|
|
@@ -76,6 +77,14 @@ declare const I18N: {
|
|
|
76
77
|
error: string;
|
|
77
78
|
yes: string;
|
|
78
79
|
no: string;
|
|
80
|
+
cancelled: string;
|
|
81
|
+
noExistingConfig: string;
|
|
82
|
+
updatingPrompts: string;
|
|
83
|
+
updateConfigLangPrompt: string;
|
|
84
|
+
updateConfigLangChoice: {
|
|
85
|
+
'zh-CN': string;
|
|
86
|
+
en: string;
|
|
87
|
+
};
|
|
79
88
|
};
|
|
80
89
|
en: {
|
|
81
90
|
selectScriptLang: string;
|
|
@@ -115,6 +124,14 @@ declare const I18N: {
|
|
|
115
124
|
error: string;
|
|
116
125
|
yes: string;
|
|
117
126
|
no: string;
|
|
127
|
+
cancelled: string;
|
|
128
|
+
noExistingConfig: string;
|
|
129
|
+
updatingPrompts: string;
|
|
130
|
+
updateConfigLangPrompt: string;
|
|
131
|
+
updateConfigLangChoice: {
|
|
132
|
+
'zh-CN': string;
|
|
133
|
+
en: string;
|
|
134
|
+
};
|
|
118
135
|
};
|
|
119
136
|
};
|
|
120
137
|
declare const MCP_SERVICES: McpService[];
|
|
@@ -123,7 +140,6 @@ interface InitOptions {
|
|
|
123
140
|
lang?: SupportedLang;
|
|
124
141
|
configLang?: SupportedLang;
|
|
125
142
|
force?: boolean;
|
|
126
|
-
skipInstall?: boolean;
|
|
127
143
|
}
|
|
128
144
|
declare function init(options?: InitOptions): Promise<void>;
|
|
129
145
|
|
|
@@ -150,5 +166,5 @@ declare function backupMcpConfig(): string | null;
|
|
|
150
166
|
declare function mergeMcpServers(existing: McpConfiguration | null, newServers: Record<string, McpServerConfig>): McpConfiguration;
|
|
151
167
|
declare function buildMcpServerConfig(baseConfig: McpServerConfig, apiKey?: string, placeholder?: string): McpServerConfig;
|
|
152
168
|
|
|
153
|
-
export { CLAUDE_DIR, CLAUDE_MD_FILE, I18N, LANG_LABELS, MCP_CONFIG_FILE, MCP_SERVICES, SETTINGS_FILE, SUPPORTED_LANGS, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, commandExists, configureApi, copyConfigFiles, ensureClaudeDir, getMcpConfigPath, getPlatform, init, installClaudeCode, isClaudeCodeInstalled, mergeConfigs, mergeMcpServers, readMcpConfig, writeMcpConfig };
|
|
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 };
|
|
154
170
|
export type { ApiConfig, McpConfiguration, McpServerConfig, McpService, SupportedLang };
|
package/dist/index.d.ts
CHANGED
|
@@ -31,8 +31,9 @@ declare const CLAUDE_DIR: string;
|
|
|
31
31
|
declare const SETTINGS_FILE: string;
|
|
32
32
|
declare const CLAUDE_MD_FILE: string;
|
|
33
33
|
declare const MCP_CONFIG_FILE: string;
|
|
34
|
+
declare const ZCF_CONFIG_FILE: string;
|
|
34
35
|
declare const SUPPORTED_LANGS: readonly ["zh-CN", "en"];
|
|
35
|
-
type SupportedLang = typeof SUPPORTED_LANGS[number];
|
|
36
|
+
type SupportedLang = (typeof SUPPORTED_LANGS)[number];
|
|
36
37
|
declare const LANG_LABELS: {
|
|
37
38
|
readonly 'zh-CN': "简体中文";
|
|
38
39
|
readonly en: "English";
|
|
@@ -76,6 +77,14 @@ declare const I18N: {
|
|
|
76
77
|
error: string;
|
|
77
78
|
yes: string;
|
|
78
79
|
no: string;
|
|
80
|
+
cancelled: string;
|
|
81
|
+
noExistingConfig: string;
|
|
82
|
+
updatingPrompts: string;
|
|
83
|
+
updateConfigLangPrompt: string;
|
|
84
|
+
updateConfigLangChoice: {
|
|
85
|
+
'zh-CN': string;
|
|
86
|
+
en: string;
|
|
87
|
+
};
|
|
79
88
|
};
|
|
80
89
|
en: {
|
|
81
90
|
selectScriptLang: string;
|
|
@@ -115,6 +124,14 @@ declare const I18N: {
|
|
|
115
124
|
error: string;
|
|
116
125
|
yes: string;
|
|
117
126
|
no: string;
|
|
127
|
+
cancelled: string;
|
|
128
|
+
noExistingConfig: string;
|
|
129
|
+
updatingPrompts: string;
|
|
130
|
+
updateConfigLangPrompt: string;
|
|
131
|
+
updateConfigLangChoice: {
|
|
132
|
+
'zh-CN': string;
|
|
133
|
+
en: string;
|
|
134
|
+
};
|
|
118
135
|
};
|
|
119
136
|
};
|
|
120
137
|
declare const MCP_SERVICES: McpService[];
|
|
@@ -123,7 +140,6 @@ interface InitOptions {
|
|
|
123
140
|
lang?: SupportedLang;
|
|
124
141
|
configLang?: SupportedLang;
|
|
125
142
|
force?: boolean;
|
|
126
|
-
skipInstall?: boolean;
|
|
127
143
|
}
|
|
128
144
|
declare function init(options?: InitOptions): Promise<void>;
|
|
129
145
|
|
|
@@ -150,5 +166,5 @@ declare function backupMcpConfig(): string | null;
|
|
|
150
166
|
declare function mergeMcpServers(existing: McpConfiguration | null, newServers: Record<string, McpServerConfig>): McpConfiguration;
|
|
151
167
|
declare function buildMcpServerConfig(baseConfig: McpServerConfig, apiKey?: string, placeholder?: string): McpServerConfig;
|
|
152
168
|
|
|
153
|
-
export { CLAUDE_DIR, CLAUDE_MD_FILE, I18N, LANG_LABELS, MCP_CONFIG_FILE, MCP_SERVICES, SETTINGS_FILE, SUPPORTED_LANGS, backupExistingConfig, backupMcpConfig, buildMcpServerConfig, commandExists, configureApi, copyConfigFiles, ensureClaudeDir, getMcpConfigPath, getPlatform, init, installClaudeCode, isClaudeCodeInstalled, mergeConfigs, mergeMcpServers, readMcpConfig, writeMcpConfig };
|
|
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 };
|
|
154
170
|
export type { 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, 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.
|
|
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.CUoxYhz9.mjs';
|
|
2
2
|
import '@posva/prompts';
|
|
3
3
|
import 'ansis';
|
|
4
4
|
import 'node:fs';
|
|
@@ -6,14 +6,17 @@ import { join, dirname } from 'pathe';
|
|
|
6
6
|
import dayjs from 'dayjs';
|
|
7
7
|
import { exec } from 'tinyexec';
|
|
8
8
|
|
|
9
|
+
const version = "1.1.1";
|
|
10
|
+
|
|
9
11
|
const CLAUDE_DIR = join(homedir(), ".claude");
|
|
10
12
|
const SETTINGS_FILE = join(CLAUDE_DIR, "settings.json");
|
|
11
13
|
const CLAUDE_MD_FILE = join(CLAUDE_DIR, "CLAUDE.md");
|
|
12
14
|
const MCP_CONFIG_FILE = join(homedir(), ".claude.json");
|
|
15
|
+
const ZCF_CONFIG_FILE = join(homedir(), ".zcf.json");
|
|
13
16
|
const SUPPORTED_LANGS = ["zh-CN", "en"];
|
|
14
17
|
const LANG_LABELS = {
|
|
15
18
|
"zh-CN": "\u7B80\u4F53\u4E2D\u6587",
|
|
16
|
-
|
|
19
|
+
en: "English"
|
|
17
20
|
};
|
|
18
21
|
const I18N = {
|
|
19
22
|
"zh-CN": {
|
|
@@ -21,7 +24,7 @@ const I18N = {
|
|
|
21
24
|
selectConfigLang: "\u9009\u62E9 Claude Code \u914D\u7F6E\u8BED\u8A00",
|
|
22
25
|
configLangHint: {
|
|
23
26
|
"zh-CN": "\u4E2D\u6587\u7248\uFF08\u4FBF\u4E8E\u4E2D\u6587\u7528\u6237\u81EA\u5B9A\u4E49\uFF09",
|
|
24
|
-
|
|
27
|
+
en: "\u82F1\u6587\u7248\uFF08\u63A8\u8350\uFF0Ctoken \u6D88\u8017\u66F4\u4F4E\uFF09"
|
|
25
28
|
},
|
|
26
29
|
installPrompt: "\u68C0\u6D4B\u5230 Claude Code \u672A\u5B89\u88C5\uFF0C\u662F\u5426\u81EA\u52A8\u5B89\u88C5\uFF1F",
|
|
27
30
|
installing: "\u6B63\u5728\u5B89\u88C5 Claude Code...",
|
|
@@ -35,7 +38,7 @@ const I18N = {
|
|
|
35
38
|
enterApiKey: "\u8BF7\u8F93\u5165 API Key",
|
|
36
39
|
existingConfig: "\u68C0\u6D4B\u5230\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6\uFF0C\u5982\u4F55\u5904\u7406\uFF1F",
|
|
37
40
|
backupAndOverwrite: "\u5907\u4EFD\u5E76\u8986\u76D6\u5168\u90E8",
|
|
38
|
-
updateDocsOnly: "\u4EC5\u66F4\u65B0
|
|
41
|
+
updateDocsOnly: "\u4EC5\u66F4\u65B0\u5DE5\u4F5C\u6D41\u76F8\u5173md\u5E76\u5907\u4EFD\u65E7\u914D\u7F6E",
|
|
39
42
|
mergeConfig: "\u5408\u5E76\u914D\u7F6E",
|
|
40
43
|
skip: "\u8DF3\u8FC7",
|
|
41
44
|
backupSuccess: "\u5DF2\u5907\u4EFD\u6240\u6709\u914D\u7F6E\u6587\u4EF6\u5230",
|
|
@@ -53,14 +56,22 @@ const I18N = {
|
|
|
53
56
|
complete: "\u{1F389} \u914D\u7F6E\u5B8C\u6210\uFF01\u4F7F\u7528 'claude' \u547D\u4EE4\u5F00\u59CB\u4F53\u9A8C\u3002",
|
|
54
57
|
error: "\u9519\u8BEF",
|
|
55
58
|
yes: "\u662F",
|
|
56
|
-
no: "\u5426"
|
|
59
|
+
no: "\u5426",
|
|
60
|
+
cancelled: "\u64CD\u4F5C\u5DF2\u53D6\u6D88",
|
|
61
|
+
noExistingConfig: "\u672A\u627E\u5230\u73B0\u6709\u914D\u7F6E\u3002\u8BF7\u5148\u8FD0\u884C `zcf`\u3002",
|
|
62
|
+
updatingPrompts: "\u6B63\u5728\u66F4\u65B0 Claude Code Prompt \u6587\u6863...",
|
|
63
|
+
updateConfigLangPrompt: "\u9009\u62E9\u914D\u7F6E\u8BED\u8A00",
|
|
64
|
+
updateConfigLangChoice: {
|
|
65
|
+
"zh-CN": "\u4E2D\u6587\u7248\u914D\u7F6E",
|
|
66
|
+
"en": "\u82F1\u6587\u7248\u914D\u7F6E"
|
|
67
|
+
}
|
|
57
68
|
},
|
|
58
|
-
|
|
69
|
+
en: {
|
|
59
70
|
selectScriptLang: "Select script language",
|
|
60
71
|
selectConfigLang: "Select Claude Code configuration language",
|
|
61
72
|
configLangHint: {
|
|
62
73
|
"zh-CN": "Chinese (easier for Chinese users to customize)",
|
|
63
|
-
|
|
74
|
+
en: "English (recommended, lower token consumption)"
|
|
64
75
|
},
|
|
65
76
|
installPrompt: "Claude Code not found. Install automatically?",
|
|
66
77
|
installing: "Installing Claude Code...",
|
|
@@ -74,7 +85,7 @@ const I18N = {
|
|
|
74
85
|
enterApiKey: "Enter API Key",
|
|
75
86
|
existingConfig: "Existing config detected. How to proceed?",
|
|
76
87
|
backupAndOverwrite: "Backup and overwrite all",
|
|
77
|
-
updateDocsOnly: "Update
|
|
88
|
+
updateDocsOnly: "Update workflow-related md files only with backup",
|
|
78
89
|
mergeConfig: "Merge config",
|
|
79
90
|
skip: "Skip",
|
|
80
91
|
backupSuccess: "All config files backed up to",
|
|
@@ -92,7 +103,15 @@ const I18N = {
|
|
|
92
103
|
complete: "\u{1F389} Setup complete! Use 'claude' command to start.",
|
|
93
104
|
error: "Error",
|
|
94
105
|
yes: "Yes",
|
|
95
|
-
no: "No"
|
|
106
|
+
no: "No",
|
|
107
|
+
cancelled: "Operation cancelled",
|
|
108
|
+
noExistingConfig: "No existing configuration found. Please run `zcf` first.",
|
|
109
|
+
updatingPrompts: "Updating Claude Code prompt documents...",
|
|
110
|
+
updateConfigLangPrompt: "Select configuration language",
|
|
111
|
+
updateConfigLangChoice: {
|
|
112
|
+
"zh-CN": "Chinese configuration",
|
|
113
|
+
"en": "English configuration"
|
|
114
|
+
}
|
|
96
115
|
}
|
|
97
116
|
};
|
|
98
117
|
const MCP_SERVICES = [
|
|
@@ -163,6 +182,29 @@ const MCP_SERVICES = [
|
|
|
163
182
|
}
|
|
164
183
|
];
|
|
165
184
|
|
|
185
|
+
function displayBanner(subtitle) {
|
|
186
|
+
const defaultSubtitle = "One-click configuration tool for Claude Code";
|
|
187
|
+
const subtitleText = subtitle || defaultSubtitle;
|
|
188
|
+
const paddedSubtitle = subtitleText.padEnd(60, " ");
|
|
189
|
+
console.log(
|
|
190
|
+
ansis.cyan.bold(`
|
|
191
|
+
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
|
|
192
|
+
\u2551 \u2551
|
|
193
|
+
\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2551
|
|
194
|
+
\u2551 \u2588\u2588\u2554\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2551
|
|
195
|
+
\u2551 \u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 \u2551
|
|
196
|
+
\u2551 \u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D \u2551
|
|
197
|
+
\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2551
|
|
198
|
+
\u2551 \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u2551
|
|
199
|
+
\u2551 \u2551
|
|
200
|
+
\u2551 ${ansis.white.bold("Zero-Config Claude-Code Flow")} \u2551
|
|
201
|
+
\u2551 ${ansis.gray(paddedSubtitle)} \u2551
|
|
202
|
+
\u2551 \u2551
|
|
203
|
+
\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
|
|
204
|
+
`)
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
166
208
|
function ensureClaudeDir() {
|
|
167
209
|
if (!existsSync(CLAUDE_DIR)) {
|
|
168
210
|
mkdirSync(CLAUDE_DIR, { recursive: true });
|
|
@@ -404,8 +446,50 @@ function buildMcpServerConfig(baseConfig, apiKey, placeholder = "YOUR_EXA_API_KE
|
|
|
404
446
|
return config;
|
|
405
447
|
}
|
|
406
448
|
|
|
449
|
+
function readZcfConfig() {
|
|
450
|
+
try {
|
|
451
|
+
if (!existsSync(ZCF_CONFIG_FILE)) {
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
const content = readFileSync(ZCF_CONFIG_FILE, "utf-8");
|
|
455
|
+
return JSON.parse(content);
|
|
456
|
+
} catch (error) {
|
|
457
|
+
console.error("Failed to read zcf config:", error);
|
|
458
|
+
return null;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
function writeZcfConfig(config) {
|
|
462
|
+
try {
|
|
463
|
+
writeFileSync(ZCF_CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
464
|
+
} catch (error) {
|
|
465
|
+
console.error("Failed to write zcf config:", error);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
function updateZcfConfig(updates) {
|
|
469
|
+
const existingConfig = readZcfConfig();
|
|
470
|
+
const newConfig = {
|
|
471
|
+
version: updates.version || existingConfig?.version || "1.0.0",
|
|
472
|
+
preferredLang: updates.preferredLang || existingConfig?.preferredLang || "en",
|
|
473
|
+
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
474
|
+
};
|
|
475
|
+
writeZcfConfig(newConfig);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
async function updatePromptOnly(configLang, scriptLang) {
|
|
479
|
+
const i18n = I18N[scriptLang];
|
|
480
|
+
const backupDir = backupExistingConfig();
|
|
481
|
+
if (backupDir) {
|
|
482
|
+
console.log(ansis.gray(`\u2714 ${i18n.backupSuccess}: ${backupDir}`));
|
|
483
|
+
}
|
|
484
|
+
copyConfigFiles(configLang, true);
|
|
485
|
+
console.log(ansis.green(`\u2714 ${i18n.configSuccess} ${CLAUDE_DIR}`));
|
|
486
|
+
console.log("\n" + ansis.cyan(i18n.complete));
|
|
487
|
+
}
|
|
407
488
|
async function init(options = {}) {
|
|
408
489
|
try {
|
|
490
|
+
displayBanner();
|
|
491
|
+
console.log(ansis.gray(` Version: ${ansis.cyan(version)} | ${ansis.cyan("https://github.com/UfoMiao/zcf")}
|
|
492
|
+
`));
|
|
409
493
|
let scriptLang = options.lang;
|
|
410
494
|
if (!scriptLang) {
|
|
411
495
|
const response = await prompts({
|
|
@@ -417,6 +501,10 @@ async function init(options = {}) {
|
|
|
417
501
|
value: l
|
|
418
502
|
}))
|
|
419
503
|
});
|
|
504
|
+
if (!response.lang) {
|
|
505
|
+
console.log(ansis.yellow("\u64CD\u4F5C\u5DF2\u53D6\u6D88 / Operation cancelled"));
|
|
506
|
+
process.exit(0);
|
|
507
|
+
}
|
|
420
508
|
scriptLang = response.lang;
|
|
421
509
|
}
|
|
422
510
|
if (!scriptLang) {
|
|
@@ -435,25 +523,31 @@ async function init(options = {}) {
|
|
|
435
523
|
value: l
|
|
436
524
|
}))
|
|
437
525
|
});
|
|
526
|
+
if (!response.lang) {
|
|
527
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
528
|
+
process.exit(0);
|
|
529
|
+
}
|
|
438
530
|
configLang = response.lang;
|
|
439
531
|
}
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
532
|
+
const installed = await isClaudeCodeInstalled();
|
|
533
|
+
if (!installed) {
|
|
534
|
+
const response = await prompts({
|
|
535
|
+
type: "confirm",
|
|
536
|
+
name: "shouldInstall",
|
|
537
|
+
message: i18n.installPrompt,
|
|
538
|
+
initial: true
|
|
539
|
+
});
|
|
540
|
+
if (response.shouldInstall === void 0) {
|
|
541
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
542
|
+
process.exit(0);
|
|
543
|
+
}
|
|
544
|
+
if (response.shouldInstall) {
|
|
545
|
+
await installClaudeCode(scriptLang);
|
|
454
546
|
} else {
|
|
455
|
-
console.log(ansis.
|
|
547
|
+
console.log(ansis.yellow(i18n.skip));
|
|
456
548
|
}
|
|
549
|
+
} else {
|
|
550
|
+
console.log(ansis.green(`\u2714 ${i18n.installSuccess}`));
|
|
457
551
|
}
|
|
458
552
|
ensureClaudeDir();
|
|
459
553
|
let onlyUpdateDocs = false;
|
|
@@ -470,6 +564,10 @@ async function init(options = {}) {
|
|
|
470
564
|
{ title: i18n.skip, value: "skip" }
|
|
471
565
|
]
|
|
472
566
|
});
|
|
567
|
+
if (!actionResponse.action) {
|
|
568
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
569
|
+
process.exit(0);
|
|
570
|
+
}
|
|
473
571
|
action = actionResponse.action;
|
|
474
572
|
if (action === "skip") {
|
|
475
573
|
console.log(ansis.yellow(i18n.skip));
|
|
@@ -491,6 +589,10 @@ async function init(options = {}) {
|
|
|
491
589
|
{ title: i18n.skipApi, value: "skip" }
|
|
492
590
|
]
|
|
493
591
|
});
|
|
592
|
+
if (!apiResponse.apiChoice) {
|
|
593
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
594
|
+
process.exit(0);
|
|
595
|
+
}
|
|
494
596
|
const apiChoice = apiResponse.apiChoice;
|
|
495
597
|
if (apiChoice === "custom") {
|
|
496
598
|
const urlResponse = await prompts({
|
|
@@ -507,6 +609,10 @@ async function init(options = {}) {
|
|
|
507
609
|
}
|
|
508
610
|
}
|
|
509
611
|
});
|
|
612
|
+
if (urlResponse.url === void 0) {
|
|
613
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
614
|
+
process.exit(0);
|
|
615
|
+
}
|
|
510
616
|
const url = urlResponse.url;
|
|
511
617
|
const keyResponse = await prompts({
|
|
512
618
|
type: "text",
|
|
@@ -514,6 +620,10 @@ async function init(options = {}) {
|
|
|
514
620
|
message: i18n.enterApiKey,
|
|
515
621
|
validate: (value) => !!value || "API Key is required"
|
|
516
622
|
});
|
|
623
|
+
if (keyResponse.key === void 0) {
|
|
624
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
625
|
+
process.exit(0);
|
|
626
|
+
}
|
|
517
627
|
const key = keyResponse.key;
|
|
518
628
|
apiConfig = { url, key };
|
|
519
629
|
}
|
|
@@ -550,6 +660,10 @@ async function init(options = {}) {
|
|
|
550
660
|
message: i18n.configureMcp,
|
|
551
661
|
initial: true
|
|
552
662
|
});
|
|
663
|
+
if (mcpResponse.shouldConfigureMcp === void 0) {
|
|
664
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
665
|
+
process.exit(0);
|
|
666
|
+
}
|
|
553
667
|
if (mcpResponse.shouldConfigureMcp) {
|
|
554
668
|
const choices = [
|
|
555
669
|
{
|
|
@@ -571,6 +685,10 @@ async function init(options = {}) {
|
|
|
571
685
|
instructions: false,
|
|
572
686
|
hint: "- Space to select. Return to submit"
|
|
573
687
|
});
|
|
688
|
+
if (selectedResponse.services === void 0) {
|
|
689
|
+
console.log(ansis.yellow(i18n.cancelled));
|
|
690
|
+
process.exit(0);
|
|
691
|
+
}
|
|
574
692
|
let selectedServices = selectedResponse.services || [];
|
|
575
693
|
if (selectedServices.includes("ALL")) {
|
|
576
694
|
selectedServices = MCP_SERVICES.map((s) => s.id);
|
|
@@ -592,6 +710,10 @@ async function init(options = {}) {
|
|
|
592
710
|
message: service.apiKeyPrompt[scriptLang],
|
|
593
711
|
validate: (value) => !!value || "API Key is required"
|
|
594
712
|
});
|
|
713
|
+
if (apiKeyResponse.apiKey === void 0) {
|
|
714
|
+
console.log(ansis.yellow(`${i18n.skip}: ${service.name[scriptLang]}`));
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
595
717
|
if (apiKeyResponse.apiKey) {
|
|
596
718
|
config = buildMcpServerConfig(service.config, apiKeyResponse.apiKey, service.apiKeyPlaceholder);
|
|
597
719
|
} else {
|
|
@@ -611,6 +733,10 @@ async function init(options = {}) {
|
|
|
611
733
|
}
|
|
612
734
|
}
|
|
613
735
|
}
|
|
736
|
+
updateZcfConfig({
|
|
737
|
+
version,
|
|
738
|
+
preferredLang: scriptLang
|
|
739
|
+
});
|
|
614
740
|
console.log(ansis.green(`\u2714 ${i18n.configSuccess} ${CLAUDE_DIR}`));
|
|
615
741
|
console.log("\n" + ansis.cyan(i18n.complete));
|
|
616
742
|
} catch (error) {
|
|
@@ -619,4 +745,4 @@ async function init(options = {}) {
|
|
|
619
745
|
}
|
|
620
746
|
}
|
|
621
747
|
|
|
622
|
-
export { CLAUDE_DIR as C, I18N as I, LANG_LABELS as L, MCP_CONFIG_FILE as M, SETTINGS_FILE as S, 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, writeMcpConfig as w };
|
|
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 };
|
package/package.json
CHANGED
|
@@ -72,7 +72,7 @@ You are a professional AI programming assistant following a structured core work
|
|
|
72
72
|
|
|
73
73
|
- Must have user approval before execution
|
|
74
74
|
- Strictly follow the plan for coding implementation
|
|
75
|
-
- Store plan summary (with context and plan) in project root directory `.claude/task-name.md`
|
|
75
|
+
- Store plan summary (with context and plan) in project root directory `.claude/plan/task-name.md`
|
|
76
76
|
- Request user feedback after key steps and completion
|
|
77
77
|
|
|
78
78
|
### 5. `[Mode: Optimize]` - Code Optimization
|
|
@@ -142,7 +142,7 @@ Starting structured development workflow with quality gates...
|
|
|
142
142
|
- Implement according to approved plan
|
|
143
143
|
- Follow development best practices
|
|
144
144
|
- Add usage methods before import statements (critical rule)
|
|
145
|
-
- Store execution plan in project root directory `.claude/task-name.md`
|
|
145
|
+
- Store execution plan in project root directory `.claude/plan/task-name.md`
|
|
146
146
|
- Request feedback at key milestones
|
|
147
147
|
|
|
148
148
|
### 🚀 Phase 5: Code Optimization
|
|
@@ -168,7 +168,8 @@ Starting structured development workflow with quality gates...
|
|
|
168
168
|
```
|
|
169
169
|
project/ # Project root directory
|
|
170
170
|
├── .claude/
|
|
171
|
-
│ └──
|
|
171
|
+
│ └── plan/
|
|
172
|
+
│ └── task-name.md # Execution plan and context (in project root)
|
|
172
173
|
├── src/
|
|
173
174
|
│ ├── components/
|
|
174
175
|
│ ├── services/
|
|
@@ -50,7 +50,7 @@ allowed-tools:
|
|
|
50
50
|
1. `[模式:研究]`:理解需求。
|
|
51
51
|
2. `[模式:构思]`:提供至少两种可行方案及评估(例如:`方案 1:描述`)。
|
|
52
52
|
3. `[模式:计划]`:将选定方案细化为详尽、有序、可执行的步骤清单(含原子操作:文件、函数/类、逻辑概要;预期结果;新库用 `Context7` 查询)。不写完整代码。完成后请求用户批准。
|
|
53
|
-
4. `[模式:执行]`:必须用户批准方可执行。严格按计划编码执行。计划简要(含上下文和计划)存入当前项目根目录的`.claude/任务名.md`。关键步骤后及完成时请求用户反馈。
|
|
53
|
+
4. `[模式:执行]`:必须用户批准方可执行。严格按计划编码执行。计划简要(含上下文和计划)存入当前项目根目录的`.claude/plan/任务名.md`。关键步骤后及完成时请求用户反馈。
|
|
54
54
|
5. `[模式:优化]`:在 `[模式:执行]` 完成后,必须自动进行本模式 `[模式:优化]`,自动检查并分析本次任务已实现(仅本次对话产生的相关代码),在 `[模式:执行]` 下产生的相关代码。聚焦冗余、低效、垃圾代码,提出具体优化建议(含优化理由与预期收益),用户确认后执行相关优化功能。
|
|
55
55
|
6. `[模式:评审]`:对照计划评估执行结果,报告问题与建议。完成后请求用户确认。
|
|
56
56
|
|
|
@@ -107,7 +107,7 @@ allowed-tools:
|
|
|
107
107
|
- 根据批准的计划实施
|
|
108
108
|
- 遵循开发最佳实践
|
|
109
109
|
- 在导入语句之前添加使用方法(关键规则)
|
|
110
|
-
- 在项目根目录 `.claude/任务名.md` 中存储执行计划
|
|
110
|
+
- 在项目根目录 `.claude/plan/任务名.md` 中存储执行计划
|
|
111
111
|
- 在关键里程碑请求反馈
|
|
112
112
|
|
|
113
113
|
### 🚀 阶段 5:代码优化
|
|
@@ -133,7 +133,8 @@ allowed-tools:
|
|
|
133
133
|
```
|
|
134
134
|
project/ # 项目根目录
|
|
135
135
|
├── .claude/
|
|
136
|
-
│ └──
|
|
136
|
+
│ └── plan/
|
|
137
|
+
│ └── 任务名.md # 执行计划和上下文(在项目根目录)
|
|
137
138
|
├── src/
|
|
138
139
|
│ ├── components/
|
|
139
140
|
│ ├── services/
|