fix: preserve existing agent guide files during install
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
#!/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" <<EOF
|
||||
# demo codex $version
|
||||
EOF
|
||||
|
||||
cat >"$dir/.claude/skills/demo/SKILL.md" <<EOF
|
||||
# demo claude $version
|
||||
EOF
|
||||
|
||||
cat >"$dir/AGENTS.md.template" <<EOF
|
||||
# AGENTS template $version
|
||||
EOF
|
||||
|
||||
cat >"$dir/CLAUDE.md.template" <<EOF
|
||||
# CLAUDE template $version
|
||||
EOF
|
||||
|
||||
(
|
||||
cd "$dir"
|
||||
git init -q
|
||||
git config user.name "Test User"
|
||||
git config user.email "test@example.com"
|
||||
git add .
|
||||
git commit -qm "upstream $version"
|
||||
)
|
||||
}
|
||||
|
||||
make_git_wrapper() {
|
||||
local wrapper_dir="$1"
|
||||
local real_git="$2"
|
||||
|
||||
mkdir -p "$wrapper_dir"
|
||||
|
||||
cat >"$wrapper_dir/git" <<EOF
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [[ "\${1:-}" == "clone" ]]; then
|
||||
dst="\${@: -1}"
|
||||
exec "$real_git" clone --quiet "\$FAKE_UPSTREAM_REPO" "\$dst"
|
||||
fi
|
||||
|
||||
exec "$real_git" "\$@"
|
||||
EOF
|
||||
|
||||
chmod +x "$wrapper_dir/git"
|
||||
}
|
||||
|
||||
run_install() {
|
||||
local target_dir="$1"
|
||||
local mode="$2"
|
||||
(
|
||||
cd "$target_dir"
|
||||
PATH="$GIT_WRAPPER_DIR:$PATH" FAKE_UPSTREAM_REPO="$UPSTREAM_REPO" bash "$INSTALL_SCRIPT" "$mode"
|
||||
)
|
||||
}
|
||||
|
||||
main() {
|
||||
local output
|
||||
local guide_before
|
||||
|
||||
TMP_ROOT="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP_ROOT"' EXIT
|
||||
|
||||
UPSTREAM_REPO="$TMP_ROOT/upstream"
|
||||
GIT_WRAPPER_DIR="$TMP_ROOT/bin"
|
||||
export UPSTREAM_REPO GIT_WRAPPER_DIR
|
||||
|
||||
make_upstream_repo "$UPSTREAM_REPO" "v1"
|
||||
make_git_wrapper "$GIT_WRAPPER_DIR" "$(command -v git)"
|
||||
|
||||
mkdir -p "$TMP_ROOT/project-codex"
|
||||
output="$(run_install "$TMP_ROOT/project-codex" codex)"
|
||||
assert_file_contains "$TMP_ROOT/project-codex/.codex/skills/demo/SKILL.md" "demo codex v1"
|
||||
assert_file_contains "$TMP_ROOT/project-codex/AGENTS.md" "AGENTS template v1"
|
||||
|
||||
printf 'custom agents\n' >"$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 "$@"
|
||||
Reference in New Issue
Block a user