path-reference-auditor — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited path-reference-auditor (Agent Skill) and scored it 87/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 3 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 3 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill requires Python 3.8+ and standard library only. No external packages needed.
To install this skill's dependencies:
pip-compile ./requirements.in
pip install -r ./requirements.txtSee requirements.txt for the dependency lockfile (currently empty — standard library only).
Complete path reference audit system for plugins and skills. Ensures all ./file references in code actually exist.
Validates that file references in plugins and skills are:
.agents/skills/Y/ stay within Y/plugins/X/ (root level) stay within X/./ paths point to actual files (or symlinks)Generates an inventory.json database of all references for reuse in multiple checks.
Find all ./reference patterns in .py, .md, .mmd, .json, .sh files. Populates temp/inventory.json with raw reference data.
python ./scripts/path_reference_auditor.py --project . --phase scanOutput: temp/inventory.json with all references found
Read inventory.json and check if each reference exists in the skill/plugin. Updates inventory with status: exists/missing/symlink/broken.
python ./scripts/path_reference_auditor.py --project . --phase verifyOutput: temp/inventory.json with status information
Generate analysis reports from verified inventory (no rescanning needed).
# Summary
python ./scripts/path_reference_auditor.py --project . --phase report --report summary
# Missing files
python ./scripts/path_reference_auditor.py --project . --phase report --report missing
# Broken symlinks
python ./scripts/path_reference_auditor.py --project . --phase report --report broken_symlinksInventory location: All reports read from temp/inventory.json (generated by Phase 1 & 2)
Flags references that point OUTSIDE a skill directory.
# All skills
python ./scripts/check_skill_boundaries.py temp/inventory.json --batch all
# Single skill (fast testing)
python ./scripts/check_skill_boundaries.py temp/inventory.json --skill adr-managementExample violation:
FILE: .agents/skills/adr-management/SKILL.md:45
REF: ../../templates/adr-template.md ❌ OUTSIDE SKILL
FIX: Create symlink inside skillFlags references in plugin root level that point OUTSIDE the plugin.
# All plugins
python ./scripts/check_plugin_boundaries.py temp/inventory.json --batch all
# Single plugin (fast testing)
python ./scripts/check_plugin_boundaries.py temp/inventory.json --plugin plugin-installerExample violation:
FILE: plugins/adr-manager/commands/adr-management.md:8
REF: ../../../docs/guide.md ❌ OUTSIDE PLUGIN
FIX: Copy/symlink file into plugin# Step 1: Generate inventory (from project root)
python ./scripts/path_reference_auditor.py --project . --phase scan
# Step 2: Verify all references exist
python ./scripts/path_reference_auditor.py --project . --phase verify
# Step 3: Check skill boundaries
python ./scripts/check_skill_boundaries.py temp/inventory.json --batch all
# Step 4: Check plugin boundaries
python ./scripts/check_plugin_boundaries.py temp/inventory.json --batch all
# Step 5: Review violations and fix# Test one skill during development
python ./scripts/check_skill_boundaries.py temp/inventory.json --skill my-skill
# Test one plugin after changes
python ./scripts/check_plugin_boundaries.py temp/inventory.json --plugin my-pluginSee references/ for detailed usage guide.
✅ Inventory-based: Scan once, analyze multiple times ✅ Filtered testing: Test single skill/plugin without scanning all ✅ Boundary validation: Skill and plugin scope checks ✅ Portable: All paths relative to project root ✅ JSON output: Machine-parseable inventory for automation
For end users who want just this skill, consult the authoritative installation hub for current deployment logic:
### 👉 INSTALL.md
Then run from the skill directory:
python ./scripts/path_reference_auditor.py --project . --phase scanFor developers who want all agent-scaffolders skills + commands + hooks:
# From project root, use the bridge installer
python ./scripts/plugin_installer.py plugins/agent-scaffolders
# Or manually
cp -r plugins/agent-scaffolders /path/to/target/plugins/Then run from project root:
python .agents/skills/path-reference-auditor/./path_reference_auditor.py --project . --phase scanAll file references inside .agents/skills/Y/ must resolve within Y/.
Valid:
./scripts/tool.py → .agents/skills/Y/scripts/tool.py ✅./references/guide.md → .agents/skills/Y/references/guide.md ✅Invalid:
../../templates/file.md → plugins/X/templates/file.md (outside skill) ❌../other-skill/file.md → .agents/skills/other-skill/file.md (sibling skill) ❌Fix: Create symlink inside the skill:
cd plugins/X/skills/Y
ln -s ../../templates templatesAll file references inside plugins/X/ (root level, non-skill files) must resolve within X/.
Valid:
./commands/file.md → plugins/X/commands/file.md ✅./skills/Y/SKILL.md → .agents/skills/Y/SKILL.md ✅Invalid:
../other-plugin/file.md → plugins/other-plugin/file.md (sibling plugin) ❌../../docs/guide.md → docs/guide.md (project root) ❌Fix: Copy or symlink into plugin:
cd plugins/X
cp -r ../../docs ./docs
# or symlink
ln -s ../../docs ./docsPrefer symlinks over duplicating files:
Good:
# Inside skill, link to plugin-level resource
ln -s ../../templates ./templatesAvoid:
# Copying creates duplication
cp -r ../../templates ./templatesinventory.json once (30-60 seconds)Never rescan unnecessarily. Reuse inventory.json across multiple checks.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.