From de18bbcf7bca7b9172d02931bd341482956588a0 Mon Sep 17 00:00:00 2001 From: chaoyuepan Date: Fri, 17 Apr 2026 21:02:20 +0800 Subject: [PATCH] refactor(autoresearch): direct agent calls and alternating review flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace acpx wrapper with direct claude/codex CLI calls - Restructure iteration loop: codex impl → claude review → codex review → ... - Both agents now have dual role (reviewer + implementer) - Remove self-assessment and self-check sections --- docs/autoresearch/README.md | 37 ++-- docs/autoresearch/agents/claude.md | 51 ++++- docs/autoresearch/agents/codex.md | 44 +---- docs/autoresearch/run.sh | 288 +++++++++++++++-------------- 4 files changed, 220 insertions(+), 200 deletions(-) diff --git a/docs/autoresearch/README.md b/docs/autoresearch/README.md index a3319ef..20ab706 100644 --- a/docs/autoresearch/README.md +++ b/docs/autoresearch/README.md @@ -10,8 +10,11 @@ # 检查 GitHub CLI gh auth status -# 检查 acpx(Agent 控制工具) -which acpx +# 检查 Claude Code CLI +which claude + +# 检查 OpenAI Codex CLI +which codex # 检查 Go 环境 go version @@ -39,11 +42,10 @@ cd /path/to/your/github/project 脚本会自动: 1. 检查项目环境(git 仓库、GitHub remote) -2. 创建 acpx session(如果不存在) -3. 获取 Issue 信息 -4. 创建工作分支 -5. 循环执行 Codex 实现 → 测试 → Claude 审核 -6. 直到评分 ≥ 8.5 或达到最大迭代次数 +2. 获取 Issue 信息 +3. 创建工作分支 +4. 循环执行 Codex 实现 → 测试 → Claude 审核 +5. 直到评分 ≥ 8.5 或达到最大迭代次数 ### 3. 自定义配置 @@ -69,27 +71,22 @@ cd /path/to/your/github/project 如果需要手动控制每一步: ```bash -# 1. 确保有 acpx session -cd /path/to/your/project -acpx codex sessions new -acpx claude sessions new - -# 2. 查看 Issue +# 1. 查看 Issue gh issue view 42 -# 3. 创建分支 +# 2. 创建分支 git checkout -b feature/issue-42 -# 4. Codex 实现 -acpx codex "实现 Issue #42: [Issue标题]" +# 3. Codex 实现 +codex --approval-mode full-auto "实现 Issue #42: [Issue标题]" -# 5. 运行测试 +# 4. 运行测试 go test ./... -# 6. Claude 审核 -acpx claude "审核 Issue #42 的实现" +# 5. Claude 审核 +claude -p "审核 Issue #42 的实现" --dangerously-skip-permissions -# 7. 如果评分 < 8.5,让 Codex 改进,然后重复 5-6 +# 6. 如果评分 < 8.5,让 Codex 改进,然后重复 4-5 ``` ## 文件说明 diff --git a/docs/autoresearch/agents/claude.md b/docs/autoresearch/agents/claude.md index cb119a6..b2aa02d 100644 --- a/docs/autoresearch/agents/claude.md +++ b/docs/autoresearch/agents/claude.md @@ -1,18 +1,49 @@ -# Claude Agent - 审核者角色 +# Claude Agent -你是一个资深的代码审核专家 Agent,负责审查 Codex 实现的代码。你是审核者,专注于发现潜在问题、确保代码质量、推动实现者改进。 +你是一个资深的软件工程师 Agent,既能审核代码,也能实现功能。 --- ## 角色定位 -**你是审核者,不是实现者。** +**你可以是审核者,也可以是实现者,取决于任务要求。** -- 你的职责是审查代码,发现问题 +- 作为审核者:审查代码质量,给出评分和改进建议 +- 作为实现者:根据 Issue 描述或审核反馈实现/改进代码 - 你需要提出具体的改进建议 - 你需要评估实现质量并给出评分 -- 你不直接修改代码,只提出意见 -- 你的目标是帮助提升代码质量,而不是为难实现者 +- 你需要根据审核反馈直接修复代码 + +--- + +## 工作流程(实现) + +### Phase 1: 理解需求 + +``` +1. 阅读 Issue #N 的完整内容 +2. 理解 Issue 的核心诉求 +3. 如果有疑问,列出需要澄清的问题 +4. 确认涉及的代码模块 +``` + +### Phase 2: 分析代码 + +``` +1. 使用 Glob 和 Grep 工具搜索相关代码 +2. 阅读相关文件,理解现有架构 +3. 识别需要修改的文件 +4. 评估改动范围和影响 +``` + +### Phase 3: 实现代码 + +``` +1. 编写功能实现代码 +2. 编写单元测试代码 +3. 确保测试覆盖核心逻辑 +4. 运行测试验证实现 +``` --- @@ -596,8 +627,12 @@ if secretKey == "" { ``` □ 完整阅读了所有改动文件 -□ 检查了测试覆盖情况 -□ 考虑了安全因素 +□ 代码编译通过 +□ 所有测试通过 +□ 测试覆盖率 ≥ 70% +□ 无硬编码配置 +□ 无安全漏洞 +□ 错误处理完整 □ 给出了具体可操作的建议 □ 评分有明确的依据 □ 结论与评分一致 diff --git a/docs/autoresearch/agents/codex.md b/docs/autoresearch/agents/codex.md index 89207fc..4829b09 100644 --- a/docs/autoresearch/agents/codex.md +++ b/docs/autoresearch/agents/codex.md @@ -1,17 +1,17 @@ -# Codex Agent - 实现者角色 +# Codex Agent -你是一个专业的软件工程师 Agent,负责实现 GitHub Issues 中描述的功能需求或修复 Bug。你是实现者,专注于编写高质量、可测试、符合规范的代码。 +你是一个专业的软件工程师 Agent,既能实现功能,也能审核代码。 --- ## 角色定位 -**你是实现者,不是决策者。** +**你可以是实现者,也可以是审核者,取决于任务要求。** -- 你的职责是根据 Issue 描述实现功能 +- 作为实现者:根据 Issue 描述或审核反馈实现/改进代码 +- 作为审核者:审查代码质量,给出评分和改进建议 - 你需要编写代码和测试 -- 你需要接受审核者的批评并改进 -- 你不决定 Issue 是否合理,只负责实现 +- 你需要接受审核反馈并改进 --- @@ -44,15 +44,6 @@ 4. 运行测试验证实现 ``` -### Phase 4: 自检 - -``` -1. 检查代码风格是否符合项目规范 -2. 检查是否有明显的 Bug -3. 检查测试是否覆盖边界情况 -4. 记录实现思路和关键决策 -``` - --- ## 输出格式 @@ -84,11 +75,6 @@ - [场景2] - ... -### 自评 -- 代码质量: X/10 -- 测试覆盖: X/10 -- 整体评分: X/10 - ### 待确认问题 - [列出需要审核者关注的问题,如果没有则写"无"] ``` @@ -312,21 +298,3 @@ go test ./internal/auth/... -v ## 改进报告 [按格式输出报告] ``` - ---- - -## 质量自检清单 - -每次提交前检查: - -``` -□ 代码编译通过 -□ 所有测试通过 -□ 测试覆盖率 ≥ 70% -□ 无硬编码配置 -□ 无安全漏洞 -□ 代码有适当注释 -□ 错误处理完整 -□ 日志输出合理 -□ 文档已更新(如需要) -``` diff --git a/docs/autoresearch/run.sh b/docs/autoresearch/run.sh index ccfa1f5..4b5008c 100755 --- a/docs/autoresearch/run.sh +++ b/docs/autoresearch/run.sh @@ -94,12 +94,19 @@ run_with_retry() { log "调用 $agent (尝试 $retry/$MAX_RETRIES)..." # 执行命令 - if acpx --approve-all $agent "$prompt" 2>&1 | tee "$log_file"; then + local exit_code=1 + if [ "$agent" = "codex" ]; then + codex exec --full-auto "$prompt" 2>&1 | tee "$log_file" && exit_code=0 + else + claude -p "$prompt" --dangerously-skip-permissions 2>&1 | tee "$log_file" && exit_code=0 + fi + + if [ $exit_code -eq 0 ]; then # 检查是否有错误 - if ! grep -q "\[error\]" "$log_file" 2>/dev/null; then + if ! grep -qi "error" "$log_file" 2>/dev/null; then # 检查是否有实际输出 local content_lines - content_lines=$(grep -v "^\[acpx\]" "$log_file" | grep -v "^\[client\]" "$log_file" | grep -v "^\[error\]" "$log_file" | grep -v "^$" | wc -l) + content_lines=$(grep -v "^$" "$log_file" | wc -l) if [ "$content_lines" -ge 5 ]; then success=1 break @@ -181,8 +188,13 @@ check_dependencies() { missing=1 fi - if ! command -v acpx &> /dev/null; then - error "acpx 未安装,请先安装 acpx" + if ! command -v claude &> /dev/null; then + error "claude (Claude Code CLI) 未安装" + missing=1 + fi + + if ! command -v codex &> /dev/null; then + error "codex (OpenAI Codex CLI) 未安装" missing=1 fi @@ -198,29 +210,6 @@ check_dependencies() { log "依赖检查通过" } -ensure_acpx_session() { - log "准备 acpx session..." - - cd "$PROJECT_ROOT" - - # 先关闭可能存在的旧 session(避免缓存旧配置) - log "关闭旧 session..." - acpx codex sessions close 2>/dev/null || true - acpx claude sessions close 2>/dev/null || true - - sleep 1 - - # 创建新的 codex session - log "创建 codex session..." - acpx codex sessions new 2>&1 - - # 创建新的 claude session - log "创建 claude session..." - acpx claude sessions new 2>&1 - - log "acpx session 准备完成" -} - get_issue_info() { local issue_number=$1 @@ -379,7 +368,7 @@ run_claude() { log "迭代 $iteration: Claude 实现..." - # 获取 claude 指令文件(作为实现者) + # 获取 claude 指令文件 local claude_instructions_file claude_instructions_file=$(get_agent_instructions "claude") @@ -400,7 +389,7 @@ Issue 内容: $ISSUE_BODY 迭代次数: $iteration --- -请作为实现者执行(参考 codex.md 的实现者角色): +请实现以下功能: $claude_instructions " else @@ -413,7 +402,7 @@ Issue 标题: $ISSUE_TITLE $previous_feedback --- -请作为实现者执行改进: +请根据反馈修复代码: $claude_instructions " fi @@ -547,7 +536,7 @@ run_codex_review() { log "迭代 $iteration: Codex 审核..." - # 获取 codex 指令文件(作为审核者) + # 获取 codex 指令文件 local codex_instructions_file codex_instructions_file=$(get_agent_instructions "codex") @@ -563,7 +552,7 @@ run_codex_review() { Issue 标题: $ISSUE_TITLE --- -请作为审核者执行审核(参考 claude.md 的审核者角色),给出评分和改进建议: +请审核代码并给出评分和改进建议: $codex_instructions " @@ -699,15 +688,16 @@ get_issue_info "$ISSUE_NUMBER" # 设置工作目录 setup_work_directory "$ISSUE_NUMBER" -# 确保 acpx session 存在 (仅用于 claude) -ensure_acpx_session - # 创建分支 create_branch "$ISSUE_NUMBER" -# 迭代循环(轮流模式) -# 奇数轮: Codex 实现 → Claude 审核 -# 偶数轮: Claude 实现 → Codex 审核 +# 迭代循环 +# 迭代 1: Codex 实现 +# 迭代 2: Claude 审核 + 评分 (未达标则修复) +# 迭代 3: Codex 审核 + 修复 (如有必要) +# 迭代 4: Claude 审核 + 修复 (如有必要) +# ... +# 直到评分 >= PASSING_SCORE 或达到最大迭代次数 ITERATION=0 PREVIOUS_FEEDBACK="" FINAL_SCORE=0 @@ -719,117 +709,153 @@ while [ $ITERATION -lt $MAX_ITERATIONS ]; do log "" log "==========================================" log "迭代 $ITERATION/$MAX_ITERATIONS" - # 判断奇偶轮 - if [ $((ITERATION % 2)) -eq 1 ]; then - log "本轮: Codex 实现 → Claude 审核" + if [ $ITERATION -eq 1 ]; then + log "本轮: Codex 初始实现" + elif [ $((ITERATION % 2)) -eq 0 ]; then + log "本轮: Claude 审核 + 修复" else - log "本轮: Claude 实现 → Codex 审核" + log "本轮: Codex 审核 + 修复" fi log "==========================================" - # 根据奇偶轮选择实现者 - if [ $((ITERATION % 2)) -eq 1 ]; then - # 奇数轮: Codex 实现 - if ! run_codex "$ISSUE_NUMBER" "$ITERATION" "$PREVIOUS_FEEDBACK"; then - CONSECUTIVE_FAILURES=$((CONSECUTIVE_FAILURES + 1)) - log "Codex 执行失败 (连续失败: $CONSECUTIVE_FAILURES/$MAX_CONSECUTIVE_FAILURES)" + CONSECUTIVE_FAILURES=0 - if [ $CONSECUTIVE_FAILURES -ge $MAX_CONSECUTIVE_FAILURES ]; then - error "连续失败 $CONSECUTIVE_FAILURES 次,停止运行" - error "请检查 acpx codex 配置" + # ---- 迭代 1: Codex 初始实现 ---- + if [ $ITERATION -eq 1 ]; then + if ! run_codex "$ISSUE_NUMBER" "$ITERATION" ""; then + error "Codex 初始实现失败" + record_final_result "$ISSUE_NUMBER" "agent_failed" "$ITERATION" "$FINAL_SCORE" + exit 1 + fi - record_final_result "$ISSUE_NUMBER" "agent_failed" "$ITERATION" "$FINAL_SCORE" - exit 1 - fi + # 运行测试 + if ! run_tests "$ITERATION"; then + log "初始实现测试失败,继续下一轮审核修复" + PREVIOUS_FEEDBACK="测试失败,请检查测试输出并修复问题。" + fi + + # 初始实现后不评分,直接进入下一轮 + PREVIOUS_FEEDBACK="初始实现完成,请审核代码质量并给出评分。如果有问题请直接修复。" + continue + fi - log "等待 10 秒后重试..." + # ---- 偶数轮: Claude 审核 + 修复 ---- + if [ $((ITERATION % 2)) -eq 0 ]; then + # Claude 审核 + if ! run_claude_review "$ISSUE_NUMBER" "$ITERATION"; then + CONSECUTIVE_FAILURES=$((CONSECUTIVE_FAILURES + 1)) + log "Claude 审核失败" sleep 10 + ITERATION=$((ITERATION - 1)) # 重试本轮 continue fi - else - # 偶数轮: Claude 实现 - if ! run_claude "$ISSUE_NUMBER" "$ITERATION" "$PREVIOUS_FEEDBACK"; then - CONSECUTIVE_FAILURES=$((CONSECUTIVE_FAILURES + 1)) - log "Claude 执行失败 (连续失败: $CONSECUTIVE_FAILURES/$MAX_CONSECUTIVE_FAILURES)" - if [ $CONSECUTIVE_FAILURES -ge $MAX_CONSECUTIVE_FAILURES ]; then - error "连续失败 $CONSECUTIVE_FAILURES 次,停止运行" - error "请检查 acpx claude 配置" + REVIEW_LOG_FILE="$WORK_DIR/iteration-$ITERATION-claude-review.log" + SCORE=$(get_last_score) + FINAL_SCORE=$SCORE - record_final_result "$ISSUE_NUMBER" "agent_failed" "$ITERATION" "$FINAL_SCORE" - exit 1 - fi + if check_score_passed "$SCORE"; then + log "审核通过!评分: $SCORE/10 (达标线: $PASSING_SCORE)" + break + fi - log "等待 10 秒后重试..." - sleep 10 + log "评分未达标 ($SCORE/$PASSING_SCORE),Claude 根据反馈修复..." + + # Claude 根据审核反馈修复 + REVIEW_FEEDBACK=$(cat "$REVIEW_LOG_FILE") + if ! run_claude "$ISSUE_NUMBER" "$ITERATION" "$REVIEW_FEEDBACK"; then + log "Claude 修复失败,继续下一轮" + PREVIOUS_FEEDBACK="$REVIEW_FEEDBACK" continue fi - fi - # 实现成功,重置连续失败计数 - CONSECUTIVE_FAILURES=0 + # 修复后运行测试 + if ! run_tests "$ITERATION"; then + PREVIOUS_FEEDBACK="测试失败,请检查测试输出并修复问题。" + else + PREVIOUS_FEEDBACK="" + fi - # 运行测试 - if ! run_tests "$ITERATION"; then - PREVIOUS_FEEDBACK="测试失败,请检查测试输出并修复问题。" continue fi - # 根据奇偶轮选择审核者 - if [ $((ITERATION % 2)) -eq 1 ]; then - # 奇数轮: Claude 审核 - run_claude_review "$ISSUE_NUMBER" "$ITERATION" - REVIEW_LOG_FILE="$WORK_DIR/iteration-$ITERATION-claude-review.log" - else - # 偶数轮: Codex 审核 - run_codex_review "$ISSUE_NUMBER" "$ITERATION" - REVIEW_LOG_FILE="$WORK_DIR/iteration-$ITERATION-codex-review.log" + # ---- 奇数轮 (>=3): Codex 审核 + 修复 ---- + if ! run_codex_review "$ISSUE_NUMBER" "$ITERATION"; then + CONSECUTIVE_FAILURES=$((CONSECUTIVE_FAILURES + 1)) + log "Codex 审核失败" + sleep 10 + ITERATION=$((ITERATION - 1)) # 重试本轮 + continue fi + REVIEW_LOG_FILE="$WORK_DIR/iteration-$ITERATION-codex-review.log" SCORE=$(get_last_score) FINAL_SCORE=$SCORE - # 检查是否通过(支持小数评分) if check_score_passed "$SCORE"; then log "审核通过!评分: $SCORE/10 (达标线: $PASSING_SCORE)" + break + fi - record_final_result "$ISSUE_NUMBER" "completed" "$ITERATION" "$SCORE" + log "评分未达标 ($SCORE/$PASSING_SCORE),Codex 根据反馈修复..." - echo "" - log "==========================================" - log "处理完成!" - log "==========================================" - log "分支: $BRANCH_NAME" - log "评分: $SCORE/10" - log "迭代次数: $ITERATION" + # Codex 根据审核反馈修复 + REVIEW_FEEDBACK=$(cat "$REVIEW_LOG_FILE") + if ! run_codex "$ISSUE_NUMBER" "$ITERATION" "$REVIEW_FEEDBACK"; then + log "Codex 修复失败,继续下一轮" + PREVIOUS_FEEDBACK="$REVIEW_FEEDBACK" + continue + fi - # 自动提交 PR 并合并 - log "" - log "==========================================" - log "自动提交 PR 并合并..." - log "==========================================" + # 修复后运行测试 + if ! run_tests "$ITERATION"; then + PREVIOUS_FEEDBACK="测试失败,请检查测试输出并修复问题。" + else + PREVIOUS_FEEDBACK="" + fi + + continue +done + +# ---- 判断最终结果 ---- +if check_score_passed "$FINAL_SCORE"; then + record_final_result "$ISSUE_NUMBER" "completed" "$ITERATION" "$FINAL_SCORE" - cd "$PROJECT_ROOT" + echo "" + log "==========================================" + log "处理完成!" + log "==========================================" + log "分支: $BRANCH_NAME" + log "评分: $FINAL_SCORE/10" + log "迭代次数: $ITERATION" + + # 自动提交 PR 并合并 + log "" + log "==========================================" + log "自动提交 PR 并合并..." + log "==========================================" - # 提交所有更改 - log "提交更改..." - git add -A - git commit -m "feat: implement issue #$ISSUE_NUMBER - $ISSUE_TITLE + cd "$PROJECT_ROOT" -Implemented by autoresearch with score $SCORE/10 after $ITERATION iterations. + # 提交所有更改 + log "提交更改..." + git add -A + git commit -m "feat: implement issue #$ISSUE_NUMBER - $ISSUE_TITLE + +Implemented by autoresearch with score $FINAL_SCORE/10 after $ITERATION iterations. Closes #$ISSUE_NUMBER" 2>/dev/null || log "没有需要提交的更改" - # 推送分支 - log "推送分支 $BRANCH_NAME..." - git push -u origin "$BRANCH_NAME" + # 推送分支 + log "推送分支 $BRANCH_NAME..." + git push -u origin "$BRANCH_NAME" - # 创建 PR - log "创建 Pull Request..." - PR_URL=$(gh pr create --title "feat: $ISSUE_TITLE (#$ISSUE_NUMBER)" --body "$(cat <&1) - if echo "$PR_URL" | grep -q "https://github.com"; then - PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$') - log "PR 已创建: $PR_URL" + if echo "$PR_URL" | grep -q "https://github.com"; then + PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$') + log "PR 已创建: $PR_URL" - # 合并 PR - log "合并 PR #$PR_NUMBER..." - gh pr merge "$PR_NUMBER" --merge --delete-branch + # 合并 PR + log "合并 PR #$PR_NUMBER..." + gh pr merge "$PR_NUMBER" --merge --delete-branch - log "" - log "==========================================" - log "完成!Issue #$ISSUE_NUMBER 已自动处理" - log "==========================================" - log "PR: $PR_URL" - log "状态: 已合并" - else - log "警告: PR 创建失败或已存在" - log "$PR_URL" - fi - - exit 0 + log "" + log "==========================================" + log "完成!Issue #$ISSUE_NUMBER 已自动处理" + log "==========================================" + log "PR: $PR_URL" + log "状态: 已合并" + else + log "警告: PR 创建失败或已存在" + log "$PR_URL" fi - log "评分未达标 ($SCORE/$PASSING_SCORE),准备下一轮迭代..." - - # 获取审核结果作为下次反馈 - PREVIOUS_FEEDBACK=$(cat "$REVIEW_LOG_FILE") -done + exit 0 +fi # 达到最大迭代次数 log ""