79 lines
3.0 KiB
Bash
Executable File
79 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
TEST_ROOT="$(mktemp -d)"
|
|
trap 'rm -rf "$TEST_ROOT"' EXIT
|
|
|
|
FIXTURE_REPO="$TEST_ROOT/repo"
|
|
TEST_HOME="$TEST_ROOT/home"
|
|
mkdir -p "$FIXTURE_REPO/skills-dev/example-plugin/.claude-plugin"
|
|
mkdir -p "$FIXTURE_REPO/skills-dev/example-plugin/skills/references"
|
|
mkdir -p "$TEST_HOME"
|
|
cp "$PROJECT_DIR/install-skills.sh" "$FIXTURE_REPO/install-skills.sh"
|
|
|
|
write_manifest() {
|
|
local plugin="$1" name="$2" version="$3"
|
|
mkdir -p "$FIXTURE_REPO/skills-dev/${plugin}-plugin/.claude-plugin"
|
|
cat > "$FIXTURE_REPO/skills-dev/${plugin}-plugin/.claude-plugin/plugin.json" <<JSON
|
|
{"name":"${plugin}-plugin","version":"${version}","install_name":"${name}","install_type":"skill","dir_category":"dev"}
|
|
JSON
|
|
}
|
|
|
|
write_manifest example example 1.0.0
|
|
cat > "$FIXTURE_REPO/skills-dev/example-plugin/skills/SKILL.md" <<'EOF'
|
|
---
|
|
name: example
|
|
description: Installer fixture version one.
|
|
---
|
|
version one
|
|
EOF
|
|
printf 'reference one\n' > "$FIXTURE_REPO/skills-dev/example-plugin/skills/references/guide.md"
|
|
|
|
HOME="$TEST_HOME" "$FIXTURE_REPO/install-skills.sh" >/dev/null
|
|
test -f "$TEST_HOME/.claude/skills/example/references/guide.md"
|
|
|
|
# A repository version upgrade replaces an unchanged prior install.
|
|
write_manifest example example 2.0.0
|
|
cat > "$FIXTURE_REPO/skills-dev/example-plugin/skills/SKILL.md" <<'EOF'
|
|
---
|
|
name: example
|
|
description: Installer fixture version two.
|
|
---
|
|
version two
|
|
EOF
|
|
HOME="$TEST_HOME" "$FIXTURE_REPO/install-skills.sh" >/dev/null
|
|
grep -q 'version two' "$TEST_HOME/.claude/skills/example/SKILL.md"
|
|
grep -q '"version": "2.0.0"' "$TEST_HOME/.claude/.installed-skills.json"
|
|
|
|
# A local edit is preserved even when the repository advances again.
|
|
printf 'local edit\n' >> "$TEST_HOME/.claude/skills/example/SKILL.md"
|
|
write_manifest example example 3.0.0
|
|
printf 'repository version three\n' >> "$FIXTURE_REPO/skills-dev/example-plugin/skills/SKILL.md"
|
|
output="$(HOME="$TEST_HOME" "$FIXTURE_REPO/install-skills.sh")"
|
|
grep -q 'local files were modified' <<<"$output"
|
|
grep -q 'local edit' "$TEST_HOME/.claude/skills/example/SKILL.md"
|
|
if grep -q 'repository version three' "$TEST_HOME/.claude/skills/example/SKILL.md"; then
|
|
echo 'local modification was overwritten' >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Legacy SKILL.md-only installs gain missing repository resources when their
|
|
# existing content is an unchanged subset of the source.
|
|
write_manifest legacy legacy 1.0.0
|
|
mkdir -p "$FIXTURE_REPO/skills-dev/legacy-plugin/skills/references"
|
|
cat > "$FIXTURE_REPO/skills-dev/legacy-plugin/skills/SKILL.md" <<'EOF'
|
|
---
|
|
name: legacy
|
|
description: Legacy installation fixture.
|
|
---
|
|
legacy content
|
|
EOF
|
|
printf 'legacy reference\n' > "$FIXTURE_REPO/skills-dev/legacy-plugin/skills/references/guide.md"
|
|
mkdir -p "$TEST_HOME/.claude/skills/legacy"
|
|
cp "$FIXTURE_REPO/skills-dev/legacy-plugin/skills/SKILL.md" "$TEST_HOME/.claude/skills/legacy/SKILL.md"
|
|
HOME="$TEST_HOME" "$FIXTURE_REPO/install-skills.sh" >/dev/null
|
|
test -f "$TEST_HOME/.claude/skills/legacy/references/guide.md"
|
|
|
|
echo 'install-skills tests passed'
|