agentleFS
jars-demojars-demo/jars-skills/skills/licensing/SKILL.md

licensing

Skill0 starsChanged 32 days agoMITView on GitHub

Keep a repository's licensing correct and consistent. Audits the LICENSE file, README and package manifests so they agree, picks a license for a new project, declares it with the right SPDX identifier, and checks that copied code, fonts, icons, logos and dependencies carry the notices their licenses require. Use when the user asks which license to use, to add or change a license, to check licensing, to audit a repo or an org for licenses, to copy code or assets from another project, to add a NOTICE or third-party notices file, to ask MIT vs Apache vs GPL, or whether a dependency's license is safe to use.

2 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 6 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈6

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Ask the user if they have not said.

    line 67
  2. Very specific:

    Use "UNLICENSED" in package.json only for code that is genuinely not licensed to anyone.

    line 109
  3. Distinctive:

    Keep the line endings and formatting the files already use, so the diff is only the license.

    line 111
  4. Distinctive:

    Before copying, read the source project's license.

    line 115
  5. Distinctive:

    Icon sets: check the set's license (Lucide is ISC, Heroicons is MIT, Simple Icons is CC0) and keep it in your third-party notices.

    line 136
  6. Distinctive:

    Logos of other products: use them only to identify that product.

    line 138
  7. Distinctive:

    AGPL in a hosted service: if you *modify* an AGPL program and let users reach it over a network, you must offer them its source.

    line 165

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

licensing

Make what a repository says about its license true, consistent and complete. This is engineering hygiene, not legal advice: when money, a contract, a company policy or a dispute is involved, say so and tell the user to ask a lawyer.

Ground rules

  • Never change a license or a copyright holder without asking. Relicensing is the author's decision, and code from other contributors may need their consent.
  • Never remove or edit someone else's copyright or license notice. Add to notices; do not rewrite them.
  • Never edit the license text itself. Tools detect licenses by matching the exact text. Fill in only the copyright line ([year] [fullname] in MIT).
  • Do not push, publish or open pull requests unless the user asked for that exact action.
  • Report what you did not check. A clean manifest scan says nothing about dependency licenses.

1. Find what the repository declares

A license is declared in three places, and they must agree:

WhereWho reads itWhat to check
LICENSE (or LICENSE.md, COPYING)Courts, GitHub, scannersExists, unmodified text, a copyright line with a real name and year
README.mdPeopleA License section that names the same license and links LICENSE
Package manifestsPyPI, npm, license scannersThe license field uses the same SPDX identifier
ls LICENSE* COPYING* NOTICE* 2>/dev/null
grep -iE '^\s*copyright' LICENSE*
grep -niE '^#+ *licen[cs]e' -A3 README.md
grep -rnE --include=package.json '"license"\s*:' . | grep -v node_modules
grep -rnE --include=pyproject.toml '^license\s*=' .
grep -rnE --include=Cargo.toml '^license\s*=' .

For a GitHub org, check every repo that is not a fork:

gh repo list <org> --source --limit 200 --json name --jq '.[].name' |
  while read -r r; do
    echo "$r $(gh api repos/<org>/$r/license --jq .license.spdx_id 2>/dev/null || echo NONE)"
  done

Skip forks: they carry their upstream's license and are not the user's to relicense.

Flag each of these:

  • No license file. Public code without a license is "all rights reserved": others may view and fork it on GitHub, but may not copy, change or reuse it.
  • The three places disagree (README says MIT, LICENSE is Apache-2.0, manifest is empty).
  • A copyright line naming someone else, often left over from copying another project's file.
  • A manifest with no license field. Private packages too: scanners read the manifest, not the README.
  • A non-SPDX value such as "MIT License" or "Apache 2". Use MIT, Apache-2.0, BSD-3-Clause, GPL-3.0-only, GPL-3.0-or-later, MPL-2.0, ISC.
  • npm's default "ISC" left in a project that is actually MIT.

2. Choose a license (new projects only)

Ask the user if they have not said. Offer this default:

SituationChooseWhy
Small library, tool, tutorial or workshopMITShort, permissive, the easiest to comply with
Code you want companies to adopt, or a patent concernApache-2.0Permissive, plus an explicit patent license and patent-retaliation clause
Code meant to be contributed to an existing projectThe upstream project's licenseReviewers can merge it as is
The author wants changes shared back when distributedGPL-3.0-or-laterStrong copyleft
The same, and the software runs as a hosted serviceAGPL-3.0-or-laterCopyleft that also covers users over a network
Documentation, images, course text (not code)CC-BY-4.0Creative Commons suits content, not software

Get the canonical text instead of typing it:

gh api licenses/mit --jq .body > LICENSE        # then fill in [year] [fullname]
gh api licenses/apache-2.0 --jq .body > LICENSE

3. Declare it everywhere

  1. LICENSE at the repository root, canonical text, copyright line filled in.
  2. README, as the last section:

    ## License
    
    [MIT](LICENSE) © 2026 Your Name
  3. Every manifest:

    # pyproject.toml (PEP 639: needs hatchling >= 1.27 or setuptools >= 77)
    [project]
    license = "MIT"
    // package.json, even when "private": true
    "license": "MIT"

    Use "UNLICENSED" in package.json only for code that is genuinely not licensed to anyone.

  4. Keep the line endings and formatting the files already use, so the diff is only the license.

4. Copying code from another project

Before copying, read the source project's license. Then:

Source licenseYou must
MIT, BSD, ISCKeep its copyright line and license text with the copied code (a header, or a third-party notices file)
Apache-2.0Do the same, state what you changed, and carry over the attribution lines from its NOTICE file into yours
MPL-2.0Keep the copied files under MPL-2.0 and their source available; the rest of your project is unaffected
GPL, AGPLStop and ask. Copying it into a permissive project makes the combined work GPL when you distribute it
No licenseStop. You have no permission to copy it; ask the author or write your own

Record each copy in a NOTICE file or docs/third-party-notices.md: what was copied, from where (repository URL and commit), under which license, and what you changed. See references/compatibility.md for which licenses can be combined.

5. Fonts, icons and logos

Assets have licenses too, and names and logos are also trademarks, which no software license grants.

  • Fonts: most open fonts use the SIL Open Font License. Ship its license file next to the font files (for example fonts/OFL-Inter.txt). Modified versions may not use the font's reserved name.
  • Icon sets: check the set's license (Lucide is ISC, Heroicons is MIT, Simple Icons is CC0) and keep it in your third-party notices.
  • Logos of other products: use them only to identify that product. Say who owns the mark, that the project is not official or endorsed, and where the file came from. If the source repository has no license, use the logo only for identification and offer to remove it on request.

A good NOTICE entry for a logo:

app/public/logos/ contains the logos of Example DB and Example Cloud. They are
trademarks of their owners, used only to identify the systems this project
works with. This project is not official and is not endorsed by either.

6. Dependencies

Dependencies stay under their own licenses. You must comply when you distribute them, which includes Docker images, bundled frontends and vendored code.

npx --yes license-checker-rseidelsohn --summary          # Node
uvx pip-licenses --from=mixed --order=license             # Python (run inside the project's venv)
go-licenses report ./...                                  # Go
cargo deny check licenses                                 # Rust (needs a deny.toml)

Flag for the user, with the package name and version:

  • GPL-*, AGPL-*, LGPL-* in anything you ship.
  • AGPL in a hosted service: if you modify an AGPL program and let users reach it over a network, you must offer them its source. Running an unmodified AGPL server next to your app does not put your app under AGPL.
  • SSPL-1.0, BUSL-1.1, Elastic-2.0, "Commons Clause": source-available, not open source, with limits on commercial or hosted use.
  • UNKNOWN, UNLICENSED, or no license at all.

7. Report

Licensing: <repo or org>

Declared:   <license> in LICENSE · README · <n> manifests   (or what disagrees)
Fixed:      <file>: <change>
Needs you:  <decision> - <why it is the user's call>
Not checked: <what was out of scope, e.g. dependency licenses>

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.