mcp-probe-kit 3.1.0 → 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 +5 -5
- package/build/index.js +5 -2
- package/build/lib/__tests__/spec-validator.unit.test.d.ts +1 -0
- package/build/lib/__tests__/spec-validator.unit.test.js +115 -0
- package/build/lib/memory-orchestration.js +29 -8
- 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/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/check_spec.d.ts +7 -0
- package/build/tools/check_spec.js +81 -0
- package/build/tools/index.d.ts +1 -0
- package/build/tools/index.js +1 -0
- package/build/tools/start_bugfix.js +21 -10
- package/build/tools/start_feature.js +46 -11
- package/build/tools/start_ui.js +27 -13
- package/package.json +2 -2
|
@@ -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 引用,三处必须一致。
|
|
38
57
|
|
|
58
|
+
### FR-1: [填写:需求标题]
|
|
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
|
+
**用户故事:** 作为 [填写:角色],我想要 [填写:功能],以便 [填写:目标]。
|
|
50
73
|
|
|
51
|
-
|
|
52
|
-
- [填写:性能相关需求]
|
|
74
|
+
#### 验收标准(EARS)
|
|
53
75
|
|
|
54
|
-
|
|
55
|
-
|
|
76
|
+
1. WHEN [填写:触发条件] THEN 系统 SHALL [填写:响应]
|
|
77
|
+
2. IF [填写:异常条件] THEN 系统 SHALL [填写:处理方式]
|
|
56
78
|
|
|
57
|
-
|
|
58
|
-
|
|
79
|
+
> 按实际拆分增减 FR-n;每条需求应可独立验收。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 非功能需求
|
|
84
|
+
|
|
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,24 +202,30 @@ 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)与设计章节,确保不漏、不越界。
|
|
163
216
|
|
|
164
217
|
---
|
|
165
218
|
|
|
166
219
|
## 任务列表
|
|
167
220
|
|
|
221
|
+
> 每条任务:动词开头、单一明确、可在一次提交内完成,并标注 _需求_ 与 _设计_。
|
|
222
|
+
> 示例:2.1 实现登录接口 POST /api/login — _需求: FR-1_ | _设计: API 设计_
|
|
223
|
+
|
|
168
224
|
### 阶段 1: 准备工作
|
|
169
225
|
|
|
170
226
|
- [ ] 1.1 [填写:任务标题]
|
|
171
227
|
- [填写:具体操作说明]
|
|
172
|
-
- _需求: [
|
|
228
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
173
229
|
|
|
174
230
|
---
|
|
175
231
|
|
|
@@ -177,15 +233,18 @@ const EMBEDDED_TEMPLATES = {
|
|
|
177
233
|
|
|
178
234
|
- [ ] 2.1 [填写:任务标题]
|
|
179
235
|
- [填写:具体操作说明]
|
|
180
|
-
- _需求: [
|
|
236
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
237
|
+
- [ ] 2.2 [填写:任务标题]
|
|
238
|
+
- [填写:具体操作说明]
|
|
239
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
181
240
|
|
|
182
241
|
---
|
|
183
242
|
|
|
184
243
|
### 阶段 3: 集成测试
|
|
185
244
|
|
|
186
|
-
- [ ] 3.1 [
|
|
245
|
+
- [ ] 3.1 [填写:任务标题(对照验收标准逐条核验)]
|
|
187
246
|
- [填写:具体操作说明]
|
|
188
|
-
- _需求: [
|
|
247
|
+
- _需求: [填写:FR-n]_ | _设计: [填写:design.md 章节]_
|
|
189
248
|
|
|
190
249
|
---
|
|
191
250
|
|
|
@@ -197,6 +256,17 @@ const EMBEDDED_TEMPLATES = {
|
|
|
197
256
|
|
|
198
257
|
---
|
|
199
258
|
|
|
259
|
+
## 需求覆盖矩阵
|
|
260
|
+
|
|
261
|
+
> 自检:每条 FR 至少对应一个任务;每个任务都能追到某条 FR。空缺即风险。
|
|
262
|
+
|
|
263
|
+
| 需求 ID | 设计章节 | 任务编号 | 状态 |
|
|
264
|
+
|---------|----------|----------|------|
|
|
265
|
+
| [填写:FR-1] | [填写:design 章节] | [填写:1.1, 2.1] | 未开始 |
|
|
266
|
+
| [填写:FR-2] | [填写:design 章节] | [填写:2.2] | 未开始 |
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
200
270
|
## 文件变更清单
|
|
201
271
|
|
|
202
272
|
| 文件 | 操作 | 说明 |
|
|
@@ -207,9 +277,11 @@ const EMBEDDED_TEMPLATES = {
|
|
|
207
277
|
|
|
208
278
|
## 检查清单
|
|
209
279
|
|
|
210
|
-
- [ ]
|
|
280
|
+
- [ ] 任务分阶段合理,粒度可在单次提交内完成
|
|
211
281
|
- [ ] 每项任务可执行且可验证
|
|
212
|
-
- [ ]
|
|
282
|
+
- [ ] 每条任务都回链到 FR 与 design 章节
|
|
283
|
+
- [ ] 需求覆盖矩阵已填,无遗漏的 FR
|
|
284
|
+
- [ ] 阶段 3 包含"对照验收标准核验"
|
|
213
285
|
`,
|
|
214
286
|
'specs/feature/strict/requirements.md': `# 需求文档:{feature_name}
|
|
215
287
|
|
|
@@ -217,24 +289,43 @@ const EMBEDDED_TEMPLATES = {
|
|
|
217
289
|
|
|
218
290
|
{description}
|
|
219
291
|
|
|
292
|
+
## 历史经验与坑(来自记忆库)
|
|
293
|
+
|
|
294
|
+
> 把 start_feature 注入的相关「坑 / 可复用经验」落到这里;无则写"暂无"。
|
|
295
|
+
|
|
296
|
+
- **可复用经验**: [填写]
|
|
297
|
+
- **必须规避的坑**: [填写]
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 范围边界
|
|
302
|
+
|
|
303
|
+
- **In Scope**: [填写:本次纳入]
|
|
304
|
+
- **Out of Scope**: [填写:本次排除;无则写"暂无"]
|
|
305
|
+
|
|
220
306
|
---
|
|
221
307
|
|
|
222
308
|
## 需求列表
|
|
223
309
|
|
|
224
|
-
|
|
310
|
+
> 每条需求一个稳定 ID(FR-n),design.md 与 tasks.md 引用时必须一致。
|
|
225
311
|
|
|
312
|
+
### FR-1: [填写:需求标题]
|
|
313
|
+
|
|
314
|
+
**优先级:** [填写:Must / Should / Could]
|
|
226
315
|
**用户故事:** 作为 [填写:角色],我想要 [填写:功能],以便 [填写:目标]。
|
|
227
316
|
|
|
228
|
-
####
|
|
317
|
+
#### 验收标准(EARS)
|
|
229
318
|
|
|
230
319
|
1. WHEN [填写:触发条件] THEN 系统 SHALL [填写:响应]
|
|
231
320
|
2. IF [填写:异常条件] THEN 系统 SHALL [填写:处理方式]
|
|
232
321
|
|
|
322
|
+
> 按需增加 FR-2、FR-3…
|
|
323
|
+
|
|
233
324
|
---
|
|
234
325
|
|
|
235
326
|
## 非功能需求
|
|
236
327
|
|
|
237
|
-
- [
|
|
328
|
+
- **NFR-1**: [填写:性能/安全/兼容性,尽量可量化]
|
|
238
329
|
|
|
239
330
|
---
|
|
240
331
|
|
|
@@ -248,15 +339,17 @@ const EMBEDDED_TEMPLATES = {
|
|
|
248
339
|
|
|
249
340
|
{description}
|
|
250
341
|
|
|
342
|
+
**对应需求:** [填写:覆盖的 FR/NFR ID,如 FR-1, FR-2]
|
|
343
|
+
|
|
251
344
|
---
|
|
252
345
|
|
|
253
346
|
## 技术方案
|
|
254
347
|
|
|
255
348
|
### 技术选型
|
|
256
349
|
|
|
257
|
-
| 类别 | 选择 | 理由 |
|
|
258
|
-
|
|
259
|
-
| [填写:类别] | [填写:技术] | [填写:理由] |
|
|
350
|
+
| 类别 | 选择 | 理由 | 关联需求 |
|
|
351
|
+
|------|------|------|----------|
|
|
352
|
+
| [填写:类别] | [填写:技术] | [填写:理由] | [填写:FR-n] |
|
|
260
353
|
|
|
261
354
|
### 架构设计
|
|
262
355
|
|
|
@@ -266,27 +359,27 @@ const EMBEDDED_TEMPLATES = {
|
|
|
266
359
|
|
|
267
360
|
## 数据模型
|
|
268
361
|
|
|
269
|
-
[
|
|
362
|
+
[填写:数据结构或表设计(字段/类型/约束);无则写"不涉及"]
|
|
270
363
|
|
|
271
364
|
---
|
|
272
365
|
|
|
273
366
|
## API 设计
|
|
274
367
|
|
|
275
|
-
|
|
|
276
|
-
|
|
277
|
-
| [填写:GET/POST/...] | [填写:/path] | [
|
|
368
|
+
| 方法/函数 | 路径/签名 | 入参/出参 | 关联需求 |
|
|
369
|
+
|------|------|------|----------|
|
|
370
|
+
| [填写:GET/POST/...] | [填写:/path] | [填写] | [填写:FR-n] |
|
|
278
371
|
|
|
279
372
|
---
|
|
280
373
|
|
|
281
374
|
## 文件结构
|
|
282
375
|
|
|
283
|
-
[
|
|
376
|
+
[填写:对照真实代码库列出新增/修改文件,勿臆造路径]
|
|
284
377
|
|
|
285
378
|
---
|
|
286
379
|
|
|
287
380
|
## 设计决策
|
|
288
381
|
|
|
289
|
-
### 决策 1: [填写:决策标题]
|
|
382
|
+
### 决策 1: [填写:决策标题](关联需求: [填写:FR-n])
|
|
290
383
|
|
|
291
384
|
**问题**: [填写:问题]
|
|
292
385
|
**选项**: [填写:选项]
|
|
@@ -304,7 +397,7 @@ const EMBEDDED_TEMPLATES = {
|
|
|
304
397
|
|
|
305
398
|
## 概述
|
|
306
399
|
|
|
307
|
-
实现 {feature_name}
|
|
400
|
+
实现 {feature_name} 的任务分解;每条任务回链 FR 与 design 章节。
|
|
308
401
|
|
|
309
402
|
---
|
|
310
403
|
|
|
@@ -312,19 +405,20 @@ const EMBEDDED_TEMPLATES = {
|
|
|
312
405
|
|
|
313
406
|
### 阶段 1: 准备工作
|
|
314
407
|
|
|
315
|
-
- [ ] 1.1 [填写:任务标题]
|
|
408
|
+
- [ ] 1.1 [填写:任务标题] — _需求: [填写:FR-n]_ | _设计: [填写:章节]_
|
|
316
409
|
|
|
317
410
|
---
|
|
318
411
|
|
|
319
412
|
### 阶段 2: 核心实现
|
|
320
413
|
|
|
321
|
-
- [ ] 2.1 [填写:任务标题]
|
|
414
|
+
- [ ] 2.1 [填写:任务标题] — _需求: [填写:FR-n]_ | _设计: [填写:章节]_
|
|
415
|
+
- [ ] 2.2 [填写:任务标题] — _需求: [填写:FR-n]_ | _设计: [填写:章节]_
|
|
322
416
|
|
|
323
417
|
---
|
|
324
418
|
|
|
325
419
|
### 阶段 3: 集成测试
|
|
326
420
|
|
|
327
|
-
- [ ] 3.1 [
|
|
421
|
+
- [ ] 3.1 [填写:任务标题(对照验收标准核验)] — _需求: [填写:FR-n]_
|
|
328
422
|
|
|
329
423
|
---
|
|
330
424
|
|
|
@@ -336,6 +430,14 @@ const EMBEDDED_TEMPLATES = {
|
|
|
336
430
|
|
|
337
431
|
---
|
|
338
432
|
|
|
433
|
+
## 需求覆盖矩阵
|
|
434
|
+
|
|
435
|
+
| 需求 ID | 设计章节 | 任务编号 | 状态 |
|
|
436
|
+
|---------|----------|----------|------|
|
|
437
|
+
| [填写:FR-1] | [填写:design 章节] | [填写:任务号] | 未开始 |
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
339
441
|
## 文件变更清单
|
|
340
442
|
|
|
341
443
|
| 文件 | 操作 | 说明 |
|
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
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 const TOOL_ANNOTATIONS = {
|
|
16
|
+
// —— 只读指南型(可安全自动放行)——
|
|
17
|
+
init_project: { title: '初始化项目', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
18
|
+
gencommit: { title: '生成提交信息', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
19
|
+
code_review: { title: '代码审查', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
20
|
+
gentest: { title: '生成测试', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
21
|
+
refactor: { title: '重构建议', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
22
|
+
fix_bug: { title: 'Bug 真因分析指南', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
23
|
+
add_feature: { title: '生成功能规格模板', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
24
|
+
estimate: { title: '工作量估算', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
25
|
+
check_spec: { title: '规格完整性校验', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
26
|
+
interview: { title: '需求访谈', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
27
|
+
ask_user: { title: '向用户提问', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
28
|
+
git_work_report: { title: 'Git 工作报告指南', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
29
|
+
ui_design_system: { title: '生成设计系统', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
30
|
+
ui_search: { title: '搜索 UI/UX 数据', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
31
|
+
start_product: { title: '产品设计编排', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
32
|
+
// 返回脚本/文件内容 + delegated plan,由 Agent 落盘 .ralph/——工具自身不写
|
|
33
|
+
start_ralph: { title: 'Ralph 循环开发编排', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
34
|
+
// 只读扫描本地代码、返回候选模式;不写记忆(存储是 memorize_asset 的事)
|
|
35
|
+
scan_and_extract_patterns: { title: '扫描并提取模式', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
36
|
+
// —— 只读 + 触外部 / 非确定 ——
|
|
37
|
+
search_memory: { title: '检索共享记忆', readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
38
|
+
read_memory_asset: { title: '读取记忆资产', readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
39
|
+
start_ui: { title: 'UI 开发编排', readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
40
|
+
start_onboard: { title: '项目上手编排', readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
41
|
+
code_insight: { title: '代码图谱洞察', readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
42
|
+
start_feature: { title: '新功能开发编排', readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
43
|
+
start_bugfix: { title: 'Bug 修复编排', readOnlyHint: true, idempotentHint: false, openWorldHint: true },
|
|
44
|
+
// —— 写型(工具自身落盘 / 写记忆 / 写缓存,非破坏)——
|
|
45
|
+
init_project_context: { title: '生成项目上下文', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false }, // 自己写 docs/.mcp-probe/layout.json(其余为指令)
|
|
46
|
+
memorize_asset: { title: '沉淀记忆资产', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }, // 写 Qdrant
|
|
47
|
+
sync_ui_data: { title: '同步 UI 数据', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }, // 下载 + 写缓存
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 把注解合并进工具定义(用于 ListTools 返回前)。
|
|
51
|
+
*/
|
|
52
|
+
export function withToolAnnotations(tool) {
|
|
53
|
+
const annotations = TOOL_ANNOTATIONS[tool.name];
|
|
54
|
+
return annotations ? { ...tool, annotations } : tool;
|
|
55
|
+
}
|
|
@@ -21,6 +21,7 @@ export const TOOLSET_DEFINITIONS = {
|
|
|
21
21
|
'refactor',
|
|
22
22
|
'fix_bug',
|
|
23
23
|
'add_feature',
|
|
24
|
+
'check_spec',
|
|
24
25
|
'init_project',
|
|
25
26
|
'init_project_context',
|
|
26
27
|
'estimate',
|
|
@@ -42,6 +43,7 @@ export const TOOLSET_DEFINITIONS = {
|
|
|
42
43
|
'refactor',
|
|
43
44
|
'fix_bug',
|
|
44
45
|
'add_feature',
|
|
46
|
+
'check_spec',
|
|
45
47
|
'init_project',
|
|
46
48
|
'init_project_context',
|
|
47
49
|
'estimate',
|
package/build/schemas/index.d.ts
CHANGED
|
@@ -281,6 +281,28 @@ export declare const allToolSchemas: ({
|
|
|
281
281
|
readonly required: readonly [];
|
|
282
282
|
readonly additionalProperties: true;
|
|
283
283
|
};
|
|
284
|
+
} | {
|
|
285
|
+
readonly name: "check_spec";
|
|
286
|
+
readonly description: "校验已落盘的功能规格(docs/specs/<feature_name>/requirements|design|tasks.md)是否完整:检测残留 [填写] 占位、缺失章节、缺 FR/验收标准、FR 未进覆盖矩阵。写完规格后、进入实现前调用;未通过按报告补全后重跑。";
|
|
287
|
+
readonly inputSchema: {
|
|
288
|
+
readonly type: "object";
|
|
289
|
+
readonly properties: {
|
|
290
|
+
readonly feature_name: {
|
|
291
|
+
readonly type: "string";
|
|
292
|
+
readonly description: "要校验的规格目录名,对应 docs/specs/<feature_name>/";
|
|
293
|
+
};
|
|
294
|
+
readonly docs_dir: {
|
|
295
|
+
readonly type: "string";
|
|
296
|
+
readonly description: "文档根目录,默认为 docs";
|
|
297
|
+
};
|
|
298
|
+
readonly project_root: {
|
|
299
|
+
readonly type: "string";
|
|
300
|
+
readonly description: "项目根目录绝对路径。可选,默认自动探测工作区根";
|
|
301
|
+
};
|
|
302
|
+
};
|
|
303
|
+
readonly required: readonly [];
|
|
304
|
+
readonly additionalProperties: true;
|
|
305
|
+
};
|
|
284
306
|
} | {
|
|
285
307
|
readonly name: "start_feature";
|
|
286
308
|
readonly description: "当用户需要完整的新功能开发流程时使用。编排:检查上下文→生成规格→估算工作量。若只需规格文档请用 add_feature";
|
|
@@ -89,4 +89,26 @@ export declare const projectToolSchemas: readonly [{
|
|
|
89
89
|
readonly required: readonly [];
|
|
90
90
|
readonly additionalProperties: true;
|
|
91
91
|
};
|
|
92
|
+
}, {
|
|
93
|
+
readonly name: "check_spec";
|
|
94
|
+
readonly description: "校验已落盘的功能规格(docs/specs/<feature_name>/requirements|design|tasks.md)是否完整:检测残留 [填写] 占位、缺失章节、缺 FR/验收标准、FR 未进覆盖矩阵。写完规格后、进入实现前调用;未通过按报告补全后重跑。";
|
|
95
|
+
readonly inputSchema: {
|
|
96
|
+
readonly type: "object";
|
|
97
|
+
readonly properties: {
|
|
98
|
+
readonly feature_name: {
|
|
99
|
+
readonly type: "string";
|
|
100
|
+
readonly description: "要校验的规格目录名,对应 docs/specs/<feature_name>/";
|
|
101
|
+
};
|
|
102
|
+
readonly docs_dir: {
|
|
103
|
+
readonly type: "string";
|
|
104
|
+
readonly description: "文档根目录,默认为 docs";
|
|
105
|
+
};
|
|
106
|
+
readonly project_root: {
|
|
107
|
+
readonly type: "string";
|
|
108
|
+
readonly description: "项目根目录绝对路径。可选,默认自动探测工作区根";
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
readonly required: readonly [];
|
|
112
|
+
readonly additionalProperties: true;
|
|
113
|
+
};
|
|
92
114
|
}];
|
|
@@ -93,4 +93,27 @@ export const projectToolSchemas = [
|
|
|
93
93
|
additionalProperties: true,
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
|
+
{
|
|
97
|
+
name: "check_spec",
|
|
98
|
+
description: "校验已落盘的功能规格(docs/specs/<feature_name>/requirements|design|tasks.md)是否完整:检测残留 [填写] 占位、缺失章节、缺 FR/验收标准、FR 未进覆盖矩阵。写完规格后、进入实现前调用;未通过按报告补全后重跑。",
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: "object",
|
|
101
|
+
properties: {
|
|
102
|
+
feature_name: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "要校验的规格目录名,对应 docs/specs/<feature_name>/",
|
|
105
|
+
},
|
|
106
|
+
docs_dir: {
|
|
107
|
+
type: "string",
|
|
108
|
+
description: "文档根目录,默认为 docs",
|
|
109
|
+
},
|
|
110
|
+
project_root: {
|
|
111
|
+
type: "string",
|
|
112
|
+
description: "项目根目录绝对路径。可选,默认自动探测工作区根",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
required: [],
|
|
116
|
+
additionalProperties: true,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
96
119
|
];
|