dependency-supply-chain — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited dependency-supply-chain (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
The supply chain is the part of your stack you trust by default and rarely review. npm, PyPI, RubyGems, Maven, Go modules — they have all hosted malicious packages, typosquats, and compromised maintainer accounts at scale.
This skill is the working developer's defense — pragmatic checks that fit in a normal workflow, not a software bill-of-materials regulatory program.
package.json / requirements.txt / go.modnode_modules and no obvious hygieneWhat can a malicious dependency actually do?
package.json looks cleanYou cannot inspect every line of every dependency. You can raise the cost of attacks and detect them when they happen.
A lockfile is the only thing standing between "I added one dep" and "my install grabbed 1,200 transitive deps any of which can be swapped tomorrow".
package-lock.json, pnpm-lock.yaml, yarn.lock, poetry.lock, Pipfile.lock, go.sum. No exceptions.npm install. install can mutate the lockfile silently; ci errors if the lockfile and package.json disagree.package-lock.json but not package.json, or vice versa, deserves a review comment. Add a CI check."left-pad": "1.3.0" rather than "left-pad": "^1.3.0". The caret invites unattended updates.For high-stakes apps consider npm install --omit=dev in production builds — dev deps are a huge attack surface that production runtime does not need.
npm audit --omit=dev --audit-level=high
pnpm audit --audit-level=high
yarn npm audit
pip-auditWhat npm audit does well:
--audit-level=high or criticalWhat it misses:
audit doesn't know that this package suddenly started making outbound HTTPS callsTreat npm audit as the first line of defense, not the only one.
Tools that look at what a package does, not just which CVE it has:
A reasonable stack: GitHub Dependabot (free, native) + socket.dev (free, behavior-aware) + npm audit in CI.
npm installWhen adding a new dep, especially a small or unfamiliar one, take 60 seconds first.
# What is this package, who maintains it, what's the install footprint?
npm view <pkg>
npm view <pkg> dependencies # transitive count
npm view <pkg> repository.url # is there a public repo?
npm view <pkg> maintainers # who can publish a new version?
npm view <pkg> time # when was each version published?
# How popular is it? (huge install counts don't prove safety, but obscure single-digit downloads warrant scrutiny)
curl -s "https://api.npmjs.org/downloads/point/last-week/<pkg>" | jq
# Red flags in the publish history
npm view <pkg> time --json | jq 'to_entries | sort_by(.value) | reverse | .[0:5]'Red flags:
"bug fixes" and a 1k-line diff)lodash-utils vs lodash, colors-js vs colorspostinstall, preinstall, install, prepare scripts run on npm install. They are the most common malware delivery vector.
# Enumerate every package with an install-time script
find node_modules -name package.json -not -path '*/node_modules/*/node_modules/*' \
-exec grep -l '"postinstall"\|"preinstall"\|"prepare"' {} \; \
| xargs -I {} dirname {} | sed 's|node_modules/||'
# Block ALL install scripts globally — most packages do not need them
npm config set ignore-scripts true
# Or per-install
npm install --ignore-scripts--ignore-scripts breaks some legitimate native-module builds (node-sass, sharp, better-sqlite3). Allow scripts only for the specific packages that need them — yarn 2+ and pnpm have allowlists.
In pnpm:
# .npmrc
ignore-scripts=true
# package.json
"pnpm": {
"onlyBuiltDependencies": ["sharp", "better-sqlite3"]
}Common substitutions: i ↔ l ↔ 1, 0 ↔ o, missing/extra dashes, plural/singular. Run:
# Cheap typosquat heuristic — flag packages with very similar names to well-known ones
npm ls --depth=0 --json | jq -r '.dependencies | keys[]' | while read p; do
echo "$p" # human review or feed to socket.dev
donesocket.dev / npq do this systematically; for a manual pass, just eyeball your direct deps with cat package.json | jq '.dependencies | keys'.
Don't let your install run with prod credentials sitting in env.
# GitHub Actions
- name: Install dependencies
run: npm ci --ignore-scripts
env: {} # no env vars passed in
# Then run the few allowed install scripts intentionally
- name: Run build scripts for native deps
run: npm rebuild sharp better-sqlite3See github-actions-security for the broader CI story (pinned action SHAs, OIDC, secret scoping).
node_modules for an inherited project# How many packages did this single npm install actually install?
find node_modules -name package.json -not -path '*/node_modules/*/node_modules/*' | wc -l
# Largest packages — these are where you'd hide a payload
du -sh node_modules/*/ | sort -h | tail -20
# Packages with install scripts (as above)
# Packages with .bin executables
find node_modules/.bin -type l -o -type f | head -30Cross-check against package.json direct deps. Anything in node_modules you cannot trace back to a direct or expected-transitive dep is worth investigating.
You wake up to "package X version 2.4.5 was compromised, contains a credential stealer".
# Did you have it installed at the bad version?
git log --all -p -- package-lock.json | grep -A2 -B2 'package-x.*2\.4\.5'.env files readable by the user that ran npm install, plus anything in process env at runtime.secret-hygiene.Once a quarter:
npm ci / --frozen-lockfile, not loose installnpm audit --audit-level=high passes; exceptions documentednpm ci step in CI~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.