
Deno PR Review Skill一套五步自动化 Pull Request 审查工作流的设计与实现【免费下载链接】denoA modern runtime for JavaScript and TypeScript.项目地址: https://gitcode.com/GitHub_Trending/de/deno本文围绕 Deno 仓库内为 AI Agent 编写的 PR 审查技能定义 .claude/skills/review-pr/SKILL.md完整拆解其“收集上下文 → 门禁检查 → 代码审查 → 类型专项检查 → 撰写评审”的五步工作流。读完后你可以理解 Deno 项目对贡献者 PR 的具体质量要求标题规范、测试分层、primordials、权限系统等如何在自动化审查中被逐条落实并能参考这套模式为任意开源仓库设计自己的 Agent 审查流程。一、Skill 是什么一个面向 Agent 的 PR 审查器SKILL.md 是 Claude Code 风格的技能skill文件YAML frontmatter 声明元信息正文是给 Agent 的逐步操作指令。其 frontmatter 定义了name: review-pr技能名description审查 Deno 运行时 PR 的正确性、测试、安全性与规范当被要求审查 PR 或提供 PR 编号/URL 时触发argument-hint: pr-number-or-url调用时需传入 PR 编号或 URLallowed-tools: Bash(gh *) Bash(git *) Read Glob Grep Agent仅允许gh/git命令、文件读取与检索类工具——即整个审查流程完全基于ghCLI 与本地仓库文件系统完成。该技能位于 .claude/skills/ 目录下与fmt、lint-all、lint-js、issue-triage、node-compat等技能并列构成 Deno 仓库内一组可复用的 Agent 工作流。下文按文档原始步骤逐一展开并结合仓库源码核实每条规则的实际依据。二、Step 1收集 PR 上下文Gather PR context在审代码之前Agent 先用gh命令拉取四类信息文档中给出的原始命令为!前缀表示执行型代码块$ARGUMENTS即传入的 PR 编号或 URL# PR 元数据编号、标题、正文、作者、标签、状态、评审决定、提交、文件列表 gh pr view $ARGUMENTS --json number,title,body,author,labels,state,reviewDecision,commits,files,isDraft,createdAt,url # 完整 diff gh pr diff $ARGUMENTS # PR 评论区内容 gh pr view $ARGUMENTS --comments --json comments # CI 检查结果无检查时降级为空输出避免命令报错中断流程 gh pr checks $ARGUMENTS --json name,state,conclusion 2/dev/null || echo No checks found这四组输出分别服务于后续步骤元数据用于门禁 6外部贡献者需关联 issue与合并就绪评论diff 是代码审查的输入评论区用于理解讨论上下文CI 结果直接决定门禁 1 是否通过。三、Step 2六道门禁检查Gate checks文档明确要求任何门禁失败时必须把问题显著地列在评审意见最顶部且不得 approve。六道门禁如下每一条都能在仓库中找到对应的执行依据。1. CI 状态所有检查必须通过失败时应指出具体是哪个检查挂了。标注为ci-test-flaky的已知不稳定测试可以重跑。这一门禁与 CLAUDE.md 中 “PR 必须经 CI 合入main” 的标准 git 工作流一致。2. PR 标题格式标题必须遵循type(scope): description。技能文档列出的类型包括feat、fix、perf、refactor、chore、docs、test、revert、BREAKINGscope 示例如ext/node、ext/fetch、cli、lsp、runtime。这一规则在 CI 侧由 tools/verify_pr_title.js 强制校验。从源码结构看实际被接受的合法前缀比技能文档列出的更宽还包括ci、cleanup、bench、build、Revert、Reland用于在 changelog 中标记被回退后又重新合入的提交以及形如x.y.z的发布 PR 标题另外该脚本还有一条专门针对chore: ... upgrade deno_core/v8的细化规则——要求把 deno_core/V8 升级归类为feat:、fix:或refactor:并在标题中说明修复/新增的具体问题而不是一句fix: upgrade deno_core。PR 模板 .github/PULL_REQUEST_TEMPLATE.md 也给出了好/坏标题对照示例如fix(ext/net): fix race condition in TCP listener为合格fix #7123、update docs为不合格。3. 禁止 force pushDeno 采用 squash-merge贡献者应持续追加新提交而非重写历史。CLAUDE.md 的 Git workflow 一节对此有原文级说明追加提交“allows reviewers to see the incremental changes you made in response to feedback”评审人因此能看到针对反馈的增量修改。4. 聚焦的改动范围不允许夹带无关的顺手清理drive-by cleanups那些应拆到独立 PR。CLAUDE.md 同样规定 “Keep your changes minimal, dont do drive-by changes in a PR”。5. AI 使用披露如果 PR 疑似 AI 生成模板化措辞过多、注释泛泛、改动范围可疑地广但没有任何披露应主动询问。仓库侧有硬性要求PR 模板 .github/PULL_REQUEST_TEMPLATE.md 顶部注明 “If you used AI tools ... you MUST disclose it in the PR description. PRs will be rejected if there is suspicion of undisclosed AI usage.”——门禁 5 是对该模板条款的人工/Agent 复核。6. 外部贡献者需关联 issue若作者不是denoland组织成员PR 必须链接到一个 issue没有时应当 request changes要求作者先开 issue 讨论方案。PR 模板第 2 条“Ensure there is related issue and it is referenced in the PR text”与此呼应。四、Step 3代码审查准则文档要求“读遍 diff 中每一个被修改的文件”并在需要时用仓库工具Read、Grep、Glob理解周边上下文。审查标准按语言与关注面分为四组。Rust 代码正确性边界情况是否处理对用户可控数据不能.unwrap()错误处理合适的错误类型、有意义的错误消息、不吞掉错误性能无不必要的分配/拷贝async 代码中不阻塞安全性无强理由不得unsafe杜绝命令注入、路径穿越、权限绕过权限新增能力必须走 Deno 的权限系统要特别盯防ext/node/——Node.js API 有时假设拥有完全访问权。权限系统的核心实现在 runtime/permissions.rs这也是下一步“安全敏感区”列出的第一个文件依赖新增 Cargo 依赖必须有强理由优先复用现有依赖或标准库。Deno 的 crate 划分cli/、runtime/、ext/、libs/可在根 Cargo.toml 与 CLAUDE.md 的 “High Level Overview” 中对照理解。JavaScript / TypeScript 代码Node.js 兼容性ext/node/实现必须与 Node.js 的实际行为一致需对照 Node.js 文档甚至源码而不是“看起来对”Primordials内部 JS 应使用 primordialsglobalThis.__bootstrap.primordials以避免原型污染——对用户可控对象不得直接调用内置方法必须经 primordial 包装。这在仓库中有完整的实现与执法链条libs/core/00_primordials.js 是 primordials 的源头实现文件头注明其思路基于 Node.js 的同名内部模块并按构造函数/迭代器等方式批量构造ArrayPrototypeIncludes、SafeMap等安全引用注释还提到“对性能有显著影响应优先使用”tools/lint_plugins/prefer_primordials.ts 是tools/lint.js专用的自定义 lint 插件定义prefer-primordials规则并维护一份GLOBAL_TARGETS黑名单JSON、Math、Array等全局在runtime/与ext/的引导代码上强制该约定实际用法可对照 ext/node/polyfills/01_require.js其头部即从ext:core/mod.js解构primordials并引入ArrayPrototypeIncludes、ObjectGetOwnPropertyDescriptor等安全引用而非裸调Array.prototype.includes。Web 标准Web API 实现应遵循相应 spec优先补充 WPT 覆盖WPT 相关测试组织在tests/wpt/懒加载所有代码应尽可能使用 lazy-loaded imports 以降低启动开销。测试每个 bug fix 都必须附一个“能抓到这个 bug”的测试每个 feature 需要 happy-path 边界用例测试层级优先级单元测试 spec 测试 集成测试只有当行为必须依赖 CLI 级验证时才使用 spec 测试Spec 测试位于tests/specs/以__test__.jsonc声明测试步骤非确定性输出用[WILDCARD]顺序不确定的输出用[UNORDERED_START]/[UNORDERED_END]包裹测试必须确定性无竞态、无计时依赖、无端口冲突。这部分规范在 CLAUDE.md 的 “spec tests” 章节有更详细的展开包括__test__.jsonc的完整 schema“tests” 对象、args/steps/output字段、期望文件.out的匹配语言[WILDCARD]、[WILDLINE]、[WILDCHAR]、[WILDCHARS(5)]、[UNORDERED_START]/[UNORDERED_END]、[# 注释]以及测试目录划分tests/specs/、tests/unit/、tests/integration/、tests/wpt/。评审时可直接引用这些标准判断新增测试是否规范。安全敏感区文档列出的需加倍警惕的改动位置runtime/permissions.rs 及散布各处的权限检查ext/net/、ext/fs/ —— 网络与文件系统访问ext/node/ —— Node 兼容层需要自己补权限检查因为上游 API 假设完全访问cli/tools/compile.rs —— 独立二进制standalone binary编译任何 shell 外呼或处理用户可控路径/URL 的代码。五、Step 4按 PR 类型的专项检查在通用标准之上文档要求识别 PR 类型并追加专项检查Node.js 兼容ext/node/必须对照 Node.js 文档/源码验证行为。新增 polyfill 必须注册进 ext/node/polyfills/01_require.js——从源码看该文件是require机制的核心3500 行集中导入op_require_*系列 ops 并实现模块解析、CJS/ESM 判定等逻辑新内置模块不在此注册就无法被require到性能必须附带改动前后的 benchmark 数据或给出清晰的收益论证同时警惕正确性回退仓库在cli/benches/、tests/bench/等目录维护基准PR 模板还支持添加ci-bench标签在 CI 上跑基准依赖更新检查 changelog 中的破坏性变更安全类更新优先处理WPT 改动确认“通过”是真通过而非断言被跳过expectation 文件的更新必须与实际结果一致若未打标签建议补上ci-wpt-testCI/发布工具必须 维护者bartlomieju审查Agent 不得自行 approve。六、Step 5撰写评审意见结构文档规定评审意见固定分四段Summary1–2 句PR 做了什么、总体评价Gate issues如有必须修复的阻塞问题Code comments具体、可执行的反馈指向精确的文件与行号非阻塞建议用nit:前缀尽量给出修复方案而非仅说“这里错了”Verdictapprove / request changes / comment。语气直接说 “This needs a test”而不是 “It would be wonderful if we could add a test here.”友善感谢贡献者尤其首次贡献者假定善意有帮助拒绝时展示“好的版本”应该是什么样简洁如果贡献者明显经验丰富就长话短说。提交评审优先在具体行内联评论一次 review 同时包含摘要正文与内联评论gh api repos/denoland/deno/pulls/{number}/reviews \ -f eventCOMMENT \ -f bodysummary \ -f comments[{path:file.rs,line:42,body:comment}]结论为通过或要求修改时将eventCOMMENT换成eventAPPROVE或eventREQUEST_CHANGES。若无需内联评论的简单评审退回gh pr review $ARGUMENTS --comment --body review text。合并就绪Merge readinessAgent 没有合并权限。PR 就绪时按贡献者身份发不同评论首次贡献者bartlomieju LGTM, needs maintainer signoff (first-time contributor)常规贡献者bartlomieju this is ready to merge。这解释了为什么 CI/发布类 PR 也要交给同一维护者把关——最终合并权集中在人工维护者一侧。七、硬性规则Rules与能力边界文档末尾列出 Agent 审查的不可越界项绝不 approve 一个 CI 失败的 PR绝不 approve 绕过权限系统的 PR大型架构变更必须在拉出给维护者讨论之后才能推进不要为 lint 已经放行的风格问题纠缠bikeshed不要对自动化检查已强制的事项重复 request changes任何发布到 GitHub 的评审评论必须先与用户确认——这是 Agent 侧的最后护栏保证自动化审查不会产生未经授权的公开行为。八、小结.claude/skills/review-pr/SKILL.md 把 Deno 的社区贡献规范沉淀成了一条可执行的 Agent 流水线它用 CLAUDE.md、tools/verify_pr_title.js、.github/PULL_REQUEST_TEMPLATE.md 等仓库内的既有约定作为事实来源用ghCLI 完成信息获取与评论发布并用 libs/core/00_primordials.js、tools/lint_plugins/prefer_primordials.ts、runtime/permissions.rs 等核心源码作为审查深度的锚点。对读者而言它既是理解 Deno 工程文化的窗口标题规范、测试分层、primordials、权限优先、squash-merge 与集中式合并权也是一份可直接借鉴的模板如何把“项目价值观”翻译成 Agent 能逐步执行、且每步都有仓库证据支撑的审查清单。【免费下载链接】denoA modern runtime for JavaScript and TypeScript.项目地址: https://gitcode.com/GitHub_Trending/de/deno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考