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
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
2
|
-
// resolve_conflict 工具实现
|
|
3
|
-
export async function resolveConflict(args) {
|
|
4
|
-
try {
|
|
5
|
-
// 智能参数解析,支持自然语言输入
|
|
6
|
-
const parsedArgs = parseArgs(args, {
|
|
7
|
-
defaultValues: {
|
|
8
|
-
conflicts: "",
|
|
9
|
-
},
|
|
10
|
-
primaryField: "conflicts", // 纯文本输入默认映射到 conflicts 字段
|
|
11
|
-
fieldAliases: {
|
|
12
|
-
conflicts: ["conflict", "diff", "merge", "冲突", "合并冲突"],
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
const conflicts = getString(parsedArgs.conflicts);
|
|
16
|
-
const message = `请分析并解决以下 Git 冲突:
|
|
17
|
-
|
|
18
|
-
⚔️ **冲突内容**:
|
|
19
|
-
${conflicts || "请提供 git diff 或冲突文件内容"}
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Git 冲突解决流程
|
|
24
|
-
|
|
25
|
-
### 第一步:识别冲突
|
|
26
|
-
|
|
27
|
-
执行以下命令查看冲突:
|
|
28
|
-
\`\`\`bash
|
|
29
|
-
# 查看冲突文件列表
|
|
30
|
-
git status
|
|
31
|
-
|
|
32
|
-
# 查看具体冲突
|
|
33
|
-
git diff
|
|
34
|
-
|
|
35
|
-
# 或查看单个文件冲突
|
|
36
|
-
git diff --ours --theirs filename
|
|
37
|
-
\`\`\`
|
|
38
|
-
|
|
39
|
-
### 第二步:理解冲突标记
|
|
40
|
-
|
|
41
|
-
**冲突格式:**
|
|
42
|
-
\`\`\`
|
|
43
|
-
<<<<<<< HEAD (当前分支)
|
|
44
|
-
你的修改
|
|
45
|
-
=======
|
|
46
|
-
他人的修改
|
|
47
|
-
>>>>>>> branch-name (合并的分支)
|
|
48
|
-
\`\`\`
|
|
49
|
-
|
|
50
|
-
**示例冲突:**
|
|
51
|
-
\`\`\`javascript
|
|
52
|
-
function calculateTotal(items) {
|
|
53
|
-
<<<<<<< HEAD
|
|
54
|
-
// 你的修改:添加了折扣
|
|
55
|
-
const subtotal = items.reduce((sum, item) => sum + item.price, 0);
|
|
56
|
-
return subtotal * 0.9; // 10% 折扣
|
|
57
|
-
=======
|
|
58
|
-
// 他人的修改:添加了税费
|
|
59
|
-
const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
60
|
-
return subtotal * 1.1; // 10% 税费
|
|
61
|
-
>>>>>>> feature/add-tax
|
|
62
|
-
}
|
|
63
|
-
\`\`\`
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 冲突分析
|
|
68
|
-
|
|
69
|
-
### 🔍 冲突类型识别
|
|
70
|
-
|
|
71
|
-
**1️⃣ 简单冲突(二选一)**
|
|
72
|
-
- 两个分支修改了同一行
|
|
73
|
-
- 通常选择其中一个版本
|
|
74
|
-
|
|
75
|
-
**2️⃣ 复杂冲突(需要合并)**
|
|
76
|
-
- 两个分支都添加了有用的功能
|
|
77
|
-
- 需要整合双方的修改
|
|
78
|
-
|
|
79
|
-
**3️⃣ 语义冲突**
|
|
80
|
-
- 语法上没冲突,但逻辑上不兼容
|
|
81
|
-
- 需要重新设计
|
|
82
|
-
|
|
83
|
-
**4️⃣ 结构冲突**
|
|
84
|
-
- 文件被移动或删除
|
|
85
|
-
- 需要决定文件的最终状态
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## 解决策略
|
|
90
|
-
|
|
91
|
-
### 策略 1:保留当前分支(ours)
|
|
92
|
-
\`\`\`bash
|
|
93
|
-
git checkout --ours filename
|
|
94
|
-
git add filename
|
|
95
|
-
\`\`\`
|
|
96
|
-
|
|
97
|
-
### 策略 2:保留对方分支(theirs)
|
|
98
|
-
\`\`\`bash
|
|
99
|
-
git checkout --theirs filename
|
|
100
|
-
git add filename
|
|
101
|
-
\`\`\`
|
|
102
|
-
|
|
103
|
-
### 策略 3:手动合并(推荐)
|
|
104
|
-
|
|
105
|
-
**步骤:**
|
|
106
|
-
1. 分析双方的修改意图
|
|
107
|
-
2. 整合有价值的修改
|
|
108
|
-
3. 删除冲突标记
|
|
109
|
-
4. 测试合并后的代码
|
|
110
|
-
|
|
111
|
-
**合并示例:**
|
|
112
|
-
\`\`\`javascript
|
|
113
|
-
// 原始冲突
|
|
114
|
-
function calculateTotal(items) {
|
|
115
|
-
<<<<<<< HEAD
|
|
116
|
-
const subtotal = items.reduce((sum, item) => sum + item.price, 0);
|
|
117
|
-
return subtotal * 0.9; // 10% 折扣
|
|
118
|
-
=======
|
|
119
|
-
const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
120
|
-
return subtotal * 1.1; // 10% 税费
|
|
121
|
-
>>>>>>> feature/add-tax
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// ✅ 合并后(整合双方修改)
|
|
125
|
-
function calculateTotal(items, { discount = 0, taxRate = 0.1 } = {}) {
|
|
126
|
-
// 整合了数量计算(theirs)和参数化设计(改进)
|
|
127
|
-
const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
128
|
-
const afterDiscount = subtotal * (1 - discount);
|
|
129
|
-
return afterDiscount * (1 + taxRate);
|
|
130
|
-
}
|
|
131
|
-
\`\`\`
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## 常见冲突场景
|
|
136
|
-
|
|
137
|
-
### 场景 1:Import 语句冲突
|
|
138
|
-
\`\`\`typescript
|
|
139
|
-
<<<<<<< HEAD
|
|
140
|
-
import { Button, Input } from './components';
|
|
141
|
-
import { api } from './services';
|
|
142
|
-
=======
|
|
143
|
-
import { Button, Select } from './components';
|
|
144
|
-
import { fetchData } from './utils';
|
|
145
|
-
>>>>>>> feature/add-select
|
|
146
|
-
|
|
147
|
-
// ✅ 合并后
|
|
148
|
-
import { Button, Input, Select } from './components';
|
|
149
|
-
import { api } from './services';
|
|
150
|
-
import { fetchData } from './utils';
|
|
151
|
-
\`\`\`
|
|
152
|
-
|
|
153
|
-
### 场景 2:配置文件冲突
|
|
154
|
-
\`\`\`json
|
|
155
|
-
<<<<<<< HEAD
|
|
156
|
-
{
|
|
157
|
-
"name": "my-app",
|
|
158
|
-
"version": "1.2.0",
|
|
159
|
-
"scripts": {
|
|
160
|
-
"dev": "vite",
|
|
161
|
-
"build": "vite build"
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
=======
|
|
165
|
-
{
|
|
166
|
-
"name": "my-app",
|
|
167
|
-
"version": "1.1.0",
|
|
168
|
-
"scripts": {
|
|
169
|
-
"dev": "vite",
|
|
170
|
-
"build": "vite build",
|
|
171
|
-
"test": "jest"
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
>>>>>>> feature/add-tests
|
|
175
|
-
|
|
176
|
-
// ✅ 合并后(保留最新版本号和所有脚本)
|
|
177
|
-
{
|
|
178
|
-
"name": "my-app",
|
|
179
|
-
"version": "1.2.0",
|
|
180
|
-
"scripts": {
|
|
181
|
-
"dev": "vite",
|
|
182
|
-
"build": "vite build",
|
|
183
|
-
"test": "jest"
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
\`\`\`
|
|
187
|
-
|
|
188
|
-
### 场景 3:函数重构冲突
|
|
189
|
-
\`\`\`typescript
|
|
190
|
-
<<<<<<< HEAD
|
|
191
|
-
// 你将同步改为异步
|
|
192
|
-
async function getUserData(id) {
|
|
193
|
-
const response = await fetch(\`/api/users/\${id}\`);
|
|
194
|
-
return response.json();
|
|
195
|
-
}
|
|
196
|
-
=======
|
|
197
|
-
// 他人添加了缓存
|
|
198
|
-
function getUserData(id) {
|
|
199
|
-
if (cache.has(id)) {
|
|
200
|
-
return cache.get(id);
|
|
201
|
-
}
|
|
202
|
-
const data = fetchUser(id);
|
|
203
|
-
cache.set(id, data);
|
|
204
|
-
return data;
|
|
205
|
-
}
|
|
206
|
-
>>>>>>> feature/add-cache
|
|
207
|
-
|
|
208
|
-
// ✅ 合并后(异步 + 缓存)
|
|
209
|
-
async function getUserData(id) {
|
|
210
|
-
if (cache.has(id)) {
|
|
211
|
-
return cache.get(id);
|
|
212
|
-
}
|
|
213
|
-
const response = await fetch(\`/api/users/\${id}\`);
|
|
214
|
-
const data = await response.json();
|
|
215
|
-
cache.set(id, data);
|
|
216
|
-
return data;
|
|
217
|
-
}
|
|
218
|
-
\`\`\`
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## 解决步骤
|
|
223
|
-
|
|
224
|
-
### Step 1: 备份
|
|
225
|
-
\`\`\`bash
|
|
226
|
-
# 创建备份分支
|
|
227
|
-
git branch backup-before-merge
|
|
228
|
-
\`\`\`
|
|
229
|
-
|
|
230
|
-
### Step 2: 分析冲突
|
|
231
|
-
\`\`\`bash
|
|
232
|
-
# 查看冲突统计
|
|
233
|
-
git diff --stat
|
|
234
|
-
|
|
235
|
-
# 使用可视化工具
|
|
236
|
-
git mergetool
|
|
237
|
-
\`\`\`
|
|
238
|
-
|
|
239
|
-
### Step 3: 解决冲突
|
|
240
|
-
1. 打开冲突文件
|
|
241
|
-
2. 分析双方修改
|
|
242
|
-
3. 手动合并代码
|
|
243
|
-
4. 删除冲突标记(<<<, ===, >>>)
|
|
244
|
-
|
|
245
|
-
### Step 4: 测试
|
|
246
|
-
\`\`\`bash
|
|
247
|
-
# 运行测试
|
|
248
|
-
npm test
|
|
249
|
-
|
|
250
|
-
# 运行 linter
|
|
251
|
-
npm run lint
|
|
252
|
-
|
|
253
|
-
# 构建检查
|
|
254
|
-
npm run build
|
|
255
|
-
\`\`\`
|
|
256
|
-
|
|
257
|
-
### Step 5: 提交
|
|
258
|
-
\`\`\`bash
|
|
259
|
-
# 标记冲突已解决
|
|
260
|
-
git add .
|
|
261
|
-
|
|
262
|
-
# 完成合并
|
|
263
|
-
git commit
|
|
264
|
-
|
|
265
|
-
# Git 会自动生成合并消息,或自定义:
|
|
266
|
-
git commit -m "chore: 解决 feature/xxx 合并冲突
|
|
267
|
-
|
|
268
|
-
- 整合了折扣和税费计算
|
|
269
|
-
- 保留了所有新增功能
|
|
270
|
-
- 所有测试通过"
|
|
271
|
-
\`\`\`
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
## 预防冲突
|
|
276
|
-
|
|
277
|
-
### 1️⃣ 频繁同步
|
|
278
|
-
\`\`\`bash
|
|
279
|
-
# 每天同步主分支
|
|
280
|
-
git fetch origin
|
|
281
|
-
git rebase origin/main
|
|
282
|
-
\`\`\`
|
|
283
|
-
|
|
284
|
-
### 2️⃣ 小步提交
|
|
285
|
-
- 提交粒度要小
|
|
286
|
-
- 功能尽量独立
|
|
287
|
-
- 避免大范围重构
|
|
288
|
-
|
|
289
|
-
### 3️⃣ 代码审查
|
|
290
|
-
- PR 及时 Review
|
|
291
|
-
- 避免长期未合并的分支
|
|
292
|
-
|
|
293
|
-
### 4️⃣ 使用工具
|
|
294
|
-
- VSCode Git Lens
|
|
295
|
-
- GitKraken
|
|
296
|
-
- Sourcetree
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## 复杂冲突处理
|
|
301
|
-
|
|
302
|
-
### 使用 Git Rerere(重用已记录的解决方案)
|
|
303
|
-
\`\`\`bash
|
|
304
|
-
# 启用 rerere
|
|
305
|
-
git config --global rerere.enabled true
|
|
306
|
-
|
|
307
|
-
# Git 会记住你的冲突解决方式
|
|
308
|
-
# 下次遇到相同冲突时自动应用
|
|
309
|
-
\`\`\`
|
|
310
|
-
|
|
311
|
-
### 使用三路合并工具
|
|
312
|
-
\`\`\`bash
|
|
313
|
-
# 配置 VSCode 作为合并工具
|
|
314
|
-
git config --global merge.tool vscode
|
|
315
|
-
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
|
|
316
|
-
|
|
317
|
-
# 使用
|
|
318
|
-
git mergetool
|
|
319
|
-
\`\`\`
|
|
320
|
-
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
现在请分析冲突内容,提供:
|
|
324
|
-
1. 冲突原因分析
|
|
325
|
-
2. 双方修改意图
|
|
326
|
-
3. 推荐的合并方案
|
|
327
|
-
4. 完整的解决后代码`;
|
|
328
|
-
return {
|
|
329
|
-
content: [
|
|
330
|
-
{
|
|
331
|
-
type: "text",
|
|
332
|
-
text: message,
|
|
333
|
-
},
|
|
334
|
-
],
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
catch (error) {
|
|
338
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
339
|
-
return {
|
|
340
|
-
content: [
|
|
341
|
-
{
|
|
342
|
-
type: "text",
|
|
343
|
-
text: `❌ 冲突解决失败: ${errorMessage}`,
|
|
344
|
-
},
|
|
345
|
-
],
|
|
346
|
-
isError: true,
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* security_scan 工具
|
|
3
|
-
*
|
|
4
|
-
* 功能:代码安全扫描,检测常见漏洞和不安全编码实践
|
|
5
|
-
* 模式:指令生成器模式 - 返回安全检查指南,由 AI 执行实际分析
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* security_scan 工具实现
|
|
9
|
-
*/
|
|
10
|
-
export declare function securityScan(args: any): Promise<{
|
|
11
|
-
content: {
|
|
12
|
-
type: string;
|
|
13
|
-
text: string;
|
|
14
|
-
}[];
|
|
15
|
-
isError?: undefined;
|
|
16
|
-
} | {
|
|
17
|
-
content: {
|
|
18
|
-
type: string;
|
|
19
|
-
text: string;
|
|
20
|
-
}[];
|
|
21
|
-
isError: boolean;
|
|
22
|
-
}>;
|
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* security_scan 工具
|
|
3
|
-
*
|
|
4
|
-
* 功能:代码安全扫描,检测常见漏洞和不安全编码实践
|
|
5
|
-
* 模式:指令生成器模式 - 返回安全检查指南,由 AI 执行实际分析
|
|
6
|
-
*/
|
|
7
|
-
const PROMPT_TEMPLATE = `# 安全扫描指南
|
|
8
|
-
|
|
9
|
-
## 🎯 扫描目标
|
|
10
|
-
|
|
11
|
-
**扫描类型**: {scan_type}
|
|
12
|
-
**编程语言**: {language}
|
|
13
|
-
|
|
14
|
-
**待扫描代码**:
|
|
15
|
-
\`\`\`{language}
|
|
16
|
-
{code}
|
|
17
|
-
\`\`\`
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## 📋 安全检查清单
|
|
22
|
-
|
|
23
|
-
### 1. 注入类漏洞 (Injection)
|
|
24
|
-
|
|
25
|
-
#### 1.1 SQL 注入 (CWE-89)
|
|
26
|
-
- [ ] 检查是否使用字符串拼接构建 SQL
|
|
27
|
-
- [ ] 检查是否使用参数化查询/预编译语句
|
|
28
|
-
- [ ] 检查 ORM 是否正确使用
|
|
29
|
-
|
|
30
|
-
**危险模式**:
|
|
31
|
-
\`\`\`
|
|
32
|
-
// ❌ 危险
|
|
33
|
-
query = "SELECT * FROM users WHERE id = " + userId
|
|
34
|
-
db.query(\`SELECT * FROM users WHERE name = '\${name}'\`)
|
|
35
|
-
|
|
36
|
-
// ✅ 安全
|
|
37
|
-
query = "SELECT * FROM users WHERE id = ?"
|
|
38
|
-
db.query("SELECT * FROM users WHERE name = $1", [name])
|
|
39
|
-
\`\`\`
|
|
40
|
-
|
|
41
|
-
#### 1.2 XSS 跨站脚本 (CWE-79)
|
|
42
|
-
- [ ] 检查用户输入是否直接输出到 HTML
|
|
43
|
-
- [ ] 检查是否使用 innerHTML/dangerouslySetInnerHTML
|
|
44
|
-
- [ ] 检查是否正确转义特殊字符
|
|
45
|
-
|
|
46
|
-
**危险模式**:
|
|
47
|
-
\`\`\`
|
|
48
|
-
// ❌ 危险
|
|
49
|
-
element.innerHTML = userInput
|
|
50
|
-
<div dangerouslySetInnerHTML={{__html: userContent}} />
|
|
51
|
-
|
|
52
|
-
// ✅ 安全
|
|
53
|
-
element.textContent = userInput
|
|
54
|
-
使用 DOMPurify 等库清理 HTML
|
|
55
|
-
\`\`\`
|
|
56
|
-
|
|
57
|
-
#### 1.3 命令注入 (CWE-78)
|
|
58
|
-
- [ ] 检查 exec/spawn/system 是否拼接用户输入
|
|
59
|
-
- [ ] 检查是否使用白名单验证
|
|
60
|
-
|
|
61
|
-
**危险模式**:
|
|
62
|
-
\`\`\`
|
|
63
|
-
// ❌ 危险
|
|
64
|
-
exec("ls " + userPath)
|
|
65
|
-
child_process.exec(\`git clone \${repoUrl}\`)
|
|
66
|
-
|
|
67
|
-
// ✅ 安全
|
|
68
|
-
execFile("ls", [userPath])
|
|
69
|
-
使用白名单验证输入
|
|
70
|
-
\`\`\`
|
|
71
|
-
|
|
72
|
-
#### 1.4 路径遍历 (CWE-22)
|
|
73
|
-
- [ ] 检查文件路径是否包含用户输入
|
|
74
|
-
- [ ] 检查是否验证路径在允许范围内
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
### 2. 认证授权问题 (Authentication & Authorization)
|
|
79
|
-
|
|
80
|
-
#### 2.1 硬编码凭证 (CWE-798)
|
|
81
|
-
- [ ] 搜索: password, secret, key, token, api_key
|
|
82
|
-
- [ ] 检查配置文件中的明文密码
|
|
83
|
-
- [ ] 检查注释中的凭证信息
|
|
84
|
-
|
|
85
|
-
**危险模式**:
|
|
86
|
-
\`\`\`
|
|
87
|
-
// ❌ 危险
|
|
88
|
-
const password = "admin123"
|
|
89
|
-
const apiKey = "sk-xxxxxxxxxxxx"
|
|
90
|
-
// TODO: 临时密码 test123
|
|
91
|
-
|
|
92
|
-
// ✅ 安全
|
|
93
|
-
const password = process.env.DB_PASSWORD
|
|
94
|
-
const apiKey = config.get("apiKey")
|
|
95
|
-
\`\`\`
|
|
96
|
-
|
|
97
|
-
#### 2.2 弱认证 (CWE-287)
|
|
98
|
-
- [ ] 检查密码强度验证
|
|
99
|
-
- [ ] 检查是否有暴力破解防护
|
|
100
|
-
- [ ] 检查 Session 管理
|
|
101
|
-
|
|
102
|
-
#### 2.3 权限检查缺失 (CWE-862)
|
|
103
|
-
- [ ] 检查敏感操作是否验证权限
|
|
104
|
-
- [ ] 检查是否存在越权访问风险
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
### 3. 加密安全问题 (Cryptography)
|
|
109
|
-
|
|
110
|
-
#### 3.1 弱哈希算法 (CWE-328)
|
|
111
|
-
- [ ] 检查是否使用 MD5/SHA1 存储密码
|
|
112
|
-
- [ ] 检查是否使用适当的密码哈希(bcrypt, argon2)
|
|
113
|
-
|
|
114
|
-
**危险模式**:
|
|
115
|
-
\`\`\`
|
|
116
|
-
// ❌ 危险
|
|
117
|
-
crypto.createHash('md5').update(password)
|
|
118
|
-
crypto.createHash('sha1').update(password)
|
|
119
|
-
|
|
120
|
-
// ✅ 安全
|
|
121
|
-
bcrypt.hash(password, saltRounds)
|
|
122
|
-
argon2.hash(password)
|
|
123
|
-
\`\`\`
|
|
124
|
-
|
|
125
|
-
#### 3.2 不安全随机数 (CWE-330)
|
|
126
|
-
- [ ] 检查安全相关场景是否使用 Math.random()
|
|
127
|
-
- [ ] 检查是否使用加密安全的随机数生成器
|
|
128
|
-
|
|
129
|
-
**危险模式**:
|
|
130
|
-
\`\`\`
|
|
131
|
-
// ❌ 危险(用于安全场景)
|
|
132
|
-
const token = Math.random().toString(36)
|
|
133
|
-
|
|
134
|
-
// ✅ 安全
|
|
135
|
-
const token = crypto.randomBytes(32).toString('hex')
|
|
136
|
-
\`\`\`
|
|
137
|
-
|
|
138
|
-
#### 3.3 弱加密算法 (CWE-327)
|
|
139
|
-
- [ ] 检查是否使用 DES/3DES/RC4
|
|
140
|
-
- [ ] 检查 AES 是否使用安全模式(GCM)
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
### 4. 敏感数据泄露 (Sensitive Data Exposure)
|
|
145
|
-
|
|
146
|
-
#### 4.1 日志泄露 (CWE-532)
|
|
147
|
-
- [ ] 检查日志是否包含密码、token、个人信息
|
|
148
|
-
- [ ] 检查错误日志是否泄露敏感信息
|
|
149
|
-
|
|
150
|
-
**危险模式**:
|
|
151
|
-
\`\`\`
|
|
152
|
-
// ❌ 危险
|
|
153
|
-
console.log("User login:", { username, password })
|
|
154
|
-
logger.info("API call with token:", apiToken)
|
|
155
|
-
|
|
156
|
-
// ✅ 安全
|
|
157
|
-
console.log("User login:", { username, password: "***" })
|
|
158
|
-
logger.info("API call with token:", maskToken(apiToken))
|
|
159
|
-
\`\`\`
|
|
160
|
-
|
|
161
|
-
#### 4.2 错误信息泄露 (CWE-209)
|
|
162
|
-
- [ ] 检查是否向用户返回详细错误信息
|
|
163
|
-
- [ ] 检查是否暴露堆栈跟踪
|
|
164
|
-
|
|
165
|
-
#### 4.3 注释中的敏感信息
|
|
166
|
-
- [ ] 检查注释中是否包含密码、密钥
|
|
167
|
-
- [ ] 检查 TODO/FIXME 中的敏感信息
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
### 5. 其他安全问题
|
|
172
|
-
|
|
173
|
-
#### 5.1 不安全的依赖
|
|
174
|
-
- [ ] 检查是否使用已知漏洞的依赖版本
|
|
175
|
-
|
|
176
|
-
#### 5.2 CORS 配置
|
|
177
|
-
- [ ] 检查是否使用 Access-Control-Allow-Origin: *
|
|
178
|
-
|
|
179
|
-
#### 5.3 不安全的反序列化 (CWE-502)
|
|
180
|
-
- [ ] 检查是否反序列化不可信数据
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## 📊 报告模板
|
|
185
|
-
|
|
186
|
-
### 漏洞摘要
|
|
187
|
-
|
|
188
|
-
| 严重程度 | 数量 | 说明 |
|
|
189
|
-
|----------|------|------|
|
|
190
|
-
| 🔴 Critical | 0 | 需立即修复 |
|
|
191
|
-
| 🟠 High | 0 | 尽快修复 |
|
|
192
|
-
| 🟡 Medium | 0 | 计划修复 |
|
|
193
|
-
| 🔵 Low | 0 | 建议修复 |
|
|
194
|
-
| ⚪ Info | 0 | 仅供参考 |
|
|
195
|
-
|
|
196
|
-
### 漏洞详情
|
|
197
|
-
|
|
198
|
-
#### [漏洞编号] 漏洞名称
|
|
199
|
-
|
|
200
|
-
| 属性 | 值 |
|
|
201
|
-
|------|-----|
|
|
202
|
-
| 严重程度 | 🔴 Critical / 🟠 High / 🟡 Medium / 🔵 Low |
|
|
203
|
-
| CWE | CWE-XXX |
|
|
204
|
-
| 位置 | 第 X 行 |
|
|
205
|
-
| 置信度 | 高 / 中 / 低 |
|
|
206
|
-
|
|
207
|
-
**问题代码**:
|
|
208
|
-
\`\`\`
|
|
209
|
-
[问题代码片段]
|
|
210
|
-
\`\`\`
|
|
211
|
-
|
|
212
|
-
**问题描述**: [描述安全风险]
|
|
213
|
-
|
|
214
|
-
**修复建议**:
|
|
215
|
-
\`\`\`
|
|
216
|
-
[修复后的代码]
|
|
217
|
-
\`\`\`
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
### 安全最佳实践建议
|
|
222
|
-
|
|
223
|
-
1. **输入验证**: 对所有用户输入进行验证和清理
|
|
224
|
-
2. **输出编码**: 根据上下文正确编码输出
|
|
225
|
-
3. **参数化查询**: 使用参数化查询防止注入
|
|
226
|
-
4. **最小权限**: 遵循最小权限原则
|
|
227
|
-
5. **安全配置**: 使用安全的默认配置
|
|
228
|
-
6. **依赖管理**: 定期更新依赖,修复已知漏洞
|
|
229
|
-
7. **日志安全**: 不记录敏感信息
|
|
230
|
-
8. **错误处理**: 不向用户暴露内部错误详情
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## 📤 输出格式要求
|
|
235
|
-
|
|
236
|
-
请严格按以下 JSON 格式输出扫描结果:
|
|
237
|
-
|
|
238
|
-
\`\`\`json
|
|
239
|
-
{
|
|
240
|
-
"scan_summary": {
|
|
241
|
-
"total_issues": 5,
|
|
242
|
-
"critical": 1,
|
|
243
|
-
"high": 2,
|
|
244
|
-
"medium": 1,
|
|
245
|
-
"low": 1
|
|
246
|
-
},
|
|
247
|
-
"findings": [
|
|
248
|
-
{
|
|
249
|
-
"severity": "critical|high|medium|low|info",
|
|
250
|
-
"type": "漏洞类型(如 SQL Injection)",
|
|
251
|
-
"cwe": "CWE-89",
|
|
252
|
-
"location": { "file": "文件路径", "line": 42 },
|
|
253
|
-
"vulnerable_code": "问题代码片段",
|
|
254
|
-
"exploit_scenario": "攻击场景描述",
|
|
255
|
-
"fix": "修复建议",
|
|
256
|
-
"fix_example": "修复代码示例"
|
|
257
|
-
}
|
|
258
|
-
],
|
|
259
|
-
"recommendations": ["安全最佳实践建议1", "建议2"]
|
|
260
|
-
}
|
|
261
|
-
\`\`\`
|
|
262
|
-
|
|
263
|
-
## ⚠️ 边界约束
|
|
264
|
-
|
|
265
|
-
- ❌ 仅分析代码,不执行任何操作
|
|
266
|
-
- ❌ 不做法律/归因结论
|
|
267
|
-
- ❌ 不保证发现所有漏洞(静态分析有局限性)
|
|
268
|
-
- ✅ 输出结构化风险清单和修复建议
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
*指南版本: 1.0.0*
|
|
273
|
-
*工具: MCP Probe Kit - security_scan*
|
|
274
|
-
`;
|
|
275
|
-
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
276
|
-
/**
|
|
277
|
-
* security_scan 工具实现
|
|
278
|
-
*/
|
|
279
|
-
export async function securityScan(args) {
|
|
280
|
-
try {
|
|
281
|
-
// 智能参数解析,支持自然语言输入
|
|
282
|
-
const parsedArgs = parseArgs(args, {
|
|
283
|
-
defaultValues: {
|
|
284
|
-
code: "",
|
|
285
|
-
language: "auto",
|
|
286
|
-
scan_type: "all",
|
|
287
|
-
},
|
|
288
|
-
primaryField: "code", // 纯文本输入默认映射到 code 字段
|
|
289
|
-
fieldAliases: {
|
|
290
|
-
code: ["source", "src", "代码", "content"],
|
|
291
|
-
language: ["lang", "语言", "编程语言"],
|
|
292
|
-
scan_type: ["type", "category", "类型", "扫描类型"],
|
|
293
|
-
},
|
|
294
|
-
});
|
|
295
|
-
const code = getString(parsedArgs.code);
|
|
296
|
-
const language = getString(parsedArgs.language) || "auto";
|
|
297
|
-
const scanType = getString(parsedArgs.scan_type) || "all";
|
|
298
|
-
if (!code) {
|
|
299
|
-
throw new Error("缺少必填参数: code(需要扫描的代码)");
|
|
300
|
-
}
|
|
301
|
-
const scanTypeDesc = {
|
|
302
|
-
all: "全面扫描(注入、认证、加密、敏感数据)",
|
|
303
|
-
injection: "注入类漏洞(SQL注入、XSS、命令注入)",
|
|
304
|
-
auth: "认证授权问题",
|
|
305
|
-
crypto: "加密安全问题",
|
|
306
|
-
sensitive_data: "敏感数据泄露",
|
|
307
|
-
};
|
|
308
|
-
const guide = PROMPT_TEMPLATE
|
|
309
|
-
.replace(/{code}/g, code)
|
|
310
|
-
.replace(/{language}/g, language)
|
|
311
|
-
.replace(/{scan_type}/g, scanTypeDesc[scanType] || scanType);
|
|
312
|
-
return {
|
|
313
|
-
content: [{ type: "text", text: guide }],
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
catch (error) {
|
|
317
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
318
|
-
return {
|
|
319
|
-
content: [{ type: "text", text: `❌ 安全扫描失败: ${errorMsg}` }],
|
|
320
|
-
isError: true,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
}
|
package/build/tools/split.d.ts
DELETED