Files
document_analyzer/scripts/_common.sh
pzhang_zywl 77831d5a68
CI / test (pull_request) Successful in 25s
fix: 将 agent 定义移至 .claude/agents/ 实现 session 自动加载 - Closes #108
1. 创建 .claude/agents/dev-agent.md / qe-agent.md — agent 定义文件
2. _common.sh: launch_agent 改为接收绝对路径的 agent 定义文件
3. start_dev_agent.sh / start_qe_agent.sh: 传递 .claude/agents/ 下的文件路径

Claude Code 启动时通过 --agent .claude/agents/<name>.md 自动加载
frontmatter + body 作为系统指令。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 11:33:13 +08:00

130 lines
5.2 KiB
Bash

#!/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)"
_MAIN_REPO_DIR="$(cd "$_COMMON_DIR/.." && pwd)"
PROJECT_DIR="${PROJECT_DIR:-$_MAIN_REPO_DIR}"
# ── Load Gitea configuration ────────────────────────────────────────────────────
# Primary: ~/.gitea/config.yaml (requires GITEA_USER)
# Fallback: scripts/.env (backwards compat)
if ! eval "$(python "$_COMMON_DIR/_get_gitea_config.py" 2>/dev/null)"; then
# Fallback: source .env directly
if [ -f "$_COMMON_DIR/.env" ]; then
source "$_COMMON_DIR/.env"
fi
fi
# ── Worktree isolation ─────────────────────────────────────────────────────────
GITEA_WORKTREE_DIR="${GITEA_WORKTREE_DIR:-$HOME/.gitea/worktrees}"
setup_worktree() {
local user="$1"
local worktree="$GITEA_WORKTREE_DIR/$user"
# Already inside a worktree we created — reuse it.
if [ -f "$worktree/.gitea-worktree" ]; then
echo "Using existing worktree: $worktree"
PROJECT_DIR="$worktree"
cd "$PROJECT_DIR"
return 0
fi
local branch="agent/${user}/$(date +%Y%m%d-%H%M%S)"
echo "Creating worktree: $worktree (branch: $branch)"
mkdir -p "$GITEA_WORKTREE_DIR"
git -C "$_MAIN_REPO_DIR" worktree add -b "$branch" "$worktree" origin/main
touch "$worktree/.gitea-worktree"
PROJECT_DIR="$worktree"
cd "$PROJECT_DIR"
}
cleanup_worktree() {
local user="$1"
local worktree="$GITEA_WORKTREE_DIR/$user"
if [ -d "$worktree" ]; then
rm -f "$worktree/.gitea-worktree"
echo "Cleaning up worktree: $worktree"
git -C "$_MAIN_REPO_DIR" worktree remove "$worktree" 2>/dev/null || true
rm -rf "$worktree" 2>/dev/null || true
fi
}
# ── Validate required environment ──────────────────────────────────────────────
require_token() {
if [ -z "${GITEA_API_TOKEN:-}" ]; then
echo "ERROR: GITEA_API_TOKEN is not set." >&2
echo "Set it in ~/.gitea/config.yaml (with GITEA_USER) or scripts/.env." >&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> <agent-file> <display-name> <single-shot-task> <polling-instruction>
#
# agent-name is the agent config name (e.g. "dev-agent", "qe-agent") used with
# --agent flag. The agent file lives in .claude/agents/<agent-name>.md (with
# frontmatter + body loaded as system prompt at session start).
#
# display-name is the persona name (e.g. "Dev-Agent", "QE-Agent") 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.
#
# Mode 2 (interactive polling): claude --agent, opens Claude Code TUI.
# The agent config is loaded from .claude/agents/<agent-name>.md,
# its body becomes the system prompt.
launch_agent() {
local agent_name="$1"
local agent_file="$2"
local display_name="$3"
local single_shot_task="$4"
local polling_instruction="${5:-}"
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 \
"你是 ${display_name}${single_shot_task}"
;;
2)
echo "启动互动轮询模式..."
echo "${display_name} 进入 Claude Code 界面后将自动开始轮询"
echo "你可以随时输入指令与 Agent 互动,按 Ctrl+C 停止"
echo ""
cd "$PROJECT_DIR"
claude --agent "$agent_file" \
"你是 ${display_name}${polling_instruction}"
;;
*)
echo "无效选择,请输入 1 或 2。"
exit 1
;;
esac
}