编写基于 AST 的自定义 Linter

要实现"将架构约束写成自定义 Lint 规则,并将错误信息转化为 AI 的修复指南(Prompt)",你需要完成三个核心步骤:编写静态分析脚本设计面向 AI 的报错信息将其接入 CI/CD 流水线

以下是具体的落地实现方案:

第一步:编写基于 AST 的自定义 Linter

Python 内置的 ast(抽象语法树)模块是进行静态代码分析的最佳工具。它可以在不执行代码的情况下,精准扫描 import 语句并检查架构违规。

以下是一个检查"领域层(domain)禁止依赖基础设施层(infrastructure)"的自定义 Linter 示例:

python 复制代码
# scripts/lint_architecture.py
import ast
import sys
from pathlib import Path

# 定义架构约束规则
FORBIDDEN_IMPORTS = {
    "src/domain": ["src.infrastructure", "src.interfaces"],
}

def check_architecture(filepath: Path) -> list[str]:
    errors = []
    # 检查当前文件是否命中了约束规则
    for restricted_dir, forbidden_modules in FORBIDDEN_IMPORTS.items():
        if str(filepath).startswith(restricted_dir):
            with open(filepath, encoding="utf-8") as f:
                tree = ast.parse(f.read())
            
            for node in ast.walk(tree):
                if isinstance(node, ast.ImportFrom) and node.module:
                    for forbidden in forbidden_modules:
                        if node.module.startswith(forbidden):
                            # 核心:构造面向 AI 的错误信息
                            errors.append(
                                f"❌ [架构违规] {filepath} 第 {node.lineno} 行: "
                                f"领域层禁止直接导入基础设施层模块 '{node.module}'。\n"
                                f"💡 [修复建议] 请遵循依赖倒置原则。在 domain 层定义抽象接口(如 Repository),"
                                f"在 infrastructure 层实现该接口,并通过依赖注入传入。\n"
                                f"📚 [参考文档] 请查阅 docs/architecture.md#dependency-rules 了解详细规范。"
                            )
    return errors

if __name__ == "__main__":
    all_errors = []
    for pyfile in Path("src").rglob("*.py"):
        all_errors.extend(check_architecture(pyfile))
    
    if all_errors:
        print("\n".join(all_errors))
        sys.exit(1)  # 返回非零退出码,阻断流水线
    print("✅ 架构规则检查通过")

第二步:掌握"错误信息即 Prompt"的设计原则

传统的 Linter 报错是给人看的(例如 ImportErrorArchitecture violation),但 AI 需要的是结构化的上下文。在设计报错信息时,必须包含以下三要素:

  1. 为什么不能这么做(Rationale):解释规则背后的架构意图,帮助 AI 理解上下文。
  2. 应该用什么替代(Actionable Fix):提供具体的重构方向或代码模式(如"使用依赖注入")。
  3. 去哪里看正确的例子 (Reference):指向项目中的深度文档(如 docs/ 目录下的 Markdown 文件),让 AI 能够按需检索。

这种设计将 Linter 的报错变成了一个"现场教学时刻(Teaching Moment)",AI 在读取到报错后,可以直接将其作为下一轮 Prompt 的输入,自行完成修复闭环。

第三步:接入 CI/CD 与 Harness 流水线

将编写好的 Linter 脚本集成到自动化流程中,使其成为 AI 无法绕过的"机械护栏":

  1. 配置 CI 门禁:在 GitHub Actions 或 GitLab CI 中添加执行该脚本的步骤。只要 AI 生成的代码触发了违规,CI 就会失败并返回上述详细的错误日志。
  2. 结合 LLM 驱动的代理审查:在 AI 提交 PR 之前,先运行此 Linter。如果失败,AI 会自动读取错误信息并修改代码,直到 Linter 通过后才允许进入人工或语义层面的审查。
  3. 使用专业工具替代手写(进阶) :如果项目规模较大,手写 AST 维护成本较高,可以引入 import-linter 等开源工具。通过在 .importlinter 配置文件中定义"契约(Contracts)",工具会自动扫描依赖图,你只需专注于配置契约和优化报错输出即可。

💡 最佳实践建议

  • 渐进式引入:不要一开始就开启所有规则。可以先将违规项记录为 Warning,让 AI 和团队适应一段时间,再转为强制阻断(Error)。
  • A/B 测试 Harness 规则:每增加一条 Linter 规则,对比 AI 任务的成功率。如果某条规则没有明显改善 AI 的产出质量,或者导致 AI 陷入无限修复循环,应果断移除,防止 Harness 膨胀。
  • 定期清理:随着项目演进,某些架构约束可能不再适用。可以部署专门的"垃圾回收 Agent"定期扫描过时的 Linter 规则并发起重构 PR。
相关推荐
gis分享者7 分钟前
Claude Code 接入蓝耘 GLM-5.1:终端 AI 编程助手配置实战
人工智能·ai·实战·claude·cc·接入glm
东方隐侠安全团队-千里9 分钟前
币安Skills Hub:散户的“机构级超能力“来了
安全·ai·区块链·skills
企业智能研究30 分钟前
企微智能客服赋能私域运营:从流量沉淀到高效转化的完整路径
人工智能·ai·agent·智能客服·私域运营
Sharewinfo_BJ38 分钟前
当 BI 遇上 AI:到底是谁在帮谁?
大数据·人工智能·ai·数据分析·微软·powerbi
装不满的克莱因瓶1 小时前
自然语言处理常见任务——从文本理解到生成式AI的完整任务体系
人工智能·pytorch·python·深度学习·ai·自然语言处理
举个栗子。1 小时前
AI智能体教程合集
ai
xin_yao_xin1 小时前
Claude Code 安装与 DeepSeek-V4 模型配置(2026 最新)
人工智能·ai·大模型·deepseek·claude code
炎武丶航1 小时前
LeNet-5深度学习详解:从手写数字识别到代码实战
人工智能·python·深度学习·机器学习·ai·cnn·lenet
曦尧1 小时前
GitHub - addyosmani/agent-skills:面向 AI 编程智能体的生产级工程技能 · GitHub
ai·自动化
xingyuzhisuan1 小时前
缓存命中率提升方案:从 30% 优化至 82% 全流程优化记录
java·开发语言·缓存·ai