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 的取舍")。
完整工作流
命令执行时依次完成:
- 查找当前分支对应的 GitHub PR
- 从 PR 标题提取 Jira 票据
- 从 PR 描述提取测试环境链接
- 从 PR 描述提取组件摘要(FE、BE、Python、TypeScript)
- 仅对缺失信息进行提问
- 允许用户小幅定制消息
- 按代码评审模板格式化消息
- 生成可复制、可编辑后发送的 Slack 命令
- 展示命令供复制
前置条件与环境配置
依赖矩阵:需要 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,启用repos、pull_requests、issues三组工具集,令牌从${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:预检与环境检查
命令启动后先做三项预检:
- 检查 GitHub MCP 可用性:尝试用
get_file_contents获取comet-ml/opik仓库信息。若不可用,直接回复并停止:"This command needs GitHub MCP configured. Set MCP config/env, run
make cursor(Cursor) ormake claude(Claude CLI), then retry." - 确认处于 Git 仓库:验证当前目录是 Git 仓库。
- 获取当前分支名:作为后续查找 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 票据(必填)
提取顺序严格递进:
- 解析 PR 标题,匹配
[OPIK-\d+]、[issue-\d+]或[NA]模式。例如从[OPIK-1234] [BE] feat(api): add trace request validation endpoint提取出OPIK-1234。 - 标题中未找到时,检查 PR 描述的
## Issues章节中的OPIK-\d+模式。 - 仍未找到时提问:"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 提取测试环境链接(必填)
提取顺序同样是多层回退:
- 先搜 PR 评论,查找测试环境部署消息(如 "Test environment is now available!")。
- 未找到则搜 PR 描述的
## Testing章节中的 URL。 - 匹配常见测试环境模式:
https://pr-*.dev.comet.com、https://test.opik.com、https://*.opik.com或任意https://URL;多个 URL 时优先选最像测试环境的第一个。 - 未找到再搜
## Details章节。 - 仍未找到则提问:"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 metricsStep 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:
- Open Slack and navigate to #code-review channel
- Paste the command above
- Edit as needed (add @ mentions, media links, etc.)
- 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-command与send-code-review-slack两条命令共用,避免两者逻辑漂移。
提取规则
- 优先读标签:仓库的 "📏 Auto Label PR Size" 工作流(实现在 .github/workflows/labeler.yml)为每个 PR 打恰好一个
size/*标签:🔵 size/XS、🟢 size/S、🟡 size/M、🟠 size/L、🔴 size/XL。直接读取 PR 标签即可。 - 存储格式:
{emoji} {BUCKET}(如🟠 L),只含桶名、不含行数。 - 回退计算:仅当尚无
size/*标签(工作流可能还没跑完)时,用 PR 的改动行数(additions + deletions)推导桶,且必须套用与工作流相同的忽略清单与阈值,保证回退结果与标签机落到同一桶。
源码级依据:labeler 工作流
.github/workflows/labeler.yml 中定义了权威的分桶规则(BUCKETS与IGNORE_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 < 20、S 20–100、M 101–300、L 301–600、XL > 600(maxSize为闭区间上界,最后一项为 null 兜底)。忽略清单剔除锁文件(package-lock.json、yarn.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 非法 → 展示期望格式并重新提问。
成功标准
命令成功的可验证清单(原文档明确定义):
- ✅ GitHub MCP 可用且可访问
- ✅ 找到当前分支的 PR(或手动提供)
- ✅ Jira 票据已从 PR 提取或手动提供
- ✅ 测试环境链接已从 PR 提取或手动提供
- ✅ 组件摘要已提取或手动提供(可选)
- ✅ 消息按模板格式化(含问候语和 Jira 链接)
- ✅ 生成并展示了可复制的 Slack 命令
- ✅ 用户获得清晰的使用指引
完整示例
标准流程(分支上有开放 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-command | send-code-review-slack |
|---|---|---|
| 发送方式 | 不发送,生成可复制命令 | 经 Slack MCP 直接发送 |
| Slack MCP | 不需要 | 需要(ghcr.io/korotovsky/slack-mcp-server) |
| 适用场景 | 发送前需要人工编辑 | 快速直达频道 |
本命令的典型适用场景(原文档明确列出):
- 添加针对特定评审者的 @ 提及
- 附带 Slack MCP 无法直接发送的媒体链接或视频链接
- 发送前做最终校对
- 对最终消息格式有更强的掌控需求
视频限制的补充说明:Slack 无法直接发送视频,视频应放入 PR 描述后在 Slack 中分享链接。如需与产品团队更顺畅地沟通,send-code-review-slack命令的文档也建议改用本命令生成可编辑的 Slack 命令后再发送。
设计要点与最佳实践
- 提取优先、提问兜底:所有字段先尝试自动提取(标题 → 描述 → 评论 → 提问),将人工输入降到最低;可选字段允许 Enter 跳过,不给用户制造负担。
- 分页是硬要求:无论提取评论还是计算 PR 大小,凡是经 GitHub API 分页返回的数据都显式 paginate,避免第 2 页的关键信息被静默丢失。
- 单一事实源:PR 大小的阈值与忽略清单只定义在 .github/workflows/labeler.yml,命令与共享文档只引用不复制,杜绝漂移。
- 发送前留出编辑窗口:把"生成"与"发送"拆成两条命令,让高控制需求的场景(@ 提及、多媒体、最终校对)不被自动化吞掉。
- 失败即停: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),仅供参考