mcp-probe-kit 3.1.0 → 3.3.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 +15 -5
- package/build/index.js +5 -2
- package/build/lib/__tests__/memory-orchestration.unit.test.js +88 -0
- package/build/lib/__tests__/memory-payload.unit.test.js +35 -0
- package/build/lib/__tests__/quality-constraints.unit.test.d.ts +1 -0
- package/build/lib/__tests__/quality-constraints.unit.test.js +54 -0
- package/build/lib/__tests__/spec-validator.unit.test.d.ts +1 -0
- package/build/lib/__tests__/spec-validator.unit.test.js +147 -0
- package/build/lib/agents-md-template.js +32 -32
- package/build/lib/cursor-history-client.d.ts +54 -0
- package/build/lib/cursor-history-client.js +240 -0
- package/build/lib/memory-orchestration.js +29 -8
- package/build/lib/quality-constraints.d.ts +54 -0
- package/build/lib/quality-constraints.js +155 -0
- package/build/lib/skill-bridge.js +12 -12
- package/build/lib/spec-validator.d.ts +36 -0
- package/build/lib/spec-validator.js +116 -0
- package/build/lib/template-loader.js +223 -61
- 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/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 -0
- package/build/schemas/project-tools.d.ts +22 -0
- package/build/schemas/project-tools.js +23 -0
- package/build/tools/__tests__/cursor-history.unit.test.d.ts +1 -0
- package/build/tools/__tests__/cursor-history.unit.test.js +38 -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/code_review.js +11 -4
- package/build/tools/cursor_read_conversation.d.ts +7 -0
- package/build/tools/cursor_read_conversation.js +36 -0
- package/build/tools/fix_bug.js +161 -161
- package/build/tools/gencommit.js +60 -60
- package/build/tools/index.d.ts +1 -0
- package/build/tools/index.js +1 -0
- package/build/tools/init_project_context.js +432 -432
- package/build/tools/start_bugfix.js +21 -10
- package/build/tools/start_feature.js +46 -11
- package/build/tools/start_product.js +1 -1
- package/build/tools/start_ui.js +44 -13
- package/build/tools/ui-ux-tools.d.ts +3 -0
- package/build/tools/ui-ux-tools.js +302 -290
- package/build/utils/__tests__/vercel-guidelines-sync.unit.test.js +12 -12
- package/build/utils/design-reasoning-engine.d.ts +2 -0
- package/build/utils/design-reasoning-engine.js +3 -0
- package/build/utils/themes-sync.js +8 -8
- package/package.json +4 -3
- package/build/resources/index.d.ts +0 -4
- package/build/resources/index.js +0 -4
- package/build/resources/tool-params-guide.d.ts +0 -571
- package/build/resources/tool-params-guide.js +0 -488
- package/build/tools/analyze_project.d.ts +0 -1
- package/build/tools/analyze_project.js +0 -527
- package/build/tools/check_deps.d.ts +0 -13
- package/build/tools/check_deps.js +0 -204
- package/build/tools/convert.d.ts +0 -13
- package/build/tools/convert.js +0 -599
- package/build/tools/css_order.d.ts +0 -13
- package/build/tools/css_order.js +0 -81
- package/build/tools/debug.d.ts +0 -13
- package/build/tools/debug.js +0 -131
- package/build/tools/design2code.d.ts +0 -20
- package/build/tools/design2code.js +0 -426
- package/build/tools/detect_shell.d.ts +0 -6
- package/build/tools/detect_shell.js +0 -151
- package/build/tools/explain.d.ts +0 -13
- package/build/tools/explain.js +0 -390
- package/build/tools/fix.d.ts +0 -13
- package/build/tools/fix.js +0 -303
- package/build/tools/gen_mock.d.ts +0 -22
- package/build/tools/gen_mock.js +0 -269
- package/build/tools/gen_skill.d.ts +0 -13
- package/build/tools/gen_skill.js +0 -560
- package/build/tools/genapi.d.ts +0 -13
- package/build/tools/genapi.js +0 -174
- package/build/tools/genchangelog.d.ts +0 -13
- package/build/tools/genchangelog.js +0 -250
- package/build/tools/gendoc.d.ts +0 -13
- package/build/tools/gendoc.js +0 -232
- package/build/tools/genpr.d.ts +0 -13
- package/build/tools/genpr.js +0 -194
- package/build/tools/genreadme.d.ts +0 -13
- package/build/tools/genreadme.js +0 -626
- package/build/tools/gensql.d.ts +0 -13
- package/build/tools/gensql.js +0 -320
- package/build/tools/genui.d.ts +0 -13
- package/build/tools/genui.js +0 -803
- package/build/tools/init_component_catalog.d.ts +0 -22
- package/build/tools/init_component_catalog.js +0 -809
- package/build/tools/init_setting.d.ts +0 -13
- package/build/tools/init_setting.js +0 -47
- package/build/tools/perf.d.ts +0 -13
- package/build/tools/perf.js +0 -409
- package/build/tools/render_ui.d.ts +0 -22
- package/build/tools/render_ui.js +0 -384
- package/build/tools/resolve_conflict.d.ts +0 -13
- package/build/tools/resolve_conflict.js +0 -349
- package/build/tools/security_scan.d.ts +0 -22
- package/build/tools/security_scan.js +0 -323
- package/build/tools/split.d.ts +0 -13
- package/build/tools/split.js +0 -599
- package/build/tools/start_api.d.ts +0 -13
- package/build/tools/start_api.js +0 -193
- package/build/tools/start_doc.d.ts +0 -13
- package/build/tools/start_doc.js +0 -207
- package/build/tools/start_refactor.d.ts +0 -13
- package/build/tools/start_refactor.js +0 -188
- package/build/tools/start_release.d.ts +0 -13
- package/build/tools/start_release.js +0 -167
- package/build/tools/start_review.d.ts +0 -13
- package/build/tools/start_review.js +0 -175
- /package/build/{utils/design-docs-generator.d.ts → lib/__tests__/memory-orchestration.unit.test.d.ts} +0 -0
- /package/build/{utils/design-docs-generator.js → lib/__tests__/memory-payload.unit.test.d.ts} +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 规格文档「填写后校验」闸门(P1)
|
|
3
|
+
*
|
|
4
|
+
* 目标:不依赖模型自觉。落盘后机械校验 requirements/design/tasks 的完整性,
|
|
5
|
+
* 打回残留占位符、缺章节、无 FR、无验收标准、FR 未进覆盖矩阵等问题,
|
|
6
|
+
* 让中等/偏弱模型也能被强制补全到可实现的程度。
|
|
7
|
+
*
|
|
8
|
+
* 本模块为纯逻辑、无 I/O,便于单测。
|
|
9
|
+
*/
|
|
10
|
+
/** 匹配未填写的占位符:`[填写:xxx]` / `[填写:xxx]` / 裸 `[填写]` 都算 */
|
|
11
|
+
const PLACEHOLDER_RE = /\[填写[::]?[^\]]*\]/g;
|
|
12
|
+
function countPlaceholders(content) {
|
|
13
|
+
const matches = content.match(PLACEHOLDER_RE);
|
|
14
|
+
return matches ? matches.length : 0;
|
|
15
|
+
}
|
|
16
|
+
function escapeRegExp(value) {
|
|
17
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
18
|
+
}
|
|
19
|
+
/** 标题行存在性(## 概述 等) */
|
|
20
|
+
function hasSection(content, name) {
|
|
21
|
+
const re = new RegExp(`^#{1,6}\\s+${escapeRegExp(name)}`, 'm');
|
|
22
|
+
return re.test(content);
|
|
23
|
+
}
|
|
24
|
+
/** 提取去重后的 FR-n 需求 ID */
|
|
25
|
+
export function extractFrIds(content) {
|
|
26
|
+
const matches = content.match(/\bFR-\d+\b/g) || [];
|
|
27
|
+
return [...new Set(matches)];
|
|
28
|
+
}
|
|
29
|
+
const REQUIRED_SECTIONS = {
|
|
30
|
+
requirements: ['功能概述', '需求列表', '非功能需求', '依赖关系'],
|
|
31
|
+
design: ['概述', '技术方案', '文件结构'],
|
|
32
|
+
tasks: ['交付物清单', '任务列表', '需求覆盖矩阵', '文件变更清单'],
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* 校验三份规格文档。传入各文件的全文(不存在传 null)。
|
|
36
|
+
*/
|
|
37
|
+
export function validateSpecDocuments(input) {
|
|
38
|
+
const issues = [];
|
|
39
|
+
const requirements = input.requirements ?? null;
|
|
40
|
+
const design = input.design ?? null;
|
|
41
|
+
const tasks = input.tasks ?? null;
|
|
42
|
+
const checkFile = (key, content) => {
|
|
43
|
+
if (!content || !content.trim()) {
|
|
44
|
+
issues.push({ file: key, severity: 'error', code: 'missing_file', message: `${key}.md 不存在或为空` });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const placeholders = countPlaceholders(content);
|
|
48
|
+
if (placeholders > 0) {
|
|
49
|
+
issues.push({
|
|
50
|
+
file: key,
|
|
51
|
+
severity: 'error',
|
|
52
|
+
code: 'placeholder',
|
|
53
|
+
message: `${key}.md 仍有 ${placeholders} 处未填写的「[填写:…]」占位`,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
for (const section of REQUIRED_SECTIONS[key]) {
|
|
57
|
+
if (!hasSection(content, section)) {
|
|
58
|
+
issues.push({ file: key, severity: 'error', code: 'missing_section', message: `${key}.md 缺少章节「${section}」` });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
checkFile('requirements', requirements);
|
|
63
|
+
checkFile('design', design);
|
|
64
|
+
checkFile('tasks', tasks);
|
|
65
|
+
// requirements:需有带 ID 的需求与 EARS 验收标准
|
|
66
|
+
let frIds = [];
|
|
67
|
+
if (requirements && requirements.trim()) {
|
|
68
|
+
frIds = extractFrIds(requirements);
|
|
69
|
+
if (frIds.length === 0) {
|
|
70
|
+
issues.push({ file: 'requirements', severity: 'error', code: 'no_fr', message: 'requirements.md 未定义任何带稳定 ID 的需求(FR-1、FR-2…)' });
|
|
71
|
+
}
|
|
72
|
+
if (!/SHALL/i.test(requirements)) {
|
|
73
|
+
issues.push({ file: 'requirements', severity: 'error', code: 'no_acceptance', message: 'requirements.md 未发现 EARS 验收标准(应包含「SHALL」)' });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// design:应引用 requirements 的 FR
|
|
77
|
+
if (design && design.trim() && frIds.length > 0) {
|
|
78
|
+
const designFr = extractFrIds(design);
|
|
79
|
+
if (designFr.length === 0) {
|
|
80
|
+
issues.push({ file: 'design', severity: 'warning', code: 'no_fr_ref', message: 'design.md 未引用任何 FR-id(应在「对应需求」标注本设计覆盖的需求)' });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 跨文档:每条 FR 都应在 tasks(含覆盖矩阵)出现,否则可能漏实现
|
|
84
|
+
if (requirements && tasks && tasks.trim() && frIds.length > 0) {
|
|
85
|
+
const taskFr = new Set(extractFrIds(tasks));
|
|
86
|
+
const uncovered = frIds.filter((id) => !taskFr.has(id));
|
|
87
|
+
if (uncovered.length > 0) {
|
|
88
|
+
issues.push({
|
|
89
|
+
file: 'cross',
|
|
90
|
+
severity: 'error',
|
|
91
|
+
code: 'uncovered_fr',
|
|
92
|
+
message: `以下需求未在 tasks.md(含需求覆盖矩阵)出现,可能漏实现:${uncovered.join(', ')}`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// tasks:详细度校验——每条任务应附「证据块」,避免宽泛任务导致 AI 偷懒
|
|
97
|
+
if (tasks && tasks.trim()) {
|
|
98
|
+
const taskItemCount = (tasks.match(/^\s*-\s*\[\s*\]\s*\d+\.\d+/gm) || []).length;
|
|
99
|
+
const evidenceCount = (tasks.match(/证据块/g) || []).length;
|
|
100
|
+
if (taskItemCount > 0 && evidenceCount < taskItemCount) {
|
|
101
|
+
issues.push({
|
|
102
|
+
file: 'tasks',
|
|
103
|
+
severity: 'warning',
|
|
104
|
+
code: 'thin_task',
|
|
105
|
+
message: `tasks.md 有 ${taskItemCount} 条任务,但仅 ${evidenceCount} 条标注「证据块」;过于宽泛的任务易导致实现时偷懒/跳步`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const errorCount = issues.filter((item) => item.severity === 'error').length;
|
|
110
|
+
const warningCount = issues.filter((item) => item.severity === 'warning').length;
|
|
111
|
+
const passed = errorCount === 0;
|
|
112
|
+
const summary = passed
|
|
113
|
+
? `规格校验通过(${frIds.length} 条需求${warningCount ? `,${warningCount} 个提醒` : ''})`
|
|
114
|
+
: `规格校验未通过:${errorCount} 个必须修复的问题${warningCount ? `、${warningCount} 个提醒` : ''}`;
|
|
115
|
+
return { passed, errorCount, warningCount, issues, frIds, summary };
|
|
116
|
+
}
|
|
@@ -14,8 +14,8 @@ const TEMPLATE_VALIDATORS = {
|
|
|
14
14
|
requiredFields: ['技术选型'],
|
|
15
15
|
},
|
|
16
16
|
'specs/feature/tasks.md': {
|
|
17
|
-
requiredSections: ['概述', '任务列表', '检查点', '文件变更清单'],
|
|
18
|
-
requiredFields: ['阶段 1', '阶段 2', '阶段 3'],
|
|
17
|
+
requiredSections: ['概述', '交付物清单', '任务列表', '检查点', '文件变更清单'],
|
|
18
|
+
requiredFields: ['阶段 1', '阶段 2', '阶段 3', '证据块'],
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
21
|
const EMBEDDED_TEMPLATES = {
|
|
@@ -25,6 +25,15 @@ const EMBEDDED_TEMPLATES = {
|
|
|
25
25
|
|
|
26
26
|
{description}
|
|
27
27
|
|
|
28
|
+
> 用一段话点明"做什么、给谁用、解决什么问题"。
|
|
29
|
+
|
|
30
|
+
## 历史经验与坑(来自记忆库)
|
|
31
|
+
|
|
32
|
+
> 开干前先看 start_feature 注入的「⚠️ 历史坑 / ♻️ 可复用经验」,把与本功能相关的条目落到这里;没有就写"暂无"。
|
|
33
|
+
|
|
34
|
+
- **可复用经验**: [填写:可直接复用的历史模式/做法]
|
|
35
|
+
- **必须规避的坑**: [填写:历史同类问题的根因与规避方式]
|
|
36
|
+
|
|
28
37
|
## 术语定义
|
|
29
38
|
|
|
30
39
|
- **[术语1]**: [填写:定义]
|
|
@@ -32,44 +41,68 @@ const EMBEDDED_TEMPLATES = {
|
|
|
32
41
|
|
|
33
42
|
---
|
|
34
43
|
|
|
44
|
+
## 范围边界
|
|
45
|
+
|
|
46
|
+
**In Scope(本次要做)**
|
|
47
|
+
- [填写:明确纳入本次的能力点]
|
|
48
|
+
|
|
49
|
+
**Out of Scope(本次不做,避免过度实现)**
|
|
50
|
+
- [填写:明确排除的能力点;没有就写"暂无"]
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
35
54
|
## 需求列表
|
|
36
55
|
|
|
37
|
-
|
|
56
|
+
> 每条需求一个稳定 ID(FR-1、FR-2…)。该 ID 会被 design.md 与 tasks.md 引用,三处必须一致。
|
|
57
|
+
|
|
58
|
+
### FR-1: [填写:需求标题]
|
|
38
59
|
|
|
60
|
+
**优先级:** [填写:Must / Should / Could](MoSCoW)
|
|
39
61
|
**用户故事:** 作为 [填写:角色],我想要 [填写:功能],以便 [填写:目标]。
|
|
40
62
|
|
|
41
|
-
####
|
|
63
|
+
#### 验收标准(EARS)
|
|
42
64
|
|
|
43
65
|
1. WHEN [填写:触发条件] THEN 系统 SHALL [填写:响应]
|
|
44
66
|
2. WHILE [填写:状态条件] THE 系统 SHALL [填写:响应]
|
|
45
67
|
3. IF [填写:异常条件] THEN 系统 SHALL [填写:处理方式]
|
|
46
68
|
|
|
47
|
-
|
|
69
|
+
### FR-2: [填写:需求标题]
|
|
48
70
|
|
|
49
|
-
|
|
71
|
+
**优先级:** [填写:Must / Should / Could]
|
|
72
|
+
**用户故事:** 作为 [填写:角色],我想要 [填写:功能],以便 [填写:目标]。
|
|
73
|
+
|
|
74
|
+
#### 验收标准(EARS)
|
|
75
|
+
|
|
76
|
+
1. WHEN [填写:触发条件] THEN 系统 SHALL [填写:响应]
|
|
77
|
+
2. IF [填写:异常条件] THEN 系统 SHALL [填写:处理方式]
|
|
78
|
+
|
|
79
|
+
> 按实际拆分增减 FR-n;每条需求应可独立验收。
|
|
50
80
|
|
|
51
|
-
|
|
52
|
-
- [填写:性能相关需求]
|
|
81
|
+
---
|
|
53
82
|
|
|
54
|
-
|
|
55
|
-
- [填写:安全相关需求]
|
|
83
|
+
## 非功能需求
|
|
56
84
|
|
|
57
|
-
|
|
58
|
-
- [
|
|
85
|
+
- **NFR-1(性能)**: [填写:尽量给可量化指标]
|
|
86
|
+
- **NFR-2(安全)**: [填写:安全相关需求]
|
|
87
|
+
- **NFR-3(兼容性)**: [填写:兼容性相关需求]
|
|
59
88
|
|
|
60
89
|
---
|
|
61
90
|
|
|
62
91
|
## 依赖关系
|
|
63
92
|
|
|
64
|
-
- [
|
|
93
|
+
- [填写:列出与其他功能/模块/外部服务的依赖]
|
|
65
94
|
|
|
66
95
|
---
|
|
67
96
|
|
|
68
97
|
## 检查清单
|
|
69
98
|
|
|
99
|
+
- [ ] 已消化记忆库的历史经验,并逐条规避「历史坑」
|
|
70
100
|
- [ ] 需求覆盖核心场景与边界场景
|
|
71
|
-
- [ ]
|
|
72
|
-
- [ ]
|
|
101
|
+
- [ ] 每条需求有唯一 ID(FR-n),将在 design.md / tasks.md 中被引用
|
|
102
|
+
- [ ] 验收标准使用 EARS 格式且可测
|
|
103
|
+
- [ ] 已标注优先级(MoSCoW)
|
|
104
|
+
- [ ] 范围边界(In/Out of Scope)明确
|
|
105
|
+
- [ ] 非功能需求明确、尽量可量化
|
|
73
106
|
- [ ] 依赖关系完整
|
|
74
107
|
`,
|
|
75
108
|
'specs/feature/guided/design.md': `# 设计文档:{feature_name}
|
|
@@ -78,7 +111,10 @@ const EMBEDDED_TEMPLATES = {
|
|
|
78
111
|
|
|
79
112
|
{description}
|
|
80
113
|
|
|
81
|
-
|
|
114
|
+
本设计描述 {feature_name} 功能的技术实现方案。
|
|
115
|
+
|
|
116
|
+
**对应需求:** [填写:本设计覆盖的需求 ID,如 FR-1, FR-2, NFR-1]
|
|
117
|
+
> 设计应覆盖 requirements.md 的全部 FR;某条 FR 不在本设计范围请在此注明原因。
|
|
82
118
|
|
|
83
119
|
---
|
|
84
120
|
|
|
@@ -86,13 +122,13 @@ const EMBEDDED_TEMPLATES = {
|
|
|
86
122
|
|
|
87
123
|
### 技术选型
|
|
88
124
|
|
|
89
|
-
| 类别 | 选择 | 理由 |
|
|
90
|
-
|
|
91
|
-
| [填写:类别] | [填写:技术] | [填写:选择理由] |
|
|
125
|
+
| 类别 | 选择 | 理由 | 关联需求 |
|
|
126
|
+
|------|------|------|----------|
|
|
127
|
+
| [填写:类别] | [填写:技术] | [填写:选择理由] | [填写:FR-n] |
|
|
92
128
|
|
|
93
129
|
### 架构设计
|
|
94
130
|
|
|
95
|
-
[
|
|
131
|
+
[填写:描述功能的架构设计,参考项目现有架构与目录约定]
|
|
96
132
|
|
|
97
133
|
\`\`\`
|
|
98
134
|
[填写:架构图或流程图,使用 ASCII 或 Mermaid]
|
|
@@ -102,19 +138,27 @@ const EMBEDDED_TEMPLATES = {
|
|
|
102
138
|
|
|
103
139
|
## 数据模型
|
|
104
140
|
|
|
105
|
-
[
|
|
141
|
+
[填写:若涉及数据存储,给出实体/字段/类型/约束;无则写"不涉及"]
|
|
142
|
+
|
|
143
|
+
| 实体/字段 | 类型 | 约束 | 说明 |
|
|
144
|
+
|-----------|------|------|------|
|
|
145
|
+
| [填写] | [填写] | [填写] | [填写] |
|
|
106
146
|
|
|
107
147
|
---
|
|
108
148
|
|
|
109
149
|
## API 设计
|
|
110
150
|
|
|
111
|
-
[
|
|
151
|
+
[填写:若涉及对外接口/函数契约,给出签名与出入参;无则写"不涉及"]
|
|
152
|
+
|
|
153
|
+
| 方法/函数 | 路径/签名 | 入参 | 出参 | 关联需求 |
|
|
154
|
+
|-----------|-----------|------|------|----------|
|
|
155
|
+
| [填写] | [填写] | [填写] | [填写] | [填写:FR-n] |
|
|
112
156
|
|
|
113
157
|
---
|
|
114
158
|
|
|
115
159
|
## 文件结构
|
|
116
160
|
|
|
117
|
-
[
|
|
161
|
+
[填写:对照项目上下文与代码图谱列出新增/修改的真实文件路径,勿臆造]
|
|
118
162
|
|
|
119
163
|
\`\`\`
|
|
120
164
|
[项目目录]/
|
|
@@ -127,7 +171,7 @@ const EMBEDDED_TEMPLATES = {
|
|
|
127
171
|
|
|
128
172
|
## 设计决策
|
|
129
173
|
|
|
130
|
-
### 决策 1: [填写:决策标题]
|
|
174
|
+
### 决策 1: [填写:决策标题](关联需求: [填写:FR-n])
|
|
131
175
|
|
|
132
176
|
**问题**: [填写:描述面临的问题]
|
|
133
177
|
|
|
@@ -141,6 +185,12 @@ const EMBEDDED_TEMPLATES = {
|
|
|
141
185
|
|
|
142
186
|
---
|
|
143
187
|
|
|
188
|
+
## 测试策略
|
|
189
|
+
|
|
190
|
+
[填写:如何验证本设计满足各 FR 的验收标准——单测/集成/手测要点]
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
144
194
|
## 风险评估
|
|
145
195
|
|
|
146
196
|
| 风险 | 影响 | 缓解措施 |
|
|
@@ -152,40 +202,73 @@ const EMBEDDED_TEMPLATES = {
|
|
|
152
202
|
## 检查清单
|
|
153
203
|
|
|
154
204
|
- [ ] 技术方案与现有架构一致
|
|
155
|
-
- [ ]
|
|
156
|
-
- [ ]
|
|
205
|
+
- [ ] requirements.md 中每条 FR 都被本设计覆盖(或注明不涉及)
|
|
206
|
+
- [ ] 文件结构对照真实代码库,路径可定位
|
|
207
|
+
- [ ] 数据模型 / 接口契约清晰(含类型与约束)
|
|
208
|
+
- [ ] 关键设计决策已记录并关联需求
|
|
209
|
+
- [ ] 测试策略可验证验收标准
|
|
157
210
|
`,
|
|
158
211
|
'specs/feature/guided/tasks.md': `# 任务清单:{feature_name}
|
|
159
212
|
|
|
160
213
|
## 概述
|
|
161
214
|
|
|
162
|
-
实现 {feature_name}
|
|
215
|
+
实现 {feature_name} 功能的任务分解。每条任务都要回链到需求(FR)与设计章节,确保不漏、不越界。
|
|
216
|
+
|
|
217
|
+
> **二元禁令(零容忍)**:本文件及后续实现的交付物中,禁止出现 \`[填写]\`、\`TODO\`、\`// ...\`、省略号占位。
|
|
218
|
+
> 这不是"尽量",是"零"。任何用占位符代替真实内容的行为都视为未完成。
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 交付物清单(Scope-lock)
|
|
223
|
+
|
|
224
|
+
> 先数清楚要产出什么,锁定数量。实现完成前必须回读本清单逐项核对,数量对不上即未完成。
|
|
225
|
+
|
|
226
|
+
- **预计新建文件数**: [填写:N 个]
|
|
227
|
+
- **预计修改文件数**: [填写:N 个]
|
|
228
|
+
- **预计新增/修改函数数**: [填写:约 N 个]
|
|
229
|
+
- **交付物逐项列举**:
|
|
230
|
+
1. [填写:交付物 1,如 src/auth/login.ts]
|
|
231
|
+
2. [填写:交付物 2]
|
|
163
232
|
|
|
164
233
|
---
|
|
165
234
|
|
|
166
235
|
## 任务列表
|
|
167
236
|
|
|
237
|
+
> **每条任务的硬性结构**(缺一不可):
|
|
238
|
+
> 1. **标题**:[动词] + [对象] + [约束/验收点]。如"实现登录接口 POST /api/login,校验邮箱格式并返回 JWT"。
|
|
239
|
+
> - ❌ 反例(过于宽泛,会被打回):"优化登录"、"处理用户模块"
|
|
240
|
+
> 2. **证据块**:动手前先读相关代码,贴出关键原文片段(文件:行号 + 代码),证明已理解现状再改。
|
|
241
|
+
> 3. **涉及文件 + 行数预算**:列出本任务触及的文件;单文件预计超 500 行时,必须在此写明拆分方案(拆成哪些模块/组件)。
|
|
242
|
+
> 4. **回链**:标注 _需求: FR-n_ 与 _设计: 章节_。
|
|
243
|
+
|
|
168
244
|
### 阶段 1: 准备工作
|
|
169
245
|
|
|
170
|
-
- [ ] 1.1 [
|
|
171
|
-
- [
|
|
172
|
-
-
|
|
246
|
+
- [ ] 1.1 [填写:动词+对象+约束的具体标题]
|
|
247
|
+
- **证据块**: [填写:先读 \`文件:行号\`,贴出现状关键片段]
|
|
248
|
+
- **涉及文件**: [填写:路径 + 行数预算;超 500 行写拆分方案]
|
|
249
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
173
250
|
|
|
174
251
|
---
|
|
175
252
|
|
|
176
253
|
### 阶段 2: 核心实现
|
|
177
254
|
|
|
178
|
-
- [ ] 2.1 [
|
|
179
|
-
- [
|
|
180
|
-
-
|
|
255
|
+
- [ ] 2.1 [填写:动词+对象+约束的具体标题]
|
|
256
|
+
- **证据块**: [填写:先读 \`文件:行号\`,贴出现状关键片段]
|
|
257
|
+
- **涉及文件**: [填写:路径 + 行数预算;超 500 行写拆分方案]
|
|
258
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
259
|
+
- [ ] 2.2 [填写:动词+对象+约束的具体标题]
|
|
260
|
+
- **证据块**: [填写:先读 \`文件:行号\`,贴出现状关键片段]
|
|
261
|
+
- **涉及文件**: [填写:路径 + 行数预算;超 500 行写拆分方案]
|
|
262
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
181
263
|
|
|
182
264
|
---
|
|
183
265
|
|
|
184
266
|
### 阶段 3: 集成测试
|
|
185
267
|
|
|
186
|
-
- [ ] 3.1 [
|
|
187
|
-
- [
|
|
188
|
-
-
|
|
268
|
+
- [ ] 3.1 [填写:动词+对象+约束的标题(对照验收标准逐条核验)]
|
|
269
|
+
- **证据块**: [填写:先读相关测试/接口现状]
|
|
270
|
+
- **涉及文件**: [填写:测试文件路径]
|
|
271
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
189
272
|
|
|
190
273
|
---
|
|
191
274
|
|
|
@@ -197,19 +280,36 @@ const EMBEDDED_TEMPLATES = {
|
|
|
197
280
|
|
|
198
281
|
---
|
|
199
282
|
|
|
283
|
+
## 需求覆盖矩阵
|
|
284
|
+
|
|
285
|
+
> 自检:每条 FR 至少对应一个任务;每个任务都能追到某条 FR。空缺即风险。
|
|
286
|
+
|
|
287
|
+
| 需求 ID | 设计章节 | 任务编号 | 状态 |
|
|
288
|
+
|---------|----------|----------|------|
|
|
289
|
+
| [填写:FR-1] | [填写:design 章节] | [填写:1.1, 2.1] | 未开始 |
|
|
290
|
+
| [填写:FR-2] | [填写:design 章节] | [填写:2.2] | 未开始 |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
200
294
|
## 文件变更清单
|
|
201
295
|
|
|
202
|
-
| 文件 | 操作 | 说明 |
|
|
203
|
-
|
|
204
|
-
| [填写:文件路径] | 新建/修改 | [填写:说明] |
|
|
296
|
+
| 文件 | 操作 | 行数预算 | 说明 |
|
|
297
|
+
|------|------|----------|------|
|
|
298
|
+
| [填写:文件路径] | 新建/修改 | [填写:预计行数] | [填写:说明] |
|
|
205
299
|
|
|
206
300
|
---
|
|
207
301
|
|
|
208
302
|
## 检查清单
|
|
209
303
|
|
|
210
|
-
- [ ]
|
|
211
|
-
- [ ]
|
|
212
|
-
- [ ]
|
|
304
|
+
- [ ] 交付物清单(Scope-lock)已填,实现后数量已逐项核对
|
|
305
|
+
- [ ] 每条任务标题是"动词+对象+约束"的具体描述,无宽泛标题
|
|
306
|
+
- [ ] 每条任务含证据块(先读后写)
|
|
307
|
+
- [ ] 每条任务标注涉及文件与行数预算,超 500 行的有拆分方案
|
|
308
|
+
- [ ] 任务分阶段合理,粒度可在单次提交内完成
|
|
309
|
+
- [ ] 每条任务都回链到 FR 与 design 章节
|
|
310
|
+
- [ ] 需求覆盖矩阵已填,无遗漏的 FR
|
|
311
|
+
- [ ] 阶段 3 包含"对照验收标准核验"
|
|
312
|
+
- [ ] 全文无 \`[填写]\` / \`TODO\` / 省略号占位(二元禁令)
|
|
213
313
|
`,
|
|
214
314
|
'specs/feature/strict/requirements.md': `# 需求文档:{feature_name}
|
|
215
315
|
|
|
@@ -217,24 +317,43 @@ const EMBEDDED_TEMPLATES = {
|
|
|
217
317
|
|
|
218
318
|
{description}
|
|
219
319
|
|
|
320
|
+
## 历史经验与坑(来自记忆库)
|
|
321
|
+
|
|
322
|
+
> 把 start_feature 注入的相关「坑 / 可复用经验」落到这里;无则写"暂无"。
|
|
323
|
+
|
|
324
|
+
- **可复用经验**: [填写]
|
|
325
|
+
- **必须规避的坑**: [填写]
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 范围边界
|
|
330
|
+
|
|
331
|
+
- **In Scope**: [填写:本次纳入]
|
|
332
|
+
- **Out of Scope**: [填写:本次排除;无则写"暂无"]
|
|
333
|
+
|
|
220
334
|
---
|
|
221
335
|
|
|
222
336
|
## 需求列表
|
|
223
337
|
|
|
224
|
-
|
|
338
|
+
> 每条需求一个稳定 ID(FR-n),design.md 与 tasks.md 引用时必须一致。
|
|
225
339
|
|
|
340
|
+
### FR-1: [填写:需求标题]
|
|
341
|
+
|
|
342
|
+
**优先级:** [填写:Must / Should / Could]
|
|
226
343
|
**用户故事:** 作为 [填写:角色],我想要 [填写:功能],以便 [填写:目标]。
|
|
227
344
|
|
|
228
|
-
####
|
|
345
|
+
#### 验收标准(EARS)
|
|
229
346
|
|
|
230
347
|
1. WHEN [填写:触发条件] THEN 系统 SHALL [填写:响应]
|
|
231
348
|
2. IF [填写:异常条件] THEN 系统 SHALL [填写:处理方式]
|
|
232
349
|
|
|
350
|
+
> 按需增加 FR-2、FR-3…
|
|
351
|
+
|
|
233
352
|
---
|
|
234
353
|
|
|
235
354
|
## 非功能需求
|
|
236
355
|
|
|
237
|
-
- [
|
|
356
|
+
- **NFR-1**: [填写:性能/安全/兼容性,尽量可量化]
|
|
238
357
|
|
|
239
358
|
---
|
|
240
359
|
|
|
@@ -248,15 +367,17 @@ const EMBEDDED_TEMPLATES = {
|
|
|
248
367
|
|
|
249
368
|
{description}
|
|
250
369
|
|
|
370
|
+
**对应需求:** [填写:覆盖的 FR/NFR ID,如 FR-1, FR-2]
|
|
371
|
+
|
|
251
372
|
---
|
|
252
373
|
|
|
253
374
|
## 技术方案
|
|
254
375
|
|
|
255
376
|
### 技术选型
|
|
256
377
|
|
|
257
|
-
| 类别 | 选择 | 理由 |
|
|
258
|
-
|
|
259
|
-
| [填写:类别] | [填写:技术] | [填写:理由] |
|
|
378
|
+
| 类别 | 选择 | 理由 | 关联需求 |
|
|
379
|
+
|------|------|------|----------|
|
|
380
|
+
| [填写:类别] | [填写:技术] | [填写:理由] | [填写:FR-n] |
|
|
260
381
|
|
|
261
382
|
### 架构设计
|
|
262
383
|
|
|
@@ -266,27 +387,27 @@ const EMBEDDED_TEMPLATES = {
|
|
|
266
387
|
|
|
267
388
|
## 数据模型
|
|
268
389
|
|
|
269
|
-
[
|
|
390
|
+
[填写:数据结构或表设计(字段/类型/约束);无则写"不涉及"]
|
|
270
391
|
|
|
271
392
|
---
|
|
272
393
|
|
|
273
394
|
## API 设计
|
|
274
395
|
|
|
275
|
-
|
|
|
276
|
-
|
|
277
|
-
| [填写:GET/POST/...] | [填写:/path] | [
|
|
396
|
+
| 方法/函数 | 路径/签名 | 入参/出参 | 关联需求 |
|
|
397
|
+
|------|------|------|----------|
|
|
398
|
+
| [填写:GET/POST/...] | [填写:/path] | [填写] | [填写:FR-n] |
|
|
278
399
|
|
|
279
400
|
---
|
|
280
401
|
|
|
281
402
|
## 文件结构
|
|
282
403
|
|
|
283
|
-
[
|
|
404
|
+
[填写:对照真实代码库列出新增/修改文件,勿臆造路径]
|
|
284
405
|
|
|
285
406
|
---
|
|
286
407
|
|
|
287
408
|
## 设计决策
|
|
288
409
|
|
|
289
|
-
### 决策 1: [填写:决策标题]
|
|
410
|
+
### 决策 1: [填写:决策标题](关联需求: [填写:FR-n])
|
|
290
411
|
|
|
291
412
|
**问题**: [填写:问题]
|
|
292
413
|
**选项**: [填写:选项]
|
|
@@ -304,27 +425,52 @@ const EMBEDDED_TEMPLATES = {
|
|
|
304
425
|
|
|
305
426
|
## 概述
|
|
306
427
|
|
|
307
|
-
实现 {feature_name}
|
|
428
|
+
实现 {feature_name} 的任务分解;每条任务回链 FR 与 design 章节。
|
|
429
|
+
|
|
430
|
+
> **二元禁令**:交付物中零容忍 \`[填写]\` / \`TODO\` / \`// ...\` 等占位。动手前先读相关代码贴出证据,再写实现。单文件超 500 行必须拆分。
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## 交付物清单(Scope-lock)
|
|
435
|
+
|
|
436
|
+
- 预计文件数: [填写:N]
|
|
437
|
+
- 预计任务数: [填写:N]
|
|
438
|
+
|
|
439
|
+
> 实现完成前回读本清单逐项核对,数量不符即未完成。
|
|
308
440
|
|
|
309
441
|
---
|
|
310
442
|
|
|
311
443
|
## 任务列表
|
|
312
444
|
|
|
445
|
+
> 每条任务标题须为「[动词]+[对象]+[约束]」的具体写法(如「新建 auth.service.ts 实现 JWT 签发,≤120 行」),禁止「优化登录」式宽泛描述。
|
|
446
|
+
|
|
313
447
|
### 阶段 1: 准备工作
|
|
314
448
|
|
|
315
|
-
- [ ] 1.1 [
|
|
449
|
+
- [ ] 1.1 [填写:动词+对象+约束]
|
|
450
|
+
- 证据块: [填写:动手前需读的文件:行号]
|
|
451
|
+
- 文件: [填写:路径](预算 [填写] 行,超 500 行拆分)
|
|
452
|
+
- _需求: [填写:FR-n]_ · _设计: [填写:章节]_
|
|
316
453
|
|
|
317
454
|
---
|
|
318
455
|
|
|
319
456
|
### 阶段 2: 核心实现
|
|
320
457
|
|
|
321
|
-
- [ ] 2.1 [
|
|
458
|
+
- [ ] 2.1 [填写:动词+对象+约束]
|
|
459
|
+
- 证据块: [填写:文件:行号]
|
|
460
|
+
- 文件: [填写:路径](预算 [填写] 行)
|
|
461
|
+
- _需求: [填写:FR-n]_ · _设计: [填写:章节]_
|
|
462
|
+
- [ ] 2.2 [填写:动词+对象+约束]
|
|
463
|
+
- 证据块: [填写:文件:行号]
|
|
464
|
+
- 文件: [填写:路径](预算 [填写] 行)
|
|
465
|
+
- _需求: [填写:FR-n]_ · _设计: [填写:章节]_
|
|
322
466
|
|
|
323
467
|
---
|
|
324
468
|
|
|
325
469
|
### 阶段 3: 集成测试
|
|
326
470
|
|
|
327
|
-
- [ ] 3.1 [
|
|
471
|
+
- [ ] 3.1 [填写:动词+对象+约束(对照验收标准逐条核验)]
|
|
472
|
+
- 验收点: [填写:对应哪条验收标准]
|
|
473
|
+
- _需求: [填写:FR-n]_
|
|
328
474
|
|
|
329
475
|
---
|
|
330
476
|
|
|
@@ -336,11 +482,27 @@ const EMBEDDED_TEMPLATES = {
|
|
|
336
482
|
|
|
337
483
|
---
|
|
338
484
|
|
|
485
|
+
## 需求覆盖矩阵
|
|
486
|
+
|
|
487
|
+
| 需求 ID | 设计章节 | 任务编号 | 状态 |
|
|
488
|
+
|---------|----------|----------|------|
|
|
489
|
+
| [填写:FR-1] | [填写:design 章节] | [填写:任务号] | 未开始 |
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
339
493
|
## 文件变更清单
|
|
340
494
|
|
|
341
|
-
| 文件 | 操作 | 说明 |
|
|
342
|
-
|
|
343
|
-
| [填写:文件路径] | 新建/修改 | [填写:说明] |
|
|
495
|
+
| 文件 | 操作 | 行数预算 | 说明 |
|
|
496
|
+
|------|------|----------|------|
|
|
497
|
+
| [填写:文件路径] | 新建/修改 | [填写:≤500] | [填写:说明] |
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## 交付前自检
|
|
502
|
+
|
|
503
|
+
- [ ] 无占位符 / TODO / 省略注释
|
|
504
|
+
- [ ] 交付物数量与 Scope-lock 一致
|
|
505
|
+
- [ ] 每个文件 ≤ 500 行、每条任务回链 FR
|
|
344
506
|
`,
|
|
345
507
|
};
|
|
346
508
|
export function normalizeTemplateProfile(input) {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工具注解(MCP Tool Annotations)集中映射
|
|
3
|
+
*
|
|
4
|
+
* 注解是给客户端的「提示」(非安全保证):客户端据此决定是否自动放行、是否提示用户等。
|
|
5
|
+
* - readOnlyHint: 工具不改动其环境(不写用户源码/项目状态)
|
|
6
|
+
* - idempotentHint: 相同入参重复调用无额外副作用
|
|
7
|
+
* - destructiveHint: 可能做破坏性更新(仅在非只读时有意义)
|
|
8
|
+
* - openWorldHint: 会与外部实体交互(HTTP/外部进程),结果可能非确定
|
|
9
|
+
*
|
|
10
|
+
* 分类:
|
|
11
|
+
* - 只读指南型:仅基于输入/内嵌数据计算并返回指南/计划,不碰用户源码、不触外部
|
|
12
|
+
* - 只读+openWorld:查 Qdrant / 跑 gitnexus 分析 / 结果随仓库或外部变化
|
|
13
|
+
* - 写型:落盘 / 写记忆 / 写缓存(均为非破坏性追加,destructive=false)
|
|
14
|
+
*/
|
|
15
|
+
export interface ToolAnnotations {
|
|
16
|
+
title?: string;
|
|
17
|
+
readOnlyHint?: boolean;
|
|
18
|
+
destructiveHint?: boolean;
|
|
19
|
+
idempotentHint?: boolean;
|
|
20
|
+
openWorldHint?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare const TOOL_ANNOTATIONS: Record<string, ToolAnnotations>;
|
|
23
|
+
/**
|
|
24
|
+
* 把注解合并进工具定义(用于 ListTools 返回前)。
|
|
25
|
+
*/
|
|
26
|
+
export declare function withToolAnnotations<T extends {
|
|
27
|
+
name: string;
|
|
28
|
+
}>(tool: T): T & {
|
|
29
|
+
annotations?: ToolAnnotations;
|
|
30
|
+
};
|