elsa-core 中的 Greploop Skill:用 Claude Code 迭代修复 PR 直至 Greptile 满分评审

发布时间:2026/9/27 7:57:08
elsa-core 中的 Greploop Skill:用 Claude Code 迭代修复 PR 直至 Greptile 满分评审 后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载导读Greploop 是 vendored 在 elsa-core 仓库.claude/skills/greploop/目录下的一套 Claude Code Skill用于对 GitHub PR、GitLab MR 或 Perforce 变更列表CL执行评审—修复—再评审的迭代闭环直到 Greptile 给出 5/5 置信度评分且零未解决评论。本文将完整讲解该 Skill 的元数据、平台检测与 PR 识别逻辑、五轮上限的修复循环触发评审、拉取结果、退出条件、修复评论、解决线程、提交推送、报告输出格式并结合仓库内真实的 GitHub Actions 部署文件 .github/workflows/greploop.yml 说明它在 CI 中的实际落地方式。读者读完可以自行在任意 git/gh/glab/p4 环境中复现这一自动化代码评审工作流。一、Skill 概览与前置条件Greploop 的元数据定义在 SKILL.md 的 YAML front-matter 中核心信息如下字段值namegreploopdescription迭代改进 PR/MR/shelved changelist直到 Greptile 给出 5/5 置信度且零未解决评论触发评审、修复、推送/重新 shelve、再触发循环往复licenseMIT详见 .claude/skills/greploop/LICENSECopyright (c) 2026 Greptile AIversion1.2allowed-toolsBash(gh:*)、Bash(glab:*)、Bash(git:*)、Bash(p4:*)前置条件compatibility字段声明本机安装git且ghGitHub CLI或glabGitLab CLI已认证目标仓库已安装 Greptile作为 GitHub App、GitLab 集成或 Perforce webhook使用 Perforce 时还需p4CLI 已认证。该 Skill 的使用场景非常明确当开发者希望把一个 PR/MR/CL 彻底打磨到符合 Greptile 的代码评审标准时调用它即可自动完成多轮往返无需人工盯着检查结果。二、输入PR/MR/CL 编号Skill 接受一个可选的PR/MR/CL 编号输入。若不提供则由 Skill 自动检测GitHub当前分支对应的 PRGitLab当前分支对应的 MRPerforce当前用户/工作区下默认的 pending changelist。这个缺省自动检测的输入设计让该 Skill 既适合在 CI 中由工作流显式传入 PR 号见后文 GitHub Actions 部署也适合本地开发时直接对当前分支调用。三、步骤 0平台检测Skill 的第一步是确定当前所处的 VCS 平台检测顺序为先检查 Perforce再回退到 git remote 检测# Check for Perforce environment if p4 info /dev/null 21; then VCSperforce else REMOTE_URL$(git remote get-url origin) if echo $REMOTE_URL | grep -qi gitlab; then VCSgitlab else VCSgithub fi fi两个值得注意的边界情况自托管 GitLab若实例主机名不包含 gitlab 字符串例如git.example.com上述检测会误判为 GitHub。此时用户可通过传入输入--vcs gitlab强制覆盖。Perforce 环境通过--vcs perforce显式指定。四、步骤 1识别 PR/MR/CL平台确定后需要精确取得评审对象的标识。三个平台的命令与关键字段如下。GitHubgh pr view --json number,headRefName -q {number: .number, branch: .headRefName}GitLabglab mr view --output json | jq {iid: .iid, branch: .source_branch}Perforce列出当前用户/客户端下的 pending changelists并描述指定 CL# List pending changelists for current user/client p4 changes -s pending -u $P4USER -c $P4CLIENT # Describe a specific CL p4 describe -s CL_NUMBER识别到对象后需切换到对应分支Perforce 则需确保p4 client工作区正确。三个平台的关键字段差异总结平台编号字段分支字段提交 SHA 字段GitHubnumberheadRefNameheadRefOidGitLabiid内部编号勿用idsource_branchshaPerforcechangelist 编号P4CLIENT、shelved files—五、步骤 2核心迭代循环最多 5 轮循环的目标状态是置信度 5/5 且零未解决评论。为防止失控循环硬上限为5 次迭代。每一轮包含 AF 六个子步骤。A. 触发 Greptile review先推送或 shelve 最新改动然后等待检查启动git push # GitHub/GitLab sleep 5Perforce 则用强制重新 shelve 更新被评审的文件p4 shelve -f -c CL_NUMBERGitHub 的去重触发逻辑在发布新的触发评论前先检查 Greptile 是否已在运行避免重复触发造成检查堆积GREPTILE_STATE$(gh pr checks PR_NUMBER --json name,state | jq -r .[] | select(.name | test(greptile; i)) | .state) if [ $GREPTILE_STATE ! PENDING ] [ $GREPTILE_STATE ! IN_PROGRESS ]; then gh pr comment PR_NUMBER --body greptile review fi随后轮询 Greptile 的 check run 直到完成HEAD_SHA$(gh pr view PR_NUMBER --json headRefOid -q .headRefOid) while true; do GREPTILE_CHECK$(gh api repos/{owner}/{repo}/commits/$HEAD_SHA/check-runs \ --jq .check_runs[] | select(.name | test(greptile; i)) 2/dev/null) if [ -z $GREPTILE_CHECK ]; then echo Waiting for Greptile check to appear... sleep 5 continue fi STATUS$(echo $GREPTILE_CHECK | jq -r .status // completed) CONCLUSION$(echo $GREPTILE_CHECK | jq -r .conclusion // pending) if [ $STATUS completed ]; then if [ $CONCLUSION success ]; then echo Greptile check passed! else echo Greptile check completed with: $CONCLUSION fi break fi echo Waiting for Greptile... (status: $STATUS) sleep 10 doneGitLab 的对应实现检查 MR 是否存在 running/pending 的 pipeline没有时才发触发评论PIPELINES$(glab api projects/:fullpath/merge_requests/MR_IID/pipelines) GREPTILE_RUNNING$(echo $PIPELINES | jq [.[] | select(.status running or .status pending)] | length) if [ $GREPTILE_RUNNING 0 ]; then glab mr note MR_IID --message greptile review fi然后定位该 SHA 对应的最新 pipeline 及其中的 Greptile job轮询到终态success/failed/canceledHEAD_SHA$(glab mr view MR_IID --output json | jq -r .sha) while true; do PIPELINES$(glab api projects/:fullpath/merge_requests/MR_IID/pipelines) PIPELINE_ID$(echo $PIPELINES | jq -r --arg sha $HEAD_SHA \ [.[] | select(.sha $sha)] | sort_by(.id) | last | .id // empty) if [ -z $PIPELINE_ID ]; then echo Waiting for Greptile pipeline to appear... sleep 5 continue fi JOBS$(glab api projects/:fullpath/pipelines/$PIPELINE_ID/jobs) GREPTILE_JOB$(echo $JOBS | jq .[] | select(.name | test(greptile; i))) if [ -z $GREPTILE_JOB ]; then echo Waiting for Greptile job to appear... sleep 5 continue fi JOB_STATUS$(echo $GREPTILE_JOB | jq -r .status) if [ $JOB_STATUS success ] || [ $JOB_STATUS failed ] || [ $JOB_STATUS canceled ]; then echo Greptile job completed with: $JOB_STATUS break fi echo Waiting for Greptile... (status: $JOB_STATUS) sleep 10 donePerforce 的特例Perforce 没有原生 check run 概念。若 Greptile 通过p4 shelve触发的 webhook 集成则需等待 webhook 处理并通过 Greptile 安装的 webhook 端点或 dashboard 查询评审状态通常以轮询 CL 上 Greptile 评审评论是否出现分数作为完成判据。B. 拉取 Greptile 评审结果Greptile 的评分可能出现在两处Perforce 为三处Skill 要求逐一检查并采用时间戳最新的一处。GitHub 的两处PR 描述body——Greptile 可能把评分块写入其中gh pr view PR_NUMBER --json body -q .bodyPR reviews——查找来自greptile-apps[bot]或greptile-apps-staging[bot]的最新条目gh api repos/{owner}/{repo}/pulls/PR_NUMBER/reviewsGitLab 的两处MR descriptionglab mr view MR_IID --output json | jq -r .descriptionMR notes评论glab api projects/:fullpath/merge_requests/MR_IID/notes按author.username过滤 Greptile bot 的评论。注意GitLab 上 Greptile bot 的用户名可能不同于 GitHub 的greptile-apps[bot]需要在首次运行时通过第一条 Greptile 评论确认确切用户名.claude/skills/greploop/references/gitlab-api.md 中明确提示了这一点。Perforce 的三处CL 描述——用p4 describe -s CL_NUMBER检查 Greptile 追加的评分块CL 评论/评审备注——若安装了 Helix Swarm 等评审工具通过其 API 获取评论Swarm 示例端点GET /api/v11/comments?topicreviews/REVIEW_ID关注字段包括user作者、body评论文本、flags/state是否已解决。评分与评论的解析规则置信度分数匹配形如3/5、5/5或Confidence: 3/5的模式评论数量汇总摘要中标注的内联评论数未解决内联评论按平台拉取——GitHubgh api repos/{owner}/{repo}/pulls/PR_NUMBER/commentsGitLabglab api projects/:fullpath/merge_requests/MR_IID/discussions过滤notes[0].type DiffNote、位于最新提交、且resolved: false的讨论PerforceSwarm按topicreviews/REVIEW_ID拉取过滤 Greptile bot 作者且未标记 resolved/addressed 的评论C. 检查退出条件满足任一条件即终止循环置信度为5/5且零未解决评论达到最大迭代次数5 次——此时如实上报当前状态。D. 修复可操作的评论对每条未解决的 Greptile 评论按四步处理读取对应文件结合上下文理解评论判定其是可操作需要改代码还是仅信息性可操作的直接修复信息性评论或误报记录后仍将该线程标记为已解决保持评审面板干净。E. 解决线程GitHub使用 GraphQL 分页拉取未解决线程再批量 resolve。分页查询与批量 mutation 的完整模板见 .claude/skills/greploop/references/graphql-queries.md核心如下gh api graphql -f query query($cursor: String) { repository(owner: OWNER, name: REPO) { pullRequest(number: PR_NUMBER) { reviewThreads(first: 100, after: $cursor) { pageInfo { hasNextPage endCursor } nodes { id isResolved comments(first: 1) { nodes { body path author { login } } } } } } } }解析出isResolved: false的线程 ID 后批量提交 resolve mutationgh api graphql -f query mutation { t1: resolveReviewThread(input: {threadId: ID1}) { thread { isResolved } } t2: resolveReviewThread(input: {threadId: ID2}) { thread { isResolved } } }GitLab没有批量解决机制必须逐条 PUT。先分页拉取未解决讨论?per_page100响应数组长度小于per_page即翻页完毕再用id逐条标记解决glab api projects/:fullpath/merge_requests/MR_IID/discussions?per_page100 glab api --method PUT \ projects/:fullpath/merge_requests/MR_IID/discussions/DISCUSSION_ID \ --field resolvedtrue每个 discussion 对象中还包含notes[0].body评论文本与notes[0].position.new_path文件路径供 D 步骤定位修复目标。F. 提交并推送 / 重新 shelveGitHub/GitLabgit add -A git commit -m address greptile review feedback (greploop iteration N) git pushPerforcep4 shelve -f -c CL_NUMBER推送/重新 shelve 后sleep 5等待检查启动然后回到步骤A开始下一轮。六、步骤 3结果报告循环退出后按以下表格汇总原文档定义的报告结构字段值PlatformGitHub / GitLab / PerforceIterationsNFinal confidenceX/5Comments resolvedNRemaining commentsN (if any)若因达到最大迭代次数退出需列出剩余未解决评论并给出下一步建议。七、输出格式规范完全成功时的标准输出模板Greploop complete. Platform: GitHub Iterations: 2 Confidence: 5/5 Resolved: 7 comments Remaining: 0未完全解决达到 5 次迭代上限时的输出模板Greploop stopped after 5 iterations. Platform: GitLab Confidence: 4/5 Resolved: 12 comments Remaining: 2 Remaining issues: - src/auth.ts:45 — Consider rate limiting this endpoint - src/db.ts:112 — Missing index on user_id columnPerforce 专用示例额外包含 Changelist 字段Greploop complete. Platform: Perforce Changelist: 12345 Iterations: 3 Confidence: 5/5 Resolved: 9 comments Remaining: 0八、仓库内的实际部署GitHub Actions 工作流在 elsa-core 仓库中Greploop 并不仅仅是一份悬空的 Skill 文档它还有一套真实的 CI 落地配置 .github/workflows/greploop.yml可以作为把该 Skill 接入自动化评审的参考范本。其设计要点对理解 Skill 的边界约束非常有价值触发方式双通道workflow_dispatch手动触发通过inputs.pr_number传入 PR 编号issue_comment触发maintainerOWNER/MEMBER/COLLABORATOR在 PR 评论中写/greploop即启动用github.event.issue.number作为 PR 编号。权限声明与 Skill 的 allowed-tools 严格对应contents: write—— greploop 需要向 PR 分支推送修复提交pull-requests: write—— 需要 resolve review threads、发布状态评论actions: read—— Claude 需要读取 PR 上的 CI 结果id-token: write、issues: read作为补充。安全设计值得复用的防御性实践PR 编号在进入后续步骤前用正则^[0-9]{1,10}$校验拒绝任何 shell 元字符注入所有 PR 作者可控的值head ref、repo 名、SHA一律先经 env 变量传递再进入 shell 命令避免 workflow 表达式直接插值造成 CodeQL 所警告的Code injectionHEAD SHA 用^[0-9a-f]{40}$校验repo 标识符用^[A-Za-z0-9_.-]$校验通过git fetch --depth1拉取指定 SHA 后以git checkout --detach $HEAD_SHA检出避免信任分支名的可变指向。Skill 的装载方式由于 Skill 源码已 vendored 在仓库的.claude/skills/greploop目录工作流将其软链到 Claude Code 的用户级技能目录随后调用anthropics/claude-code-actionv1以prompt: /greploop PR_NUMBER启动并用--allowed-tools Bash(gh:*),Bash(git:*)收紧工具权限——这与 SKILL.md 中allowed-tools的声明相互印证。九、配套参考文档Greploop Skill 自带的两个参考文件是完整执行时的 API 速查表.claude/skills/greploop/references/gitlab-api.md汇总 GitLab REST API 调用glab api会自动将:fullpath解析为本地 remote 的 URL 编码项目路径覆盖 MR 详情、触发评论、pipeline/job 查询、notes 拉取、未解决讨论过滤与逐条 resolve.claude/skills/greploop/references/graphql-queries.md提供 GitHub 侧分页查询 reviewThreads 与批量resolveReviewThreadmutation 的完整模板。十、适用前提与限制说明前置依赖本 Skill 的全部命令依赖git、gh/glab/p4CLI 的可用与认证以及目标仓库已安装 Greptile 集成缺一不可平台差异自托管 GitLab主机名不含 gitlab与 Perforce 场景需通过--vcs输入显式指定平台迭代上限循环硬限制为 5 次达到上限会保留未解决评论并给出建议不会无限空转bot 身份差异GitLab 上 Greptile bot 用户名不固定需首次运行时确认后再做精确过滤见 .claude/skills/greploop/references/gitlab-api.md。综上Greploop 是一套可直接复用的AI 评审驱动开发闭环从平台检测、对象识别到触发评审、解析评分与内联评论再到修复、resolve 线程、重新推送最终以结构化报告收尾。结合 elsa-core 仓库中的 .github/workflows/greploop.yml 部署示例开发者可以快速将它嵌入自己的 PR 优化流程用最少的人工介入把代码质量打磨到 Greptile 评审标准的满分状态。赞分享后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载相关推荐Greploop 实战指南基于 Greptile 自动迭代优化 PR/MR/CL 直至满分评审Greploop 实战指南基于 Greptile 自动迭代优化 PR/MR/CL 直至满分评审 导读 Greploop 是存放在本仓库 .agents/ski后端工作流自动化流程编排低代码Greploop 实战指南基于 Greptile 自动化 PR/MR/CL 审查迭代闭环直至 5/5 满分通过Greploop 实战指南基于 Greptile 自动化 PR/MR/CL 审查迭代闭环直至 5/5 满分通过 导读 Greploop 是本仓库Onyx/AI 应用大模型RAGAI Agent后端前端Claude Code 自动评审 GitHub PR 实战claude-cookbooks 的 review-pr 指令与 code-reviewer 子代理深度解析Claude Code 自动评审 GitHub PR 实战claude cookbooks 的 review pr 指令与 code reviewer 子代理示例工程上一篇PDF补丁丁终极指南免费PDF编辑工具完整教程下一篇VirtualBuddy深度集成指南5步实现Guest应用无缝文件共享和剪贴板同步创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考