Files
Claude-Code-Workflow/ccw-contentPattern-optimization-summary.md
catlog22 964292ebdb 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.
2026-02-09 11:13:01 +08:00

3.7 KiB
Raw Blame History

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 函数签名

// 之前
function findMatches(content: string, pattern: string): string[]

// 之后
function findMatches(content: string, pattern: string): string[] | null

返回值语义

  • null → 匹配所有内容(不进行过滤)
  • [] → 无匹配(跳过文件)
  • [string] → 有匹配(返回匹配行)

Schema 更新

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 验证所有行为:

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"

实施结果:

  • 空字符串返回全文(不是错误)
  • 危险模式返回全文(不是拦截)
  • 方法说明已更新

构建和测试

# 构建
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