| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #!/usr/bin/env bash
- # Test: Skill Priority Resolution
- # Verifies that skills are resolved with correct priority: project > personal > superpowers
- # NOTE: These tests require OpenCode to be installed and configured
- set -euo pipefail
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
- echo "=== Test: Skill Priority Resolution ==="
- # Source setup to create isolated environment
- source "$SCRIPT_DIR/setup.sh"
- # Trap to cleanup on exit
- trap cleanup_test_env EXIT
- # Create same skill "priority-test" in all three locations with different markers
- echo "Setting up priority test fixtures..."
- # 1. Create in superpowers location (lowest priority)
- mkdir -p "$HOME/.config/opencode/superpowers/skills/priority-test"
- cat > "$HOME/.config/opencode/superpowers/skills/priority-test/SKILL.md" <<'EOF'
- ---
- name: priority-test
- description: Superpowers version of priority test skill
- ---
- # Priority Test Skill (Superpowers Version)
- This is the SUPERPOWERS version of the priority test skill.
- PRIORITY_MARKER_SUPERPOWERS_VERSION
- EOF
- # 2. Create in personal location (medium priority)
- mkdir -p "$HOME/.config/opencode/skills/priority-test"
- cat > "$HOME/.config/opencode/skills/priority-test/SKILL.md" <<'EOF'
- ---
- name: priority-test
- description: Personal version of priority test skill
- ---
- # Priority Test Skill (Personal Version)
- This is the PERSONAL version of the priority test skill.
- PRIORITY_MARKER_PERSONAL_VERSION
- EOF
- # 3. Create in project location (highest priority)
- mkdir -p "$TEST_HOME/test-project/.opencode/skills/priority-test"
- cat > "$TEST_HOME/test-project/.opencode/skills/priority-test/SKILL.md" <<'EOF'
- ---
- name: priority-test
- description: Project version of priority test skill
- ---
- # Priority Test Skill (Project Version)
- This is the PROJECT version of the priority test skill.
- PRIORITY_MARKER_PROJECT_VERSION
- EOF
- echo " Created priority-test skill in all three locations"
- # Test 1: Verify fixture setup
- echo ""
- echo "Test 1: Verifying test fixtures..."
- if [ -f "$HOME/.config/opencode/superpowers/skills/priority-test/SKILL.md" ]; then
- echo " [PASS] Superpowers version exists"
- else
- echo " [FAIL] Superpowers version missing"
- exit 1
- fi
- if [ -f "$HOME/.config/opencode/skills/priority-test/SKILL.md" ]; then
- echo " [PASS] Personal version exists"
- else
- echo " [FAIL] Personal version missing"
- exit 1
- fi
- if [ -f "$TEST_HOME/test-project/.opencode/skills/priority-test/SKILL.md" ]; then
- echo " [PASS] Project version exists"
- else
- echo " [FAIL] Project version missing"
- exit 1
- fi
- # Check if opencode is available for integration tests
- if ! command -v opencode &> /dev/null; then
- echo ""
- echo " [SKIP] OpenCode not installed - skipping integration tests"
- echo " To run these tests, install OpenCode: https://opencode.ai"
- echo ""
- echo "=== Priority fixture tests passed (integration tests skipped) ==="
- exit 0
- fi
- # Test 2: Test that personal overrides superpowers
- echo ""
- echo "Test 2: Testing personal > superpowers priority..."
- echo " Running from outside project directory..."
- # Run from HOME (not in project) - should get personal version
- cd "$HOME"
- output=$(timeout 60s opencode run --print-logs "Use the use_skill tool to load the priority-test skill. Show me the exact content including any PRIORITY_MARKER text." 2>&1) || {
- exit_code=$?
- if [ $exit_code -eq 124 ]; then
- echo " [FAIL] OpenCode timed out after 60s"
- exit 1
- fi
- }
- if echo "$output" | grep -qi "PRIORITY_MARKER_PERSONAL_VERSION"; then
- echo " [PASS] Personal version loaded (overrides superpowers)"
- elif echo "$output" | grep -qi "PRIORITY_MARKER_SUPERPOWERS_VERSION"; then
- echo " [FAIL] Superpowers version loaded instead of personal"
- exit 1
- else
- echo " [WARN] Could not verify priority marker in output"
- echo " Output snippet:"
- echo "$output" | grep -i "priority\|personal\|superpowers" | head -10
- fi
- # Test 3: Test that project overrides both personal and superpowers
- echo ""
- echo "Test 3: Testing project > personal > superpowers priority..."
- echo " Running from project directory..."
- # Run from project directory - should get project version
- cd "$TEST_HOME/test-project"
- output=$(timeout 60s opencode run --print-logs "Use the use_skill tool to load the priority-test skill. Show me the exact content including any PRIORITY_MARKER text." 2>&1) || {
- exit_code=$?
- if [ $exit_code -eq 124 ]; then
- echo " [FAIL] OpenCode timed out after 60s"
- exit 1
- fi
- }
- if echo "$output" | grep -qi "PRIORITY_MARKER_PROJECT_VERSION"; then
- echo " [PASS] Project version loaded (highest priority)"
- elif echo "$output" | grep -qi "PRIORITY_MARKER_PERSONAL_VERSION"; then
- echo " [FAIL] Personal version loaded instead of project"
- exit 1
- elif echo "$output" | grep -qi "PRIORITY_MARKER_SUPERPOWERS_VERSION"; then
- echo " [FAIL] Superpowers version loaded instead of project"
- exit 1
- else
- echo " [WARN] Could not verify priority marker in output"
- echo " Output snippet:"
- echo "$output" | grep -i "priority\|project\|personal" | head -10
- fi
- # Test 4: Test explicit superpowers: prefix bypasses priority
- echo ""
- echo "Test 4: Testing superpowers: prefix forces superpowers version..."
- cd "$TEST_HOME/test-project"
- output=$(timeout 60s opencode run --print-logs "Use the use_skill tool to load superpowers:priority-test specifically. Show me the exact content including any PRIORITY_MARKER text." 2>&1) || {
- exit_code=$?
- if [ $exit_code -eq 124 ]; then
- echo " [FAIL] OpenCode timed out after 60s"
- exit 1
- fi
- }
- if echo "$output" | grep -qi "PRIORITY_MARKER_SUPERPOWERS_VERSION"; then
- echo " [PASS] superpowers: prefix correctly forces superpowers version"
- elif echo "$output" | grep -qi "PRIORITY_MARKER_PROJECT_VERSION\|PRIORITY_MARKER_PERSONAL_VERSION"; then
- echo " [FAIL] superpowers: prefix did not force superpowers version"
- exit 1
- else
- echo " [WARN] Could not verify priority marker in output"
- fi
- # Test 5: Test explicit project: prefix
- echo ""
- echo "Test 5: Testing project: prefix forces project version..."
- cd "$HOME" # Run from outside project but with project: prefix
- output=$(timeout 60s opencode run --print-logs "Use the use_skill tool to load project:priority-test specifically. Show me the exact content." 2>&1) || {
- exit_code=$?
- if [ $exit_code -eq 124 ]; then
- echo " [FAIL] OpenCode timed out after 60s"
- exit 1
- fi
- }
- # Note: This may fail since we're not in the project directory
- # The project: prefix only works when in a project context
- if echo "$output" | grep -qi "not found\|error"; then
- echo " [PASS] project: prefix correctly fails when not in project context"
- else
- echo " [INFO] project: prefix behavior outside project context may vary"
- fi
- echo ""
- echo "=== All priority tests passed ==="
|