Releases: 23512478/ContextGate
Release list
v0.2.0
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 StringSQL 可解析,支持字面量拼接与同类/跨类常量互拼折叠(全局不动点) - 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
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— 按方法名/表名/列名反查 SQLimpact— 改实体/字段的影响面分析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 # 零配置体验内置 demoTrae / 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调试残留