Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audit a project's dependency licenses against an explicit policy (allow-list / deny-list / review-required) and flag incompatibilities before they ship to production. Reads SPDX license identifiers from npm package manifests, Python METADATA / PKG-INFO files, and pyproject.toml; classifies each license by family (permissive, weak-copyleft, strong-copyleft, proprietary, unknown); detects copyleft contamination and SPDX-incompatible license combinations. Use when: pre-release legal review, M&A cod
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -10% | 0% |
License compliance is a security concern only in the indirect sense that an unintended license obligation can force you to release proprietary source code, retroactively invalidate a customer contract, or render an M&A transaction infeasible. The cost is legal and contractual rather than exploitative — but the consequence ladder is real.
The most-stepped-on landmine is copyleft contamination: unintentionally including a GPL or AGPL-licensed package in a codebase the rest of which is permissively licensed (MIT, Apache-2.0, BSD). The terms of the GPL family say that any project distributing GPL code MUST itself release source under a GPL-compatible license. If your package.json says MIT and one of your transitive deps is GPL-2.0, you may be obligated to either re-license your code or remove the dep.
This skill audits the resolved dependency tree against an explicit policy file and emits findings for:
GPL-2.0 + Apache-2.0 without a patent grant)
| Finding | Severity | Threshold | Affected control | |---|---|---|---| | Strong-copyleft in permissive project | CRITICAL | GPL-2.0/3.0, AGPL-3.0, or similar in a project declaring MIT/Apache-2.0/BSD | (legal) | | Weak-copyleft requiring source disclosure | HIGH | LGPL family in a project where the obligation isn't being met (no source-availability commitment) | (legal) | | Custom / non-SPDX license | HIGH | License field doesn't match SPDX expression syntax; requires legal review | (legal) | | Unknown license | MEDIUM | Package has no license field, no LICENSE file detected | (legal) | | Deny-listed license (per policy) | HIGH | Package license is in the explicit deny-list in the policy file | (legal) | | Review-required license (per policy) | MEDIUM | Package license is in the review-list (e.g. MPL-2.0) | (legal) | | Incompatible license combination | HIGH | Detected pair of licenses known to conflict (e.g. GPL-2.0-only + Apache-2.0) | (legal) | | License declared differently in metadata vs source headers | MEDIUM | LICENSE file says one license; per-file SPDX-License-Identifier headers say another | (legal) | | Permissive license requiring attribution | INFO | MIT/BSD/Apache-2.0 — emit reminder that NOTICE / attribution file should list the package | (informational) |
package.json + node_modules/OR a Python project (pyproject.toml/requirements.txt/ installed venv)
./.license-policy.json (auto-detected) orpassed via --policy. If absent, the skill uses a built-in default policy that flags strong copyleft for permissive parent projects.
The skill reads the project's top-level license from:
package.json's license fieldpyproject.toml's [project].license table ORsetup.cfg's license field
If the project's own license isn't declared, the skill emits a FATAL operational finding — license compliance can't be checked without a baseline. Add a license field before running.
The policy file is JSON:
json{ "allow": ["MIT", "BSD-3-Clause", "Apache-2.0", "ISC", "BSD-2-Clause"], "deny": ["GPL-2.0-only", "GPL-3.0-only", "AGPL-3.0-only", "AGPL-3.0-or-later"], "review": ["MPL-2.0", "EPL-2.0", "CDDL-1.0", "LGPL-3.0-or-later"], "project_license": "MIT" }
allow: licenses that pass without comment. deny: licenses that produce a finding regardless of project license. review: licenses that produce a MEDIUM-severity finding for legal review. project_license: enforced — if the project declares this but a dep is in deny, finding is CRITICAL.
bashpython3 ./scripts/check_licenses.py /path/to/project
Options:
Usage: check_licenses.py PATH [OPTIONS]
Options:
--output FILE Write findings to FILE (default: stdout)
--format FMT json | jsonl | markdown (default: markdown)
--min-severity SEV (default: info)
--policy FILE Override default policy
--emit-attribution Also emit an attribution file (NOTICE.md) listing
every permissive-licensed dep that requires attributionCRITICAL findings block release pending legal review. Either remove the offending dep, replace it with a permissively-licensed alternative, or escalate to legal for a written exception.
HIGH findings require legal sign-off but don't necessarily block release if the legal posture (e.g. service-only deployment under AGPL) makes the obligation moot.
MEDIUM findings should be reviewed quarterly and either resolved or moved into an explicit exception list.
INFO findings are reminders that an attribution / NOTICE file should reference these packages.
bashpython3 ./scripts/check_licenses.py . --min-severity high --format json --output license-audit.json jq -e '. == []' license-audit.json || { echo "License finding — legal review required"; exit 1; }
bashpython3 ./scripts/check_licenses.py . --emit-attribution --format markdown --output NOTICE.md
bashmkdir -p evidence/legal/ python3 ./scripts/check_licenses.py target-acquisition-codebase/ \ --format json \ --output evidence/legal/license-audit-$(date +%Y%m%d).json
JSON / JSONL / Markdown per lib/report.py. Exit codes: 0 clean, 1 high/critical, 2 error.
Each Finding includes:
id — license-compliance::<package>::<license-id>severity — CRITICAL / HIGH / MEDIUM / LOW / INFOcategory — license-compliancesummary — what's wrongevidence — package name, declared license, project license, policy matchreferences — SPDX URL for the license, package home pagerecommending the operator add a license field, exits 2.
license, emits MEDIUM finding.
reminding that SPDX header convention catches contamination at the file level.
references/THEORY.md — SPDX license expression syntax, familyclassifications, copyleft propagation theory, common license incompatibilities, when LGPL static linking matters, AGPL service-distribution clauses, public-domain edge cases (CC0 vs unlicense)
references/PLAYBOOK.md — Default policy templates per projecttype (proprietary product, OSS library, internal-only tool, SaaS service), attribution file generation, legal-counsel handoff templates, replacing copyleft deps with permissive alternatives
Other measured skills in the registry, with their headline benchmark lift.