@jdzhang225gmail/fontend-prompt 0.1.0 → 0.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/README.md +54 -173
- package/dist/cli.js +76 -1
- package/dist/index.js +33 -602
- 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 +5 -3
package/README.md
CHANGED
|
@@ -1,223 +1,104 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 前端提示词 Skills & MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
这是一个**前端开发辅助工具库**,它既可以作为 **Skills (CLI 工具)** 使用(零 Token 消耗,适合 Agent 直接调用),也可以作为标准的 **MCP Server** 使用。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
它致力于把模糊的需求转化为**专业、结构化、带审批流的前端开发方案**。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **按任务类型套模板**(新功能 / 优化 / 重构 / 等)
|
|
9
|
-
- **审批关口**(宿主在每个 gate 处拦截并让用户确认)
|
|
10
|
-
- **TypeScript 校验 + 验收流程**
|
|
11
|
-
- **条件触发的文档更新**(仅当存在 `claude.md/CLAUDE.md` 时)
|
|
7
|
+
## 🌟 核心理念:Skills vs MCP
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
- **Skills (CLI 模式)**: 🚀 **推荐!** Agent 通过命令行直接运行工具。 **优点**:无需在 Prompt 中挂载巨量的工具定义,极大节省 Token;运行速度快;无常驻进程。
|
|
10
|
+
- **MCP Server 模式**: 经典模式,适合 Claude Desktop 等标准 MCP 客户端。
|
|
14
11
|
|
|
15
12
|
---
|
|
16
13
|
|
|
17
|
-
##
|
|
14
|
+
## 🚀 快速开始 (CLI / Skills)
|
|
18
15
|
|
|
19
|
-
|
|
16
|
+
无需安装,直接使用 `npx` 运行:
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
## 安装与构建
|
|
18
|
+
### 1. 扫描项目 (Scan)
|
|
19
|
+
快速了解项目架构、技术栈与关键文件。
|
|
24
20
|
|
|
25
21
|
```bash
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
npx @jdzhang225gmail/fontend-prompt scan
|
|
23
|
+
# 或指定目录
|
|
24
|
+
npx @jdzhang225gmail/fontend-prompt scan --depth 2
|
|
28
25
|
```
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
### 2. 优化需求 (Optimize)
|
|
28
|
+
将你的“一句话需求”转化为详细的开发方案(包含文件变更、审批关口等)。
|
|
31
29
|
|
|
32
30
|
```bash
|
|
33
|
-
|
|
31
|
+
npx @jdzhang225gmail/fontend-prompt optimize "给后台增加一个用户管理页面"
|
|
34
32
|
```
|
|
35
33
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
---
|
|
34
|
+
### 3. 评分 (Score)
|
|
35
|
+
看看你的 Prompt 写得好不好,缺什么信息。
|
|
39
36
|
|
|
40
|
-
|
|
37
|
+
```bash
|
|
38
|
+
npx @jdzhang225gmail/fontend-prompt score "帮我写个页面"
|
|
39
|
+
```
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
---
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
- **args**:`["-y", "<你的npm包名>@<版本>"]`
|
|
43
|
+
## 🤖 在 Agent 中使用 (Antigravity / Claude Code)
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
"mcpServers": {
|
|
50
|
-
"frontend-prompt-workflow": {
|
|
51
|
-
"command": "npx",
|
|
52
|
-
"args": ["-y", "frontend-prompt-workflow-mcp@0.1.0"]
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
```
|
|
45
|
+
### 方式一:作为 CLI 工具(最省 Token)
|
|
57
46
|
|
|
58
|
-
|
|
47
|
+
告诉你的 Agent(或者写在 `.cursorrules` / `.agent/workflows` 中):
|
|
59
48
|
|
|
60
|
-
|
|
49
|
+
> "当需要理解项目结构时,请运行命令 `npx @jdzhang225gmail/fontend-prompt scan`。"
|
|
50
|
+
> "当需要规划新功能时,请运行命令 `npx @jdzhang225gmail/fontend-prompt optimize '<需求>'`,并根据输出结果执行。"
|
|
61
51
|
|
|
62
|
-
|
|
63
|
-
- **args**:`["d:/web/mcp/dist/index.js"]`
|
|
52
|
+
### 方式二:作为库集成
|
|
64
53
|
|
|
65
|
-
|
|
54
|
+
如果你在编写 TS 脚本或 Agent 插件:
|
|
66
55
|
|
|
67
|
-
|
|
56
|
+
```typescript
|
|
57
|
+
import { scanProject, optimizeFrontendPrompt } from "@jdzhang225gmail/fontend-prompt";
|
|
68
58
|
|
|
69
|
-
|
|
70
|
-
{
|
|
71
|
-
"mcpServers": {
|
|
72
|
-
"frontend-prompt-workflow": {
|
|
73
|
-
"command": "node",
|
|
74
|
-
"args": ["d:/web/mcp/dist/index.js"]
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
59
|
+
const tree = await scanProject({ rootDir: "." });
|
|
60
|
+
const plan = optimizeFrontendPrompt({ userPrompt: "..." });
|
|
78
61
|
```
|
|
79
62
|
|
|
80
|
-
> Claude Desktop 配置文件的具体位置/名称可能随版本变化。关键是:**宿主通过 `node dist/index.js` 启动这个服务**。
|
|
81
|
-
|
|
82
63
|
---
|
|
83
64
|
|
|
84
|
-
##
|
|
85
|
-
|
|
86
|
-
### 1) `scan_project`
|
|
65
|
+
## 📦 安装与构建
|
|
87
66
|
|
|
88
|
-
|
|
67
|
+
如果你想本地部署或二次开发:
|
|
89
68
|
|
|
90
|
-
|
|
69
|
+
```bash
|
|
70
|
+
npm install
|
|
71
|
+
npm run build
|
|
91
72
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"rootDir": ".",
|
|
95
|
-
"maxDepth": 4,
|
|
96
|
-
"maxEntries": 1200
|
|
97
|
-
}
|
|
73
|
+
# 本地运行 CLI
|
|
74
|
+
npm run skill -- --help
|
|
98
75
|
```
|
|
99
76
|
|
|
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
|
-
**关键入参**
|
|
77
|
+
---
|
|
117
78
|
|
|
118
|
-
|
|
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` 等
|
|
79
|
+
## 🛠️ MCP Server 配置
|
|
130
80
|
|
|
131
|
-
|
|
81
|
+
如果你仍希望在 Claude Desktop 中作为常驻服务使用:
|
|
132
82
|
|
|
133
83
|
```json
|
|
134
84
|
{
|
|
135
|
-
"
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
85
|
+
"mcpServers": {
|
|
86
|
+
"frontend-helper": {
|
|
87
|
+
"command": "npx",
|
|
88
|
+
"args": ["-y", "@jdzhang225gmail/fontend-prompt"]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
141
91
|
}
|
|
142
92
|
```
|
|
143
93
|
|
|
144
|
-
**重要出参字段(重要字段)**
|
|
145
|
-
|
|
146
|
-
- `workflow.gates[]`:审批关口列表
|
|
147
|
-
- `messages[]`:标准化后的提示词
|
|
148
|
-
|
|
149
|
-
### 3) `score_frontend_prompt`
|
|
150
|
-
|
|
151
|
-
对提示词质量评分,并识别缺失信息。
|
|
152
|
-
|
|
153
|
-
**入参**
|
|
154
|
-
|
|
155
|
-
```json
|
|
156
|
-
{ "prompt": "..." }
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
**出参**
|
|
160
|
-
|
|
161
|
-
- `score`(0-100)
|
|
162
|
-
- `missing[]`
|
|
163
|
-
- `suggestions[]`
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
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 停止(推荐把它作为宿主拦截触发信号):
|
|
182
|
-
|
|
183
|
-
```text
|
|
184
|
-
<<<MCP:WAIT gate_id="new_feature_design" action="WAIT_FOR_USER_APPROVAL">>>
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### 推荐的宿主行为
|
|
188
|
-
|
|
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 之后的步骤继续执行
|
|
196
|
-
|
|
197
94
|
---
|
|
198
95
|
|
|
199
|
-
##
|
|
200
|
-
|
|
201
|
-
### 1) `scan_project` 的 rootDir
|
|
202
|
-
|
|
203
|
-
出于安全考虑,`scan_project.rootDir` 必须位于**服务进程的工作目录(cwd)**之内。
|
|
204
|
-
|
|
205
|
-
因此,通常建议宿主用**目标前端项目根目录作为工作目录(cwd)**来启动这个 MCP 服务。
|
|
96
|
+
## 功能特性
|
|
206
97
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 开发
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
npm run dev
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
---
|
|
98
|
+
- **中文优先**: 所有输出、文档、注释默认均为中文。
|
|
99
|
+
- **Gate 机制**: 在关键节点(设计/计划/验收)生成审批关口,防止 AI 一条路走到黑。
|
|
100
|
+
- **安全扫描**: 自动识别项目目录,但严格限制在 CWD 下访问。
|
|
220
101
|
|
|
221
102
|
## 许可
|
|
222
103
|
|
|
223
|
-
|
|
104
|
+
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.1.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();
|