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.
Files changed (119) hide show
  1. package/README.md +15 -5
  2. package/build/index.js +5 -2
  3. package/build/lib/__tests__/memory-orchestration.unit.test.js +88 -0
  4. package/build/lib/__tests__/memory-payload.unit.test.js +35 -0
  5. package/build/lib/__tests__/quality-constraints.unit.test.d.ts +1 -0
  6. package/build/lib/__tests__/quality-constraints.unit.test.js +54 -0
  7. package/build/lib/__tests__/spec-validator.unit.test.d.ts +1 -0
  8. package/build/lib/__tests__/spec-validator.unit.test.js +147 -0
  9. package/build/lib/agents-md-template.js +32 -32
  10. package/build/lib/cursor-history-client.d.ts +54 -0
  11. package/build/lib/cursor-history-client.js +240 -0
  12. package/build/lib/memory-orchestration.js +29 -8
  13. package/build/lib/quality-constraints.d.ts +54 -0
  14. package/build/lib/quality-constraints.js +155 -0
  15. package/build/lib/skill-bridge.js +12 -12
  16. package/build/lib/spec-validator.d.ts +36 -0
  17. package/build/lib/spec-validator.js +116 -0
  18. package/build/lib/template-loader.js +223 -61
  19. package/build/lib/tool-annotations.d.ts +30 -0
  20. package/build/lib/tool-annotations.js +55 -0
  21. package/build/lib/toolset-manager.js +2 -0
  22. package/build/resources/ui-ux-data/guidelines/vercel-web-interface.json +1632 -1632
  23. package/build/resources/ui-ux-data/metadata.json +30 -30
  24. package/build/resources/ui-ux-data/shadcn/blocks.json +2541 -2541
  25. package/build/resources/ui-ux-data/shadcn/components.json +997 -997
  26. package/build/resources/ui-ux-data/themes/presets.json +483 -483
  27. package/build/schemas/index.d.ts +22 -0
  28. package/build/schemas/project-tools.d.ts +22 -0
  29. package/build/schemas/project-tools.js +23 -0
  30. package/build/tools/__tests__/cursor-history.unit.test.d.ts +1 -0
  31. package/build/tools/__tests__/cursor-history.unit.test.js +38 -0
  32. package/build/tools/check_spec.d.ts +7 -0
  33. package/build/tools/check_spec.js +81 -0
  34. package/build/tools/code_insight.js +41 -41
  35. package/build/tools/code_review.js +11 -4
  36. package/build/tools/cursor_read_conversation.d.ts +7 -0
  37. package/build/tools/cursor_read_conversation.js +36 -0
  38. package/build/tools/fix_bug.js +161 -161
  39. package/build/tools/gencommit.js +60 -60
  40. package/build/tools/index.d.ts +1 -0
  41. package/build/tools/index.js +1 -0
  42. package/build/tools/init_project_context.js +432 -432
  43. package/build/tools/start_bugfix.js +21 -10
  44. package/build/tools/start_feature.js +46 -11
  45. package/build/tools/start_product.js +1 -1
  46. package/build/tools/start_ui.js +44 -13
  47. package/build/tools/ui-ux-tools.d.ts +3 -0
  48. package/build/tools/ui-ux-tools.js +302 -290
  49. package/build/utils/__tests__/vercel-guidelines-sync.unit.test.js +12 -12
  50. package/build/utils/design-reasoning-engine.d.ts +2 -0
  51. package/build/utils/design-reasoning-engine.js +3 -0
  52. package/build/utils/themes-sync.js +8 -8
  53. package/package.json +4 -3
  54. package/build/resources/index.d.ts +0 -4
  55. package/build/resources/index.js +0 -4
  56. package/build/resources/tool-params-guide.d.ts +0 -571
  57. package/build/resources/tool-params-guide.js +0 -488
  58. package/build/tools/analyze_project.d.ts +0 -1
  59. package/build/tools/analyze_project.js +0 -527
  60. package/build/tools/check_deps.d.ts +0 -13
  61. package/build/tools/check_deps.js +0 -204
  62. package/build/tools/convert.d.ts +0 -13
  63. package/build/tools/convert.js +0 -599
  64. package/build/tools/css_order.d.ts +0 -13
  65. package/build/tools/css_order.js +0 -81
  66. package/build/tools/debug.d.ts +0 -13
  67. package/build/tools/debug.js +0 -131
  68. package/build/tools/design2code.d.ts +0 -20
  69. package/build/tools/design2code.js +0 -426
  70. package/build/tools/detect_shell.d.ts +0 -6
  71. package/build/tools/detect_shell.js +0 -151
  72. package/build/tools/explain.d.ts +0 -13
  73. package/build/tools/explain.js +0 -390
  74. package/build/tools/fix.d.ts +0 -13
  75. package/build/tools/fix.js +0 -303
  76. package/build/tools/gen_mock.d.ts +0 -22
  77. package/build/tools/gen_mock.js +0 -269
  78. package/build/tools/gen_skill.d.ts +0 -13
  79. package/build/tools/gen_skill.js +0 -560
  80. package/build/tools/genapi.d.ts +0 -13
  81. package/build/tools/genapi.js +0 -174
  82. package/build/tools/genchangelog.d.ts +0 -13
  83. package/build/tools/genchangelog.js +0 -250
  84. package/build/tools/gendoc.d.ts +0 -13
  85. package/build/tools/gendoc.js +0 -232
  86. package/build/tools/genpr.d.ts +0 -13
  87. package/build/tools/genpr.js +0 -194
  88. package/build/tools/genreadme.d.ts +0 -13
  89. package/build/tools/genreadme.js +0 -626
  90. package/build/tools/gensql.d.ts +0 -13
  91. package/build/tools/gensql.js +0 -320
  92. package/build/tools/genui.d.ts +0 -13
  93. package/build/tools/genui.js +0 -803
  94. package/build/tools/init_component_catalog.d.ts +0 -22
  95. package/build/tools/init_component_catalog.js +0 -809
  96. package/build/tools/init_setting.d.ts +0 -13
  97. package/build/tools/init_setting.js +0 -47
  98. package/build/tools/perf.d.ts +0 -13
  99. package/build/tools/perf.js +0 -409
  100. package/build/tools/render_ui.d.ts +0 -22
  101. package/build/tools/render_ui.js +0 -384
  102. package/build/tools/resolve_conflict.d.ts +0 -13
  103. package/build/tools/resolve_conflict.js +0 -349
  104. package/build/tools/security_scan.d.ts +0 -22
  105. package/build/tools/security_scan.js +0 -323
  106. package/build/tools/split.d.ts +0 -13
  107. package/build/tools/split.js +0 -599
  108. package/build/tools/start_api.d.ts +0 -13
  109. package/build/tools/start_api.js +0 -193
  110. package/build/tools/start_doc.d.ts +0 -13
  111. package/build/tools/start_doc.js +0 -207
  112. package/build/tools/start_refactor.d.ts +0 -13
  113. package/build/tools/start_refactor.js +0 -188
  114. package/build/tools/start_release.d.ts +0 -13
  115. package/build/tools/start_release.js +0 -167
  116. package/build/tools/start_review.d.ts +0 -13
  117. package/build/tools/start_review.js +0 -175
  118. /package/build/{utils/design-docs-generator.d.ts → lib/__tests__/memory-orchestration.unit.test.d.ts} +0 -0
  119. /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
- ### 需求 1: [填写:需求标题]
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
- - [ ] 验收标准使用 EARS 格式
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
- 本设计文档描述 {feature_name} 功能的技术实现方案。
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
- [填写:如果功能涉及 API,描述 API 设计]
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
- ### 需求 1: [填写:需求标题]
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
+ };