Skills move to skills/<name>/SKILL.md and the repo gains both manifests, so it is now a marketplace hosting exactly one plugin whose root is the repo root (source: "."). Claude Code installs it from git; no symlinks involved. Why: install.sh wired the library into every consuming repo as an ABSOLUTE symlink to $CHECKOUT_DIR. The checkout moved three times, most recently when local-dev@1966d5a dropped the embedded .skills/ copy, and nothing migrated the links — 243 dangling links across 12 repos, hidden from git by the **/.claude/skills/ ignore rule. Worse, ~/dev spans two path roots (/Users/mathias on the iCloud-shared Macs, /home/mathias on koala), so an absolute link stored there is broken on one side by construction. Re-running the installer cannot fix that; only removing the mechanism can. install.sh keeps the harnesses with no plugin system and drops from 42 links per harness to one directory link, via the convergent ~/.agents/skills convention that Pi and OpenCode both read: ~/.agents/skills -> $CHECKOUT_DIR/skills ~/.config/crush/skills -> ~/.agents/skills ~/.config/opencode/skills -> ~/.agents/skills wire_claude_repo is deleted outright rather than gated behind a flag — on a mixed-root fleet it cannot be made correct. Antigravity and Vibe targets go too; both unused. CHECKOUT_DIR keeps its host-local default deliberately: pointing it into ~/dev would put a git working tree inside iCloud with two concurrent writers. Taskfile drops five near-identical wiring loops (they had already drifted) and delegates to install.sh. `task check` gains frontmatter validation, a stray-root-entry gate, and manifest/tag version parity — the loose secret-hygiene.md sat unloadable for months because nothing checked layout. Verified: claude plugin validate . passes clean; a probe skill loaded as skills:zzprobe through --plugin-dir; task check green at 42 skills. Refs: #23 Bump-Type: minor Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BeAp5LTscnz2W7Ubt4eJ6m
64 lines
1.5 KiB
Bash
Executable File
64 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Bisection script to find which test creates unwanted files/state
|
|
# Usage: ./find-polluter.sh <file_or_dir_to_check> <test_pattern>
|
|
# Example: ./find-polluter.sh '.git' 'src/**/*.test.ts'
|
|
|
|
set -e
|
|
|
|
if [ $# -ne 2 ]; then
|
|
echo "Usage: $0 <file_to_check> <test_pattern>"
|
|
echo "Example: $0 '.git' 'src/**/*.test.ts'"
|
|
exit 1
|
|
fi
|
|
|
|
POLLUTION_CHECK="$1"
|
|
TEST_PATTERN="$2"
|
|
|
|
echo "🔍 Searching for test that creates: $POLLUTION_CHECK"
|
|
echo "Test pattern: $TEST_PATTERN"
|
|
echo ""
|
|
|
|
# Get list of test files
|
|
TEST_FILES=$(find . -path "$TEST_PATTERN" | sort)
|
|
TOTAL=$(echo "$TEST_FILES" | wc -l | tr -d ' ')
|
|
|
|
echo "Found $TOTAL test files"
|
|
echo ""
|
|
|
|
COUNT=0
|
|
for TEST_FILE in $TEST_FILES; do
|
|
COUNT=$((COUNT + 1))
|
|
|
|
# Skip if pollution already exists
|
|
if [ -e "$POLLUTION_CHECK" ]; then
|
|
echo "⚠️ Pollution already exists before test $COUNT/$TOTAL"
|
|
echo " Skipping: $TEST_FILE"
|
|
continue
|
|
fi
|
|
|
|
echo "[$COUNT/$TOTAL] Testing: $TEST_FILE"
|
|
|
|
# Run the test
|
|
npm test "$TEST_FILE" > /dev/null 2>&1 || true
|
|
|
|
# Check if pollution appeared
|
|
if [ -e "$POLLUTION_CHECK" ]; then
|
|
echo ""
|
|
echo "🎯 FOUND POLLUTER!"
|
|
echo " Test: $TEST_FILE"
|
|
echo " Created: $POLLUTION_CHECK"
|
|
echo ""
|
|
echo "Pollution details:"
|
|
ls -la "$POLLUTION_CHECK"
|
|
echo ""
|
|
echo "To investigate:"
|
|
echo " npm test $TEST_FILE # Run just this test"
|
|
echo " cat $TEST_FILE # Review test code"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "✅ No polluter found - all tests clean!"
|
|
exit 0
|