AI Engineer Coach规则引擎源码剖析MarkdownDSL如何驱动45条反模式检测【免费下载链接】AI-Engineering-Coachbetter agentic engineering项目地址: https://gitcode.com/gh_mirrors/ai/AI-Engineering-CoachAI Engineer CoachAI工程师教练是一款分析 AI 编码助手使用习惯的开源工具其核心是一个规则引擎用 45 个 Markdown 规则文件 一套自研检测 DSL检测提示词偷懒、会话冗长、跳过代码审查等反模式所有数据均不离开本地。这篇文章带你从源码层面看懂这套「Markdown DSL」检测原理的完整设计。整体架构45条规则从哪来45 条内置规则并不是写死在代码里的函数而是存放在规则目录下的 Markdown 文件内置规则目录src/core/rules/ —— 每个.md文件对应一条反模式规则如 mega-sessions.md、weekend-overwork.md、speed-accept.md规则加载器rule-loader.ts —— 负责从三层位置读取规则文件规则引擎核心rule-engine.ts —— 负责解析、合并优先级、求值与预览rules/*.md45条规则 │ rule-loader 读取注册 ▼ rule-engine三层合并 → DetectionRule 对象 │ rule-parser 解析 frontmatter 正文模板 ▼ rule-pipeline提取 detect 检测逻辑块 → Pipeline │ dsl/ 词法分析 → 语法分析 → 解释执行 ▼ 检测结果触发/未触发 描述模板填充三层规则优先级rule-loader.ts 定义了规则加载的三个层级getAllRules() 按优先级合并层级位置说明1. 内置层扩展内置的dist/rules/出厂自带的 45 条规则2. 个人层~/.ai-engineer-coach/rules/用户级跨工作区生效3. 项目层workspace/.ai-engineer-coach/rules/团队级优先级最高同 ID 的规则会按「项目 个人 内置」覆盖而你在界面里临时调整阈值产生的内存级覆盖又凌驾于一切之上。这意味着你不需要改一行 TypeScript只需写一个 Markdown 文件就能新增或修改检测规则——这正是这套架构最巧妙的一点。解剖一条规则一个文件 一份完整检测器以最经典的 mega-sessions.md检测超长会话为例一个规则文件由三部分组成1️⃣ YAML Frontmatter元数据--- id: mega-sessions name: Mega Sessions group: session-hygiene severity: high scope: sessions thresholds: maxMessages: 50 ---id是唯一标识group决定它归入哪个实践组提示词质量、会话卫生、代码审查、工具掌握、上下文管理共 5 组severity是严重级别thresholds是可调阈值——比如超过 50 条消息就判定为「巨型会话」。2️⃣ 正文模板面向用户的文案# When Triggered、# How to Improve、# Examples三个章节使用{{count}}、{{pct}}、{{extra.maxMessages}}这类模板变量。检测触发后evaluateRule() 会把真实统计值填进模板生成类似「3 个会话超过 50 条消息长会话会损害上下文质量」的提示。3️⃣ 检测逻辑块DSL 核心detect scan: sessions match: requestCount thresholds.maxMessages aggregate: count check: count 0 examples: {{workspaceName}}: {{requestCount}} messages这五行声明式指令就是整条规则「怎么检测」的全部定义。 [](https://link.gitcode.com/i/e64cd66afabebb3ba82f40e63961b861) ## DSL 编译管线从一行表达式到可执行判定 detect 块由 [rule-pipeline.ts](https://link.gitcode.com/i/39f20bd020e7841a1841e6760c39a65b) 编译为「发射器 触发器」两个函数。管线支持六种指令 | 指令 | 作用 | 类比 SQL | | --- | --- | --- | | scan | 扫描 requests请求或 sessions会话 | FROM 子句 | | match | 行级过滤表达式 | WHERE 子句 | | aggregate | 聚合为 count 或 ratio占比 | GROUP BY | | check | 对聚合结果做触发判定 | HAVING 子句 | | examples | 示例文案模板 | — | | severity | 动态严重级别 | — | 而 match 和 check 里写的表达式则由自研的 **指标表达式 DSL** 编译执行。这套 DSL 在 [src/core/dsl/](https://link.gitcode.com/i/fb8ed7c7b99ef1b142e07845c6dc292f) 目录下是一个教科书式的小型语言实现 - **词法分析**[lexer.ts](https://link.gitcode.com/i/536930847c773a34a997b872af5b5a1b) 把 messageLength thresholds.minChars AND messageLength 0 这样的字符串切分为 、、AND、数字、引号字符串、正则等 Token - **语法分析**[parser.ts](https://link.gitcode.com/i/29a2de12ed8793f23b60d3c7fa21a2bc) 把 Token 序列组装成 AST抽象语法树解析深度上限 64 层 - **解释执行**[interpreter.ts](https://link.gitcode.com/i/35156a2703b8af84183d814356387dfe) 遍历 AST 求值内置了 contains、matches(s, /re/)、dayOfWeek(ts)、sum(arr, field) 等 40 个函数甚至还有 hasProfanity(s)检测脏话、adjacentPairCount检测秒批 AI 代码对这类专为行为分析定制的领域函数 - **安全执行**[safe-regex.ts](https://link.gitcode.com/i/04cbd512fa2c5c25534c1b0996d2667b) 实现了「安全正则」编译防止恶意规则文件用病态正则触发 ReDoS 卡死 更稳妥的是[interpreter.ts](https://link.gitcode.com/i/35156a2703b8af84183d814356387dfe#L99-L117) 给每次求值设置了 500 万步执行预算和 500 层递归上限——一条写坏的规则只会「降级为不匹配」绝不会拖垮整个分析流程。DSL 的公共 API 和校验函数集中在 [dsl/index.ts](https://link.gitcode.com/i/ead868491a1e264d549d4bc0e26c3e2c)。 ## 实战走查「秒批 AI 代码」是怎么被抓住的 [speed-accept.md](https://link.gitcode.com/i/acd7f9fe3ad6dba03fe4a30a77865b62)检测「AI 输出 20 行以上代码后 15 秒内就发送下一条消息根本没审查」的检测逻辑 text detect scan: sessions match: requestCount 2 aggregate: count pairs: adjacentPairCount(allSessions, thresholds.minAiLoc, thresholds.maxGapMs) check: pairs.count thresholds.minOccurrences examples: {{workspaceName}}: speed-accept detected执行过程非常直观 1. **scan**以会话为扫描单位 2. **pairs**调用 DSL 的领域函数逐对检查「AI 代码行数 ≥ 20 且相邻消息间隔 ≤ 15 秒」的次数 3. **check**命中次数 ≥ 5 时触发规则阈值都在 frontmatter 里界面可改 4. **模板填充**触发后向用户展示每个工作区的命中明细 [](https://link.gitcode.com/i/e64cd66afabebb3ba82f40e63961b861) ## 这套设计的精华在哪 - **规则即文档**每条规则既是可执行代码也是写给用户的说明书Description / When Triggered / How to Improve新人读一个 Markdown 就懂一条检测 - **零代码扩展**新增反模式 新增一个 .md 文件支持 extends: 继承现有规则再改阈值甚至支持在规则文件里写 # Tests 测试夹具做自校验见 [rule-pipeline.ts](https://link.gitcode.com/i/39f20bd020e7841a1841e6760c39a65b#L13-L16) - **可预览可实验**[rule-engine.ts](https://link.gitcode.com/i/835ec344199db2bc661b8ff654a63d77#L269-L302) 提供了 getRulePreviewStats()规则编辑器页面[page-rule-editor.ts](https://link.gitcode.com/i/00e6cc53e52afe494f696f3a723e684a)能实时展示「这条规则在当前数据上会命中多少条」调参像做实验 - **安全兜底**词法/语法/解释三层各自抛错被捕获配合安全正则与执行步数预算用户自定义规则永远不会把插件拖崩 想动手体验克隆仓库后按 [docs/content/getting-started/installation.md](https://link.gitcode.com/i/96bf881ca05f5cf0bf91fbcd900385e6) 安装在反模式页面就能看到 45 条规则在你自己的会话日志上跑起来规则写法细节可参考项目贡献指南 [CONTRIBUTING.md](https://link.gitcode.com/i/37b70f30382f8539dab98fac5e91178c)。【免费下载链接】AI-Engineering-Coachbetter agentic engineering项目地址: https://gitcode.com/gh_mirrors/ai/AI-Engineering-Coach创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
TypeScript 命名空间(Namespacing)实战指南:用逻辑容器组织代码、杜绝命名冲突 文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 本篇文章源自开源项… · 2026/9/25 2:19:13
DiceBear Critters 头像样式预设指南:12 套开箱即用的渲染参数与 Playground 调优实战 UI组件后端 【免费下载链接】dicebear DiceBear is an avatar library for designers and developers. 🌍 项目地址: https://gitcode.com/gh_mirrors/di/dicebear 点击查看 免费下载 本文以 DiceBear 文档站中 Critters 样式的 Presets 页面 为骨架&am… · 2026/9/25 2:53:06
GD32开发环境搭建:SEGGER Embedded Studio从入门到点灯 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:53:06
基于 ANTLR v4 的 YINI 语言文法指南:语法特性、词法实现与示例解析 编程语言编译器开发工具 【免费下载链接】grammars-v4 Grammars written for ANTLR v4; expectation that the grammars are free of actions. 项目地址: https://gitcode.com/gh_mirrors/gr/grammars-v4 点击查看 免费下载 YINI(Yet another INI&#… · 2026/9/25 2:53:06
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37