Skip to content

Releases: 23512478/ContextGate

Release list

v0.2.0

Choose a tag to compare

@23512478 23512478 released this 08 Sep 08:44

ContextGate v0.2.0

v0.1.0 之后用 23 个真实开源项目做了 4 轮练兵(mall / vhr / ruoyi-vue-pro / yudao-cloud / pig / litemall / JeecgBoot / snowy / dax-pay / xzs / favorites-web …),内嵌 SQL 识别从「单点规则」演进为「跨方法/跨类数据流分析」。

这版本最大的变化:条件会「流动」了

v0.1.0 只能看单方法内的 Wrapper 链。真实项目里条件经常是分开拼的:Service 里 wrapper.eq(...) 拼好条件传给 Mapper 的 selectList(wrapper),或者 lqw = buildQuery() 调 helper 方法构建。v0.2.0 把定义点、续链点、消费点跨方法/跨类串起来,条件经参数传播不动点归并,合成完整 SQL。

实测效果(同一项目对比):

  • ruoyi-vue-pro:内嵌 SQL 识别 178 → 1631 条,无 SQL 方法覆盖率 85%
  • snowy:ServiceImpl 继承式调用打通后逆向索引 4 → 200,事务闭包 339 → 480
  • RuoYi-Vue-Plus:真缺失 71 → 22
  • 第三轮 5 个项目验证轮:零新增缺陷

新增能力

  • 跨方法/跨类数据流:Wrapper/Example 作方法参数时调用方条件传播归并;跨类 helper(lqw = Other.buildXxx(...))与 helper 套 helper 递归展开;Wrapper 拷贝别名(w2 = w)共享底层链
  • ServiceImpl/BaseManager 继承式调用extends ServiceImpl<M,T> 的服务层不再要求注入 mapper 字段,this.list()/getById()/remove() 等 17 个继承方法映射到泛型 M;BaseManager 的 findByField(Entity::getField, value) 合成 WHERE
  • MyBatis Generator Example 动态条件andXxxEqualTo 链解码列名/操作符;criteria 分组语义还原(createCriteria()=AND 组、or()=OR 组含匿名组);selectByExample 等消费合成 WHERE
  • XML mapper 大补全:resultMap extends 继承合并、<association>/<collection> 嵌套映射列归因、select= 懒加载子查询链接(trace_call 标注 N+1)、<foreach> 批量条件重建
  • 类级 SQL 常量:JdbcTemplate 的 static final String SQL 可解析,支持字面量拼接与同类/跨类常量互拼折叠(全局不动点)
  • Wrapper 生态扩展LambdaQueryWrapperX 等 X 后缀自研 Wrapper 识别;Mapper default 方法 this.lambda() 链与 selectOne(Entity::getField, value) 字段值便捷调用
  • MP count 族修正selectCount/count/exists/countByExample 标 0 列,不再虚报全列触碰
  • 多项目模式:配置 CODECONTEXT_MAPS_DIR 后一个 server 管多个项目,新增 list_maps 工具(共 5 个工具)

修复

  • MapStruct 的 @Mapper 与 MyBatis @Mapper 撞名误判(ruoyi-vue-pro 数千个 *Convert 接口曾被误报),按 import 归属区分
  • 类注解名改从去注释文本抽取:@MapperScan、注释里提及 @Mapper 不再把启动类误判成 Mapper,@RestControllerAdvice 不再误判成 Controller
  • 逆向索引统计按 is_mapper 类计数,*Dao 命名的 mapper 不再漏计
  • XML 列清单逗号清理误伤 order_id 类列名,补词边界
  • README 配置示例环境变量名写错(写成了 CONTEXTGATE_PROJECT/MAP,server 实际读 CODECONTEXT_*):照抄旧配置会被静默忽略并回退到内置 demo 地图,已更正

⚠️ 如果你在 v0.1.0 时期照抄过 README 的 MCP 配置,请把 env 改成 CODECONTEXT_PROJECT / CODECONTEXT_MAP(多项目目录是 CODECONTEXT_MAPS_DIR)。

已知边界

  • 正则级解析,内部类 / Lombok 生成方法可能漏
  • Wrapper 多跳传播链、跨类直接传参暂不追;.select() 子查询列裁剪排队中
  • SQL 常量运行期拼参("..." + variable)静态拿不到

完整变更记录见 CHANGELOG.md

这个版本的每条规则都是真实项目逼出来的,你的项目就是最好的测试用例python analyzer/framework_map.py <你的项目>,发现漏报欢迎提 issue。

v0.1.0

Choose a tag to compare

@23512478 23512478 released this 07 Sep 18:02

ContextGate v0.1.0

首个公开发布版本。经过 campus-job、mall、vhr 三个真实 Spring Boot + MyBatis 项目验证,核心链路可用。

一句话介绍

把 Spring Boot + MyBatis 的框架约定(路由、依赖注入、事务、SQL、实体映射)离线预编译成一张代码地图,通过 MCP 协议喂给 AI 编程工具(Trae / Cursor / Claude Code),让 AI 改代码前查地图而不是全文 grep——省 token、防幻觉。

核心能力

  • 静态分析器(零依赖 Python):扫描 Java 源码 → 结构化 JSON 地图
  • MCP Server:4 个工具
    • trace_call — 路由/方法的完整调用链(含事务边界)
    • find_sql — 按方法名/表名/列名反查 SQL
    • impact — 改实体/字段的影响面分析
    • refresh_map — 一键刷新地图

已覆盖的解析规则

路由注解 / @Autowired 注入(含包私有字段)/ @Transactional 闭包(支持接口方法)/ 注解 SQL / XML mapper / 内嵌 SQL(JdbcTemplate 裸 SQL、MP Wrapper 动态链)/ 实体映射(@TableName 或裸 POJO 自动推断)/ MP BaseMapper 内置方法(selectById=SELECT * 全列)/ 全限定类型字段 / 裸 SELECT * 与别名星号展开 / 跨表 JOIN 列精确归因 / 多模块 Maven / 隐藏入口(@PostConstruct 等)

快速开始

pip install mcp<2
python analyzer/framework_map.py <你的SpringBoot项目>
python mcp-server/test_mcp.py   # 零配置体验内置 demo

Trae / Cursor 接入配置见 README。

已知限制

正则级解析(内部类/Lombok 可能漏)、MP 内置方法给全列上界、Wrapper 跨语句调用、类级 SQL 常量、MyBatis Generator Example、XML <association>/<foreach> 暂未覆盖。详见 README「已知边界」。

完整变更记录见 CHANGELOG.md

修复

  • 字段扫描会把方法体里的 return x; 语句误判为 return 类型的伪字段,导致调用树出现 return#setXxx 这类假节点(也会混进事务闭包);已按语句关键字排除
  • impact 的事务标记歧义:MP CRUD 调用点的 🔒 改为逐调用者标注(只有从事务路径调进来的才带锁),读操作只标「🔒事务内」不再误标「写」
  • 分析器 stdout 输出粘连缺换行;顺带移除漂移的 framework_map.py:NNNN 调试残留