@jdzhang225gmail/fontend-prompt 0.1.0 → 0.2.0

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,223 +1,79 @@
1
- # 前端提示词流程 MCP Server
1
+ # 前端提示词 Skills (CLI)
2
2
 
3
- 这是一个 Model Context Protocol(MCP)服务,用于**标准化前端开发的提示词与工作流**。
3
+ 这是一个**前端开发辅助 CLI 工具**。它通过**零 Token 消耗**的本地分析,将模糊的需求转化为**专业、结构化、带审批流的前端开发方案**,供 Agent 或开发者直接使用。
4
4
 
5
- 它可以把质量参差不齐的用户问题,转换为更适合 AI 安全执行的**结构化、带审批关口(gate)的方案**:
5
+ ## 🌟 核心特性
6
6
 
7
- - **先理解项目**(扫描目录树)
8
- - **按任务类型套模板**(新功能 / 优化 / 重构 / 等)
9
- - **审批关口**(宿主在每个 gate 处拦截并让用户确认)
10
- - **TypeScript 校验 + 验收流程**
11
- - **条件触发的文档更新**(仅当存在 `claude.md/CLAUDE.md` 时)
12
-
13
- 本服务使用 **stdio**(最主流、最容易配置的 MCP 部署方式),应由 MCP 宿主(例如 Claude Desktop)启动。
7
+ - **纯 CLI 工具**: 无需常驻服务,即用即走。
8
+ - **节省 Token**: 本地扫描项目结构,无需将整个文件树塞入 Context。
9
+ - **结构化输出**: 生成包含文件变更、审批关口、校验步骤的标准 Prompt。
14
10
 
15
11
  ---
16
12
 
17
- ## 环境要求
18
-
19
- - 建议 Node.js 18+
20
-
21
- ---
22
-
23
- ## 安装与构建
24
-
25
- ```bash
26
- npm install
27
- npm run build
28
- ```
13
+ ## 🚀 安装 (推荐)
29
14
 
30
- 运行(仅用于调试):
15
+ 为了获得极速体验(避免每次 `npx` 下载),请**全局安装**:
31
16
 
32
17
  ```bash
33
- npm start
18
+ npm install -g @jdzhang225gmail/fontend-prompt
34
19
  ```
35
20
 
36
- > 注意:直接运行该服务不会出现交互界面。MCP Server 通常会等待宿主通过 stdio 发送 JSON-RPC 消息。
21
+ 安装后,即可使用 `fontend-prompt` 命令。
37
22
 
38
23
  ---
39
24
 
40
- ## MCP 宿主中配置(stdio)
41
-
42
- ### 推荐(最方便):使用 npx 启动(无需下载源码)
43
-
44
- - **command**:`npx`(Windows 某些宿主需要写 `npx.cmd`)
45
- - **args**:`["-y", "<你的npm包名>@<版本>"]`
46
-
47
- ```json
48
- {
49
- "mcpServers": {
50
- "frontend-prompt-workflow": {
51
- "command": "npx",
52
- "args": ["-y", "frontend-prompt-workflow-mcp@0.1.0"]
53
- }
54
- }
55
- }
56
- ```
25
+ ## 📖 使用指南
57
26
 
58
- ### 推荐(稳定):运行构建后的产物
27
+ ### 1. 扫描项目 (Scan)
28
+ 快速了解项目架构、技术栈与关键文件。
59
29
 
60
- 使用 **Node** 运行 `dist/index.js`。
61
-
62
- - **command**:`node`
63
- - **args**:`["d:/web/mcp/dist/index.js"]`
64
-
65
- ### Claude Desktop 示例(Windows)
66
-
67
- 在 Claude Desktop 的 MCP 配置中添加类似内容:
68
-
69
- ```json
70
- {
71
- "mcpServers": {
72
- "frontend-prompt-workflow": {
73
- "command": "node",
74
- "args": ["d:/web/mcp/dist/index.js"]
75
- }
76
- }
77
- }
30
+ ```bash
31
+ fontend-prompt scan
32
+ # 或指定目录
33
+ fontend-prompt scan --depth 2
78
34
  ```
79
35
 
80
- > Claude Desktop 配置文件的具体位置/名称可能随版本变化。关键是:**宿主通过 `node dist/index.js` 启动这个服务**。
81
-
82
- ---
83
-
84
- ## 工具
85
-
86
- ### 1) `scan_project`
87
-
88
- 扫描项目目录(只读),输出目录树,并检测是否存在 `claude.md/CLAUDE.md`。
89
-
90
- **入参**
91
-
92
- ```json
93
- {
94
- "rootDir": ".",
95
- "maxDepth": 4,
96
- "maxEntries": 1200
97
- }
98
- ```
36
+ ### 2. 优化需求 (Optimize)
37
+ 将你的“一句话需求”转化为详细的开发方案。
99
38
 
100
- **出参(JSON 文本)**
101
-
102
- - `tree`:目录树
103
- - `hasClaudeMd`:是否存在 `claude.md/CLAUDE.md`
104
- - `claudeMdPaths`:命中的路径
105
- - `suggestedFiles`:检测到的关键配置文件
106
-
107
- ### 2) `optimize_frontend_prompt`
108
-
109
- 将原始用户问题转换为一个**提示词包**,包含:
110
-
111
- - `messages`:可直接喂给 AI 的 `system` + `user` 消息
112
- - `workflow`:机器可解析的步骤与 gate
113
- - `guardrails`:约束与限制条件
114
- - `clarifyingQuestions`:继续执行前需要追问的澄清问题
115
-
116
- **关键入参**
117
-
118
- - `userPrompt`(必填)
119
- - `taskType`:
120
- - `new_feature`
121
- - `optimize_existing`
122
- - `refactor`
123
- - `bugfix`
124
- - `performance`
125
- - `ui_polish`
126
- - `dependency_upgrade`
127
- - `test_addition`
128
- - `requireApprovalGates`(默认 `true`):强制在 gate 处停下等待用户确认
129
- - 可选的技术栈提示:`framework`、`language`、`styling`、`router` 等
130
-
131
- **示例入参**
132
-
133
- ```json
134
- {
135
- "userPrompt": "给后台新增一个用户列表页面,支持搜索、分页、编辑弹窗",
136
- "taskType": "new_feature",
137
- "language": "ts",
138
- "framework": "React",
139
- "styling": "TailwindCSS",
140
- "requireApprovalGates": true
141
- }
39
+ ```bash
40
+ fontend-prompt optimize "给后台增加一个用户管理页面"
142
41
  ```
143
42
 
144
- **重要出参字段(重要字段)**
145
-
146
- - `workflow.gates[]`:审批关口列表
147
- - `messages[]`:标准化后的提示词
148
-
149
- ### 3) `score_frontend_prompt`
150
-
151
- 对提示词质量评分,并识别缺失信息。
43
+ ### 3. 评分 (Score)
44
+ 看看你的 Prompt 写得好不好,缺什么信息。
152
45
 
153
- **入参**
154
-
155
- ```json
156
- { "prompt": "..." }
46
+ ```bash
47
+ fontend-prompt score "帮我写个页面"
157
48
  ```
158
49
 
159
- **出参**
160
-
161
- - `score`(0-100)
162
- - `missing[]`
163
- - `suggestions[]`
164
-
165
50
  ---
166
51
 
167
- ## 宿主编排(最佳实践)
168
-
169
- 为了让 gate 更可靠、做到“像主流 MCP 一样好用”,建议采用:**由宿主拦截**。
170
-
171
- ### Gate 标记(拦截信号)
172
-
173
- 强制模板中包含机器可解析标记:
174
-
175
- - Gate 开始:
176
-
177
- ```text
178
- <<<MCP:GATE id="new_feature_design" action="WAIT_FOR_USER_APPROVAL">>>
179
- ```
180
-
181
- - Gate 停止(推荐把它作为宿主拦截触发信号):
52
+ ## 🤖 在 Agent 中使用 (Antigravity / Claude Code)
182
53
 
183
- ```text
184
- <<<MCP:WAIT gate_id="new_feature_design" action="WAIT_FOR_USER_APPROVAL">>>
185
- ```
54
+ 为了让 Agent 更流畅地调用本工具,请告诉它直接使用命令行。
186
55
 
187
- ### 推荐的宿主行为
56
+ **添加到 `.cursorrules` 或 Agent 系统提示词:**
188
57
 
189
- 1. 调用 `scan_project`(获取目录树 + `hasClaudeMd`)
190
- 2. 调用 `optimize_frontend_prompt`
191
- 3. 将返回的 `messages` 喂给你的 AI
192
- 4. 当 AI 输出包含 `<<<MCP:WAIT ...>>>`:
193
- - 宿主停止继续
194
- - 询问用户:**同意 / 调整 / 取消**
195
- 5. 用户同意后 -> 宿主开启下一轮 AI,对应 gate 之后的步骤继续执行
58
+ > "当需要理解项目结构时,请运行命令 `fontend-prompt scan`。"
59
+ > "当需要规划新功能时,请运行命令 `fontend-prompt optimize '<需求>'`,并根据输出结果执行。"
196
60
 
197
61
  ---
198
62
 
199
- ## 说明 / 常见问题(FAQ)
200
-
201
- ### 1) `scan_project` 的 rootDir
202
-
203
- 出于安全考虑,`scan_project.rootDir` 必须位于**服务进程的工作目录(cwd)**之内。
204
-
205
- 因此,通常建议宿主用**目标前端项目根目录作为工作目录(cwd)**来启动这个 MCP 服务。
206
-
207
- ### 2) 为什么使用 stdio?
63
+ ## 📦 本地开发与构建
208
64
 
209
- stdio 是 MCP 宿主里支持最广、也最容易配置的传输方式。
210
-
211
- ---
212
-
213
- ## 开发
65
+ 如果你想二次开发:
214
66
 
215
67
  ```bash
216
- npm run dev
68
+ npm install
69
+ npm run build
70
+
71
+ # 本地测试
72
+ node dist/cli.js --help
217
73
  ```
218
74
 
219
75
  ---
220
76
 
221
77
  ## 许可
222
78
 
223
- 默认:私有 / 内部使用。
79
+ MIT
package/dist/cli.js CHANGED
@@ -1,2 +1,77 @@
1
1
  #!/usr/bin/env node
2
- import "./index.js";
2
+ import { cac } from "cac";
3
+ import { scanProject } from "./skills/scan.js";
4
+ import { buildOptimizedPromptPackage } from "./skills/optimize.js";
5
+ import { scoreFrontendPrompt } from "./skills/score.js";
6
+ import * as fs from "fs/promises";
7
+ // 读取 package.json 获取版本号
8
+ // const pkg = JSON.parse(await fs.readFile(new URL("../package.json", import.meta.url), "utf-8"));
9
+ // 为了避免 ESM 路径问题,暂时硬编码,或者用 simple import
10
+ const version = "0.2.0";
11
+ const cli = cac("fontend-skill");
12
+ cli
13
+ .command("scan [root]", "扫描项目目录结构与关键文件")
14
+ .option("--depth <number>", "最大目录深度", { default: 4 })
15
+ .option("--entries <number>", "最大文件条目数", { default: 1200 })
16
+ .action(async (root, options) => {
17
+ try {
18
+ const result = await scanProject({
19
+ rootDir: root,
20
+ maxDepth: options.depth,
21
+ maxEntries: options.entries,
22
+ });
23
+ console.log(JSON.stringify(result, null, 2));
24
+ }
25
+ catch (e) {
26
+ console.error("扫描失败:", e.message);
27
+ process.exit(1);
28
+ }
29
+ });
30
+ cli
31
+ .command("optimize <prompt>", "将原始需求转化为结构化 Prompt")
32
+ .option("--context <string>", "项目上下文")
33
+ .option("--stack <string>", "技术栈")
34
+ .option("--framework <string>", "框架")
35
+ .option("--lang <string>", "语言 (ts/js)", { default: "ts" })
36
+ .option("--type <string>", "任务类型 (new_feature 等)")
37
+ .option("--save <path>", "将结果保存到文件")
38
+ .action(async (prompt, options) => {
39
+ try {
40
+ const args = {
41
+ userPrompt: prompt,
42
+ projectContext: options.context,
43
+ techStack: options.stack,
44
+ framework: options.framework,
45
+ language: options.lang,
46
+ taskType: options.type,
47
+ outputLanguage: "zh", // 强制默认中文
48
+ };
49
+ const result = buildOptimizedPromptPackage(args);
50
+ if (options.save) {
51
+ await fs.writeFile(options.save, JSON.stringify(result, null, 2), "utf-8");
52
+ console.log(`结果已保存至: ${options.save}`);
53
+ }
54
+ else {
55
+ console.log(JSON.stringify(result, null, 2));
56
+ }
57
+ }
58
+ catch (e) {
59
+ console.error("优化失败:", e.message);
60
+ process.exit(1);
61
+ }
62
+ });
63
+ cli
64
+ .command("score <prompt>", "对 Prompt 质量进行评分")
65
+ .action((prompt) => {
66
+ try {
67
+ const result = scoreFrontendPrompt({ prompt });
68
+ console.log(JSON.stringify(result, null, 2));
69
+ }
70
+ catch (e) {
71
+ console.error("评分失败:", e.message);
72
+ process.exit(1);
73
+ }
74
+ });
75
+ cli.help();
76
+ cli.version(version);
77
+ cli.parse();