Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Ghost Security - Software Composition Analysis (SCA) scanner. Scans dependency lockfiles for known vulnerabilities, identifies CVEs, and generates findings with severity levels and remediation guidance. Use when the user asks about dependency vulnerabilities, vulnerable packages, CVE checks, security audits of dependencies, or wants to scan lockfiles like package-lock.json, yarn.lock, go.sum, or Gemfile.lock.
.claude/skills/ghostsecurity-ghost-scan-deps/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 51% | 0% |
You are the top-level orchestrator for Software Composition Analysis (SCA) scanning. Your ONLY job is to call the Task tool to spawn subagents to do the actual work. Each step below gives you the exact Task tool parameters to use. Do not do the work yourself.
~/.ghost/repos/<repo_id>/scans/<short_sha>/depsgit rev-parse --short HEAD (falls back to YYYYMMDD for non-git dirs)$ARGUMENTS
Any values provided above override the defaults.
Run this Bash command to compute the repo-specific output directory, create it, and locate the skill files:
repo_name=$(basename "$(pwd)") && remote_url=$(git remote get-url origin 2>/dev/null || pwd) && short_hash=$(printf '%s' "$remote_url" | git hash-object --stdin | cut -c1-8) && repo_id="${repo_name}-${short_hash}" && short_sha=$(git rev-parse --short HEAD 2>/dev/null || date +%Y%m%d) && ghost_repo_dir="$HOME/.ghost/repos/${repo_id}" && scan_dir="${ghost_repo_dir}/scans/${short_sha}/deps" && cache_dir="${ghost_repo_dir}/cache" && mkdir -p "$scan_dir/findings" && skill_dir=$(find . -path '*skills/scan-deps/SKILL.md' 2>/dev/null | head -1 | xargs dirname) && echo "scan_dir=$scan_dir cache_dir=$cache_dir skill_dir=$skill_dir"Store scan_dir (the absolute path under ~/.ghost/repos/), cache_dir (the repo-level cache directory), and skill_dir (the absolute path to the skill directory containing agents/, scripts/, etc.).
After this step, your only remaining tool is Task. Do not use Bash, Read, Grep, Glob, or any other tool for Steps 1–5.
Call the Task tool to initialize the wraith binary:
json{ "description": "Initialize wraith binary", "subagent_type": "general-purpose", "prompt": "You are the init agent. Read and follow the instructions in <skill_dir>/agents/init/agent.md.\n\n## Inputs\n- skill_dir: <skill_dir>" }
The init agent installs wraith to ~/.ghost/bin/wraith (or wraith.exe on Windows).
Call the Task tool to discover lockfiles in the repository:
json{ "description": "Discover lockfiles", "subagent_type": "general-purpose", "prompt": "You are the discover agent. Read and follow the instructions in <skill_dir>/agents/discover/agent.md.\n\n## Inputs\n- repo_path: <repo_path>\n- scan_dir: <scan_dir>" }
The discover agent finds all lockfiles (go.mod, package-lock.json, etc.) and writes <scan_dir>/lockfiles.json.
If lockfile count is 0: Skip to Step 5 (Summarize) with no lockfiles found.
Call the Task tool to run the wraith scanner:
json{ "description": "Scan for vulnerabilities", "subagent_type": "general-purpose", "prompt": "You are the scan agent. Read and follow the instructions in <skill_dir>/agents/scan/agent.md.\n\n## Inputs\n- repo_path: <repo_path>\n- scan_dir: <scan_dir>" }
The scan agent executes wraith for each lockfile and writes <scan_dir>/candidates.json.
If candidate count is 0: Skip to Step 5 (Summarize) with no vulnerabilities found.
Call the Task tool to analyze the vulnerability candidates:
json{ "description": "Analyze vulnerability candidates", "subagent_type": "general-purpose", "prompt": "You are the analysis agent. Read and follow the instructions in <skill_dir>/agents/analyze/agent.md.\n\n## Inputs\n- repo_path: <repo_path>\n- scan_dir: <scan_dir>\n- skill_dir: <skill_dir>\n- cache_dir: <cache_dir>" }
The analysis agent spawns parallel analyzers for each candidate to assess exploitability and writes finding files to <scan_dir>/findings/.
Call the Task tool to summarize the findings:
json{ "description": "Summarize scan results", "subagent_type": "general-purpose", "prompt": "You are the summarize agent. Read and follow the instructions in <skill_dir>/agents/summarize/agent.md.\n\n## Inputs\n- repo_path: <repo_path>\n- scan_dir: <scan_dir>\n- skill_dir: <skill_dir>\n- cache_dir: <cache_dir>" }
After executing all the tasks, report the scan results to the user.
If any Task call fails, retry it once. If it fails again, stop and report the failure.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,620 | 15,212 | -8% | 1 | 1 | 0% | 1,990 | 2,330 | +17% | 0 | 0 | — |
case-02 | fail→fail | 16,495 | 17,087 | +4% | 1 | 1 | 0% | 1,979 | 1,972 | -0% | 0 | 0 | — |
case-03 | fail→fail | 11,450 | 13,219 | +15% | 1 | 1 | 0% | 1,402 | 2,146 | +53% | 0 | 0 | — |
case-04 | pass→pass | 8,676 | 9,899 | +14% | 1 | 1 | 0% | 826 | 2,166 | +162% | 0 | 0 | — |
case-05 | pass→fail | 13,657 | 9,540 | -30% | 1 | 1 | 0% | 2,292 | 2,073 | -10% | 0 | 0 | — |
case-06 | pass→fail | 12,163 | 11,377 | -6% | 1 | 1 | 0% | 1,475 | 2,287 | +55% | 0 | 0 | — |
case-07 | pass→pass | 15,947 | 15,659 | -2% | 1 | 1 | 0% | 1,965 | 2,387 | +21% | 0 | 0 | — |
case-08 | fail→pass | 12,183 | 5,316 | -56% | 1 | 1 | 0% | 1,926 | 2,458 | +28% | 0 | 0 | — |
case-09 | fail→fail | 8,276 | 12,079 | +46% | 1 | 1 | 0% | 1,434 | 2,477 | +73% | 0 | 0 | — |
case-10 | fail→pass | 7,214 | 2,576 | -64% | 1 | 1 | 0% | 1,151 | 1,789 | +55% | 0 | 0 | — |
case-11 | fail→pass | 9,815 | 2,824 | -71% | 1 | 1 | 0% | 1,639 | 1,886 | +15% | 0 | 0 | — |
case-12 | fail→pass | 8,127 | 1,940 | -76% | 1 | 1 | 0% | 1,268 | 1,705 | +34% | 0 | 0 | — |
case-13 | fail→pass | 8,002 | 2,086 | -74% | 1 | 1 | 0% | 1,135 | 1,712 | +51% | 0 | 0 | — |
case-14 | fail→pass | 8,364 | 2,356 | -72% | 1 | 1 | 0% | 1,375 | 1,793 | +30% | 0 | 0 | — |
case-15 | fail→pass | 13,658 | 2,966 | -78% | 1 | 1 | 0% | 2,126 | 1,906 | -10% | 0 | 0 | — |
case-16 | fail→pass | 7,724 | 2,347 | -70% | 1 | 1 | 0% | 1,194 | 1,761 | +47% | 0 | 0 | — |
case-17 | pass→pass | 9,055 | 1,504 | -83% | 1 | 1 | 0% | 1,310 | 1,581 | +21% | 0 | 0 | — |
case-18 | fail→pass | 11,307 | 2,001 | -82% | 1 | 1 | 0% | 1,953 | 1,705 | -13% | 0 | 0 | — |
case-19 | fail→pass | 11,827 | 4,623 | -61% | 1 | 1 | 0% | 2,028 | 2,215 | +9% | 0 | 0 | — |
case-20 | fail→fail | 9,146 | 3,491 | -62% | 1 | 1 | 0% | 1,503 | 2,069 | +38% | 0 | 0 | — |
case-21 | fail→pass | 9,644 | 4,129 | -57% | 1 | 1 | 0% | 1,474 | 1,627 | +10% | 0 | 0 | — |
case-22 | fail→pass | 7,580 | 1,404 | -81% | 1 | 1 | 0% | 1,248 | 1,582 | +27% | 0 | 0 | — |
case-23 | pass→pass | 10,729 | 4,200 | -61% | 1 | 1 | 0% | 1,837 | 2,081 | +13% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 19 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +43 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.