Skip to main content

Ownerloom

Coverage

Keep CODEOWNERS readable as your repository grows. Ownerloom groups literal paths by directory, removes redundant rules, and preserves the order that decides who owns each path. One Python package replaces copied formatting scripts across projects.

Table of contents

Quick start

With Python 3.12+ and Git available, run inside your existing repository:

python -m pip install ownerloom
ownerloom --check
ownerloom --write
git diff -- .github/CODEOWNERS

Review and stage the result yourself. Ownerloom never commits, pushes or changes repository permissions. Python 3.14.1 is excluded by the NetworkX dependency.

Why Ownerloom

  • Readable policy: keep related directories together without moving an override ahead of the rule it overrides.
  • Conservative changes: preserve comments, GitLab sections, wildcard rules and unfamiliar syntax as boundaries. Retained syntax still needs provider validation.
  • Reviewable automation: check the exact committed file and tree before push, rather than allowing an unstaged fix to mask stale committed policy.
  • Reusable integration: the same typed library powers the CLI, pre-commit and CI. Normal compilation is offline and does not execute repository hooks or source.

Examples

These examples use tracked paths and placeholder team handles. Expand each case to see the policy before and after compilation.

1. Keep shared ownership clear while retaining a team's override

The platform team owns pkg/, the API team owns pkg/api/, and the docs team owns docs/. Repeated file rules scatter those responsibilities across the file. The tracked paths are pkg/core.py, pkg/api/routes.py, pkg/api/models.py and docs/usage.md.

Before: seven rules

/pkg/api/routes.py @acme/api
/docs/usage.md @acme/docs
/pkg/ @acme/platform
/pkg/core.py @acme/platform
/pkg/api/ @acme/api
/docs/ @acme/docs
/pkg/api/models.py @acme/api

Run ownerloom --write.

After: three rules

/docs/ @acme/docs
/pkg/ @acme/platform
/pkg/api/ @acme/api

Reviewers can see each team's scope together. The API override stays after the broader package rule, so it still wins. Existing directory rules already cover new files; removing the repeated file rules does not change that policy.

2. Give a complete component one maintainable ownership rule

The payments team owns every tracked file in pkg/billing/: invoice.py, refunds.py and tax.py. The catalog team separately owns pkg/catalog/search.py. The teams agree that future billing files should also belong to payments.

Before: four rules

/pkg/billing/tax.py @acme/payments
/pkg/catalog/search.py @acme/catalog
/pkg/billing/invoice.py @acme/payments
/pkg/billing/refunds.py @acme/payments

Run ownerloom --write --consolidate.

After: two rules

/pkg/billing/ @acme/payments
/pkg/catalog/search.py @acme/catalog

A new billing module now inherits the team's ownership without another file rule. This is an explicit policy choice: --consolidate checks complete, uniform tracked coverage and introduces ownership for future files in the new directory scope. Normal --write does not introduce that scope. Review it with the affected teams.

Architecture

flowchart LR
    A[CODEOWNERS text] --> C[Literal runs and opaque boundaries]
    B[Tracked Git inventory] --> C
    C --> D[Remove shadowed and inherited rules]
    D --> E[Precedence DAG]
    E --> F[Deterministic tree order]
    F --> G[Compilation result]
    G --> H[Check or atomic write]
    classDef input fill:#829B85,stroke:#647D8B,color:#243746
    classDef pass fill:#C4AC70,stroke:#647D8B,color:#243746
    class A,B input
    class C,D,E,F,G,H pass

The pure compiler accepts explicit text and paths. The CLI owns Git reads and atomic writes. NetworkX orders the precedence graph; it does not interpret provider policy. See the compiler contract for supported syntax, consolidation and failure behavior.

Inputs and results

Input Default Purpose
--repo PATH Current directory Existing repository root
--file PATH .github/CODEOWNERS Relative ownership file; select GitLab's path explicitly
--check Required choice Report whether selected text is normalized
--write Required choice Atomically replace working text; never stage it
--revision REV Index inventory and working text Check committed text and its tree together; check mode only
--consolidate Off Explicitly combine complete uniform subtrees, including future files

Exit status is 0 for normalized or written content, 1 for formatting drift, and 2 for invalid inputs or operational errors. Runtime use requires no credentials. Release jobs use the repository secrets PYPI_API_TOKEN, COSIGN_PRIVATE_KEY and COSIGN_PASSWORD, plus the trusted COSIGN_PUBLIC_KEY_SHA256 variable. GitHub supplies the repository, source SHA, tag and job token. See release setup for these administrator-managed inputs.

from ownerloom import compile_owners

result = compile_owners("/z @team\n/a @team\n", frozenset({"a", "z"}))
assert result.text == "/a @team\n/z @team\n"

Integrations and development

Use the pre-commit and migration guide to replace local copies. Keep a provider-aware syntax/path linter alongside Ownerloom; formatting does not establish account eligibility or enforce required reviews.

See contributing, security reporting, development, release verification, CI permissions, and the portable SKILL.md (browse online). The implementation follows RFC #94.

License and provenance

The runtime compiler is Apache-2.0, copyright Astrivant LLC. The extraction manifest binds its source to Polyad's merged compiler and records the owner's licensing choice. Development helpers retain their separate notices; they are excluded from the wheel.

Metadata

Release files for ownerloom 0.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ownerloom 0.0.3
File Size Uploaded
ownerloom-0.0.3.tar.gz 17.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ownerloom 0.0.3
File Interpreter ABI Platform
ownerloom-0.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 37.4 kB

Release files / ownerloom-0.0.3.tar.gz

Download URL ownerloom-0.0.3.tar.gz
Size 17.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a0abac62fe2202f01f6ba6feaf741846294e41b8a51eea920c4d72fb3a782d19
BLAKE2b-256 checksum
How to use checksums
461a1c405f91c30b2ac3a91a5a76414c85161ffc1a452b1f4b53762029b71c7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ownerloom-0.0.3-py3-none-any.whl

Download URL ownerloom-0.0.3-py3-none-any.whl
Size 20.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d936f7579fa396fea71ee52282cbbe6b827174b9222a266eb3c207f295cf31a8
BLAKE2b-256 checksum
How to use checksums
64c9d5bc380881a559811156059a36d21784fcf46badd409fa5630ee07c1d777
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release history Release notifications | RSS feed

This release

0.0.3 This release

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page