#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" INSTALL_SCRIPT="$REPO_ROOT/install.sh" TMP_ROOT="" fail() { echo "FAIL: $*" >&2 exit 1 } assert_file_contains() { local file="$1" local expected="$2" grep -F "$expected" "$file" >/dev/null || fail "expected '$expected' in $file" } assert_output_contains() { local output="$1" local expected="$2" [[ "$output" == *"$expected"* ]] || fail "expected output to contain '$expected'" } assert_equals() { local actual="$1" local expected="$2" [[ "$actual" == "$expected" ]] || fail "expected '$expected', got '$actual'" } make_upstream_repo() { local dir="$1" local version="$2" mkdir -p "$dir/.codex/skills/demo" "$dir/.claude/skills/demo" cat >"$dir/.codex/skills/demo/SKILL.md" <"$dir/.claude/skills/demo/SKILL.md" <"$dir/AGENTS.md.template" <"$dir/CLAUDE.md.template" <"$wrapper_dir/git" <"$TMP_ROOT/project-codex/AGENTS.md" guide_before="$(cat "$TMP_ROOT/project-codex/AGENTS.md")" ( cd "$UPSTREAM_REPO" printf '# demo codex v2\n' > .codex/skills/demo/SKILL.md printf '# AGENTS template v2\n' > AGENTS.md.template git add .codex/skills/demo/SKILL.md AGENTS.md.template git commit -qm "upstream v2" ) output="$(run_install "$TMP_ROOT/project-codex" codex)" assert_equals "$(cat "$TMP_ROOT/project-codex/AGENTS.md")" "$guide_before" [[ ! -f "$TMP_ROOT/project-codex/AGENTS.md.local.bak" ]] || fail "AGENTS.md.local.bak should not exist" assert_output_contains "$output" "跳过项目引导" assert_file_contains "$TMP_ROOT/project-codex/.codex/skills/demo/SKILL.md" "demo codex v2" [[ -f "$TMP_ROOT/project-codex/.codex/skills/demo/SKILL.md.local.bak" ]] || fail "skill backup should exist" mkdir -p "$TMP_ROOT/project-claude" output="$(run_install "$TMP_ROOT/project-claude" claude)" assert_file_contains "$TMP_ROOT/project-claude/.claude/skills/demo/SKILL.md" "demo claude v1" assert_file_contains "$TMP_ROOT/project-claude/CLAUDE.md" "CLAUDE template v1" printf 'custom claude\n' >"$TMP_ROOT/project-claude/CLAUDE.md" ( cd "$UPSTREAM_REPO" printf '# demo claude v2\n' > .claude/skills/demo/SKILL.md printf '# CLAUDE template v2\n' > CLAUDE.md.template git add .claude/skills/demo/SKILL.md CLAUDE.md.template git commit -qm "upstream claude v2" ) output="$(run_install "$TMP_ROOT/project-claude" claude)" assert_equals "$(cat "$TMP_ROOT/project-claude/CLAUDE.md")" "custom claude" [[ ! -f "$TMP_ROOT/project-claude/CLAUDE.md.local.bak" ]] || fail "CLAUDE.md.local.bak should not exist" assert_output_contains "$output" "跳过项目引导" assert_file_contains "$TMP_ROOT/project-claude/.claude/skills/demo/SKILL.md" "demo claude v2" mkdir -p "$TMP_ROOT/project-both" printf 'team agents\n' >"$TMP_ROOT/project-both/AGENTS.md" printf 'team claude\n' >"$TMP_ROOT/project-both/CLAUDE.md" output="$(run_install "$TMP_ROOT/project-both" both)" assert_equals "$(cat "$TMP_ROOT/project-both/AGENTS.md")" "team agents" assert_equals "$(cat "$TMP_ROOT/project-both/CLAUDE.md")" "team claude" assert_file_contains "$TMP_ROOT/project-both/.codex/skills/demo/SKILL.md" "demo codex v2" assert_file_contains "$TMP_ROOT/project-both/.claude/skills/demo/SKILL.md" "demo claude v2" assert_output_contains "$output" "跳过项目引导: AGENTS.md" assert_output_contains "$output" "跳过项目引导: CLAUDE.md" echo "PASS" } main "$@"