#!/usr/bin/env bats setup() { REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../" && pwd)" load "$REPO_ROOT/tests/test_helper/bats-support/load" load "$REPO_ROOT/tests/test_helper/bats-assert/load" SCRIPT="$(cd "$BATS_TEST_DIRNAME/../scripts" && pwd)/validate.sh" TMPDIR="$(mktemp -d)" # Helper: create an APM package root at (apm.yml with a top-level # type: line, marking it a real package manifest — not marketplace-only) # plus a single vendor-neutral agent file at # /.apm/agents/.agent.md. , if given, is # inserted as additional raw frontmatter lines (used to inject fields # under test). make_apm_agent() { local root="$1" local name="$2" local extra_frontmatter="${3:-}" mkdir -p "$root/.apm/agents" cat > "$root/apm.yml" < "$root/.apm/agents/${name}.agent.md" < "$root/.claude/agents/my-agent.md" < "$root/.github/agents/my-agent.agent.md" < "$fake_home/.claude/agents/my-agent.md" < "$fake_home/.copilot/agents/my-agent.agent.md" < "$root/apm.yml" < "$root/.apm/agents/my-agent.agent.md" < "$root/apm.yml" < "$root/.apm/agents/my-agent.agent.md" < "$root/apm.yml" < "$root/.apm/agents/my-agent.agent.md" < "$root/apm.yml" < "$root/.apm/agents/my-agent.agent.md" < "$root/apm.yml" < "$root/.apm/agents/my-agent.agent.md" < "$root/apm.yml" < "$root/.apm/agents/nested/apm.yml" < "$root/.apm/agents/nested/deeper/my-agent.agent.md" < "$root/apm.yml" < "$root/.claude/agents/my-agent.md" < "$root/.github/agents/my-agent.agent.md" < "$root/plugin.json" # 'hooks' is plugin-silently-ignored only at (old) plugin scope; at # project scope it's a legitimate CC field. If this directory were # mis-detected as plugin scope (old plugin.json-based logic), this would # FAIL with a plugin-silently-ignored-fields finding on 'hooks'. cat > "$root/.claude/agents/my-agent.md" < "$root/.github/agents/my-agent.agent.md" <