feat: Add comprehensive tests for contentPattern and glob pattern matching

- Implemented final verification tests for contentPattern to validate behavior with empty strings, dangerous patterns, and normal patterns.
- Created glob pattern matching tests to verify regex conversion and matching functionality.
- Developed infinite loop risk tests using Worker threads to isolate potential blocking operations.
- Introduced optimized contentPattern tests to validate improvements in the findMatches function.
- Added verification tests to assess the effectiveness of contentPattern optimizations.
- Conducted safety tests for contentPattern to identify edge cases and potential vulnerabilities.
- Implemented unrestricted loop tests to analyze infinite loop risks without match limits.
- Developed tests for zero-width pattern detection logic to ensure proper handling of dangerous regex patterns.
This commit is contained in:
catlog22
2026-02-09 11:13:01 +08:00
parent dfe153778c
commit 964292ebdb
62 changed files with 7588 additions and 374 deletions

View File

@@ -0,0 +1,133 @@
# CCW MCP read_file contentPattern 优化总结
## 优化背景
基于分析会话 ANL-ccw-mcp-file-tools-2025-02-08 的结论,对 `read_file` 工具的 `contentPattern` 参数进行了安全性和易用性优化。
## 实施的优化
### 1. 空字符串行为优化
- **之前**: 空字符串 `""` 返回错误
- **之后**: 空字符串 `""` 返回全文(设计行为)
- **实现**: `findMatches` 返回 `null` 表示"匹配所有内容"
### 2. 危险模式安全回退
- **之前**: 危险模式(如 `x*`)被拦截,返回空结果
- **之后**: 危险模式自动回退到返回全文(安全回退)
- **实现**: 检测到零宽度模式时返回 `null`,而不是 `[]`
### 3. 增强的错误处理
- 模式长度限制1000 字符)→ 超限返回全文
- 无效正则表达式 → 返回全文而不是报错
- 迭代计数器保护(最大 1000 次迭代)
- 位置前进检查(防止 `regex.exec()` 卡住)
- 结果去重(使用 `Set` 防止重复行)
## 最终行为矩阵
| contentPattern 值 | 行为 | 返回值 | 文件是否包含 |
|-------------------|------|--------|--------------|
| `""` (空字符串) | 匹配所有内容 | `null` | ✅ 包含 |
| `"x*"` (危险模式) | 安全回退 | `null` | ✅ 包含 |
| `"CCW"` (正常匹配) | 正常过滤 | `["匹配行"]` | ✅ 包含 |
| `"NOMATCH"` (无匹配) | 跳过文件 | `[]` | ❌ 不包含 |
## 代码变更
### findMatches 函数签名
```typescript
// 之前
function findMatches(content: string, pattern: string): string[]
// 之后
function findMatches(content: string, pattern: string): string[] | null
```
### 返回值语义
- `null` → 匹配所有内容(不进行过滤)
- `[]` → 无匹配(跳过文件)
- `[string]` → 有匹配(返回匹配行)
### Schema 更新
```typescript
contentPattern: {
type: 'string',
description: 'Regex pattern to search within file content. Empty string "" returns all content. Dangerous patterns (e.g., "x*") automatically fall back to returning all content for safety.',
}
```
## 验证测试
运行 `node test-final-verification.js` 验证所有行为:
```bash
node test-final-verification.js
```
预期输出:
```
✅ 所有测试通过!
行为总结:
空字符串 "" → 返回全文(设计行为)
危险模式 "x*" → 返回全文(安全回退)
正常模式 "CCW" → 正常过滤
无匹配 "NOMATCH" → 跳过文件
```
## 相关文件
- `ccw/src/tools/read-file.ts` - 主要实现
- `test-final-verification.js` - 最终验证测试
- `test-mcp-tools.mjs` - MCP 工具参数验证
## 安全特性
1. **零宽度模式检测**: 在空字符串上双重 `exec` 测试
2. **迭代计数器**: 防止 ReDoS 攻击
3. **位置前进检查**: `match.index === lastIndex` 时强制前进
4. **结果去重**: 使用 `Set` 防止重复匹配
## 用户反馈处理
用户关键反馈:
> "空字符串 │ "" │ 输出错误并拦截 │ ✅ 这样不应该输出错误吧, 应该默认输出全部内容 read file"
实施结果:
- ✅ 空字符串返回全文(不是错误)
- ✅ 危险模式返回全文(不是拦截)
- ✅ 方法说明已更新
## 构建和测试
```bash
# 构建
npm run build
# 测试 MCP 工具
node test-mcp-tools.mjs
# 测试 contentPattern 行为
node test-final-verification.js
# 通过 CLI 测试
ccw tool exec read_file '{"paths":"README.md","contentPattern":"x*"}'
```
## 完成状态
- ✅ P0 任务 1: read_file offset/limit 多文件验证
- ✅ P0 任务 2: edit_file discriminatedUnion 重构
- ✅ contentPattern 安全性优化
- ✅ 空字符串行为修正
- ✅ 危险模式安全回退
- ✅ 方法说明更新
- ✅ 验证测试通过
## 优化日期
2025-02-08
## 相关分析会话
ANL-ccw-mcp-file-tools-2025-02-08