test: 统一 Agent Issue 轮询 label 体系与创建规则 - Closes #40
CI / test (pull_request) Successful in 8s

- test-dev → test-code:QE-Agent 一致化 label
- Dev-Agent 新增 product-code label + [product] 前缀规则
- agent_poller.py 新增 create-issue action
- QE/Dev Agent 轮询改为多轮递进:label → title 前缀 → 无标识分析

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 14:16:51 +08:00
parent dca0322647
commit ae0ff5d4de
5 changed files with 331 additions and 25 deletions
+31 -3
View File
@@ -2,9 +2,10 @@
Usage:
python scripts/agent_poller.py --action list
python scripts/agent_poller.py --action list --labels test-dev
python scripts/agent_poller.py --action list --labels test-code
python scripts/agent_poller.py --action get --issue 1
python scripts/agent_poller.py --action comment --issue 1 --body "Working on this"
python scripts/agent_poller.py --action create-issue --title "My issue" --labels test-code --body "..."
python scripts/agent_poller.py --action create-pr --issue 1 --branch test/issue-1
python scripts/agent_poller.py --action pr-status --pr 4
python scripts/agent_poller.py --action merge-pr --pr 4
@@ -98,6 +99,27 @@ def close_issue(num, body=None):
return i
def create_issue(title, body=None, labels=None):
"""Create a new Gitea issue.
Labels convention (per project rules):
- Product/feature issues → product-code
- Test code issues → test-code
"""
payload = {"title": title}
if body:
payload["body"] = body + AGENT_SIG
if labels:
payload["labels"] = [l.strip() for l in labels.split(",") if l.strip()]
i = _req("POST", "/issues", payload)
issue_labels = [l["name"] for l in i.get("labels", [])]
print(f"Issue #{i['number']} created: {i['title']}")
if issue_labels:
print(f"Labels: {', '.join(issue_labels)}")
print(f"URL: {i.get('html_url', i.get('url', ''))}")
return i
# ── PR operations ────────────────────────────────────────────────────────────
def create_pr(issue_num, branch, body=None):
@@ -212,12 +234,13 @@ def main():
parser = argparse.ArgumentParser(description="Dev agent Gitea helper")
parser.add_argument("--action", required=True,
choices=["list", "get", "comment", "close-issue",
"create-pr", "pr-status", "merge-pr", "lifecycle"])
"create-issue", "create-pr", "pr-status", "merge-pr", "lifecycle"])
parser.add_argument("--issue", type=int)
parser.add_argument("--pr", type=int)
parser.add_argument("--title", help="Issue title (for 'create-issue' action)")
parser.add_argument("--branch")
parser.add_argument("--body")
parser.add_argument("--labels", help="Comma-separated labels to filter issues (for 'list' action)")
parser.add_argument("--labels", help="Comma-separated labels (filter for 'list', assign for 'create-issue')")
args = parser.parse_args()
if not GITEA_TOKEN:
@@ -243,6 +266,11 @@ def main():
print("--issue is required for 'close-issue' action", file=sys.stderr)
sys.exit(1)
close_issue(args.issue, args.body)
elif args.action == "create-issue":
if not args.title:
print("--title is required for 'create-issue' action", file=sys.stderr)
sys.exit(1)
create_issue(args.title, args.body, args.labels)
elif args.action == "create-pr":
if not args.issue or not args.branch:
print("--issue and --branch are required for 'create-pr' action", file=sys.stderr)
+4 -4
View File
@@ -18,9 +18,9 @@ launch_agent \
"agents/QE_AGENT.md" \
"QE-Agent" \
"执行一次 Issue 巡检(单次任务,不要用 /loop):
1. python scripts/agent_poller.py --action list --labels test-dev 检查 test-dev Issue
1. python scripts/agent_poller.py --action list --labels test-code 检查 test-code 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 跟踪
3. test-code Issue:分析 → 开发验收测试到 tests/acceptance/ → pytest 本地验证 → commit('test:' 前缀, Closes #N) → push → create-pr → 等 CI → merge-pr
4. acceptance-failure Issue:分析失败原因 → 测试问题则修复测试 → 管道问题则开 test-code issue 跟踪
5. 所有 Issue 处理完毕后报告汇总并退出。" \
"现在开始工作。使用 /loop 10m 开启轮询:每 10 分钟检查 test-dev 和 acceptance-failure 标签 Issue,有则走完整闭环(分析→开发测试→pytest→push→PR→CI→merge),无则报告 main healthy。保持对话开放。"
"现在开始工作。使用 /loop 10m 开启轮询:每 10 分钟检查 test-code 和 acceptance-failure 标签 Issue,有则走完整闭环(分析→开发测试→pytest→push→PR→CI→merge),无则报告 main healthy。保持对话开放。"