Install
$ agentstack add skill-cboone-agent-harness-plugins-manage-repo-licensing ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Manage Repo Licensing
Encode the REUSE-style mixed-license workflow that has converged across four sibling repos (strength-model, shannon-entropy, zhang-yeung-inequality, non-shannon-inequalities). The skill is a structured companion for these rollouts: it frames policy, standardizes placement, and drives verification. It is not an automated sweeper.
Core Invariants
Every run, regardless of mode, honors these rules. They are the lessons from the four prior rollouts.
- Policy is frozen before edits. Surface the license split, the fork-lineage question, and the reference-material scope, and wait for user confirmation before touching any file.
- License-text filenames are normalized first.
LICENSES/.txtmust match the SPDX identifier byte-for-byte (case-sensitive). Fix mis-cased filenames (APACHE-2.0.txt->Apache-2.0.txt) before any annotation pass — otherwisereuse lintwill flag every tag. - Placement is decided by file type, not by repo convention. Use the standardized matrix in
references/file-type-matrix.md. Existing divergence is drift to migrate. REUSE.tomlis the default coverage surface. Every repo ships one with at least prose, config, generated, and structural groups (plus conditional CoC and reference-material blocks). Inline SPDX is reserved for substantive source code; per-file.licensesidecars are a narrow residual. Config files (Makefile,lakefile.toml,pyproject.toml,cspell-words.txt, dotfiles, YAML, JSONC) and generated artifacts (lock files,lean-toolchain, Pandoc output, regenerated JSON/ICS) both fall inREUSE.toml, not inline or sidecar.- Rollouts advance in small, reviewable commits. Use the ladder in
references/commit-sequence.md. Do not squash. reuse lintmust be clean when done. Plus any repo-local checks (e.g.make lint,make check-proofs).- Third-party bundled reference material is covered, not excluded. It uses
LicenseRef-Reference-Material(shared canonical text) with scale-tiered placement — per-file sidecars for small curated collections (~20 or fewer), aREUSE.tomlglob for larger ones. Per-workLicenseRef-*exceptions require explicit justification inNOTICE. - Comments live where required, nowhere else. No
NOTICE.licensesidecar. No*.md.licensesidecars or HTML-comment SPDX inside project-authored Markdown — both are absorbed by theREUSE.tomlprose group. NOTICEis a summary, not an override. Never write wording that implies every file is under one license.- Prose that documents SPDX syntax is a hazard. Any project-authored Markdown that contains the literal string
SPDX-License-Identifierfollowed by a colon (or a similar tag) outside a REUSE-ignore region is parsed byreuseas a real declaration and usually corrupts the lint report. Wrap such passages in `/` HTML comments. This applies to this skill's own documentation, to any plan document that describes the workflow, and to README sections that show SPDX examples. The code-block fence does not protect the content; REUSE scans code blocks. - Intentional deviations are data, not drift. When running against a repo that is already REUSE-compliant, compare coverage to the matrix but do not flatten deliberate policy choices. Common legitimate deviations: (a) a fork preserving upstream attribution via per-file sidecars on unmodified files, dual-copyright MIT on lockfiles, or a compound license on the README; (b) a non-default code-bucket license (for example, Apache-2.0 rather than MIT for project-authored tooling); (c) per-work
LicenseRef-*exceptions with justification inNOTICE; (d) explicit prose path lists instead of globs when auditability matters more than elasticity. Surface these as candidate cleanups and wait for user direction before normalizing. The defaults in Sections 2-6 are a starting point; once a repo has a working policy, changes should be additive and policy-preserving, not flattening.
Modes
Pick the mode that matches the user's ask. Announce the mode before executing so the user can redirect.
Mode B — Bootstrap
For a repo with no or minimal SPDX coverage.
Flow:
- Run preconditions and content-class detection (Section 1 below).
- Freeze policy with the user (Section 2).
- Normalize
LICENSES/filenames and add any missing license text (Section 3). - Author the root
NOTICE(Section 4) and mirror the## Licensesection inREADME.md. - Write the root
REUSE.tomlwith the required prose-group annotation plus any conditional blocks (Section 5). - Apply SPDX coverage per the file-type matrix (Section 6).
- Verify (Section 7).
- Only emit a tracked plan document when the scope warrants one (Section 8).
Execute in commits that follow references/commit-sequence.md.
Mode M — Maintain
For a repo that already has SPDX coverage and needs a drift audit or catch-up.
Flow:
- Run
reuse lintand capture the report. - Read
LICENSES/,NOTICE, andREUSE.tomland compare against the file-type matrix. - Emit a punch list: bad license filenames, missing or unnecessary sidecars, inline Markdown SPDX that should fold into the REUSE.toml prose group, missing
LICENSES/LicenseRef-Reference-Material.txt, orphaned sidecars for deleted files, policy mismatches (for example, a.pyfile carryingApache-2.0in an MIT-for-Python repo). - Classify each item as drift or intentional deviation. Drift is structural mismatch with the matrix that should be migrated (stray
*.md.licensesidecars, inline SPDX on infrastructure config,.gitkeep.licensefiles). Intentional deviations are fork-preserving sidecars on unmodified upstream files, dual-copyright on lockfiles, a compound license onREADME.md, a non-default code-bucket license, or a justified per-workLicenseRef-*. Per invariant 11, surface deviations as candidate cleanups, not drift, and wait for explicit user direction. - Present the punch list and proposed targeted patches before applying.
- Apply approved fixes in small commits.
- Re-verify.
Mode N — New file drop
For one or more newly added files.
Flow:
- Classify each file per the matrix: license bucket + inline/sidecar/REUSE.toml group.
- Note any LicenseRef or carve-out membership.
- Apply the headers or sidecars (or extend the
REUSE.tomlprose-group path list). reuse lintthe affected paths.
No plan document. No commit ladder. One small commit.
1. Preconditions and Detection
Confirm tooling and detect content classes before editing:
reuse --version(oruvx reuse-tool --version). If absent, offer the install command (uv tool install reuseorpipx install reuse) but continue read-only.- Detect content classes:
- Lean:
**/*.lean,lakefile.toml, orlakefile.lean - Python:
**/*.py,pyproject.toml, orbin/*.py - Pandoc paper pipeline:
papers/**/main.mdpluspapers/shared/templates/*.latex - Fork lineage: upstream copyright lines in tracked files, or a non-empty
git log --diff-filter=A --followon legacy paths - Bundled third-party material:
references/papers/,references/extractions/,references/transcriptions/, or equivalents - Shared external corpora:
corpora/as a symlink outside the worktree
- Read current
LICENSES/,NOTICE,REUSE.toml, and representative inline headers.
Do not auto-detect the repo's sidecar-vs-inline convention. The file-type matrix governs placement; any repo-specific deviation is drift.
2. Policy Freeze
Before editing, propose and confirm:
- License split. Defaults (see
references/license-split.yaml):
- Lean code:
Apache-2.0 - Non-Lean substantive code (Python scripts, shell tools, vendored LaTeX macros):
MIT - Hand-authored infrastructure config (Makefile, TOML, YAML, JSONC, dotfiles, word lists): same code-bucket license (
MITwhen present), covered via the REUSE.toml config group — not inline. - Prose, mathematical exposition, planning notes:
CC-BY-4.0 - Generated artifacts (lock files, Pandoc output, tool-regenerated JSON/ICS):
CC0-1.0, covered via the REUSE.toml generated group. - Contributor Covenant derivative
CODE_OF_CONDUCT.md:CC-BY-SA-4.0 - Third-party bundled materials: explicit carve-out or
LicenseRef-*
- Repo content-driven adjustments. Only add a bucket the repo actually needs. Omit MIT when there is no non-Lean substantive code (in a Lean-only repo the config and placeholder groups fall back to
Apache-2.0). Omit CC-BY-SA-4.0 when there is no Contributor Covenant derivative. Omit CC0-1.0 when there are no tracked generated artifacts. - Fork lineage. Ask the user whether the repo is a fork, who the upstream is, and whether retained upstream files should use a
REUSE.tomlbulk annotation or per-file sidecars. Do not attempt to auto-detect fork lineage beyond surfacing upstream copyright lines for confirmation. - Reference-material scope. Identify which paths fall under
LicenseRef-Reference-Materialand which stay under project licenses. Seereferences/reference-material-text.mdfor the canonical boundary.
Record confirmed overrides in the emitted plan document when one is warranted.
3. License-Text Surface Normalization
This precedes any annotation pass.
- For every license in the confirmed split, confirm
LICENSES/.txtexists with the exact SPDX identifier casing. - Rename wrong-cased files (
APACHE-2.0.txt->Apache-2.0.txt). Usegit mv. - Download or copy canonical license text for any missing entry (SPDX canonical texts live at ). Prefer
reuse downloadwhich places canonical text underLICENSES/. - Author
LicenseRef-*.txtfiles for carve-outs. For third-party bundled reference material, use the canonical text inreferences/reference-material-text.md(adjust path names to match the repo's actual layout, keep the rest unchanged). - Run
reuse lintand confirm the "bad license filename" class of errors is gone.
4. Root NOTICE
Author a short NOTICE that:
- Names the project.
- Records the project copyright.
- States that the repository contains material under multiple licenses.
- Lists each license used, pointing at its
LICENSES/*.txtfile. - Calls out fork lineage if present.
- Calls out third-party carve-outs via
LicenseRef-Reference-Material(or the per-workLicenseRef-*if one is justified). - States that per-file SPDX metadata together with the
REUSE.tomlprose-group annotation is authoritative and thatNOTICEis a summary.
Do not ship NOTICE.license. NOTICE is covered by the REUSE.toml prose-group annotation.
Mirror the split exactly in README.md's ## License section. README.md is itself covered by the prose group and carries no inline SPDX header.
Template: references/NOTICE.template.md.
5. Root REUSE.toml
Every repo ships one. REUSE.toml is the default coverage surface; inline SPDX and per-file sidecars are exceptions, not defaults. The required annotation groups are:
- Project prose (
CC-BY-4.0,precedence = "aggregate"). CoversNOTICEand every project-authored.mdpath from the matrix. This group replaces per-file.mdinline headers and.licensesidecars for prose. - Project config (code-bucket license,
precedence = "aggregate"). Covers hand-authored infrastructure config:Makefile,lakefile.toml,pyproject.toml,**/*.yaml,**/*.yml,**/*.jsonc,.editorconfig,.gitignore,.gitattributes,.ignore,cspell-words.txt, and similar. License is the repo's code bucket —MITif present, otherwiseApache-2.0. Replaces per-file sidecars and inline headers on config files. - Generated artifacts (
CC0-1.0,precedence = "override"). Covers auto-regenerated files whose content is mechanical: lock files,lean-toolchain, Pandoc-generated.tex, generated JSON/JSONL,.icsoutput, script-generated figure data.CC0-1.0is the honest framing (public-domain dedication on content the project does not originate) and addsLICENSES/CC0-1.0.txt. - Structural placeholders (code-bucket license,
precedence = "override"). Covers**/.gitkeep. One glob, no per-file sidecars. - Contributor Covenant derivative (
CC-BY-SA-4.0,precedence = "override"). Include only whenCODE_OF_CONDUCT.mdexists and is Contributor-Covenant-derived. - Third-party reference material (
LicenseRef-Reference-Material,precedence = "override"). Include when the collection exceeds the small-collection threshold (~20 files).SPDX-FileCopyrightText = "Original authors and publishers".
Optional additional groups:
- Upstream fork trees retained unchanged (upstream copyright, original license).
- Mixed-copyright paths (for example, a fork's
README.mdunderMIT AND CC-BY-4.0) — give them their own annotation block with multi-entrySPDX-FileCopyrightText.
The REUSE.toml file itself is covered by group 2 (config), not inline. Do not add an inline SPDX block at its top.
Canonical skeleton (MIT-code-bucket, repo has CODE_OF_CONDUCT.md and bundled reference material; trim blocks to what the repo actually needs):
version = 1
# Prose: NOTICE, README, CHANGELOG, agent configs, docs, project-authored
# Markdown subtrees, bibliographic metadata.
[[annotations]]
path = [
"NOTICE",
"README.md",
"CHANGELOG.md",
"CONTRIBUTING.md",
"AGENTS.md",
"CLAUDE.md",
".github/**/*.md",
"docs/**/*.md",
# repo-specific prose subtrees go here
"references/summaries/**/*.md",
"references/reviews/**/*.md",
"references/datasets/**/*.md",
"references/bibliographies/**/*.md",
"references/README.md",
"references/papers.bib",
"skills/**/*.md",
"skills/**/*.yaml",
]
precedence = "aggregate"
SPDX-FileCopyrightText = " "
SPDX-License-Identifier = "CC-BY-4.0"
# Config: Makefiles, TOML, YAML, JSONC, dotfiles, and word lists. One
# glob covers all hand-authored infrastructure config.
[[annotations]]
path = [
"Makefile",
"**/*.mk",
"**/*.toml",
"**/*.yaml",
"**/*.yml",
"**/*.jsonc",
".editorconfig",
".gitignore",
".gitattributes",
".ignore",
"cspell-words.txt",
"REUSE.toml",
]
precedence = "aggregate"
SPDX-FileCopyrightText = " "
SPDX-License-Identifier = "MIT"
# Generated artifacts: lock files, pinned versions, tool output. CC0 is
# the honest framing for content the project does not originate.
[[annotations]]
path = [
"**/lake-manifest.json",
"uv.lock",
"poetry.lock",
"package-lock.json",
"yarn.lock",
"**/lean-toolchain",
"papers/*/main.tex",
"papers/submission-schedule.ics",
"references/cross-reference-*.json",
"references/cross-reference-frequency.md",
# repo-specific generated trees go here
]
precedence = "override"
SPDX-FileCopyrightText = "NONE"
SPDX-License-Identifier = "CC0-1.0"
# Structural placeholders.
[[annotations]]
path = ["**/.gitkeep"]
precedence = "override"
SPDX-FileCopyrightText = " "
SPDX-License-Identifier = "MIT"
# Include only if CODE_OF_CONDUCT.md exists and is Contributor-Covenant-derived.
[[annotations]]
path = ["CODE_OF_CONDUCT.md"]
precedence = "override"
SPDX-FileCopyrightText = " "
SPDX-License-Identifier = "CC-BY-SA-4.0"
# Include only when the reference collection exceeds the small-collection threshold.
[[annotations]]
path = [
"references/papers/**",
"references/extractions/**",
"references/transcriptions/**",
]
precedence = "override"
SPDX-FileCopyrightText = "Original authors and publishers"
SPDX-License-Identifier = "LicenseRef-Reference-Material"
Notes on the skeleton:
- Generated-group
SPDX-FileCopyrightText = "NONE"is the REUSE-blessed way to say "no copyright is asserted." Use it for lock files and tool output. Do not invent a fictional copyright line. - The config group uses
aggregate, notoverride, so a genuine per-file SPDX (rare but allowed) still wins. - Keep path lists alphabetized within each block when practical; they grow and unordered lists drift.
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: cboone
- Source: cboone/agent-harness-plugins
- License: MIT
- Homepage: https://github.com/cboone/agent-harness-plugins
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.