@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 +38 -182
- package/dist/cli.js +76 -1
- package/dist/index.js +5 -750
- package/dist/skills/optimize.js +442 -0
- package/dist/skills/scan.js +80 -0
- package/dist/skills/score.js +60 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +38 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,223 +1,79 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 前端提示词 Skills (CLI)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
这是一个**前端开发辅助 CLI 工具**。它通过**零 Token 消耗**的本地分析,将模糊的需求转化为**专业、结构化、带审批流的前端开发方案**,供 Agent 或开发者直接使用。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 🌟 核心特性
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
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
|
|
18
|
+
npm install -g @jdzhang225gmail/fontend-prompt
|
|
34
19
|
```
|
|
35
20
|
|
|
36
|
-
|
|
21
|
+
安装后,即可使用 `fontend-prompt` 命令。
|
|
37
22
|
|
|
38
23
|
---
|
|
39
24
|
|
|
40
|
-
##
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
190
|
-
|
|
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
|
-
##
|
|
200
|
-
|
|
201
|
-
### 1) `scan_project` 的 rootDir
|
|
202
|
-
|
|
203
|
-
出于安全考虑,`scan_project.rootDir` 必须位于**服务进程的工作目录(cwd)**之内。
|
|
204
|
-
|
|
205
|
-
因此,通常建议宿主用**目标前端项目根目录作为工作目录(cwd)**来启动这个 MCP 服务。
|
|
206
|
-
|
|
207
|
-
### 2) 为什么使用 stdio?
|
|
63
|
+
## 📦 本地开发与构建
|
|
208
64
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 开发
|
|
65
|
+
如果你想二次开发:
|
|
214
66
|
|
|
215
67
|
```bash
|
|
216
|
-
npm
|
|
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 "
|
|
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();
|