PR Review Context
【免费下载链接】oh-my-claudecodeTeams-first Multi-agent orchestration for Claude Code项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-claudecode
You are reviewing PR #{{PR_NUMBER}}:{{PR_TITLE}}
PR Details
- Author: @{{PR_AUTHOR}}
- Branch:
{{HEAD_BRANCH}}→{{BASE_BRANCH}} - URL: {{PR_URL}}
各占位符的取值来源是 GitHub CLI 的 `gh pr view` JSON 输出。见 [providers/github.sh](https://link.gitcode.com/i/66329b0431e91c65ede071b394bb96a8): ```bash provider_github_fetch_pr() { local pr_number="$1" local repo="$2" gh pr view "$pr_number" --repo "$repo" --json number,title,author,headRefName,baseRefName,body,files,url 2>/dev/null }映射关系如下:
| 占位符 | 含义 | 数据来源(gh 字段) |
|---|---|---|
{{PR_NUMBER}} | PR 编号 | number |
{{PR_TITLE}} | PR 标题 | title |
{{PR_AUTHOR}} | 提交者 GitHub 用户名 | author.login |
{{HEAD_BRANCH}} | 源分支(待审查分支) | headRefName |
{{BASE_BRANCH}} | 目标分支(合并基) | baseRefName |
{{PR_URL}} | PR 链接 | url |
{{PR_BODY}} | PR 描述正文 | body(可为空,// ""兜底) |
{{CHANGED_FILES}} | 变更文件路径列表 | files[].path,最多取 50 条 |
值得注意的两个实现细节(均出自 psm.sh):
body使用jq -r '.body // ""',把缺失描述归一为空字符串,避免渲染时出现字面null;- 变更文件通过
jq -r '.files[]?.path // empty'提取并head -50截断,防止超大 PR 撑爆上下文。
2.2 PR 描述与变更文件
## Description {{PR_BODY}} ## Changed Files {{CHANGED_FILES}}PR_BODY使 Claude 无需切换上下文即可直接读取 PR 动机与实现说明;CHANGED_FILES则给出审查范围清单,供其快速定位待审文件、决定测试执行顺序(先跑被改动文件对应的最小测试集)。这部分与.psm/review.md中注入的原始换行文本会被整体保留(多行值的安全替换详见后文第三节)。
2.3 五维审查聚焦(Review Focus)
这是模板的"质量标准"核心,Claude 被要求围绕五个维度展开审查:
- Code Quality(代码质量)
- Follow existing patterns and conventions(遵循既有模式与约定)
- Clean, readable, maintainable code(干净、可读、可维护)
- Appropriate abstractions(恰当的抽象层次)
- Correctness(正确性)
- Does it do what it claims?(是否兑现 PR 声称的功能)
- Edge cases handled?(边界情况是否覆盖)
- Error handling appropriate?(错误处理是否恰当)
- Security(安全)
- Input validation(输入校验)
- No hardcoded secrets(无硬编码密钥)
- Safe dependencies(依赖安全)
- Testing(测试)
- Adequate test coverage(测试覆盖是否充分)
- Tests are meaningful(测试是否有意义)
- Edge cases tested(边界用例是否被测试)
- Documentation(文档)
- Code is self-documenting(代码自解释)
- Complex logic explained(复杂逻辑有说明)
- API changes documented(API 变更是否有文档)
这五维清单同时呼应了仓库中docs/shared/verification-tiers.md、agents/code-reviewer.md 与 agents/critic.md 所体现的"审查质量标准分层"理念:既有面向代码实现细节的工程质量检查,也有面向安全与测试证据的底线检查。
2.4 建议执行的命令序列
模板中嵌入了三条被注释为"审查执行抓手"的命令:
# View diff git diff {{BASE_BRANCH}}...HEAD # Run the narrowest relevant tests first # If this clean review worktree has a symlinked node_modules from the source repo, # focused vitest commands should work without a fresh install. npm run test:run -- <changed-test-paths> # preferred focused verification npm test # or appropriate full test command if focused coverage is insufficient # Check build npm run build # or appropriate build command这段命令块设计得非常"可运行":审查 worktree 是全新检出的 PR 分支(以{{BASE_BRANCH}}为基线),因此git diff {BASE}...HEAD能精确给出相对合并基的差异;随后强调"先跑最窄的相关测试",并提示如果 worktree 与源仓库node_modules做了符号链接复用,定向 vitest 命令无需重新安装即可执行——这正是 PSM 在 worktree.sh 中实现的依赖引导(bootstrap)机制:
psm_bootstrap_review_dependencies() { ... cmp -s "$source_package_json" "$target_package_json" || return 0 ln -s "$source_node_modules" "$target_node_modules" 2>/dev/null || true return 0 }前提与限制:只有当 worktree 与源仓库的package.json逐字节一致(cmp -s)时,才会把源仓库的node_modules符号链接到干净 worktree,从而让npm run test:run -- ...这类聚焦测试无需完整npm install。若依赖清单不一致则跳过链接,审查者需自行安装依赖。
2.5 审查检查清单(Review Checklist)
## Review Checklist - [ ] Code follows project style - [ ] No obvious bugs or logic errors - [ ] Security concerns addressed - [ ] Tests pass and cover changes - [ ] Documentation updated if needed这份清单与 Review Focus 一一对应(风格/质量、正确性、安全、测试、文档),为审查结论提供了可勾选的证据闭环,也方便后续人工复核。
三、模板渲染与提示注入的底层实现
3.1 渲染器psm_render_template
模板中的{{KEY}}由 lib/tmux.sh 中的psm_render_template完成替换。其实现非常克制,刻意不用 sed/awk 而采用 Bash 参数展开:
psm_render_template() { local template_file="$1" shift if [[ ! -f "$template_file" ]]; then echo "error|Template not found: $template_file" >&2 return 1 fi local content content=$(cat "$template_file") for assignment in "$@"; do local key="${assignment%%=*}" local value="${assignment#*=}" content="${content//\{\{${key}\}\}/$value}" done printf '%s\n' "$content" }该设计在回归测试 test-psm-prompt-injection.sh 中被逐条验证,并针对 PR 场景做了专门加固:
| 测试用例 | 验证点 |
|---|---|
| 单变量替换 | Hello {{NAME}}!→Hello World! |
| 多变量替换 | PR 编号/标题/作者一次替换 |
| 未引用占位符保留 | 未提供的{{OTHER}}原样保留,便于发现漏传 |
| 缺失模板文件 | 返回非零退出码与错误信息 |
值中含/ | 分支名feature/my-branch不被破坏 |
| 空值清除 | 空值将占位符清空为空白 |
值中含& | foo&bar不会被当作 sed 反向引用(这正是规避 sed 的原因) |
3.2 依赖检测与多行安全
多行值(PR_BODY、CHANGED_FILES)能安全注入,得益于 Bash${content//pattern/value}天然支持跨行字符串——这是比逐行 sed 更稳健的选择。此外渲染失败时的降级路径在 test-psm-prompt-injection.sh 的cmd_review simulation用例中有端到端模拟:渲染后写入 worktree 的.psm/review.md必须存在,且 PR 编号、标题、作者、URL、head/base 分支全部无残留占位符。
3.3 REPL 就绪检测与提示注入
模板被渲染成.psm/review.md之后,还需要"送进"正在启动的 Claude Code。这由psm_inject_prompt完成(见 lib/tmux.sh):
psm_inject_prompt() { ... if ! psm_wait_for_claude_prompt "$session_name"; then echo "warn|Timed out waiting for Claude prompt; task context not injected" >&2 return 0 fi local trigger="Read ${context_file} for full task context, then begin." tmux send-keys -t "$session_name" -l -- "$trigger" sleep 0.15 tmux send-keys -t "$session_name" Enter return 0 }【免费下载链接】oh-my-claudecodeTeams-first Multi-agent orchestration for Claude Code项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-claudecode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考