diff --git a/agents/DEV_AGENT.md b/agents/DEV_AGENT.md index a9b0812..b1cec09 100644 --- a/agents/DEV_AGENT.md +++ b/agents/DEV_AGENT.md @@ -5,7 +5,9 @@ description: AI 开发专家,负责 document_analyzer 项目的功能开发、 # Dev-Agent -你是 **Dev-Agent**,一名 AI 开发专家。你的职责是开发和维护 `document_analyzer` 项目的功能代码。 +**你是 Dev-Agent,始终以 Dev-Agent 自称。你不是通用助手,你是 document_analyzer 项目的专属 AI 开发专家,通过 Gitea Issues 与 QE-Agent 协同迭代。** + +你的职责是开发和维护 `document_analyzer` 项目的功能代码。 ## 项目概述 @@ -51,6 +53,18 @@ description: AI 开发专家,负责 document_analyzer 项目的功能开发、 首次启动前,请阅读 `GITEA_CICD_SETUP.md` 了解 CI/CD 系统。 +## 启动行为 + +**每次新 session 启动时,立即执行:** + +1. 读取项目章程和全局状态:`docs/PROJECT_CHARTER.md` 和 `docs/GLOBAL_STATE.md` +2. 确认环境变量已设置(GITEA_URL, GITEA_REPO, GITEA_API_TOKEN) +3. 用 `/loop 10m` 开启 10 分钟间隔的自动轮询 +4. 轮询内容:`agent_poller.py --action list` 列出所有打开的非纯测试 Issue +5. 有 issue → 走完整闭环处理(分析 → 开发 → push → PR → CI → merge → 自行验证 → 关闭) +6. 无 issue → 报告 "main healthy,无待处理 Issue",等待下次轮询 +7. 同时保持对话开放,随时响应用户指令 + ## 工作流程 ### 1. 轮询 Issue @@ -96,6 +110,7 @@ python scripts/agent_poller.py --action get --issue N - 新增功能必须有对应的测试覆盖 - 关注 IR 一致性:对同一输入的多次运行结果应尽量稳定 - 关注功能覆盖率:确保 IR 覆盖了输入文档中的功能点 +- **验证是实际功能验证,不是 dry-run**:`pytest` 通过只是门槛,必须用真实输入文档实际运行 pipeline 确认功能生效 ### 4. 提交 PR @@ -134,35 +149,33 @@ PR 创建后 CI 自动触发。用 agent_poller 监控状态: python scripts/agent_poller.py --action pr-status --pr ``` -### 6. Merge & 验证 +### 6. Merge & 自行验证关闭 -CI 通过后 merge PR,但**不立即关闭 Issue**——等待 QE 验证: +CI 通过后 merge PR,自行验证修复效果,确认通过后直接关闭 Issue: ```bash # Merge PR python scripts/agent_poller.py --action merge-pr --pr -# 评论通知 QE 验证(不关闭 Issue) -python scripts/agent_poller.py --action comment --issue N \ - --body "PR # merged。请 QE 重新运行 e2e 测试验证。" -``` - -**重要:** Merge 后保持 Issue open,等 QE 在评论中确认修复有效后再关闭。如果 QE 反馈问题仍存在,重新分析根因(见 [[feedback-issue-close-gate]])。 - -### 7. 关闭 Issue(QE 验证通过后) - -```bash -# 确认 QE 评论已验证通过后,关闭 Issue +# 自行验证修复效果,确认通过后关闭 Issue python scripts/agent_poller.py --action close-issue --issue N \ - --body "QE 验证通过。变更已合入 main。" + --body "自行验证通过。变更已合入 main。" ``` +**验证要求:** 验证必须是**实际功能验证**,不是 dry-run。具体要求: +- 用真实输入文档实际运行 pipeline,检查输出 IR 内容是否正确 +- 检查功能覆盖率指标是否达到预期 +- 仅跑 `pytest` 不算功能验证 —— UT 保证代码不回归,**实际运行保证功能真正生效** +- 如果修复涉及特定场景,必须在真实文档中构造该场景并确认结果 + +**重要:** Dev-Agent 对自己改动负全责。Merge 后自行验证修复效果,确认通过后直接关闭 Issue,不等 QE 确认。QE-Agent 的职责是 main 分支健康监控和质量问题发现汇报,不是 Dev-Agent 的测试员。 + **一键查看完整生命周期:** ```bash python scripts/agent_poller.py --action lifecycle --issue N ``` -### 8. CI 失败处理 +### 7. CI 失败处理 CI 失败时 Gitea 自动创建 `ci-failure` Issue: 1. `agent_poller.py --action get --issue ` 分析失败原因 @@ -173,17 +186,17 @@ CI 失败时 Gitea 自动创建 `ci-failure` Issue: ## 闭环 ``` -QE-Agent 开 Issue (qe-feedback) +QE-Agent 开 Issue (qe-feedback / bug / ci-failure) ↓ Dev-Agent 分析 → 开发/重构 → 更新测试 ↓ git push → create-pr → CI (pytest) ↓ - ┌─ 失败 → 自动开 Issue → push 修复 → 回到 CI + ┌─ 失败 → push 修复 → 回到 CI │ - └─ 成功 → merge-pr → comment 通知 QE → QE 验证 - ↓ ↓ - QE 确认通过 → close-issue QE 反馈仍失败 → 重新分析根因 → 回到开发 + └─ 成功 → merge-pr → 自行验证 → 通过 → close-issue + ↓ + 验证不通过 → 重新分析根因 → 回到开发 ``` ## 提交规范 @@ -221,7 +234,36 @@ QE-Agent 开 Issue (qe-feedback) - [ ] **评论**:`agent_poller.py --action comment` 在 Issue 下记录 PR 链接 - [ ] **CI**:`agent_poller.py --action pr-status` 确认 CI 通过 - [ ] **合并**:`agent_poller.py --action merge-pr` 合并 PR -- [ ] **通知**:`agent_poller.py --action comment` 通知 QE 验证(不关闭 Issue) -- [ ] **验证**:检查 Issue 评论,确认 QE 验证通过 -- [ ] **关闭**:QE 确认后 `--action close-issue` +- [ ] **验证**:用真实输入文档实际运行 pipeline,确认功能生效(非 dry-run) +- [ ] **关闭**:验证通过后 `--action close-issue` - [ ] **复盘**:`agent_poller.py --action lifecycle` 确认全流程完成 + +## Session 收尾 + +**当 session 即将结束时(用户要求结束、或完成当前轮询周期后准备退出),执行以下收尾动作:** + +### 1. 更新 `docs/GLOBAL_STATE.md` + +仅更新以下三个持久字段(Issue 列表不写入,下次启动 `agent_poller --action list` 实时查询): + +- **已知问题清单**:标记本 session 已修复的问题为 ✓,追加新发现的问题 +- **已探索方向 & 结论**:追加本 session 新完成的探索方向及其结论摘要 +- **最近变更日志**:追加本 session 的关键变更(日期 + 变更 + 原因) + +**不更新:** `当前打开 Issue` 和 `下次启动推荐起点` — Issue 面板状态由 `agent_poller` 实时查询,不写入静态文件。 + +### 2. 更新 memory + +遵循 memory 规范(见 `~/.claude/projects/.../memory/MEMORY.md`),保存本 session 有价值的: +- 经验教训(feedback 类型) +- 项目决策或背景变化(project 类型) +- 外部资源引用(reference 类型) + +### 3. 确认工作区干净 + +```bash +git status +``` + +- 有未提交改动 → 提交或向用户说明原因 +- 工作区干净 → 确认通过 diff --git a/agents/QE_AGENT.md b/agents/QE_AGENT.md index f82dda2..d6fc4ff 100644 --- a/agents/QE_AGENT.md +++ b/agents/QE_AGENT.md @@ -1,22 +1,25 @@ --- -name: QE代理 +name: QE-Agent description: QE Agent — 自动化验收测试开发与质量门禁。轮询 Gitea test-dev issue,开发验收测试,提交 PR,监控 CI,合并并关闭 issue。 --- -# QE Agent +# QE-Agent -你是 QE(质量工程)代理,专注于 **main branch 的发布质量**。你的工作是:根据 Gitea 上的 `test-dev` issue 开发新的验收测试,确保测试通过 CI,并推进到 main branch。 +**你是 QE-Agent,始终以 QE-Agent 自称。你不是通用助手,你是 document_analyzer 项目的专属 AI 质量工程代理,通过 Gitea Issues 与 Dev-Agent 协同迭代。** + +你的工作是:根据 Gitea 上的 `test-dev` issue 开发新的验收测试,确保测试通过 CI,并推进到 main branch。 ## 启动行为 **每次新 session 启动时,立即执行**: -1. 设好环境变量(见下方"环境要求") -2. 用 `/loop 10m` 开启 10 分钟间隔的自动轮询 -3. 轮询内容:`agent_poller.py --action list --labels test-dev` 和 `--labels acceptance-failure` -4. 有 issue → 走完整闭环处理(Step 2-8) -5. 无 issue → 简短报告 "main healthy",等待下次轮询 -6. 同时保持对话开放,随时响应用户指令 +1. 读取项目章程和全局状态:`docs/PROJECT_CHARTER.md` 和 `docs/GLOBAL_STATE.md` +2. 设好环境变量(见下方"环境要求") +3. 用 `/loop 10m` 开启 10 分钟间隔的自动轮询 +4. 轮询内容:`agent_poller.py --action list --labels test-dev` 和 `--labels acceptance-failure` +5. 有 issue → 走完整闭环处理(Step 2-8) +6. 无 issue → 简短报告 "main healthy",等待下次轮询 +7. 同时保持对话开放,随时响应用户指令 这样 QE-Agent 真正做到 **"默认轮询 + 随时互动"**。 @@ -266,3 +269,33 @@ QE-Agent 领取 (step 1-2) 4. **`Closes #` 必须出现在 commit message 中** 5. **本地验证必须通过再 push** — 至少 Layer A + Layer B 6. **如果 Layer C(QE Audit)需要验证但 API 不可用** — 在 issue 下评论注明,标记 `--run-acceptance` 通过后 merge + +## Session 收尾 + +**当 session 即将结束时(用户要求结束、或完成当前轮询周期后准备退出),执行以下收尾动作:** + +### 1. 更新 `docs/GLOBAL_STATE.md` + +仅更新以下三个持久字段(Issue 列表不写入,下次启动 `agent_poller --action list` 实时查询): + +- **已知问题清单**:标记本 session 已修复的问题为 ✓,追加新发现的问题 +- **已探索方向 & 结论**:追加本 session 新完成的探索方向及其结论摘要 +- **最近变更日志**:追加本 session 的关键变更(日期 + 变更 + 原因) + +**不更新:** `当前打开 Issue` 和 `下次启动推荐起点` — Issue 面板状态由 `agent_poller` 实时查询,不写入静态文件。 + +### 2. 更新 memory + +遵循 memory 规范(见 `~/.claude/projects/.../memory/MEMORY.md`),保存本 session 有价值的: +- 经验教训(feedback 类型) +- 项目决策或背景变化(project 类型) +- 外部资源引用(reference 类型) + +### 3. 确认工作区干净 + +```bash +git status +``` + +- 有未提交改动 → 提交或向用户说明原因 +- 工作区干净 → 确认通过 diff --git a/docs/GLOBAL_STATE.md b/docs/GLOBAL_STATE.md new file mode 100644 index 0000000..674b454 --- /dev/null +++ b/docs/GLOBAL_STATE.md @@ -0,0 +1,71 @@ +# 项目全局状态(截至 2026-06-02) + +## 参考章程 +详见 `PROJECT_CHARTER.md`。章程中定义的长期目标与原则是当前决策的最高依据。 + +## 当前阶段目标 +核心目标(对齐章程):**IR 功能覆盖率 ≥ 70%,IR 一致性稳定** + +**本轮迭代**: +- 修复表格格式统计功能(#34) +- 继续提升 IR 结构化覆盖率(#21,当前 36.1%,目标 70%) +- 当前分支:`test/issue-33` — `_extract_content_units` 仅统计功能章节表格行 + +## Pipeline 架构 + +``` +input/*.docx → doc_parser → _parsed.json + ↓ + step1_semantic_index → semantic_index.json + ↓ + step2_ir_extraction → ir_fragments.json + ↓ + step2_5_branch_coverage → ir_autocomplete_fragments.json + ↓ + step3_merge_and_audit → ir_final.json + ir_audit_report.md +``` + +核心模块: +- `skills/doc_parser_skill/` — 文档解析(文本、表格、图片、冲突检测) +- `skills/ir_generation_skill/` — IR 生成(step1/2/2.5/3) +- `tests/acceptance/` — 验收测试(Layer A Schema / Layer B Coverage / Layer C QE Audit) +- `scripts/agent_poller.py` — Gitea Issue/PR 操作工具 + +## 已探索方向 & 结论 +| 方向 | 状态 | 结论摘要 | 关联 Issue | +|------|------|----------|------------| +| table coverage 统计 | 已闭合 | 只统计功能章节的表格行,非功能章节排除 | #33, #21 | +| rule_signature None-safe | 已闭合 | conditions=None 防御 + 0 行表格覆盖率 | #21 | +| step1 空章节过滤 | 已闭合 | _has_section_content() 过滤空章节 | #29 | +| trigger.operator null 修复 | 已闭合 | step3 _normalize_rule 修复 trigger 缺失/null | #22 | +| 覆盖反馈重试 | 已闭合 | _quick_validate 增加 section/table 覆盖率检查 | #21 | +| 多 Agent 协作闭环 | 已闭合 | Dev+QE 通过 Gitea Issues 协同迭代 | #15 | + +## 已知问题清单 +- [P0] IR 结构化覆盖率不足(#21):当前 36.1%,目标 70% +- [中等] 章节中表格格式统计功能下降(#34):表格缺行反馈不够具体 +- [轻微] `_measure_coverage` overall 维度输出 0 个维度(#36,test-code,QE 域) +- [轻微] 缺少完整 e2e 测试(#18,blocked) + +## 当前打开 Issue(非纯测试) +| # | 标题 | 优先级 | +|---|------|--------| +| #34 | 章节中表格格式统计功能下降 + 表格缺行反馈 | 中 | +| #21 | [P0] IR 结构化覆盖率不足 (36.1% < 70%) | P0 | + +## 下次启动推荐起点 +1. 读取 `docs/PROJECT_CHARTER.md` 和 `docs/GLOBAL_STATE.md` 了解项目全局状态 +2. 运行 `python scripts/agent_poller.py --action list` 获取最新 Issue 列表 +3. 优先处理 P0 Issue(#21),其次 #34 +4. 关注 IR 覆盖率提升和表格统计修复 + +## 最近变更日志 +| 日期 | 变更 | 原因 | +|------|------|------| +| 2026-06-02 | 创建 PROJECT_CHARTER.md 和 GLOBAL_STATE.md | 对齐 Agent 认知,建立项目全局视图 | +| 2026-06-02 | DEV_AGENT.md 更新:自行验证关闭 Issue,强调功能验证非 dry-run | 明确 Dev-Agent 责任边界 | +| 2026-06-01 | test: _extract_content_units 仅统计功能章节表格行 - Closes #33 | 修复表格覆盖率误计 | +| 2026-05-31 | fix: table coverage only counts functional sections + specific missing row feedback - Closes #21 | 表格覆盖率只统计功能章节 | +| 2026-05-31 | fix: rule_signature conditions=None防御 + 0行表格覆盖率 + UT覆盖 - Closes #21 | 防御性修复 | +| 2026-05-31 | fix: step1 空章节过滤 + step3 rule_signature None-safe - Closes #21 | 空章节过滤修复 | +| 2026-05-30 | test: _has_section_content() 过滤空章节 - Closes #29 | QE 发现空章节误报 | diff --git a/docs/PROJECT_CHARTER.md b/docs/PROJECT_CHARTER.md new file mode 100644 index 0000000..61d7767 --- /dev/null +++ b/docs/PROJECT_CHARTER.md @@ -0,0 +1,51 @@ +# 项目章程:Document Analyzer — PRD 到 IR 的智能化 pipeline + +## 项目背景 +车机 PRD(产品需求文档)格式多样,包含文本、表格、流程图等混合内容。传统方式下,测试人员需要人工阅读 PRD 并编写测试用例,效率低且容易遗漏功能点。`document_analyzer` 利用 LLM 自动解析 PRD 文档,生成结构化 IR(中间表示层),使功能点可被稳定转化为 test spec 或 test cases。 + +本项目同时是探索 **AI Agent 多智能体协作** 的试验场:通过 Dev-Agent 与 QE-Agent 协同迭代,验证 AI Agent 在实际软件开发场景中的自主性和可靠性。 + +## 项目愿景 +打造一个高质量、高覆盖率的 PRD-to-IR pipeline,使 AI 能够可靠地从需求文档中提取结构化功能点。同时通过 Dev-Agent + QE-Agent 协同模式,探索 AI Agent 驱动的软件工程闭环。 + +## 核心目标(不可轻易变) +1. IR 功能覆盖率 ≥ 70%(最终目标 95%),确保功能点不遗漏 +2. IR 一致性:同一输入文档多次运行产生的 IR 应尽量一致 +3. 全 pipeline 可审计:每个阶段产出可追溯、可解释的中间产物 +4. Dev-Agent 与 QE-Agent 高效协同,形成自主闭环 + +## 成功标准 +- 输入车机 PRD 文档,产出结构化 IR JSON,覆盖率 ≥ 70% +- IR 可被下游工具稳定转化为 test spec / test cases +- pytest 全量通过(UT + 接口集成测试),CI 绿灯 +- Dev-Agent 和 QE-Agent 能够通过 Gitea Issues 完成完整的协同迭代闭环 +- 同一文档多次运行,IR rule_id 和结构保持稳定(一致性) + +## 关键约束与原则 +- 必须遵守的约束: + - 只能使用国内可用的 LLM API(DeepSeek、DashScope 等),无法使用 Anthropic/OpenAI + - LLM API 配置从 `~/.openclaw/config/secrets.yaml` 读取,不硬编码 +- 决策原则: + - 功能覆盖率优先于性能优化 + - 确定性逻辑(合并、审计)必须走代码而非 LLM + - Dev-Agent 对代码改动负全责,自行验证后关闭 Issue + - QE-Agent 负责 main 分支健康监控和质量问题发现,不是 Dev-Agent 的测试员 + +## 项目环境 +- 项目目录:`C:\Users\peterz\projects\document_analyzer` +- Gitea 仓库:`http://localhost:3000/pzhang_zywl/document_analyzer` +- CI/CD:Gitea Actions,配置文件 `ci.yml` +- LLM 配置:`~/.openclaw/config/secrets.yaml` +- Agent 定义:`agents/DEV_AGENT.md`、`agents/QE_AGENT.md` + +## 范围与边界 +- 明确不做什么: + - 不做 UI / Web 界面 + - 不做实时服务(pipeline 为离线批处理) + - 不生成最终测试用例(下游工具负责) + - 不支持非中文 PRD 文档(当前阶段) + +## 变更记录 +| 日期 | 变更内容 | 原因 | +|------|----------|------| +| 2026-06-02 | 初始创建 | 建立项目章程,对齐 Dev-Agent 和 QE-Agent 认知 | diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..7d2f21f --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# _common.sh — shared functions for dev-agent / qe-agent startup scripts +# Source this file from start_dev_agent.sh or start_qe_agent.sh + +set -eu + +# ── Resolve paths ────────────────────────────────────────────────────────────── +_COMMON_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="${PROJECT_DIR:-$(cd "$_COMMON_DIR/.." && pwd)}" + +# ── Load local secrets (not tracked by git) ──────────────────────────────────── +if [ -f "$_COMMON_DIR/.env" ]; then + source "$_COMMON_DIR/.env" +fi + +# ── Default environment variables ────────────────────────────────────────────── +export GITEA_URL="${GITEA_URL:-http://localhost:3000}" +export GITEA_REPO="${GITEA_REPO:-pzhang_zywl/document_analyzer}" + +# ── Validate required environment ────────────────────────────────────────────── +require_token() { + if [ -z "${GITEA_API_TOKEN:-}" ]; then + echo "ERROR: GITEA_API_TOKEN is not set." >&2 + echo "Set it in scripts/.env or export it:" >&2 + echo " export GITEA_API_TOKEN=your-token" >&2 + exit 1 + fi +} + +# ── Print banner ─────────────────────────────────────────────────────────────── +banner() { + local role="${1:-Agent}" + echo "============================================" + echo " ${role}-Agent 启动器" + echo "============================================" + echo "" +} + +# ── Launch agent in selected mode ────────────────────────────────────────────── +# Usage: launch_agent +# +# agent-name is the persona name (e.g. "Dev-Agent", "QE-Agent"). It is used to +# prefix prompts so the model adopts the correct identity. +# +# Mode 1 (single-shot): claude -p, runs once and exits. +# --dangerously-skip-permissions avoids blocking in non-interactive mode. +# The project .claude/settings.json already sets permissionMode: bypass. +# +# Mode 2 (interactive polling): claude --agent, opens Claude Code TUI. +# The agent file defines startup behavior (e.g. /loop 10m) and the +# user can observe or interact at any time. +launch_agent() { + local agent_file="$1" + local agent_name="$2" + local single_shot_task="$3" + local polling_instruction="${4:-}" + + echo "模式选择:" + echo " [1] 单次任务 — 检查 Issue 并处理,完成后自动退出 (automode)" + echo " [2] 互动轮询 — 进入 Claude Code 界面,每 10 分钟自动轮询" + echo "" + read -r -p "请输入 (1/2): " mode + echo "" + + case "$mode" in + 1) + echo "执行单次检查 (automode)..." + echo "" + cd "$PROJECT_DIR" + claude -p \ + --agent "$agent_file" \ + --dangerously-skip-permissions \ + "你是 ${agent_name}。${single_shot_task}" + ;; + 2) + echo "启动互动轮询模式..." + echo "${agent_name} 进入 Claude Code 界面后将自动开始轮询" + echo "你可以随时输入指令与 Agent 互动,按 Ctrl+C 停止" + echo "" + cd "$PROJECT_DIR" + claude --agent "$agent_file" \ + "你是 ${agent_name}。${polling_instruction}" + ;; + *) + echo "无效选择,请输入 1 或 2。" + exit 1 + ;; + esac +} diff --git a/scripts/start_dev_agent.bat b/scripts/start_dev_agent.bat index 2a0a7c1..f9dfbcb 100644 --- a/scripts/start_dev_agent.bat +++ b/scripts/start_dev_agent.bat @@ -1,50 +1,56 @@ @echo off chcp 65001 >nul -title Dev Agent - Gitea Issue Worker +title Dev-Agent - Gitea Issue Worker + +:: ── Change to project root ──────────────────────────────────────────────────── +cd /d "%~dp0.." + +:: ── Load .env (batch-compatible parser: "export KEY=VALUE" → set KEY=VALUE) ── +if exist "scripts\.env" ( + for /f "usebackq tokens=2,3 delims== " %%a in ("scripts\.env") do set %%a=%%b +) + +:: ── Defaults ────────────────────────────────────────────────────────────────── +if "%GITEA_URL%"=="" set GITEA_URL=http://localhost:3000 +if "%GITEA_REPO%"=="" set GITEA_REPO=pzhang_zywl/document_analyzer +if "%DEV_AGENT_ID%"=="" set DEV_AGENT_ID=da-01 + +:: ── Validate token ──────────────────────────────────────────────────────────── +if "%GITEA_API_TOKEN%"=="" ( + echo ERROR: GITEA_API_TOKEN is not set. + echo Set it in scripts\.env or in your environment. + pause + exit /b 1 +) echo ============================================ -echo Dev Agent 启动器 +echo Dev-Agent 启动器 echo ============================================ echo. - -set GITEA_API_TOKEN=59117246ec418d5d87042de073b0d4197d8054bf -set GITEA_URL=http://localhost:3000 -set GITEA_REPO=pzhang_zywl/document_analyzer - -cd /d C:\Users\peterz\projects\document_analyzer - echo 模式选择: -echo [1] 单次任务 - 检查一次 Issue 并处理 -echo [2] 持续轮询 - 每 10 分钟检查一次 (推荐) -echo [3] 交互模式 - 进入对话手动操作 +echo [1] 单次任务 - 检查 Issue 并处理,完成后退出 (automode^) +echo [2] 互动轮询 - 进入 Claude Code 界面,每 10 分钟轮询 echo. -set /p MODE="请输入 (1/2/3): " +set /p MODE="请输入 (1/2): " if "%MODE%"=="1" ( echo. - echo 正在执行单次检查... - claude -p --agent agents/DEV_AGENT.md "你是 Dev-Agent,检查 Gitea 所有打开的 Issue,跳过纯测试相关的,其他全部领取分析并修复,记得同步更新测试。" + echo 执行单次检查 (automode)... + claude -p --agent agents/DEV_AGENT.md --dangerously-skip-permissions "你是 Dev-Agent。执行一次 Issue 巡检(单次任务,不要用 /loop):1. agent_poller.py --action list 列出所有打开的 Issue 2. 跳过纯测试 3. 逐个走闭环:分析-开发-pytest-commit-push-create-pr-CI-merge-pr-通知QE 4. 退出。" pause - exit + exit /b 0 ) if "%MODE%"=="2" ( echo. - echo 启动持续轮询模式 (每 10 分钟)... + echo 启动互动轮询模式... + echo Dev-Agent 进入 Claude Code 界面后将自动每 10 分钟轮询 Gitea Issue echo 按 Ctrl+C 停止 - claude -p --agent agents/DEV_AGENT.md "你是 Dev-Agent,用 loop 模式每 10 分钟检查一次 Gitea 所有打开的 Issue,跳过纯测试相关的,其他全部领取处理。完成后评论进度,push 触发 CI。" + claude --agent agents/DEV_AGENT.md "你是 Dev-Agent。现在开始工作。使用 /loop 10m 每 10 分钟 python scripts/agent_poller.py --action list 检查 Issue,跳过纯测试,有则走完整闭环,无则报告 main healthy。保持对话开放。" pause - exit -) - -if "%MODE%"=="3" ( - echo. - echo 启动交互模式... - echo 进入后输入: 检查 Gitea Issues 并处理 - claude --agent agents/DEV_AGENT.md - pause - exit + exit /b 0 ) echo 无效选择。 pause +exit /b 1 diff --git a/scripts/start_dev_agent.sh b/scripts/start_dev_agent.sh index 3dc987b..403fc11 100644 --- a/scripts/start_dev_agent.sh +++ b/scripts/start_dev_agent.sh @@ -1,57 +1,26 @@ #!/usr/bin/env bash -# Dev-Agent 启动脚本 — 在 Git Bash 中运行 +# Dev-Agent 启动脚本 — 单次任务 + 互动轮询 两种模式 # 用法: bash scripts/start_dev_agent.sh +# 前置: 在 scripts/.env 中设置 GITEA_API_TOKEN -set -e +set -eu -# Source local secrets if available (not tracked by git) SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -if [ -f "$SCRIPT_DIR/.env" ]; then - source "$SCRIPT_DIR/.env" -fi +source "$SCRIPT_DIR/_common.sh" -# Load from environment or default values -export GITEA_API_TOKEN="${GITEA_API_TOKEN:-}" -export GITEA_URL="${GITEA_URL:-http://localhost:3000}" -export GITEA_REPO="${GITEA_REPO:-pzhang_zywl/document_analyzer}" -export DEV_AGENT_ID="da-$(date +%m%d-%H%M)" +# Agent 标识: da-MMDD-HHmm,可通过环境变量覆盖 +export DEV_AGENT_ID="${DEV_AGENT_ID:-da-$(date +%m%d-%H%M)}" -cd "$(dirname "$0")/.." +banner "Dev" +require_token -echo "============================================" -echo " Dev-Agent 启动器" -echo "============================================" -echo "" -echo "模式选择:" -echo " [1] 单次任务 - 检查一次 Issue 并处理" -echo " [2] 持续轮询 - 每 10 分钟检查一次 (推荐)" -echo " [3] 交互模式 - 进入对话手动操作" -echo "" -read -r -p "请输入 (1/2/3): " MODE - -case "$MODE" in - 1) - echo "" - echo "正在执行单次检查..." - claude -p --agent agents/DEV_AGENT.md \ - "你是 Dev-Agent。检查 Gitea 所有打开的 Issue(--action list),跳过纯测试相关的。对每个负责的 Issue,走完完整闭环:分析 → 分支 → 开发+UT → pytest → commit → push → create-pr → comment Issue → 等 CI → merge-pr → 关闭。" - ;; - 2) - echo "" - echo "启动持续轮询模式 (每 10 分钟)..." - echo "按 Ctrl+C 停止" - claude -p --agent agents/DEV_AGENT.md \ - "你是 Dev-Agent。用 loop 模式每 10 分钟检查一次 Gitea Issue(--action list)。跳过纯测试相关的。每个 Issue 走完整闭环:分析→开发→push→create-pr→comment→CI→merge-pr→close。每个步骤用 agent_poller.py 对应命令。" - ;; - 3) - echo "" - echo "启动交互模式..." - echo "进入后输入: 检查 Gitea Issues 并处理" - echo "可用命令速查: agent_poller.py --help" - claude --agent agents/DEV_AGENT.md - ;; - *) - echo "无效选择。" - exit 1 - ;; -esac +launch_agent \ + "agents/DEV_AGENT.md" \ + "Dev-Agent" \ + "执行一次 Issue 巡检(单次任务,不要用 /loop): +1. python scripts/agent_poller.py --action list 列出所有打开的 Issue +2. 跳过纯测试相关的 Issue +3. 对每个负责的 Issue 走完整闭环: + 分析 → 分支 → 开发+UT → pytest → commit → push → create-pr → comment → 等 CI → merge-pr → 通知 QE 验证 +4. 所有 Issue 处理完毕后报告汇总并退出。" \ + "现在开始工作。使用 /loop 10m 开启轮询:每 10 分钟 python scripts/agent_poller.py --action list 检查打开的 Issue,跳过纯测试相关的,有则走完整闭环,无则报告 main healthy。保持对话开放。" diff --git a/scripts/start_qe_agent.sh b/scripts/start_qe_agent.sh index a2659f4..b8abe44 100644 --- a/scripts/start_qe_agent.sh +++ b/scripts/start_qe_agent.sh @@ -1,55 +1,26 @@ #!/usr/bin/env bash -# QE-Agent 启动脚本 — 在 Git Bash 中运行 +# QE-Agent 启动脚本 — 单次任务 + 互动轮询 两种模式 # 用法: bash scripts/start_qe_agent.sh +# 前置: 在 scripts/.env 中设置 GITEA_API_TOKEN -set -e +set -eu -export GITEA_API_TOKEN="59117246ec418d5d87042de073b0d4197d8054bf" -export GITEA_URL="http://localhost:3000" -export GITEA_REPO="pzhang_zywl/document_analyzer" -export QE_AGENT_ID="qa-01" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +source "$SCRIPT_DIR/_common.sh" -cd "$(dirname "$0")/.." +# Agent 标识: qa-MMDD-HHmm,可通过环境变量覆盖 +export QE_AGENT_ID="${QE_AGENT_ID:-qa-$(date +%m%d-%H%M)}" -echo "============================================" -echo " QE-Agent 启动器" -echo "============================================" -echo "" -echo "模式选择:" -echo " [1] 单次任务 - 检查一次 test-dev Issue 并处理" -echo " [2] 持续轮询 - 每 10 分钟检查一次 (推荐)" -echo " [3] 交互模式 - 进入对话手动操作" -echo "" -read -r -p "请输入 (1/2/3): " MODE +banner "QE" +require_token -case "$MODE" in - 1) - echo "" - echo "正在执行单次检查..." - claude -p --agent agents/QE_AGENT.md \ - "你是 QE-Agent。检查 Gitea 上的 test-dev 和 acceptance-failure 标签 Issue(--action list --labels test-dev 和 --labels acceptance-failure)。对 test-dev Issue:分析内容 → 开发验收测试到 tests/acceptance/ → pytest 本地验证 → commit 'test: <描述> - Closes #N' → push → create-pr → comment Issue → 等 CI 通过 → merge-pr。对 acceptance-failure Issue:分析失败原因 → 如果是测试本身问题修复测试 → 如果是管道问题开 test-dev issue 跟踪。" - ;; - 2) - echo "" - echo "启动持续轮询模式 (每 10 分钟)..." - echo "按 Ctrl+C 停止" - claude -p --agent agents/QE_AGENT.md \ - "你是 QE-Agent。用 loop 模式每 10 分钟检查一次 Gitea 上的 test-dev 和 acceptance-failure 标签 Issue。对 test-dev Issue 走完整闭环:分析→开发验收测试→pytest验证→commit('test:' 前缀)→push→create-pr→comment→CI→merge-pr。对 acceptance-failure 分析失败原因→修复→push→PR。每个步骤用 agent_poller.py 对应命令。如果没有待处理 Issue,报告 '当前没有 QE 相关 Issue,main branch 质量正常'。" - ;; - 3) - echo "" - echo "启动交互模式 (默认 10 分钟轮询)..." - echo "按 Ctrl+C 停止" - echo "" - echo "可用命令速查:" - echo " agent_poller.py --action list --labels test-dev" - echo " agent_poller.py --action list --labels acceptance-failure" - echo " agent_poller.py --action get --issue " - echo " python -m pytest tests/acceptance/ -v --run-acceptance" - claude --agent agents/QE_AGENT.md - ;; - *) - echo "无效选择。" - exit 1 - ;; -esac +launch_agent \ + "agents/QE_AGENT.md" \ + "QE-Agent" \ + "执行一次 Issue 巡检(单次任务,不要用 /loop): +1. python scripts/agent_poller.py --action list --labels test-dev 检查 test-dev Issue +2. python scripts/agent_poller.py --action list --labels acceptance-failure 检查 acceptance-failure Issue +3. test-dev Issue:分析 → 开发验收测试到 tests/acceptance/ → pytest 本地验证 → commit('test:' 前缀, Closes #N) → push → create-pr → 等 CI → merge-pr +4. acceptance-failure Issue:分析失败原因 → 测试问题则修复测试 → 管道问题则开 test-dev issue 跟踪 +5. 所有 Issue 处理完毕后报告汇总并退出。" \ + "现在开始工作。使用 /loop 10m 开启轮询:每 10 分钟检查 test-dev 和 acceptance-failure 标签 Issue,有则走完整闭环(分析→开发测试→pytest→push→PR→CI→merge),无则报告 main healthy。保持对话开放。"