chore: agent 配置文件纳入版本管理 + docs/ 项目章程与全局状态 - Closes #37
CI / test (pull_request) Successful in 11s

- agents/DEV_AGENT.md: 新增启动读取 docs、Session 收尾流程、自行验证关闭 Issue
- agents/QE_AGENT.md: 新增启动读取 docs、Session 收尾流程
- docs/PROJECT_CHARTER.md: 项目章程(背景、愿景、目标、约束)
- docs/GLOBAL_STATE.md: 项目全局状态(架构、已知问题、变更日志)
- scripts/: 启动脚本重构,引入 _common.sh

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 13:57:42 +08:00
parent 4cf9f1d3e0
commit 3a3091d0df
8 changed files with 390 additions and 158 deletions
+89
View File
@@ -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-file> <agent-name> <single-shot-task> <polling-instruction>
#
# 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
}
+34 -28
View File
@@ -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
+18 -49
View File
@@ -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。保持对话开放。"
+19 -48
View File
@@ -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 相关 Issuemain 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 <N>"
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。保持对话开放。"