#!/usr/bin/env bats # make install must link the runtime-neutral agent entry file (AGENTS.md) # into CODEX_DIR so Codex-style harnesses bootstrap from the same # protocols/rules/skills the Claude side reads. The thin-pointer shape and # the decision trail live in docs/design/2026-07-13-runtime-portability- # inventories.org and the generic-agent-runtime task. setup() { REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../.." && pwd)" TMPHOME="$(mktemp -d)" } teardown() { rm -rf "$TMPHOME" } run_install() { make -C "$REPO_ROOT" install \ SKILLS_DIR="$TMPHOME/skills" \ RULES_DIR="$TMPHOME/rules" \ HOOKS_DIR="$TMPHOME/hooks" \ CLAUDE_DIR="$TMPHOME/claude" \ CODEX_DIR="$TMPHOME/codex" \ LOCAL_BIN="$TMPHOME/bin" } @test "install links AGENTS.md into CODEX_DIR" { run run_install [ "$status" -eq 0 ] [ -L "$TMPHOME/codex/AGENTS.md" ] grep -q "protocols.org" "$TMPHOME/codex/AGENTS.md" } @test "install is idempotent on the agent entry (second run skips)" { run run_install [ "$status" -eq 0 ] run run_install [ "$status" -eq 0 ] [[ "$output" == *"skip AGENTS.md (already linked)"* ]] [ -L "$TMPHOME/codex/AGENTS.md" ] } @test "install warns on a non-symlink AGENTS.md collision and leaves it alone" { mkdir -p "$TMPHOME/codex" echo "hand-written entry" > "$TMPHOME/codex/AGENTS.md" run run_install [ "$status" -eq 0 ] [[ "$output" == *"WARN AGENTS.md exists and is not a symlink"* ]] [ ! -L "$TMPHOME/codex/AGENTS.md" ] grep -q "hand-written entry" "$TMPHOME/codex/AGENTS.md" }