mcp-probe-kit 3.0.24 → 3.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 +755 -779
- package/build/index.js +42 -41
- package/build/lib/__tests__/spec-validator.unit.test.js +115 -0
- package/build/lib/agents-md-template.js +32 -32
- package/build/lib/memory-orchestration.js +29 -8
- package/build/lib/skill-bridge.js +12 -12
- package/build/lib/spec-validator.d.ts +36 -0
- package/build/lib/spec-validator.js +103 -0
- package/build/lib/template-loader.js +149 -47
- package/build/lib/tool-annotations.d.ts +30 -0
- package/build/lib/tool-annotations.js +55 -0
- package/build/lib/toolset-manager.js +2 -0
- package/build/resources/index.d.ts +4 -0
- package/build/resources/index.js +4 -0
- package/build/resources/tool-params-guide.d.ts +571 -0
- package/build/resources/tool-params-guide.js +488 -0
- package/build/resources/ui-ux-data/guidelines/vercel-web-interface.json +1632 -1632
- package/build/resources/ui-ux-data/metadata.json +30 -30
- package/build/resources/ui-ux-data/shadcn/blocks.json +2541 -2541
- package/build/resources/ui-ux-data/shadcn/components.json +997 -997
- package/build/resources/ui-ux-data/themes/presets.json +483 -483
- package/build/schemas/index.d.ts +22 -22
- package/build/schemas/memory-tools.d.ts +0 -22
- package/build/schemas/memory-tools.js +0 -14
- package/build/schemas/project-tools.d.ts +22 -0
- package/build/schemas/project-tools.js +23 -0
- package/build/tools/analyze_project.d.ts +1 -0
- package/build/tools/analyze_project.js +527 -0
- package/build/tools/check_deps.d.ts +13 -0
- package/build/tools/check_deps.js +204 -0
- package/build/tools/check_spec.d.ts +7 -0
- package/build/tools/check_spec.js +81 -0
- package/build/tools/code_insight.js +41 -41
- package/build/tools/convert.d.ts +13 -0
- package/build/tools/convert.js +599 -0
- package/build/tools/css_order.d.ts +13 -0
- package/build/tools/css_order.js +81 -0
- package/build/tools/debug.d.ts +13 -0
- package/build/tools/debug.js +131 -0
- package/build/tools/design2code.d.ts +20 -0
- package/build/tools/design2code.js +426 -0
- package/build/tools/detect_shell.d.ts +6 -0
- package/build/tools/detect_shell.js +151 -0
- package/build/tools/explain.d.ts +13 -0
- package/build/tools/explain.js +390 -0
- package/build/tools/fix.d.ts +13 -0
- package/build/tools/fix.js +303 -0
- package/build/tools/fix_bug.js +161 -161
- package/build/tools/gen_mock.d.ts +22 -0
- package/build/tools/gen_mock.js +269 -0
- package/build/tools/gen_skill.d.ts +13 -0
- package/build/tools/gen_skill.js +560 -0
- package/build/tools/genapi.d.ts +13 -0
- package/build/tools/genapi.js +174 -0
- package/build/tools/genchangelog.d.ts +13 -0
- package/build/tools/genchangelog.js +250 -0
- package/build/tools/gencommit.js +60 -60
- package/build/tools/gendoc.d.ts +13 -0
- package/build/tools/gendoc.js +232 -0
- package/build/tools/genpr.d.ts +13 -0
- package/build/tools/genpr.js +194 -0
- package/build/tools/genreadme.d.ts +13 -0
- package/build/tools/genreadme.js +626 -0
- package/build/tools/gensql.d.ts +13 -0
- package/build/tools/gensql.js +320 -0
- package/build/tools/genui.d.ts +13 -0
- package/build/tools/genui.js +803 -0
- package/build/tools/index.d.ts +1 -1
- package/build/tools/index.js +1 -1
- package/build/tools/init_component_catalog.d.ts +22 -0
- package/build/tools/init_component_catalog.js +809 -0
- package/build/tools/init_project_context.js +432 -432
- package/build/tools/init_setting.d.ts +13 -0
- package/build/tools/init_setting.js +47 -0
- package/build/tools/perf.d.ts +13 -0
- package/build/tools/perf.js +409 -0
- package/build/tools/render_ui.d.ts +22 -0
- package/build/tools/render_ui.js +384 -0
- package/build/tools/resolve_conflict.d.ts +13 -0
- package/build/tools/resolve_conflict.js +349 -0
- package/build/tools/security_scan.d.ts +22 -0
- package/build/tools/security_scan.js +323 -0
- package/build/tools/split.d.ts +13 -0
- package/build/tools/split.js +599 -0
- package/build/tools/start_api.d.ts +13 -0
- package/build/tools/start_api.js +193 -0
- package/build/tools/start_bugfix.js +254 -243
- package/build/tools/start_doc.d.ts +13 -0
- package/build/tools/start_doc.js +207 -0
- package/build/tools/start_feature.js +162 -127
- package/build/tools/start_product.js +1 -1
- package/build/tools/start_refactor.d.ts +13 -0
- package/build/tools/start_refactor.js +188 -0
- package/build/tools/start_release.d.ts +13 -0
- package/build/tools/start_release.js +167 -0
- package/build/tools/start_review.d.ts +13 -0
- package/build/tools/start_review.js +175 -0
- package/build/tools/start_ui.js +426 -412
- package/build/tools/ui-ux-tools.js +290 -290
- package/build/utils/__tests__/vercel-guidelines-sync.unit.test.js +12 -12
- package/build/utils/themes-sync.js +8 -8
- package/package.json +81 -83
- package/build/lib/__tests__/memory-orchestration.unit.test.js +0 -88
- package/build/lib/__tests__/memory-payload.unit.test.js +0 -35
- package/build/lib/cursor-history-client.d.ts +0 -54
- package/build/lib/cursor-history-client.js +0 -240
- package/build/tools/__tests__/cursor-history.unit.test.js +0 -38
- package/build/tools/cursor_read_conversation.d.ts +0 -7
- package/build/tools/cursor_read_conversation.js +0 -36
- package/docs/.mcp-probe/layout.json +0 -11
- package/docs/CNAME +0 -1
- package/docs/assets/font/MaterialSymbolsOutlined.codepoints +0 -4102
- package/docs/assets/font/MaterialSymbolsOutlined.ttf +0 -0
- package/docs/assets/font/noto-sans-sc-400.ttf +0 -0
- package/docs/assets/font/noto-sans-sc-700.ttf +0 -0
- package/docs/assets/font/noto-sans-sc-900.ttf +0 -0
- package/docs/assets/js/i18n.js +0 -375
- package/docs/assets/js/tailwind.js +0 -83
- package/docs/assets/logo-zh.png +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/data/tools.js +0 -523
- package/docs/i18n/all-tools/en.json +0 -190
- package/docs/i18n/all-tools/ja.json +0 -171
- package/docs/i18n/all-tools/ko.json +0 -171
- package/docs/i18n/all-tools/zh-CN.json +0 -190
- package/docs/i18n/en.json +0 -626
- package/docs/i18n/ja.json +0 -602
- package/docs/i18n/ko.json +0 -602
- package/docs/i18n/zh-CN.json +0 -626
- package/docs/index.html +0 -327
- package/docs/memory-local-setup.md +0 -315
- package/docs/memory-local-setup.zh-CN.md +0 -283
- package/docs/pages/all-tools.html +0 -515
- package/docs/pages/examples.html +0 -717
- package/docs/pages/getting-started.html +0 -964
- package/docs/pages/migration.html +0 -308
- package/docs/specs/user-auth/design.md +0 -82
- package/docs/specs/user-auth/requirements.md +0 -52
- package/docs/specs/user-auth/tasks.md +0 -55
- /package/build/lib/__tests__/{memory-orchestration.unit.test.d.ts → spec-validator.unit.test.d.ts} +0 -0
- /package/build/{lib/__tests__/memory-payload.unit.test.d.ts → utils/design-docs-generator.d.ts} +0 -0
- /package/build/{tools/__tests__/cursor-history.unit.test.d.ts → utils/design-docs-generator.js} +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
2
|
+
/**
|
|
3
|
+
* start_doc 智能编排工具
|
|
4
|
+
*
|
|
5
|
+
* 场景:文档生成
|
|
6
|
+
* 编排:[检查上下文] → gendoc → genreadme → genapi
|
|
7
|
+
*/
|
|
8
|
+
const PROMPT_TEMPLATE = `# 📖 文档生成编排指南
|
|
9
|
+
|
|
10
|
+
## 🎯 目标
|
|
11
|
+
|
|
12
|
+
为项目/代码生成完整的文档
|
|
13
|
+
|
|
14
|
+
**输入内容**:
|
|
15
|
+
\`\`\`
|
|
16
|
+
{code}
|
|
17
|
+
\`\`\`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 📋 步骤 0: 项目上下文(自动处理)
|
|
22
|
+
|
|
23
|
+
**操作**:
|
|
24
|
+
1. 检查 \`docs/project-context.md\` 是否存在
|
|
25
|
+
2. **如果不存在**:
|
|
26
|
+
- 调用 \`init_project_context\` 工具
|
|
27
|
+
- 等待生成完成
|
|
28
|
+
3. **读取** \`docs/project-context.md\` 内容
|
|
29
|
+
4. 了解项目的文档风格、技术栈
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 📝 步骤 1: 生成代码注释
|
|
34
|
+
|
|
35
|
+
**调用工具**: \`gendoc\`
|
|
36
|
+
|
|
37
|
+
**参数**:
|
|
38
|
+
\`\`\`json
|
|
39
|
+
{
|
|
40
|
+
"code": "[代码内容]",
|
|
41
|
+
"style": "{style}",
|
|
42
|
+
"lang": "{lang}"
|
|
43
|
+
}
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
**生成内容**:
|
|
47
|
+
- 函数/方法注释
|
|
48
|
+
- 参数说明
|
|
49
|
+
- 返回值说明
|
|
50
|
+
- 使用示例
|
|
51
|
+
|
|
52
|
+
**产出**: 带注释的代码
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 📄 步骤 2: 生成 README
|
|
57
|
+
|
|
58
|
+
**调用工具**: \`genreadme\`
|
|
59
|
+
|
|
60
|
+
**参数**:
|
|
61
|
+
\`\`\`json
|
|
62
|
+
{
|
|
63
|
+
"project_info": "[项目信息或代码]",
|
|
64
|
+
"style": "standard"
|
|
65
|
+
}
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
**生成内容**:
|
|
69
|
+
- 项目简介
|
|
70
|
+
- 功能特性
|
|
71
|
+
- 安装使用
|
|
72
|
+
- API 说明
|
|
73
|
+
- 贡献指南
|
|
74
|
+
|
|
75
|
+
**产出**: README.md
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 🔌 步骤 3: 生成 API 文档(如适用)
|
|
80
|
+
|
|
81
|
+
**调用工具**: \`genapi\`
|
|
82
|
+
|
|
83
|
+
**参数**:
|
|
84
|
+
\`\`\`json
|
|
85
|
+
{
|
|
86
|
+
"code": "[API 相关代码]",
|
|
87
|
+
"format": "markdown"
|
|
88
|
+
}
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
**生成内容**:
|
|
92
|
+
- API 端点列表
|
|
93
|
+
- 请求/响应格式
|
|
94
|
+
- 参数说明
|
|
95
|
+
|
|
96
|
+
**产出**: API 文档
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## ✅ 完成检查
|
|
101
|
+
|
|
102
|
+
- [ ] 项目上下文已读取
|
|
103
|
+
- [ ] 代码注释已生成
|
|
104
|
+
- [ ] README 已生成
|
|
105
|
+
- [ ] API 文档已生成(如适用)
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 📊 输出汇总
|
|
110
|
+
|
|
111
|
+
完成后,向用户提供:
|
|
112
|
+
|
|
113
|
+
### 1. 代码注释
|
|
114
|
+
|
|
115
|
+
\`\`\`typescript
|
|
116
|
+
/**
|
|
117
|
+
* [函数描述]
|
|
118
|
+
* @param {Type} param - [参数说明]
|
|
119
|
+
* @returns {Type} [返回值说明]
|
|
120
|
+
* @example
|
|
121
|
+
* [使用示例]
|
|
122
|
+
*/
|
|
123
|
+
\`\`\`
|
|
124
|
+
|
|
125
|
+
### 2. README.md
|
|
126
|
+
|
|
127
|
+
\`\`\`markdown
|
|
128
|
+
# 项目名称
|
|
129
|
+
|
|
130
|
+
## 简介
|
|
131
|
+
...
|
|
132
|
+
|
|
133
|
+
## 功能特性
|
|
134
|
+
...
|
|
135
|
+
|
|
136
|
+
## 快速开始
|
|
137
|
+
...
|
|
138
|
+
|
|
139
|
+
## API 文档
|
|
140
|
+
...
|
|
141
|
+
|
|
142
|
+
## 贡献指南
|
|
143
|
+
...
|
|
144
|
+
|
|
145
|
+
## 许可证
|
|
146
|
+
...
|
|
147
|
+
\`\`\`
|
|
148
|
+
|
|
149
|
+
### 3. API 文档(如适用)
|
|
150
|
+
|
|
151
|
+
\`\`\`markdown
|
|
152
|
+
## API 参考
|
|
153
|
+
...
|
|
154
|
+
\`\`\`
|
|
155
|
+
|
|
156
|
+
### 4. 文档清单
|
|
157
|
+
|
|
158
|
+
| 文档 | 状态 | 位置 |
|
|
159
|
+
|------|------|------|
|
|
160
|
+
| 代码注释 | ✅ | 源代码中 |
|
|
161
|
+
| README | ✅ | README.md |
|
|
162
|
+
| API 文档 | ✅/- | docs/api.md |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
*编排工具: MCP Probe Kit - start_doc*
|
|
167
|
+
`;
|
|
168
|
+
export async function startDoc(args) {
|
|
169
|
+
try {
|
|
170
|
+
// 智能参数解析,支持自然语言输入
|
|
171
|
+
const parsedArgs = parseArgs(args, {
|
|
172
|
+
defaultValues: {
|
|
173
|
+
code: "",
|
|
174
|
+
project_info: "",
|
|
175
|
+
style: "jsdoc",
|
|
176
|
+
lang: "zh",
|
|
177
|
+
},
|
|
178
|
+
primaryField: "code", // 纯文本输入默认映射到 code 字段
|
|
179
|
+
fieldAliases: {
|
|
180
|
+
code: ["source", "src", "代码", "content"],
|
|
181
|
+
project_info: ["info", "project", "项目信息"],
|
|
182
|
+
style: ["format", "type", "风格", "注释风格"],
|
|
183
|
+
lang: ["language", "语言"],
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
const code = getString(parsedArgs.code) || getString(parsedArgs.project_info);
|
|
187
|
+
const style = getString(parsedArgs.style) || "jsdoc";
|
|
188
|
+
const lang = getString(parsedArgs.lang) || "zh";
|
|
189
|
+
if (!code) {
|
|
190
|
+
throw new Error("缺少必填参数: code 或 project_info");
|
|
191
|
+
}
|
|
192
|
+
const guide = PROMPT_TEMPLATE
|
|
193
|
+
.replace(/{code}/g, code)
|
|
194
|
+
.replace(/{style}/g, style)
|
|
195
|
+
.replace(/{lang}/g, lang);
|
|
196
|
+
return {
|
|
197
|
+
content: [{ type: "text", text: guide }],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
202
|
+
return {
|
|
203
|
+
content: [{ type: "text", text: `❌ 编排执行失败: ${errorMsg}` }],
|
|
204
|
+
isError: true,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -54,114 +54,121 @@ function extractFeatureInfo(input) {
|
|
|
54
54
|
description: input,
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
-
const PROMPT_TEMPLATE = `# 🚀 新功能开发编排(委托式)
|
|
58
|
-
|
|
59
|
-
本工具仅生成 **执行计划(steps)**。AI 需要按顺序调用对应工具并落盘文档。
|
|
60
|
-
|
|
61
|
-
## 🎯 目标
|
|
62
|
-
开发新功能:**{feature_name}**
|
|
63
|
-
功能描述:{description}
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## ✅ 执行计划(按顺序)
|
|
68
|
-
|
|
69
|
-
### 0) 项目上下文(如缺失)
|
|
70
|
-
**检查**:
|
|
71
|
-
- \`{docs_dir}/project-context.md\`
|
|
72
|
-
- \`{docs_dir}/graph-insights/latest.md\`
|
|
73
|
-
- \`{docs_dir}/graph-insights/latest.json\`
|
|
74
|
-
**缺失则调用**: \`init_project_context\`
|
|
75
|
-
\`\`\`json
|
|
76
|
-
{ "docs_dir": "{docs_dir}", "project_root": "{project_root}" }
|
|
77
|
-
\`\`\`
|
|
78
|
-
|
|
79
|
-
### 1) 生成功能规格
|
|
80
|
-
**调用**: \`add_feature\`
|
|
81
|
-
\`\`\`json
|
|
82
|
-
{
|
|
83
|
-
"feature_name": "{feature_name}",
|
|
84
|
-
"description": "{description}",
|
|
85
|
-
"docs_dir": "{docs_dir}",
|
|
86
|
-
"template_profile": "{template_profile}"
|
|
87
|
-
}
|
|
88
|
-
\`\`\`
|
|
89
|
-
**预期输出**:
|
|
90
|
-
- \`{docs_dir}/specs/{feature_name}/requirements.md\`
|
|
91
|
-
- \`{docs_dir}/specs/{feature_name}/design.md\`
|
|
92
|
-
- \`{docs_dir}/specs/{feature_name}/tasks.md\`
|
|
93
|
-
|
|
94
|
-
### 2)
|
|
95
|
-
**调用**: \`
|
|
96
|
-
\`\`\`json
|
|
97
|
-
{
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
57
|
+
const PROMPT_TEMPLATE = `# 🚀 新功能开发编排(委托式)
|
|
58
|
+
|
|
59
|
+
本工具仅生成 **执行计划(steps)**。AI 需要按顺序调用对应工具并落盘文档。
|
|
60
|
+
|
|
61
|
+
## 🎯 目标
|
|
62
|
+
开发新功能:**{feature_name}**
|
|
63
|
+
功能描述:{description}
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## ✅ 执行计划(按顺序)
|
|
68
|
+
|
|
69
|
+
### 0) 项目上下文(如缺失)
|
|
70
|
+
**检查**:
|
|
71
|
+
- \`{docs_dir}/project-context.md\`
|
|
72
|
+
- \`{docs_dir}/graph-insights/latest.md\`
|
|
73
|
+
- \`{docs_dir}/graph-insights/latest.json\`
|
|
74
|
+
**缺失则调用**: \`init_project_context\`
|
|
75
|
+
\`\`\`json
|
|
76
|
+
{ "docs_dir": "{docs_dir}", "project_root": "{project_root}" }
|
|
77
|
+
\`\`\`
|
|
78
|
+
|
|
79
|
+
### 1) 生成功能规格
|
|
80
|
+
**调用**: \`add_feature\`
|
|
81
|
+
\`\`\`json
|
|
82
|
+
{
|
|
83
|
+
"feature_name": "{feature_name}",
|
|
84
|
+
"description": "{description}",
|
|
85
|
+
"docs_dir": "{docs_dir}",
|
|
86
|
+
"template_profile": "{template_profile}"
|
|
87
|
+
}
|
|
88
|
+
\`\`\`
|
|
89
|
+
**预期输出**:
|
|
90
|
+
- \`{docs_dir}/specs/{feature_name}/requirements.md\`
|
|
91
|
+
- \`{docs_dir}/specs/{feature_name}/design.md\`
|
|
92
|
+
- \`{docs_dir}/specs/{feature_name}/tasks.md\`
|
|
93
|
+
|
|
94
|
+
### 2) 校验规格完整性(闸门)
|
|
95
|
+
**调用**: \`check_spec\`
|
|
96
|
+
\`\`\`json
|
|
97
|
+
{ "feature_name": "{feature_name}", "docs_dir": "{docs_dir}" }
|
|
98
|
+
\`\`\`
|
|
99
|
+
**未通过**:按报告逐条补全 requirements/design/tasks 后**重跑 check_spec**;**通过前不要写实现代码**。
|
|
100
|
+
|
|
101
|
+
### 3) 工作量估算
|
|
102
|
+
**调用**: \`estimate\`
|
|
103
|
+
\`\`\`json
|
|
104
|
+
{
|
|
105
|
+
"task_description": "实现 {feature_name} 功能:{description}",
|
|
106
|
+
"code_context": "参考生成的 tasks.md 中的任务列表"
|
|
107
|
+
}
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## ✅ 输出汇总(执行完成后)
|
|
113
|
+
1. 规格文档位置: \`{docs_dir}/specs/{feature_name}/\`
|
|
114
|
+
2. 图谱入口: \`{docs_dir}/graph-insights/latest.md\`
|
|
115
|
+
3. 估算结果: 故事点 + 时间区间
|
|
116
|
+
4. 主要风险(如有)
|
|
117
|
+
5. 下一步: 按 tasks.md 开始开发
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
114
121
|
*编排工具: MCP Probe Kit - start_feature*`;
|
|
115
|
-
const LOOP_PROMPT_TEMPLATE = `# 🧭 需求澄清与补全(Requirements Loop)
|
|
116
|
-
|
|
117
|
-
本模式用于**生产级稳健补全**:在不改变用户意图的前提下补齐关键要素,并输出可审计的结构化结果。
|
|
118
|
-
|
|
119
|
-
## 🎯 目标
|
|
120
|
-
开发新功能:**{feature_name}**
|
|
121
|
-
功能描述:{description}
|
|
122
|
-
|
|
123
|
-
## ✅ 规则
|
|
124
|
-
1. **不覆盖用户原始需求**
|
|
125
|
-
2. **补全内容必须标注来源**(User / Derived / Assumption)
|
|
126
|
-
3. **假设必须进入待确认列表**
|
|
127
|
-
4. **每轮问题 ≤ {question_budget},假设 ≤ {assumption_cap}**
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## 🔁 执行步骤(每轮)
|
|
132
|
-
|
|
133
|
-
### 1) 生成待确认问题
|
|
134
|
-
使用 \`ask_user\` 提问,问题来源于“功能需求补全清单”(角色/触发/约束/异常/依赖等)。
|
|
135
|
-
|
|
136
|
-
**调用示例**:
|
|
137
|
-
\`\`\`json
|
|
138
|
-
{
|
|
139
|
-
"questions": [
|
|
140
|
-
{ "question": "目标用户或角色是谁?", "context": "角色定义", "required": true },
|
|
141
|
-
{ "question": "触发场景是什么?", "context": "业务场景", "required": true }
|
|
142
|
-
]
|
|
143
|
-
}
|
|
144
|
-
\`\`\`
|
|
145
|
-
|
|
146
|
-
### 2) 更新结构化输出
|
|
147
|
-
将回答补入 \`requirements\`,并标注来源:
|
|
148
|
-
- User:用户明确回答
|
|
149
|
-
- Derived:合理推导
|
|
150
|
-
- Assumption:无法确认但补全(需确认)
|
|
151
|
-
|
|
152
|
-
### 3) 自检与结束
|
|
153
|
-
若 \`openQuestions\` 为空且无高风险假设,则结束 loop,进入规格生成与估算。
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## ✅ 结束后继续
|
|
158
|
-
当满足结束条件时,执行:
|
|
159
|
-
1. 调用 \`add_feature\` 生成规格文档
|
|
160
|
-
2. 调用 \`estimate\` 进行工作量估算
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
*编排工具: MCP Probe Kit - start_feature (requirements loop)*
|
|
122
|
+
const LOOP_PROMPT_TEMPLATE = `# 🧭 需求澄清与补全(Requirements Loop)
|
|
123
|
+
|
|
124
|
+
本模式用于**生产级稳健补全**:在不改变用户意图的前提下补齐关键要素,并输出可审计的结构化结果。
|
|
125
|
+
|
|
126
|
+
## 🎯 目标
|
|
127
|
+
开发新功能:**{feature_name}**
|
|
128
|
+
功能描述:{description}
|
|
129
|
+
|
|
130
|
+
## ✅ 规则
|
|
131
|
+
1. **不覆盖用户原始需求**
|
|
132
|
+
2. **补全内容必须标注来源**(User / Derived / Assumption)
|
|
133
|
+
3. **假设必须进入待确认列表**
|
|
134
|
+
4. **每轮问题 ≤ {question_budget},假设 ≤ {assumption_cap}**
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 🔁 执行步骤(每轮)
|
|
139
|
+
|
|
140
|
+
### 1) 生成待确认问题
|
|
141
|
+
使用 \`ask_user\` 提问,问题来源于“功能需求补全清单”(角色/触发/约束/异常/依赖等)。
|
|
142
|
+
|
|
143
|
+
**调用示例**:
|
|
144
|
+
\`\`\`json
|
|
145
|
+
{
|
|
146
|
+
"questions": [
|
|
147
|
+
{ "question": "目标用户或角色是谁?", "context": "角色定义", "required": true },
|
|
148
|
+
{ "question": "触发场景是什么?", "context": "业务场景", "required": true }
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
### 2) 更新结构化输出
|
|
154
|
+
将回答补入 \`requirements\`,并标注来源:
|
|
155
|
+
- User:用户明确回答
|
|
156
|
+
- Derived:合理推导
|
|
157
|
+
- Assumption:无法确认但补全(需确认)
|
|
158
|
+
|
|
159
|
+
### 3) 自检与结束
|
|
160
|
+
若 \`openQuestions\` 为空且无高风险假设,则结束 loop,进入规格生成与估算。
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## ✅ 结束后继续
|
|
165
|
+
当满足结束条件时,执行:
|
|
166
|
+
1. 调用 \`add_feature\` 生成规格文档
|
|
167
|
+
2. 调用 \`estimate\` 进行工作量估算
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
*编排工具: MCP Probe Kit - start_feature (requirements loop)*
|
|
165
172
|
`;
|
|
166
173
|
function buildOpenQuestions(questionBudget) {
|
|
167
174
|
const base = [
|
|
@@ -278,18 +285,18 @@ export async function startFeature(args, context) {
|
|
|
278
285
|
const graphStatusNote = graphContext.available
|
|
279
286
|
? `任务图谱收敛: 可用(${graphContext.mode})`
|
|
280
287
|
: "任务图谱收敛: 已降级(自动回退)";
|
|
281
|
-
const graphGuideSection = `
|
|
282
|
-
|
|
283
|
-
## 🧠 代码图谱上下文
|
|
284
|
-
- 基线入口: ${graphDocs.latestMarkdownPath}
|
|
285
|
-
- 基线结构化副本: ${graphDocs.latestJsonPath}
|
|
286
|
-
- 基线状态: ${graphDocsMissing ? "缺失(需要补初始化)" : "可用"}
|
|
287
|
-
- 任务级收敛: ${graphContext.available ? "可用" : "降级"}
|
|
288
|
-
- 任务级摘要: ${graphContext.summary}
|
|
288
|
+
const graphGuideSection = `
|
|
289
|
+
|
|
290
|
+
## 🧠 代码图谱上下文
|
|
291
|
+
- 基线入口: ${graphDocs.latestMarkdownPath}
|
|
292
|
+
- 基线结构化副本: ${graphDocs.latestJsonPath}
|
|
293
|
+
- 基线状态: ${graphDocsMissing ? "缺失(需要补初始化)" : "可用"}
|
|
294
|
+
- 任务级收敛: ${graphContext.available ? "可用" : "降级"}
|
|
295
|
+
- 任务级摘要: ${graphContext.summary}
|
|
289
296
|
${graphContext.highlights.length > 0
|
|
290
297
|
? `- 任务级线索:\n${graphContext.highlights.slice(0, 3).map((item) => ` - ${item}`).join("\n")}`
|
|
291
|
-
: "- 任务级线索: 无"}
|
|
292
|
-
- 使用方式: 先参考基线图谱,再使用本次任务图谱线索约束模块边界和改动范围
|
|
298
|
+
: "- 任务级线索: 无"}
|
|
299
|
+
- 使用方式: 先参考基线图谱,再使用本次任务图谱线索约束模块边界和改动范围
|
|
293
300
|
`;
|
|
294
301
|
const estimateCodeContext = [
|
|
295
302
|
`参考生成的 ${docsDir}/specs/${featureName}/tasks.md`,
|
|
@@ -305,6 +312,17 @@ ${graphContext.highlights.length > 0
|
|
|
305
312
|
.join("\n");
|
|
306
313
|
const memoryContext = await loadMemoryInjectionContext(`${featureName}\n${description}`, 'feature');
|
|
307
314
|
const memoryGuideSection = renderMemoryGuideSection(memoryContext);
|
|
315
|
+
// 记忆优先:把"先检索消化历史经验/坑"作为编排的显式第一步
|
|
316
|
+
const memoryRecallStep = memoryContext.enabled
|
|
317
|
+
? [{
|
|
318
|
+
id: 'recall-memory',
|
|
319
|
+
tool: 'search_memory',
|
|
320
|
+
when: '开干前(下方「历史经验与坑」已自动注入 top 命中;需要更多历史需求/坑时再调)',
|
|
321
|
+
args: { query: `${featureName} ${description}`, limit: 5 },
|
|
322
|
+
outputs: [],
|
|
323
|
+
note: '先消化历史经验与可复用模式,并逐条核对「历史坑」是否已在本次设计中规避;据此收敛需求范围,并把要点填入 requirements.md 的「历史经验与坑」节',
|
|
324
|
+
}]
|
|
325
|
+
: [];
|
|
308
326
|
if (requirementsMode === "loop") {
|
|
309
327
|
throwIfAborted(context?.signal, "start_feature(loop) 已取消");
|
|
310
328
|
await reportToolProgress(context, 70, "start_feature: 生成 loop 计划");
|
|
@@ -330,6 +348,7 @@ ${graphContext.highlights.length > 0
|
|
|
330
348
|
const plan = {
|
|
331
349
|
mode: 'delegated',
|
|
332
350
|
steps: [
|
|
351
|
+
...memoryRecallStep,
|
|
333
352
|
{
|
|
334
353
|
id: 'context',
|
|
335
354
|
tool: 'init_project_context',
|
|
@@ -369,6 +388,14 @@ ${graphContext.highlights.length > 0
|
|
|
369
388
|
`${docsDir}/specs/${featureName}/tasks.md`,
|
|
370
389
|
],
|
|
371
390
|
},
|
|
391
|
+
{
|
|
392
|
+
id: 'check-spec',
|
|
393
|
+
tool: 'check_spec',
|
|
394
|
+
when: 'stopConditions.ready=true 且 requirements/design/tasks 已落盘',
|
|
395
|
+
args: { feature_name: featureName, docs_dir: docsDir, ...(projectRoot ? { project_root: projectRoot } : {}) },
|
|
396
|
+
outputs: [],
|
|
397
|
+
note: '未通过则按报告补全规格后重跑 check_spec;通过前不要写实现代码',
|
|
398
|
+
},
|
|
372
399
|
{
|
|
373
400
|
id: 'estimate',
|
|
374
401
|
tool: 'estimate',
|
|
@@ -392,17 +419,16 @@ ${graphContext.highlights.length > 0
|
|
|
392
419
|
notes: [
|
|
393
420
|
`模板档位: ${templateProfile}`,
|
|
394
421
|
graphStatusNote,
|
|
395
|
-
...(memoryContext.enabled ? ['
|
|
422
|
+
...(memoryContext.enabled ? ['记忆优先: 已自动注入历史经验与坑(见顶部),开干前先消化、约束范围并规避同类坑;结束后评估是否沉淀'] : []),
|
|
396
423
|
],
|
|
397
424
|
});
|
|
398
|
-
const
|
|
425
|
+
const renderedLoopPrompt = LOOP_PROMPT_TEMPLATE
|
|
399
426
|
.replace(/{feature_name}/g, featureName)
|
|
400
427
|
.replace(/{description}/g, description)
|
|
401
428
|
.replace(/{project_root}/g, toWorkspacePath(projectRoot))
|
|
402
429
|
.replace(/{question_budget}/g, String(questionBudget))
|
|
403
|
-
.replace(/{assumption_cap}/g, String(assumptionCap))
|
|
404
|
-
|
|
405
|
-
+ memoryGuideSection;
|
|
430
|
+
.replace(/{assumption_cap}/g, String(assumptionCap));
|
|
431
|
+
const guide = header + memoryGuideSection + renderedLoopPrompt + graphGuideSection;
|
|
406
432
|
const loopReport = {
|
|
407
433
|
mode: 'loop',
|
|
408
434
|
round: 1,
|
|
@@ -452,20 +478,20 @@ ${graphContext.highlights.length > 0
|
|
|
452
478
|
notes: [
|
|
453
479
|
`模板档位: ${templateProfile}`,
|
|
454
480
|
graphStatusNote,
|
|
455
|
-
...(memoryContext.enabled ? ['
|
|
481
|
+
...(memoryContext.enabled ? ['记忆优先: 已自动注入历史经验与坑(见顶部),开干前先消化、约束范围并规避同类坑'] : []),
|
|
456
482
|
],
|
|
457
483
|
});
|
|
458
|
-
const
|
|
484
|
+
const renderedPrompt = PROMPT_TEMPLATE
|
|
459
485
|
.replace(/{feature_name}/g, featureName)
|
|
460
486
|
.replace(/{description}/g, description)
|
|
461
487
|
.replace(/{docs_dir}/g, docsDir)
|
|
462
488
|
.replace(/{project_root}/g, (projectRoot || process.cwd()).replace(/\\/g, "/"))
|
|
463
|
-
.replace(/{template_profile}/g, templateProfile)
|
|
464
|
-
|
|
465
|
-
+ memoryGuideSection;
|
|
489
|
+
.replace(/{template_profile}/g, templateProfile);
|
|
490
|
+
const guide = header + memoryGuideSection + renderedPrompt + graphGuideSection;
|
|
466
491
|
const plan = {
|
|
467
492
|
mode: 'delegated',
|
|
468
493
|
steps: [
|
|
494
|
+
...memoryRecallStep,
|
|
469
495
|
{
|
|
470
496
|
id: 'context',
|
|
471
497
|
tool: 'init_project_context',
|
|
@@ -487,6 +513,14 @@ ${graphContext.highlights.length > 0
|
|
|
487
513
|
`${docsDir}/specs/${featureName}/tasks.md`,
|
|
488
514
|
],
|
|
489
515
|
},
|
|
516
|
+
{
|
|
517
|
+
id: 'check-spec',
|
|
518
|
+
tool: 'check_spec',
|
|
519
|
+
when: 'requirements/design/tasks 落盘后、进入估算/实现前',
|
|
520
|
+
args: { feature_name: featureName, docs_dir: docsDir, ...(projectRoot ? { project_root: projectRoot } : {}) },
|
|
521
|
+
outputs: [],
|
|
522
|
+
note: '未通过则按报告逐条补全规格后重跑 check_spec;通过前不要写实现代码',
|
|
523
|
+
},
|
|
490
524
|
{
|
|
491
525
|
id: 'estimate',
|
|
492
526
|
tool: 'estimate',
|
|
@@ -526,6 +560,7 @@ ${graphContext.highlights.length > 0
|
|
|
526
560
|
`如果缺少 ${graphDocs.latestMarkdownPath} / ${graphDocs.latestJsonPath},先调用 init_project_context 补齐图谱初始化`,
|
|
527
561
|
`优先读取 ${graphDocs.latestMarkdownPath} 获取模块依赖与调用链摘要`,
|
|
528
562
|
'调用 add_feature 工具生成功能规格文档',
|
|
563
|
+
'调用 check_spec 校验规格完整性,未通过先补全再重跑(通过前不要写实现代码)',
|
|
529
564
|
'调用 estimate 工具进行工作量估算',
|
|
530
565
|
'按照 tasks.md 开始开发',
|
|
531
566
|
],
|
|
@@ -89,7 +89,7 @@ export async function startProduct(args, context) {
|
|
|
89
89
|
],
|
|
90
90
|
notes: [buildSkillHeaderNote(skillBridge)],
|
|
91
91
|
});
|
|
92
|
-
const guidanceText = header + skillBridgeSection + `# 🚀 产品设计工作流执行指导
|
|
92
|
+
const guidanceText = header + skillBridgeSection + `# 🚀 产品设计工作流执行指导
|
|
93
93
|
|
|
94
94
|
基于${requirementsSource},请按照以下步骤完成从需求到 HTML 原型的完整产品设计流程。
|
|
95
95
|
|