vercel/plugin-audit
Audit vercel-plugin performance on real-world projects. Extracts tool calls from Claude Code conversation logs, tests hook matching against actual inputs, identifies pattern coverage gaps, and checks plugin cache staleness. Use when asked to audit, test, or investigate plugin skill injection on a real project.
npx skills add https://github.com/vercel/vercel-plugin --skill plugin-audit
Audit how well vercel-plugin skill injection performs on real-world Claude Code sessions.
Find JSONL conversation logs for a target project:
ls -lt ~/.claude/projects/-Users-*-<project-name>/*.jsonl
The path uses the project's absolute path with slashes replaced by hyphens and a leading hyphen.
Parse the JSONL log to extract all tool_use entries. Each line is a JSON object with message.content[] containing type: "tool_use" blocks. Extract name and input fields. Group by tool type (Bash, Read, Write, Edit).
Use the exported pipeline functions directly — do NOT shell out to the hook script for each test. Import from the hooks directory:
import { loadSkills, matchSkills } from "./hooks/pretooluse-skill-inject.mjs";
import { createLogger } from "./hooks/logger.mjs";
Call loadSkills() once, then matchSkills(toolName, toolInput, compiledSkills) for each tool call. This is fast and gives exact match results.
Compare matched skills against what SHOULD have matched based on the project's technology stack. Common gap categories:
src/db/schema.ts not matching vercel-storage)Compare the installed plugin cache against the dev version:
# Cache location
~/.claude/plugins/cache/vercel-labs-vercel-plugin/vercel-plugin/<version>/
# Compare skill content
diff <(grep 'pattern' skills/<skill>/SKILL.md) <(grep 'pattern' ~/.claude/plugins/cache/.../skills/<skill>/SKILL.md)
Check ~/.claude/plugins/installed_plugins.json for version and git SHA.
Produce a structured report with:
Take vercel/plugin-audit from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.