ai-battle 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/ai-battle.sh +115 -42
  2. package/package.json +1 -1
package/ai-battle.sh CHANGED
@@ -22,8 +22,9 @@ if [ -f ".env" ]; then
22
22
  set +a
23
23
  fi
24
24
 
25
- # ======================== 版本 ========================
26
- VERSION="0.1.0"
25
+ # ======================== 版本(从 package.json 读取) ========================
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
+ VERSION=$(node -p "require('${SCRIPT_DIR}/package.json').version" 2>/dev/null || echo "0.0.0")
27
28
 
28
29
  # ======================== 颜色 ========================
29
30
  BLUE='\033[1;34m'
@@ -37,13 +38,17 @@ NC='\033[0m'
37
38
  # ======================== 默认配置 ========================
38
39
  DEFAULT_AGENTS="claude,codex"
39
40
  DEFAULT_MAX_ROUNDS=10
41
+
42
+ # 工作目录:所有程序产物放入 .ai-battle/,最终总结输出到运行目录
43
+ WORK_DIR=".ai-battle"
40
44
  PROBLEM_FILE="problem.md"
41
- ROUNDS_DIR="rounds"
42
- CONSENSUS_FILE="consensus.md"
43
- LOG_FILE=".debate.log"
44
- CONFIG_FILE=".debate.json"
45
+ ROUNDS_DIR="${WORK_DIR}/rounds"
46
+ CONSENSUS_FILE="${WORK_DIR}/consensus.md"
47
+ LOG_FILE="${WORK_DIR}/battle.log"
48
+ CONFIG_FILE="${WORK_DIR}/config.json"
45
49
  REFEREE_PROMPT_FILE="referee.md"
46
- SESSIONS_DIR=".sessions"
50
+ SESSIONS_DIR="${WORK_DIR}/sessions"
51
+ AGENTS_DIR="${WORK_DIR}/agents"
47
52
 
48
53
  # ======================== Codex 配置 ========================
49
54
  CODEX_MODEL="${CODEX_MODEL:-gpt-5.3-codex}"
@@ -536,6 +541,7 @@ agent_color() {
536
541
  }
537
542
 
538
543
  # Agent 指令文件名映射(支持实例名,如 claude_1 → CLAUDE_1.md)
544
+ # 输出到 AGENTS_DIR 目录中
539
545
  agent_md_file() {
540
546
  local base
541
547
  base=$(agent_base "$1")
@@ -543,12 +549,14 @@ agent_md_file() {
543
549
  if [ "$1" != "$base" ]; then
544
550
  suffix="_${1##*_}" # 提取 _N 后缀
545
551
  fi
552
+ local filename
546
553
  case "$base" in
547
- claude) echo "CLAUDE${suffix}.md" ;;
548
- codex) echo "AGENTS${suffix}.md" ;;
549
- gemini) echo "GEMINI${suffix}.md" ;;
550
- *) echo "${1^^}.md" ;;
554
+ claude) filename="CLAUDE${suffix}.md" ;;
555
+ codex) filename="AGENTS${suffix}.md" ;;
556
+ gemini) filename="GEMINI${suffix}.md" ;;
557
+ *) filename="${1^^}.md" ;;
551
558
  esac
559
+ echo "${AGENTS_DIR}/${filename}"
552
560
  }
553
561
 
554
562
  # 上帝视角: 等待用户输入补充信息
@@ -808,15 +816,24 @@ cmd_run() {
808
816
  echo -e "${CYAN}📋 已加载裁判提示词: ${REFEREE_PROMPT_FILE}${NC}"
809
817
  else
810
818
  echo -e "${YELLOW}⚠️ 未找到裁判提示词文件: ${REFEREE_PROMPT_FILE}${NC}"
811
- echo -e " 你可以创建该文件来自定义裁判的行为,例如:"
812
- echo -e " ${CYAN}echo '重点关注架构设计的可行性和成本' > ${REFEREE_PROMPT_FILE}${NC}"
819
+ echo -e " 你可以创建该文件来自定义裁判的行为"
813
820
  echo ""
814
- echo -ne "${BOLD}是否跳过,使用默认裁判提示词?[Y/n]: ${NC}"
821
+ echo -ne "${BOLD}选择操作: [1] 编辑裁判提示词 [2] 跳过使用默认 [3] 取消: ${NC}"
815
822
  local ref_choice
816
823
  read -er ref_choice
817
824
  case "$ref_choice" in
818
- n|N|no|NO)
819
- echo -e "${CYAN}请创建 ${REFEREE_PROMPT_FILE} 后重新运行。${NC}"
825
+ 1)
826
+ mkdir -p "$WORK_DIR"
827
+ ${EDITOR:-vim} "$REFEREE_PROMPT_FILE"
828
+ if [ -f "$REFEREE_PROMPT_FILE" ] && [ -s "$REFEREE_PROMPT_FILE" ]; then
829
+ referee_custom_prompt=$(cat "$REFEREE_PROMPT_FILE")
830
+ echo -e "${CYAN}📋 裁判提示词已保存${NC}"
831
+ else
832
+ echo -e "${CYAN}裁判提示词为空,使用默认。${NC}"
833
+ fi
834
+ ;;
835
+ 3|n|N)
836
+ echo -e "${CYAN}已取消。${NC}"
820
837
  exit 0
821
838
  ;;
822
839
  *)
@@ -871,7 +888,7 @@ cmd_run() {
871
888
  case "$choice" in
872
889
  1)
873
890
  echo -e "${CYAN}清理历史记录...${NC}"
874
- rm -rf "$ROUNDS_DIR" "$SESSIONS_DIR" "$CONFIG_FILE" "$CONSENSUS_FILE" "$LOG_FILE" SUMMARY.md
891
+ rm -rf "$WORK_DIR" SUMMARY.md
875
892
  ;;
876
893
  2)
877
894
  # 仅当有完整配置时 2=继续,否则 2=取消
@@ -893,12 +910,16 @@ cmd_run() {
893
910
  echo ""
894
911
  fi
895
912
 
896
- # 检查 problem.md
913
+ # 检查 problem.md,不存在则自动用编辑器创建
914
+ mkdir -p "$WORK_DIR"
915
+
897
916
  if [ ! -f "$PROBLEM_FILE" ]; then
898
- echo -e "${RED} 当前目录缺少 $PROBLEM_FILE${NC}"
899
- echo -e "${CYAN}请先创建讨论问题:${NC}"
900
- echo -e " echo \"你的问题\" > $PROBLEM_FILE"
901
- exit 1
917
+ echo -e "${CYAN}📝 首次运行,请编辑讨论问题...${NC}"
918
+ ${EDITOR:-vim} "$PROBLEM_FILE"
919
+ if [ ! -s "$PROBLEM_FILE" ]; then
920
+ echo -e "${RED}❌ 问题文件为空,已取消${NC}"
921
+ exit 1
922
+ fi
902
923
  fi
903
924
 
904
925
  if [ ! -s "$PROBLEM_FILE" ]; then
@@ -1042,8 +1063,7 @@ cmd_run() {
1042
1063
  fi
1043
1064
 
1044
1065
  # 创建 rounds 目录
1045
- mkdir -p "$ROUNDS_DIR"
1046
- mkdir -p "$SESSIONS_DIR"
1066
+ mkdir -p "$ROUNDS_DIR" "$SESSIONS_DIR" "$AGENTS_DIR"
1047
1067
 
1048
1068
  # 动态生成各 Agent 的指令文件(新建和恢复模式都需要更新)
1049
1069
  for agent in "${available_agents[@]}"; do
@@ -1061,8 +1081,7 @@ cmd_run() {
1061
1081
  # 初始化 git(codex 需要)
1062
1082
  if [ ! -d ".git" ]; then
1063
1083
  git init -q
1064
- echo ".debate.log" >> .gitignore 2>/dev/null || true
1065
- echo ".debate.json" >> .gitignore 2>/dev/null || true
1084
+ echo ".ai-battle/" >> .gitignore 2>/dev/null || true
1066
1085
  git add -A 2>/dev/null || true
1067
1086
  git commit -q -m "ai-battle: init" 2>/dev/null || true
1068
1087
  fi
@@ -1251,7 +1270,61 @@ $problem" "round_1_${agent}")
1251
1270
  exit 0
1252
1271
  fi
1253
1272
 
1254
- # 上帝视角: Round 1 后注入
1273
+ # 裁判总结: Round 1 结束后,调用裁判对各方初始观点进行总结
1274
+ if $referee_mode; then
1275
+ log_and_print ""
1276
+ log_and_print "${BOLD}\033[1;37m━━━ 🔨 裁判总结 [Round 1/${max_rounds}] ━━━${NC}"
1277
+ log_and_print "${CYAN}⏳ 裁判分析中...${NC}"
1278
+
1279
+ # 构建所有 agent 回复的汇总
1280
+ local all_responses_r1=""
1281
+ for ((ri=0; ri<agent_count; ri++)); do
1282
+ local ra="${available_agents[$ri]}"
1283
+ all_responses_r1+="<${ra}_response>
1284
+ ${responses[$ri]}
1285
+ </${ra}_response>
1286
+
1287
+ "
1288
+ done
1289
+
1290
+ # 根据模式选择裁判 prompt
1291
+ local ref_prompt_r1
1292
+ if $god_mode; then
1293
+ ref_prompt_r1=$(build_referee_god_prompt)
1294
+ else
1295
+ ref_prompt_r1=$(build_referee_free_prompt)
1296
+ fi
1297
+ # 追加自定义裁判提示词
1298
+ if [ -n "$referee_custom_prompt" ]; then
1299
+ ref_prompt_r1+=$'\n\n[额外指示]\n'"$referee_custom_prompt"
1300
+ fi
1301
+
1302
+ local referee_result_r1
1303
+ referee_result_r1=$(call_referee "$referee_base" "$ref_prompt_r1" "以下是 Round 1 各参与者的回复:
1304
+
1305
+ ${all_responses_r1}请进行裁判总结。" "referee_round_1")
1306
+
1307
+ # 保存裁判结果
1308
+ echo "$referee_result_r1" > "$ROUNDS_DIR/referee_round_1.md"
1309
+ log_and_print "${BOLD}\033[1;37m${referee_result_r1}${NC}"
1310
+
1311
+ # 自由辩论模式: 裁判检测共识
1312
+ if ! $god_mode; then
1313
+ if echo "$referee_result_r1" | grep -qiE 'CONSENSUS:[[:space:]]*YES'; then
1314
+ local ref_conclusion_r1
1315
+ ref_conclusion_r1=$(echo "$referee_result_r1" | grep -ioE '\*{0,2}AGREED:[[:space:]]*.*' | head -1 \
1316
+ | sed 's/^\*\{0,2\}[Aa][Gg][Rr][Ee][Ee][Dd]:[[:space:]]*//' | sed 's/[[:space:]]*$//' | sed 's/\*\{1,2\}$//')
1317
+ if [ -n "$ref_conclusion_r1" ]; then
1318
+ log_and_print "${CYAN}🔨 裁判判定: 已达成共识${NC}"
1319
+ finish_consensus "$ref_conclusion_r1" 1 "$max_rounds"
1320
+ generate_final_summary "$referee_base" "$referee_custom_prompt"
1321
+ exit 0
1322
+ fi
1323
+ fi
1324
+ fi
1325
+ fi
1326
+
1327
+ # 上帝视角: Round 1 后注入(裁判总结后再让 god 输入)
1255
1328
  if $god_mode; then
1256
1329
  god_context=$(god_input 1)
1257
1330
  fi
@@ -1657,8 +1730,8 @@ cmd_help() {
1657
1730
  检测共识、保存全部讨论记录。
1658
1731
 
1659
1732
  前置条件:
1660
- 1. 在当前目录创建 problem.md,写入讨论问题
1661
- 2. 确保参与讨论的 Agent CLI 工具已安装并可用
1733
+ 1. 确保参与讨论的 Agent CLI 工具已安装并可用
1734
+ 2. 首次运行会自动弹出编辑器创建讨论问题
1662
1735
 
1663
1736
  依赖: jq, bash 4+, (可选) claude, codex, gemini
1664
1737
 
@@ -1680,9 +1753,8 @@ cmd_help() {
1680
1753
  gemini 通过 Gemini CLI 调用 (需 gemini 命令)
1681
1754
 
1682
1755
  使用示例:
1683
- # 快速开始
1756
+ # 快速开始(首次运行会自动弹出编辑器输入问题)
1684
1757
  mkdir my-topic && cd my-topic
1685
- echo "微服务 vs 单体架构的优缺点?" > problem.md
1686
1758
  ai-battle --agents claude,gemini --rounds 8
1687
1759
 
1688
1760
  # 同类 Agent 自我辩论
@@ -1704,22 +1776,23 @@ cmd_help() {
1704
1776
  ai-battle --agents claude,codex --referee --god
1705
1777
 
1706
1778
  产出文件:
1707
- rounds/ 每轮讨论记录 (round_N_<agent>.md)
1708
- rounds/referee_*.md 裁判总结记录 (开启 --referee)
1709
- rounds/god_*.md 上帝视角注入记录 (开启 --god)
1710
- .sessions/ Agent CLI 原始输出记录 (stream-json/json/raw)
1711
- consensus.md 共识结论(如达成)
1712
- SUMMARY.md 最终总结 (裁判自动生成)
1713
- .debate.log 完整日志 (可用 tail -f 实时查看)
1779
+ .ai-battle/rounds/ 每轮讨论记录 (round_N_<agent>.md)
1780
+ .ai-battle/rounds/referee_*.md 裁判总结记录 (--referee)
1781
+ .ai-battle/rounds/god_*.md 上帝视角注入记录 (--god)
1782
+ .ai-battle/sessions/ Agent CLI 原始输出记录
1783
+ .ai-battle/consensus.md 共识结论(如达成)
1784
+ .ai-battle/battle.log 完整日志
1785
+ SUMMARY.md 最终总结 (裁判自动生成,输出到运行目录)
1786
+
1787
+ 用户文件 (运行目录):
1788
+ problem.md 讨论问题定义 (首次运行自动创建)
1789
+ referee.md 裁判自定义提示词 (--referee 时可选)
1790
+ .env 环境变量 (启动时自动加载)
1714
1791
 
1715
1792
  扩展 Agent:
1716
1793
  在脚本中实现 check_<name>()、call_<name>()、generate_<name>_md()
1717
1794
  然后调用 register_agent "<name>"
1718
1795
 
1719
- 配置文件:
1720
- .env 自动加载环境变量 (启动时)
1721
- referee.md 裁判自定义提示词 (开启 --referee 时)
1722
-
1723
1796
  环境变量:
1724
1797
  Claude:
1725
1798
  ANTHROPIC_BASE_URL API 地址
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-battle",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "让多个 AI Agent 对同一问题进行结构化圆桌讨论",
5
5
  "bin": {
6
6
  "ai-battle": "./ai-battle.sh"