chore: agent 配置文件纳入版本管理 + docs/ 项目章程与全局状态 - Closes #37
CI / test (pull_request) Successful in 11s
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:
@@ -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
@@ -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
@@ -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
@@ -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 <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。保持对话开放。"
|
||||
|
||||
Reference in New Issue
Block a user