dependency-extraction-multilang — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited dependency-extraction-multilang (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.
| # | Attempt | Why Failed | Lesson |
|---|---|---|---|
| 1 | Used a TOML parser library for pyproject.toml | Added a dependency just for parsing one file. Library had edge cases | Regex extraction is simpler and sufficient for dependency arrays |
| 2 | Didn't strip version specifiers from requirements.txt | "fastapi>=0.100" didn't match "fastapi" in project config | Always split on version specifiers: [=<>~! |
| 3 | Only checked dependencies in package.json | Missed devDependencies (typescript, vite, testing frameworks) | Check both dependencies AND devDependencies |
function extractDependencies(packageJson, requirementsTxt, pyprojectToml) {
const deps = [];
// 1. Node.js: package.json
if (packageJson) {
try {
const pkg = JSON.parse(packageJson);
if (pkg.dependencies) deps.push(...Object.keys(pkg.dependencies));
if (pkg.devDependencies) deps.push(...Object.keys(pkg.devDependencies));
} catch { /* malformed JSON */ }
}
// 2. Python: requirements.txt
if (requirementsTxt) {
for (const line of requirementsTxt.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-')) continue;
const name = trimmed.split(/[=<>~![\s]/)[0].trim();
if (name) deps.push(name.toLowerCase());
}
}
// 3. Python: pyproject.toml (regex — no TOML parser needed)
if (pyprojectToml) {
const depMatch = pyprojectToml.match(/dependencies\s*=\s*\[([\s\S]*?)\]/);
if (depMatch) {
const entries = depMatch[1].match(/"([^"]+)"|'([^']+)'/g);
if (entries) {
for (const entry of entries) {
const raw = entry.replace(/["']/g, '');
const name = raw.split(/[=<>~![\s]/)[0].trim();
if (name) deps.push(name.toLowerCase());
}
}
}
}
// Deduplicate and normalize
return [...new Set(deps.map(d => d.toLowerCase()))];
}const base = `https://raw.githubusercontent.com/${repo}/HEAD`;
const [pkgRes, reqRes, pyRes] = await Promise.all([
fetch(`${base}/package.json`).catch(() => null),
fetch(`${base}/requirements.txt`).catch(() => null),
fetch(`${base}/pyproject.toml`).catch(() => null),
]);| Metric | Value | Source |
|---|---|---|
| Languages supported | 3 (Node.js, Python pip, Python modern) | Hub production |
| Parse success rate | 99%+ (graceful fallback on malformed) | 500+ repos analyzed |
| Version stripping accuracy | 100% for standard specifiers | Tested with ==, >=, ~=, != |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.