RepoPolicyScore:如何评估GitHub仓库对AI贡献者的就绪度 这周收到一条让我印象很深的PR提交者的头像是一个机器人commit message写得规范工整代码也过了编译但把边界条件改错了。这不是我第一次看到AI直接往开源仓库发PR。GitHub上早就不是只有人类开发者在活跃AI如今真的会读文档、提issue、开PR。于是我开始考虑一个更本质的问题一个repo到底满足什么条件才称得上准备好让AI贡献者进入带着这个疑问我做了RepoPolicyScore这个小工具作用一句话就能说清——check if a GitHub repo is ready for AI contributors。它会拉取仓库结构、解析维护文档、检查CI和自动化配置最后给这个仓库打一个0到100分的AI贡献者就绪度评分并告诉你到底缺了什么。1. AI贡献者不是低配版人类开发者准备工作得另算1.1 人类靠交情与提问补足的隐性信息AI只能靠文档大多数仓库维护者觉得我的README写得挺全issue也有人管AI要贡献就贡献呗但实际上AI和人类开发者的行为模式差异非常大。人类新贡献者看一个陌生项目时会先逛逛issue列表看看最近有没有人在问类似问题甚至直接在讨论区发一句这功能怎么跑起来。AI不会。它拿到提示词后行为路径非常直接读README找入口看代码结构然后开始写改动。中途遇到不清楚的地方它的默认策略是从现有代码里推断出一个自洽的答案而不是向维护者提问。这个推断过程正是大量低质量AI PR的来源。代码里存在已久的隐式约定比如这个工具函数只在server目录下使用error handling必须走统一包装import顺序按第三方包、本地模块、类型声明排列人类维护者能在review时靠经验和上下文自然遵守但AI不具备这种项目内感受力。它更倾向于按照主流代码风格或者自己的训练语料来补全认知结果就是单独看每一行改得都不算错放在整个项目语境里就非常违和。1.2 就绪度评分的本质把隐性知识显性化RepoPolicyScore真正想评分的东西不是代码好不好也不是文档多不多而是这个仓库把隐形知识显性化的程度。一个AI能够相对安全地贡献PR的仓库一定具备以下能力新贡献者能在15分钟内本地跑起来代码规范能以lint脚本形式一键执行测试命令明确、能快速反馈贡献指南写明了PR范围、commit格式和分支策略issue模板和PR模板能强制提供足够上下文。这些条件几乎每一项都在做同一件事——把原本存在维护者脑子里的规则变成机器和AI都能读取的文件、脚本和配置。理解了这层逻辑评分维度的设计就有了统一的指导思想我检查的不是文档数量而是知识被文件化和可执行化的程度。2. RepoPolicyScore的评分维度拆解每个分数都有明确出处RepoPolicyScore并不是一个简单的文件存在性检查器。如果只判断有没有CONTRIBUTING.md那这个工具三小时就能写完但没什么用。实际开发过程中我针对每个维度都设计了文件存在 内容质量 可执行性三层校验具体维度如下评分维度权重核心检查点为什么对AI贡献者重要贡献指南 CONTRIBUTING.md25是否包含环境搭建、测试命令、代码规范、PR流程AI的第一步行动完全依赖这份文档README质量20Quick Start/Installation/Usage段落是否完整、是否有可运行命令AI理解项目入口的主要途径CI配置与当前状态15.github/workflows是否存在、最近一次提交状态是否通过AI改完代码后CI是它唯一能自助验证的手段Issue/PR模板10.github/ISSUE_TEMPLATE和PULL_REQUEST_TEMPLATE是否完整模板能强制AI补全环境信息和测试结果测试与Lint脚本10package.json/tox.ini/Makefile中是否有明确命令让AI在提交前能执行低成本自检分支保护与CODEOWNERS10main分支是否受保护、review规则是否清晰防止AI直接推代码或绕过审查依赖更新自动化5Dependabot/Renovate配置是否存在控制AI改依赖时的连锁风险License与CLA5LICENSE文件是否明确、是否要求贡献者授权法律合规是AI贡献绕不开的问题2.1 贡献指南不能只看有没有要看能不能执行CONTRIBUTING.md在这个评分体系里占了最高权重但检测逻辑并不简单。很多仓库有这份文件打开一看却是空泛的套话We welcome all contributions.Please fork and submit a pull request.这种情况下AI读了和没读没区别。我的解析逻辑是先用tree-sitter-markdown把文档的标题结构解析出来再确认是否覆盖了几类关键sectionGetting Started、Build、Test、Code Style、Pull Request Process。如果标题不完全匹配就做关键词模糊匹配比如npm installpoetry installgo mod tidydocker compose up这类环境搭建命令以及pytestgo testnpm testcargo test这类测试指令。只有同时具备环境搭建命令和测试执行命令这份贡献指南才会被判为有效。这个设计是从实际教训里来的我开始只检查标题结构结果一个测试项目的CONTRIBUTING.md写了完整的如何提PR但整篇没有一个命令AI按文档操作根本跑不起来评分还给了80以上。后来才加上命令检测至少把能执行这条底线守住。2.2 README评分的反直觉之处代码块比文字更有价值README的评分方法相对温和。我先用tree-sitter解析出所有二级标题和三级标题然后重点找Quick Start、Getting Started、Installation、Usage这几个section。关键指标其实是这些section内嵌的代码块数量和非空命令数量——一个只有截图、没有命令的READMEAI根本无法上手。相比之下哪怕README只有五十行但有一个完整的快速开始命令实际可用性反而更高。经过几十个仓库的测试我得出的经验值是一个对AI友好的README至少包含一个安装命令、一个最小可用示例、一个运行测试的方式。这三个信息不一定要齐全但缺一不可的其实是运行测试的方式。AI拿到一个项目后最想做的事就是快速证明自己没把环境搞坏如果README没写怎么跑测试它大概率会自己猜猜错的概率并不低。3. 技术实现剖析从GitHub API到文档解析的完整链路3.1 核心技术选型与原因实现RepoPolicyScore时我选择的是TypeScript Node.js主要理由有三个第一Octokit是成熟的GitHub REST API客户端省去大量鉴权和请求细节第二tree-sitter官方提供了tree-sitter-markdown的Node绑定可以直接把Markdown解析成AST结构比正则匹配稳定得多第三CLI工具用Node打包发布对应的生态已经非常成熟最终产物可以一个命令搞定。整个工具的运行时序分四段先通过GitHub API获取仓库的默认分支和完整文件树再按需拉取关键文件内容然后逐一跑各维度的检测规则最后汇总评分并输出Markdown格式的报告。3.2 一个关键优化用Git Trees API减少请求次数最初版本是逐文件调用API获取内容一个检测目标至少要发十几个请求遇到大仓库很容易撞上GitHub API的限流。后来我改成调用一次Git Trees API用递归方式把整个默认分支的文件树拉回来再在本地过滤出需要解析的文件路径只有真正需要的文件才走Raw类型的contents接口。经过这个调整评分一个仓库通常只需要5到7个API请求花费的时间大幅下降。GitHub API的限流是个要特别留意的问题。匿名请求一小时只能发60次哪怕拿到token也只有5000次/小时但实际跑批量评测的时候最怕的是跑一半突然收到403。RepoPolicyScore的处理方式是支持加载GITHUB_TOKEN环境变量并在每次请求后检查响应头里的ratelimit-remaining字段低于安全阈值就停止评测给出提示。这个设计看起来不起眼但在你一口气评测几十个仓库的时候能避免大量无效请求。3.3 解析Markdown结构时的取舍与坑用tree-sitter-markdown解析文档比正则表达式稳定但也不是没有坑。Markdown里的heading如果包含链接、内联代码AST的节点类型会有差异比如### Quick Start是atx_heading而### a namequick/aQuick Start会拆成多个子节点。我在做heading归一化时需要把每个heading节点的所有子节点文本拼起来再统一转小写、去掉标点。另外有些仓库的README会写# GETTING STARTED或者## Quickstart单纯匹配Quick Start会漏判。我最终的方案是构建一个同义词表把Getting Started、Quickstart、Quick Start、Installation归为一组Usage、Examples、API Reference归为一组然后按优先级排序读到任何一个就算命中对应维度。这个表需要根据实际仓库的表现持续维护。GitHub上不同语言项目的文档习惯差异很大Rust项目爱写Usage前端项目爱写Getting StartedGo项目可能直接放一个example.go如果词典不够宽泛评分会失真。3.4 CI状态检查动态与静态两条腿走路对于仓库的CI情况RepoPolicyScore从两个角度判断第一个是静态角度检查.github/workflows目录下是否有YAML文件是否存在test、build、lint相关的工作流第二个是动态角度调用GitHub的commits status接口查默认分支最新一次提交的combined status是success、pending还是failure。动态检查受网络和GitHub服务状态影响比较大偶尔会出现仓库本身没问题、GitHub API临时抽风导致查不到状态的情况。所以在动态检查失败时我选择直接跳过该维度而不判零分避免把服务可用性问题错误转化为仓库就绪度低的结论。如果是真实环境里的CI红叉那才是真正需要扣分的点通常一个常年构建失败的仓库AI贡献者改了代码也得不到有效反馈整体的就绪度分数一定高不了。4. 实测复盘高分局与低分局之间真正的差距写到这里很多人肯定会问拿真实仓库跑一遍结果如何我在开发过程中评测了多个类型的仓库覆盖活跃的中小型工具库、文档体量很大的老牌项目以及已经被AI PR淹没的社区项目下面把印象比较深的几种典型情况整理一下。4.1 典型的高分仓库长什么样高分区仓库通常有一个共性CI配置非常完整而且工作流拆分得很细。比如一个前端组件库它的.github/workflows目录里会同时存在lint.yml、test.yml、build.yml三个独立文件每个文件的触发条件都很明确test还会分node版本矩阵跑。这类仓库的CONTRIBUTING.md同样可读性很强开头就是一个Prerequisites列表明确写出Node版本要求、包管理器要求然后是四五个复制粘贴就能跑的命令。给这类仓库打出80分以上的时候我去翻了它们近期合并的PR发现AI生成的提交其实已经混入其中而且大部分能通过自动化检查。这印证了一个观点CI和文档完备的项目对AI贡献者的接受度天然就高因为大部分质量门槛自动化兜住了。4.2 看起来用心、实际拿低分的仓库类型另一种让我比较意外的仓库类型是文档丰富但命令缺失。有个项目README洋洋洒洒几千字贡献指南里甚至细到commit message的动词含义但整个仓库找不到一条可执行的本地构建命令也没有自动化测试。这种仓库的分数很尴尬——维护者显然花了心思但AI贡献者进来了几乎寸步难行它能读到大量规则却无法验证自己的改动对不对。这类仓库恰恰解释了为什么RepoPolicyScore必须坚持可执行性原则文档是给人看的命令和脚本才是给AI执行闭环用的。评价AI就绪度必须优先尊重AI的行动导向特性。4.3 评分失真案例分支保护信息获取的权限问题开发过程中还遇到过一类错判。某个仓库各项配置都很完善但动态检查分支保护时返回了403结果分支保护维度被判成未启用总分明显偏低。后来排查发现GitHub REST API对于分支保护信息的匿名访问极其严格很多字段不授权就拿不到。RepoPolicyScore在这个维度上做了一层降级处理如果拿不到分支保护数据就根据仓库是否配置了CODEOWNERS文件来做推测评分并在报告里专门说明当前无权限读取分支保护设置该维度结果不完整。这个处理方式适合很多类似的权限受限场景宁可降级成半可信分数也不要直接当成问题项报给用户不然维护者会为了一个误报去反复折腾配置。5. 拿到低分之后维护者实际改造仓库的推荐顺序RepoPolicyScore的价值不仅在于打分更在于给出可执行的修复建议。每个报告里低分维度后面都会附一段为什么扣分和建议改动的说明。基于我自己跑完一批仓库后的经验我归纳了一个改造顺序适合时间有限的维护者按优先级推进。5.1 第一优先级把测试和CI跑通任何仓库要接受AI贡献者第一步不是写文档而是确保现有测试能在CI里稳定通过。AI的行为模式非常依赖反馈循环提交-触发CI-看结果-改代码这个循环越快越稳定AI改进PR的效率就越高。如果CI本身常年是红的AI根本无从判断自己的改动是否引入了新问题。在这个阶段也不需要一次搞定复杂的工作流先来一个最简单的测试工作流就够了name: test on: pull_request: push: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-nodev4 with: node-version: 20 - run: npm ci - run: npm test - run: npm run lint5.2 第二优先级给AI一行命令就能复现的自检流程AI与人类不同它不会去开一个bash终端调试半天它更愿意遵循文档里给的命令步骤。因此CONTRIBUTING.md里一定要有一块How to verify your changes这块要写得极其死板从安装依赖到跑lint到跑单测到跑集成测试一步一步列清楚。我在自己的项目里甚至会把每个命令都写成代码块让AI可以直接复制。建议直接复制这份最小模板比大多数仓库现有的CONTRIBUTING.md更适合作为起点# Contributing ## Prerequisites - Node.js 20 - pnpm 9 ## Setup 1. pnpm install 2. cp .env.example .env ## Verify - pnpm lint - pnpm test - pnpm build ## Pull Request Rules - Keep PRs focused on one concern - Add tests for any logic changes - Do not modify files outside the scope of your PR5.3 第三优先级用模板与自动化配置约束PR形态第三优先级是GitHub的issue和PR模板。我不建议写很长的模板AI填长模板时很容易产生超长废话反而淹没关键信息。更好的做法是写一个紧凑的清单式模板要求提交者明确写出改动目的、测试方式、以及是否新增了依赖。比如PR模板可以包含三个固定问题这个问题解决什么场景、如何验证改动、改动涉及哪些文件。分支保护也建议尽早打开至少给main分支配置要求PR通过后再合并同时设置一个CODEOWNERS文件把核心目录的审查责任落到具体维护者头上。对AI贡献者来说有明确review人是一种安全网即使它写出了有问题的代码至少不会直接污染主线。5.4 最容易忽略的一步明确告诉AI哪些事不能做大多数开源仓库的贡献指南都在写我们欢迎什么但很少写我们禁止什么。AI恰恰需要这个负面清单。我建议在CONTRIBUTING.md里明确列出几条硬性规定例如禁止无关联的重构禁止修改格式化配置禁止批量替换API调用禁止升级锁文件里的传递依赖。这不是要限制AI创造力而是给它的行为划一个边界。从实际效果看这份负面清单能显著减少AI顺手把整个文件格式化了一遍这类最令维护者头疼的PR。有时候AI提交的问题不在逻辑而在它太爱顺手做很多无关的修改明确禁止项可以大幅降低review负担。6. 工具边界和后续方向静态评分只能做到这一步RepoPolicyScore的定位很清楚它是一个静态就绪度检查器不是AI贡献效果预测器。它无法判断一个仓库的代码架构是否清晰、测试覆盖率是否足够、模块耦合度是否合理更无法预判AI进入之后会不会把代码库搅成一团。这些动态质量问题需要结合代码分析工具和实际PR表现来综合判断。在后续迭代里我在考虑两个方向。一个是把CI最新的运行状态引入评分缓存让分数不再是一个瞬间快照而是能反映过去三十天的持续通过率另一个是尝试引入LLM对文档的自然语言质量做一次粗评比如自动判断README的描述是否存在明显歧义贡献指南是否覆盖了环境搭建的例外情况。不过这两个方向都还比较早期稳定性还需要大量样本验证。从实际使用体验来说RepoPolicyScore最适合的场景是你维护的仓库已经有了一些AI PR涌入但quality参差不齐你想知道自己仓库在流程上哪里最薄弱。它不适合作为是否欢迎AI的道德判断工具有人就是不想接受AI贡献这完全没问题工具只负责呈现客观状态不负责劝人改变立场。最后分享一个我评测大量仓库之后的最大感触很多仓库表面看维护得不错一旦用AI能不能直接上手这个标准重新审视到处都是隐性断层。这反而是一个很好的自省契机——让AI贡献者顺利工作的那些要求本质上是让所有新贡献者都更舒服的要求。把规则从维护者的大脑里搬到仓库里受益的远不止机器人。