Cursor Agent 命令实战:Opik 仓库 generate-code-review-slack-command 自动生成代码评审 Slack 消息
2026/9/13 4:08:25 网站建设 项目流程

Cursor Agent 命令实战:Opik 仓库 generate-code-review-slack-command 自动生成代码评审 Slack 消息

【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm

generate-code-review-slack-command是 Opik(comet-llm)仓库在 .agents/commands/comet/generate-code-review-slack-command.md 中定义的一条 Cursor AI Agent 命令:它自动从当前分支的 GitHub PR 中提取 Jira 票据、测试环境链接、PR 大小以及 FE/BE/Python/TypeScript 各组件摘要,并按照固定的代码评审模板格式化为可直接粘贴到#code-review频道的 Slack 消息。读完本文,你将掌握这条命令的完整执行流程、信息提取规则、消息模板细节、配套的 PR 大小提取共享逻辑,以及它与自动发送命令send-code-review-slack的取舍,可以直接在 Opik 仓库中复制使用或借鉴到自己的 Agent 命令设计中。

命令概览:做什么、不做什么

功能定位

该命令的核心职责是:生成一条格式化、可复制的 Slack 命令,用于在#code-review频道发布 PR 代码评审请求。消息包含:

  • PR 信息(PR 链接)
  • Jira 票据(自动从 PR 标题提取,例如[OPIK-1234]
  • 测试环境链接(自动从 PR 描述或评论提取)
  • 可选的组件摘要(FE、BE、Python、TypeScript)
  • 可选的 Baz 审批状态
  • PR 大小(如🟠 L

执行模型:只生成、不发送

与原文档一致,本命令的执行模型是"只生成、不发送"

自动从 GitHub PR 提取信息,仅对缺失的信息进行提问,按模板格式化消息,输出可复制的 Slack 命令(不会自动发送)。

这是它与姊妹命令cursor send-code-review-slack(见 .agents/commands/comet/send-code-review-slack.md)的本质区别——后者通过 Slack MCP 的conversations_add_message工具直接把消息发到频道。选择哪条命令取决于你是否需要发送前的人工编辑(见下文"与 send-code-review-slack 的取舍")。

完整工作流

命令执行时依次完成:

  1. 查找当前分支对应的 GitHub PR
  2. 从 PR 标题提取 Jira 票据
  3. 从 PR 描述提取测试环境链接
  4. 从 PR 描述提取组件摘要(FE、BE、Python、TypeScript)
  5. 仅对缺失信息进行提问
  6. 允许用户小幅定制消息
  7. 按代码评审模板格式化消息
  8. 生成可复制、可编辑后发送的 Slack 命令
  9. 展示命令供复制

前置条件与环境配置

依赖矩阵:需要 GitHub MCP,不需要 Slack MCP

依赖是否必需说明
GitHub MCP✅ 必需用于自动提取 PR 信息
Slack MCP❌ 不需要本命令不发送消息,因此无需配置 Slack MCP
Git 仓库✅ 必需命令需在当前分支上运行
Docker视环境而定GitHub MCP 通过 Docker 运行(见.agents/mcp.json

GitHub MCP 配置

GitHub MCP 在 .agents/mcp.json 中声明,通过 Docker 运行官方镜像ghcr.io/github/github-mcp-server,启用repospull_requestsissues三组工具集,令牌从${workspaceFolder}/.env.local中的GITHUB_PERSONAL_ACCESS_TOKEN读取:

"GitHub": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "-e", "GITHUB_TOOLSETS=repos,pull_requests,issues", "ghcr.io/github/github-mcp-server" ], "envFile": "${workspaceFolder}/.env.local" }

启用命令:make cursor / make claude

如果运行命令时提示 MCP 未配置,按提示先执行环境初始化。仓库根目录 Makefile 提供了两个目标:

  • make cursor:把.agents/目录软链为.cursor/,让 Cursor 能读取命令定义;
  • make claude:把.agents/同步到.claude/并生成根目录.mcp.json,供 Claude CLI 使用。
# 配置 MCP 环境后 make cursor # Cursor make claude # Claude CLI

命令发现机制依赖 Agent 工具链(Cursor/Claude)能访问.agents/commands/comet/下的 Markdown 命令定义文件,因此上述初始化是第一步。

执行流程详解

Step 1:预检与环境检查

命令启动后先做三项预检:

  1. 检查 GitHub MCP 可用性:尝试用get_file_contents获取comet-ml/opik仓库信息。若不可用,直接回复并停止:

    "This command needs GitHub MCP configured. Set MCP config/env, runmake cursor(Cursor) ormake claude(Claude CLI), then retry."

  2. 确认处于 Git 仓库:验证当前目录是 Git 仓库。
  3. 获取当前分支名:作为后续查找 PR 的依据。

预检失败即停止,不进入后续流程——这保证了信息源(PR)的可靠性。

Step 2:查找当前分支的 GitHub PR

  • 使用 GitHub MCP 在comet-ml/opik中查找当前分支对应的开放 PR
  • 找到 PR:提取 PR 编号、URL、标题和描述,暂存供后续提取步骤使用。
  • 未找到 PR:提示 "No open PR found for this branch. Please provide the PR link manually:",要求手动输入 PR 链接并校验 URL 格式;随后用 GitHub MCP 拉取该 PR 详情。若拉取失败则停止并报错。手动链接成功获取后,走与自动发现完全相同的"提取 PR 编号/URL/标题/描述"分支。

Step 3:从 PR 中提取信息

这是命令的核心智能所在,分为四类提取任务。

3.1 提取 Jira 票据(必填)

提取顺序严格递进:

  1. 解析 PR 标题,匹配[OPIK-\d+][issue-\d+][NA]模式。例如从[OPIK-1234] [BE] feat(api): add trace request validation endpoint提取出OPIK-1234
  2. 标题中未找到时,检查 PR 描述的## Issues章节中的OPIK-\d+模式。
  3. 仍未找到时提问:"Jira ticket not found in PR. Enter Jira ticket number (e.g., OPIK-1234):",校验格式后存储。

随后构造 Jira URL:https://comet-ml.atlassian.net/browse/{TICKET}(例如https://comet-ml.atlassian.net/browse/OPIK-1234)。

3.2 提取 Baz 审批状态(可选)
  • 尝试通过 GitHub MCP 拉取 PR 的 status checks / CI checks。
  • 若发现能表明 "Baz approved" 或类似审批状态的检查,存储状态(如 "Baz approved: ✅" 或 "Baz status: pending")。
  • 不可用时跳过该字段(它是可选项)。
3.3 提取 PR 大小(必填)

遵循共享文档 .agents/docs/PR_SIZE_EXTRACTION.md 的步骤:优先读取size/*标签;标签缺失时,按工作流自身的忽略清单与阈值回退到改动行数计算。存储格式为{emoji} {BUCKET}(例如🟠 L)。详细机制见下文"PR 大小提取的共享逻辑"。

3.4 提取测试环境链接(必填)

提取顺序同样是多层回退:

  1. 先搜 PR 评论,查找测试环境部署消息(如 "Test environment is now available!")。
  2. 未找到则搜 PR 描述的## Testing章节中的 URL。
  3. 匹配常见测试环境模式:https://pr-*.dev.comet.comhttps://test.opik.comhttps://*.opik.com或任意https://URL;多个 URL 时优先选最像测试环境的第一个。
  4. 未找到再搜## Details章节。
  5. 仍未找到则提问:"Test environment link not found in PR. Enter test environment link (e.g., https://pr-4743.dev.comet.com):",校验 URL 后存储。

关键细节:拉取评论必须分页。文档明确要求调用gh api始终加--paginate

# Issue comments(一般 PR 评论,含部署机器人消息) gh api repos/comet-ml/opik/issues/{pr_number}/comments --paginate # Review comments(行内代码评论) gh api repos/comet-ml/opik/pulls/{pr_number}/comments --paginate

原因:GitHub API 默认每页仅返回 30 条。Opik 的 PR 经常超过这个数量——17 条 CI 测试组评论 + 部署机器人评论 + 评审者评论很容易突破 30 条。不加--paginate时,含测试环境链接的部署机器人评论可能落在第 2 页而被静默漏掉,导致提取失败并退回人工输入。

3.5 提取组件摘要(可选,四个组件独立提取)
组件关键词启发式(大小写不敏感)缺失时的提问
FE"frontend"、"FE"、"React"、"UI"、[FE]标签"Frontend summary not found in PR. Enter frontend summary (one line, optional - press Enter to skip):"
BE"backend"、"BE"、"Java"、"API"、[BE]标签"Backend summary not found in PR. Enter backend summary (one line, optional - press Enter to skip):"
Python"Python"、"Python SDK"、"SDK" 或 Python 相关改动"Python summary not found in PR. Enter Python summary (one line, optional - press Enter to skip):"
TypeScript"TypeScript"、"TypeScript SDK"、"TS"、"TS SDK"、[TS]标签"TypeScript summary not found in PR. Enter TypeScript summary (one line, optional - press Enter to skip):"

每个组件的摘要从## Details章节或组件相关提及中提取一行摘要;未找到时提问,按 Enter 可直接跳过(摘要本来就是可选项)。

Step 4:消息定制提问

所有信息提取完成后,命令询问用户是否定制消息:

"Would you like to customize the message? (Enter any additional text to prepend/append, or press Enter to use default message):"

  • 用户输入文本:该文本会作为独立段落插入问候语之后、结构化字段之前。
  • 用户按 Enter(空):按默认模板输出。

定制文本可用于补充上下文、强调重点或附加额外信息。

Step 5:按模板格式化 Slack 消息

消息模板
Hi team, Please review the following PR: {{user_customization_text_if_provided}} :jira_epic: jira link: {{Jira_URL}} :github: pr link: {{PR_link}} :straight_ruler: pr size: {{pr_size}} :test_tube: test env link: {{test_env}} {{baz_approved_status_if_available}} :react: fe summary (optional): {{description_in_one_line}} :java: be summary (optional): {{description_in_one_line}} :python: python summary (optional): {{description_in_one_line}} :typescript: typescript summary (optional): {{description_in_one_line}}
字段规则
  • 问候语固定:始终以Hi team,\n\nPlease review the following PR:\n开头。
  • 用户定制文本:若有(Step 4),放在问候语之后、结构化字段之前。
  • Jira 链接:完整 URL,如https://comet-ml.atlassian.net/browse/OPIK-1234
  • PR 链接:GitHub PR URL。
  • PR 大小:只含桶名(如🟠 L),始终包含——因为 GitHub 上大小信息总是可得。
  • 测试环境链接:测试环境 URL。
  • Baz 审批状态:仅在成功提取时才包含(可选字段)。
  • 组件摘要:只包含已提供的可选字段,空值一律跳过。
格式化示例
Hi team, Please review the following PR: :jira_epic: jira link: https://comet-ml.atlassian.net/browse/OPIK-1234 :github: pr link: https://github.com/comet-ml/opik/pull/1234 :straight_ruler: pr size: 🟠 L :test_tube: test env link: https://test.opik.com :react: fe summary (optional): Added new metrics dashboard UI :java: be summary (optional): Implemented metrics aggregation endpoint :typescript: typescript summary (optional): Added TypeScript SDK support for metrics

Step 6:生成可复制的 Slack 命令

生成结果以代码块形式输出,便于一键复制,并附带明确的使用指引:

"📋Copiable Slack Command Generated

Copy the command below and paste it into the #code-review channel in Slack.

You can edit it before sending to:

  • Add @ mentions for specific reviewers
  • Add media links or video links
  • Make final proof edits
  • Add any additional context
[FORMATTED_MESSAGE]

To send in Slack:

  1. Open Slack and navigate to #code-review channel
  2. Paste the command above
  3. Edit as needed (add @ mentions, media links, etc.)
  4. Send the message"

如果用户偏好,命令还会额外提供 Slack CLI 等价格式:

slack chat send --channel "#code-review" --text "[FORMATTED_MESSAGE]"

Step 7:展示与总结

最终展示代码块中的格式化消息、说明使用方式,并强调"发送前可编辑"(添加 @ 提及、媒体链接、最终校对)。

PR 大小提取的共享逻辑

PR 大小是命令的必填字段,其提取逻辑被抽取为共享文档 .agents/docs/PR_SIZE_EXTRACTION.md,供generate-code-review-slack-commandsend-code-review-slack两条命令共用,避免两者逻辑漂移。

提取规则

  1. 优先读标签:仓库的 "📏 Auto Label PR Size" 工作流(实现在 .github/workflows/labeler.yml)为每个 PR 打恰好一个size/*标签:🔵 size/XS🟢 size/S🟡 size/M🟠 size/L🔴 size/XL。直接读取 PR 标签即可。
  2. 存储格式{emoji} {BUCKET}(如🟠 L),只含桶名、不含行数
  3. 回退计算:仅当尚无size/*标签(工作流可能还没跑完)时,用 PR 的改动行数(additions + deletions)推导桶,且必须套用与工作流相同的忽略清单与阈值,保证回退结果与标签机落到同一桶。

源码级依据:labeler 工作流

.github/workflows/labeler.yml 中定义了权威的分桶规则(BUCKETSIGNORE_GLOBS):

const BUCKETS = [ { name: "🔵 size/XS", color: CHIP_COLOR, maxSize: 19 }, { name: "🟢 size/S", color: CHIP_COLOR, maxSize: 100 }, { name: "🟡 size/M", color: CHIP_COLOR, maxSize: 300 }, { name: "🟠 size/L", color: CHIP_COLOR, maxSize: 600 }, { name: "🔴 size/XL", color: CHIP_COLOR, maxSize: null }, // 兜底 ]; const IGNORE_GLOBS = [ "**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/poetry.lock", "**/uv.lock", "sdks/python/src/opik/rest_api/**", "sdks/typescript/src/opik/rest_api/**", "**/*.snap", "**/*.svg", "**/*.png", ];

分桶阈值:XS < 20S 20–100M 101–300L 301–600XL > 600maxSize为闭区间上界,最后一项为 null 兜底)。忽略清单剔除锁文件(package-lock.jsonyarn.lock等)、生成的 REST 客户端(sdks/*/src/opik/rest_api/**)以及快照/图片文件——否则一次锁文件升级会把小 PR 误标成 XL。工作流计算时还会对 PR 文件列表做github.paginate分页拉取(.github/workflows/labeler.yml),与命令提取评论时分页同理。

为什么以 GitHub 为唯一事实源

文档强调 GitHub 是大小信息的事实源;消息发布时刻的大小即可满足需求——PR 进入评审后极少跨桶变化。共享文档刻意不在自身重复列出忽略清单与阈值,而是要求读工作流定义,从源头杜绝两处定义漂移。

错误处理全景

GitHub MCP 错误

  • MCP 不可用:测试后立即停止,给出配置指引(make cursor/make claude)。
  • PR 未找到:提示手动提供 PR 链接,或用户取消则停止。
  • PR 拉取失败:展示错误详情,建议手动输入。

提取错误

  • Jira 票据未找到 → 提示输入票据号。
  • 测试环境链接未找到 → 提示输入测试环境 URL。
  • 组件摘要未找到 → 提示输入摘要(可选,可跳过)。

输入校验错误

  • Jira 票据格式非法 → 展示期望格式(如OPIK-1234)并重新提问。
  • PR URL 非法 → 展示期望格式并重新提问。
  • 测试环境 URL 非法 → 展示期望格式并重新提问。

成功标准

命令成功的可验证清单(原文档明确定义):

  1. ✅ GitHub MCP 可用且可访问
  2. ✅ 找到当前分支的 PR(或手动提供)
  3. ✅ Jira 票据已从 PR 提取或手动提供
  4. ✅ 测试环境链接已从 PR 提取或手动提供
  5. ✅ 组件摘要已提取或手动提供(可选)
  6. ✅ 消息按模板格式化(含问候语和 Jira 链接)
  7. ✅ 生成并展示了可复制的 Slack 命令
  8. ✅ 用户获得清晰的使用指引

完整示例

标准流程(分支上有开放 PR)

# 1. 确保 GitHub MCP 已配置(无需 Slack MCP) # 2. 在带有开放 PR 的分支上运行 cursor generate-code-review-slack-command
# 执行流程: # 1. 找到当前分支 PR:https://github.com/comet-ml/opik/pull/1234 # 2. 从 PR 标题提取 Jira 票据:[OPIK-1234] [FE] feat(api): add metrics dashboard # 3. 从 PR 评论/描述提取测试环境:https://pr-1234.dev.comet.com(来自 PR 评论或 Testing 章节) # 从 size/* 标签(或 additions+deletions)提取 PR 大小:🟠 L # 4. 从 PR 描述提取摘要: # - FE: Added new metrics dashboard UI(来自 Details 章节) # - BE: Implemented metrics aggregation endpoint(来自 Details 章节) # - Python:(未找到,向用户提问) # - TypeScript:(未找到,向用户提问) # 5. 询问消息定制(可选) # 6. 按模板格式化消息(含问候语和 Jira 链接) # 7. 生成并展示可复制的 Slack 命令
# 输出: # 📋 **Copiable Slack Command Generated** # # Copy the command below and paste it into the #code-review channel in Slack. # # You can edit it before sending to: # - Add @ mentions for specific reviewers # - Add media links or video links # - Make final proof edits # - Add any additional context # # ``` # Hi team, # # Please review the following PR: # # :jira_epic: jira link: https://comet-ml.atlassian.net/browse/OPIK-1234 # :github: pr link: https://github.com/comet-ml/opik/pull/1234 # :straight_ruler: pr size: 🟠 L # :test_tube: test env link: https://test.opik.com # :react: fe summary (optional): Added new metrics dashboard UI # :java: be summary (optional): Implemented metrics aggregation endpoint # :typescript: typescript summary (optional): Added TypeScript SDK support for metrics # ``` # # **To send in Slack:** # 1. Open Slack and navigate to #code-review channel # 2. Paste the command above # 3. Edit as needed (add @ mentions, media links, etc.) # 4. Send the message

信息缺失场景

部分信息无法从 PR 提取时,命令逐项提问、缺失即补:

cursor generate-code-review-slack-command # Found PR: https://github.com/comet-ml/opik/pull/1234 # Extracted Jira ticket: OPIK-1234 # Test environment link not found in PR. Enter test environment link (e.g., https://test.opik.com): https://test.opik.com # Frontend summary not found in PR. Enter frontend summary (one line, optional - press Enter to skip): [Enter pressed - skipped] # Backend summary not found in PR. Enter backend summary (one line, optional - press Enter to skip): Implemented metrics endpoint # Python summary not found in PR. Enter Python summary (one line, optional - press Enter to skip): [Enter pressed - skipped] # TypeScript summary not found in PR. Enter TypeScript summary (one line, optional - press Enter to skip): [Enter pressed - skipped] # Would you like to customize the message? (Enter any additional text to prepend/append, or press Enter to use default message): [Enter pressed - using default]

定制场景

cursor generate-code-review-slack-command # ... 提取步骤 ... # Would you like to customize the message? (Enter any additional text to prepend/append, or press Enter to use default message): This PR includes important security updates, please review carefully. # # 生成的消息包含定制文本: # Hi team, # # Please review the following PR: # # This PR includes important security updates, please review carefully. # # :jira_epic: jira link: https://comet-ml.atlassian.net/browse/OPIK-1234 # ...

与 send-code-review-slack 的取舍

本命令与自动发送命令cursor send-code-review-slack(.agents/commands/comet/send-code-review-slack.md)共享几乎完全相同的信息提取逻辑(Jira、测试环境、组件摘要、PR 大小),关键差异在发送环节:

维度generate-code-review-slack-commandsend-code-review-slack
发送方式不发送,生成可复制命令经 Slack MCP 直接发送
Slack MCP不需要需要(ghcr.io/korotovsky/slack-mcp-server
适用场景发送前需要人工编辑快速直达频道

本命令的典型适用场景(原文档明确列出):

  • 添加针对特定评审者的 @ 提及
  • 附带 Slack MCP 无法直接发送的媒体链接或视频链接
  • 发送前做最终校对
  • 对最终消息格式有更强的掌控需求

视频限制的补充说明:Slack 无法直接发送视频,视频应放入 PR 描述后在 Slack 中分享链接。如需与产品团队更顺畅地沟通,send-code-review-slack命令的文档也建议改用本命令生成可编辑的 Slack 命令后再发送。

设计要点与最佳实践

  1. 提取优先、提问兜底:所有字段先尝试自动提取(标题 → 描述 → 评论 → 提问),将人工输入降到最低;可选字段允许 Enter 跳过,不给用户制造负担。
  2. 分页是硬要求:无论提取评论还是计算 PR 大小,凡是经 GitHub API 分页返回的数据都显式 paginate,避免第 2 页的关键信息被静默丢失。
  3. 单一事实源:PR 大小的阈值与忽略清单只定义在 .github/workflows/labeler.yml,命令与共享文档只引用不复制,杜绝漂移。
  4. 发送前留出编辑窗口:把"生成"与"发送"拆成两条命令,让高控制需求的场景(@ 提及、多媒体、最终校对)不被自动化吞掉。
  5. 失败即停:GitHub MCP 不可用或 PR 无法获取时立即停止并给出明确指引,避免在半可用状态下产出错误消息。

【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询