test: add run-tests.sh, fix stale tests for marketplace model

- Add tests/run-tests.sh: discovers and runs all test-*.sh (including
  plugin subdirs) and the bats suite; replaces per-script pre-push calls
- Add tests/run-tests.bats: TDD coverage for run-tests.sh behaviours
- Update setup-hooks.sh: pre-push block now calls run-tests.sh
- Fix test-install.sh: remove provider adapter symlink tests (adapter
  removed in marketplace migration), guard skills loops on dir existence
- Fix test-instructions-and-docs.sh: content index checks now point to
  core/AGENTS.md (where it lives), remove ard/bug dir assertions
- Fix test-setup-hooks.sh: assert pre-push hook calls run-tests.sh

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-25 19:47:20 +00:00
parent 93e3de4d02
commit 32cd2e3128
6 changed files with 207 additions and 112 deletions

View File

@@ -18,7 +18,6 @@ echo ""
echo "--- providers/claude-code/ → ~/.claude/ ---"
while IFS= read -r -d '' src; do
rel="${src#"$REPO_ROOT/providers/claude-code/"}"
# provider-manifest.sh is sourced by install.sh, not deployed to ~/.claude/
[[ "$rel" == "provider-manifest.sh" ]] && continue
dest="$TEMP_HOME/.claude/$rel"
if diff -q "$src" "$dest" > /dev/null 2>&1; then
@@ -57,56 +56,46 @@ echo "--- core/AGENTS.md → ~/.agents/AGENTS.md (0015) ---"
if diff -q "$REPO_ROOT/core/AGENTS.md" "$TEMP_HOME/.agents/AGENTS.md" > /dev/null 2>&1; then
pass "core/AGENTS.md deployed and matches source"
else
fail "~/.agents/AGENTS.md — missing or differs from source"
fail "\$HOME/.agents/AGENTS.md — missing or differs from source"
fi
echo ""
echo "--- skills deployed to ~/.agents/skills/ ---"
while IFS= read -r -d '' src_skill; do
skill_name="$(basename "$src_skill")"
dest_skill="$TEMP_HOME/.agents/skills/$skill_name"
if [[ -d "$dest_skill" ]]; then
pass "$skill_name deployed to ~/.agents/skills/"
else
fail "$skill_name missing from ~/.agents/skills/"
fi
done < <(find "$REPO_ROOT/.agents/skills" -mindepth 1 -maxdepth 1 -type d -print0)
if [[ -d "$REPO_ROOT/.agents/skills" ]]; then
echo ""
echo "--- skills deployed to ~/.agents/skills/ ---"
while IFS= read -r -d '' src_skill; do
skill_name="$(basename "$src_skill")"
dest_skill="$TEMP_HOME/.agents/skills/$skill_name"
if [[ -d "$dest_skill" ]]; then
pass "$skill_name deployed to ~/.agents/skills/"
else
fail "$skill_name missing from ~/.agents/skills/"
fi
done < <(find "$REPO_ROOT/.agents/skills" -mindepth 1 -maxdepth 1 -type d -print0)
echo ""
echo "--- skill files match source ---"
while IFS= read -r -d '' src; do
rel="${src#"$REPO_ROOT/.agents/skills/"}"
dest="$TEMP_HOME/.agents/skills/$rel"
if diff -q "$src" "$dest" > /dev/null 2>&1; then
pass "skills/$rel matches source"
else
fail "skills/$rel — missing or differs from source"
fi
done < <(find "$REPO_ROOT/.agents/skills" -type f -print0)
echo ""
echo "--- skill files match source ---"
while IFS= read -r -d '' src; do
rel="${src#"$REPO_ROOT/.agents/skills/"}"
dest="$TEMP_HOME/.agents/skills/$rel"
if diff -q "$src" "$dest" > /dev/null 2>&1; then
pass "skills/$rel matches source"
else
fail "skills/$rel — missing or differs from source"
fi
done < <(find "$REPO_ROOT/.agents/skills" -type f -print0)
echo ""
echo "--- provider adapter: ~/.claude/skills/ is a symlink to ~/.agents/skills/ ---"
adapter="$TEMP_HOME/.claude/skills"
skills_canonical="$TEMP_HOME/.agents/skills"
if [[ -L "$adapter" ]]; then
resolved="$(readlink "$adapter")"
if [[ "$resolved" == "$skills_canonical" ]]; then
pass "~/.claude/skills → ~/.agents/skills (correct target)"
else
fail "~/.claude/skills symlink points to wrong target: $resolved"
fi
else
fail "~/.claude/skills is not a symlink"
fi
echo ""
echo "--- skills correctly replaced on second install (no double-nesting) ---"
skill_name="$(basename "$(find "$REPO_ROOT/.agents/skills" -mindepth 1 -maxdepth 1 -type d | head -1)")"
nested="$TEMP_HOME/.agents/skills/$skill_name/$skill_name"
if [[ -d "$nested" ]]; then
fail "$skill_name/$skill_name exists — skill was nested instead of replaced"
else
pass "$skill_name not double-nested after second install"
echo ""
echo "--- skills correctly replaced on second install (no double-nesting) ---"
first_skill="$(find "$REPO_ROOT/.agents/skills" -mindepth 1 -maxdepth 1 -type d | head -1)"
if [[ -n "$first_skill" ]]; then
skill_name="$(basename "$first_skill")"
nested="$TEMP_HOME/.agents/skills/$skill_name/$skill_name"
if [[ -d "$nested" ]]; then
fail "$skill_name/$skill_name exists — skill was nested instead of replaced"
else
pass "$skill_name not double-nested after second install"
fi
fi
fi
echo ""
@@ -123,57 +112,36 @@ else
fail "pre-existing user skill was wiped by install"
fi
echo ""
echo "--- warning emitted when adapter target is a real directory ---"
TEMP_HOME3="$(mktemp -d)"
trap 'rm -rf "$TEMP_HOME3"' EXIT
mkdir -p "$TEMP_HOME3/.claude/skills/some-user-skill"
output="$(HOME="$TEMP_HOME3" bash "$REPO_ROOT/scripts/install.sh" 2>&1)"
if echo "$output" | grep -q "Warning"; then
pass "warning emitted when ~/.claude/skills exists as real directory"
else
fail "no warning when ~/.claude/skills is a real directory"
fi
if [[ -d "$TEMP_HOME3/.claude/skills/some-user-skill" ]]; then
pass "real directory left intact when warning emitted"
else
fail "real directory was destroyed despite warning"
fi
echo ""
echo "--- idempotency: second run state is correct ---"
HOME="$TEMP_HOME" bash "$REPO_ROOT/scripts/install.sh" > /dev/null 2>&1 \
&& pass "second run exits zero" \
|| fail "second run failed"
# skill files still match source after second run
while IFS= read -r -d '' src; do
rel="${src#"$REPO_ROOT/.agents/skills/"}"
dest="$TEMP_HOME/.agents/skills/$rel"
if diff -q "$src" "$dest" > /dev/null 2>&1; then
pass "idempotent: skills/$rel correct after second install"
else
fail "idempotent: skills/$rel corrupted after second install"
fi
done < <(find "$REPO_ROOT/.agents/skills" -type f -print0)
# no double-nesting after second run
while IFS= read -r -d '' skill_dir; do
skill_name="$(basename "$skill_dir")"
nested="$TEMP_HOME/.agents/skills/$skill_name/$skill_name"
if [[ -d "$nested" ]]; then
fail "idempotent: $skill_name double-nested after second install"
else
pass "idempotent: $skill_name not double-nested after second install"
fi
done < <(find "$REPO_ROOT/.agents/skills" -mindepth 1 -maxdepth 1 -type d -print0)
# symlink still correct after second run
adapter="$TEMP_HOME/.claude/skills"
if [[ -L "$adapter" ]] && [[ "$(readlink "$adapter")" == "$TEMP_HOME/.agents/skills" ]]; then
pass "idempotent: ~/.claude/skills symlink intact after second install"
if HOME="$TEMP_HOME" bash "$REPO_ROOT/scripts/install.sh" > /dev/null 2>&1; then
pass "second run exits zero"
else
fail "idempotent: ~/.claude/skills symlink broken after second install"
fail "second run failed"
fi
if [[ -d "$REPO_ROOT/.agents/skills" ]]; then
# skill files still match source after second run
while IFS= read -r -d '' src; do
rel="${src#"$REPO_ROOT/.agents/skills/"}"
dest="$TEMP_HOME/.agents/skills/$rel"
if diff -q "$src" "$dest" > /dev/null 2>&1; then
pass "idempotent: skills/$rel correct after second install"
else
fail "idempotent: skills/$rel corrupted after second install"
fi
done < <(find "$REPO_ROOT/.agents/skills" -type f -print0)
# no double-nesting after second run
while IFS= read -r -d '' skill_dir; do
skill_name="$(basename "$skill_dir")"
nested="$TEMP_HOME/.agents/skills/$skill_name/$skill_name"
if [[ -d "$nested" ]]; then
fail "idempotent: $skill_name double-nested after second install"
else
pass "idempotent: $skill_name not double-nested after second install"
fi
done < <(find "$REPO_ROOT/.agents/skills" -mindepth 1 -maxdepth 1 -type d -print0)
fi
# AGENTS.md still correct after second run