Skip to main content

Intendant

Multi-stack project governance framework — handbook + auditor + scaffolder + portfolio report.

Intendant materializes project management standards (workflows, CI, releases, quality, security, architecture) in a form that is both human-readable (handbook + ADRs) and machine-executable (CLI). A single .intendant.toml at a repo root tells the auditor which stack applies and which rules are exempted; the scaffolder bootstraps a fully compliant repo from scratch.

Status

Stable (see CHANGELOG). 84 rules across 7 stacks (python, claude-skill, node, rust, go, swift, dotnet), 795 tests. Multi-language sub-projects supported via [[subprojects]] in .intendant.toml (see Multi-stack repositories). The intendant CLI ships init, audit, explain, new, report, doctor, and mcp (optional MCP server for agents).

Installation

# PyPI / uv tool (recommended)
uv tool install intendant

# Editable from source
uv tool install --editable <path-to-clone>

Quickstart

Adopt intendant on an existing repo

cd <your-repo>
intendant init           # writes .intendant.toml and docs skeleton
intendant audit .        # human report

Audit a single repo

intendant audit .                          # full report, human-readable
intendant audit . --severity=required      # exit 1 on required failures
intendant audit . --format=json            # for CI or scripting
intendant audit . --format=md              # for PR comments
intendant audit . --fix --dry-run          # preview auto-fixes
intendant audit . --fix                    # apply auto-fixes

Bootstrap a new project

# Python package
intendant new my-lib --stack=python --description="..." --author="..."

# Claude Code skill
intendant new my-skill --stack=claude-skill --description="..."

# Node package
intendant new my-pkg --stack=node --description="..."

# Rust crate
intendant new my-crate --stack=rust --description="..."

# Go module
intendant new my-svc --stack=go --description="..."

# Swift (SwiftPM library, package + Sources + Tests + swiftlint + CI)
intendant new my-pkg --stack=swift --description="..."

# .NET (C# library, csproj + xunit test project + .editorconfig + CI)
intendant new my-lib --stack=dotnet --description="..."

# After scaffolding
cd my-lib
uv sync && uv run pre-commit install
intendant audit . --severity=required      # should exit 0

Multi-stack repositories

A repo can host several sub-projects in different languages. Declare each one via [[subprojects]] in .intendant.toml:

[intendant]
version = "1"
enforcement = "strict"

[[subprojects]]
name = "backend"
path = "services/api"
stack = "python"

[[subprojects]]
name = "frontend"
path = "apps/web"
stack = "node"
role = "frontend"   # presentation-only: test-presence rules auto-skip

[[subprojects]]
name = "agent-skill"
path = "skills/triage"
stack = "claude-skill"

Each sub-project is audited independently — only transverse rules and its own stack's rules apply. Exemptions can be scoped to a single sub-project with [exemptions.<name>]:

[exemptions.backend]
PYTHON_QU002 = "Ruff config inherited from monorepo root, not duplicated here"

For single-stack repos, prefer auto-detection (omit stack) or pin once with [intendant] stack = "<name>". See the Multi-stack handbook page for the resolution model, field constraints, and scoped-exemption semantics.

Cross-repo portfolio report

intendant report <portfolio-root>               # human table
intendant report <portfolio-root> --format=json # machine-readable
intendant report <portfolio-root> --save-snapshot
intendant report <portfolio-root> --diff        # compare to last snapshot
intendant report <portfolio-root> --against snapshots/2026-04-01.json

Inspect a rule

intendant explain PYTHON_LO001       # handbook entry + linked ADR
intendant explain --all              # table of all 84 rules

Health check

intendant doctor     # verify install integrity

Coverage

84 rules total. Transverse rules apply to every stack; adapter rules apply only to the declared stack.

Transverse (25 rules)

Family Prefix Count Examples
Docs & governance DG 6 README, CLAUDE.md, ADRs, LICENSE, specs local-only, fresh version claims
Layout LO 2 docs/ directory, orphan nested stack roots
Releases RL 6 CHANGELOG, conventional commits, release-please, SemVer, branch protection, App-token release
CI CI 4 workflow present, commit-msg check, caching, SHA-pinned actions
Quality QU 1 configured tools actually run in CI
Sanitizing SA 5 pre-commit baseline, gitleaks, .env.example, .gitignore, update automation
Tests TS 1 regression_tests/ (when applicable)

Python adapter (14 rules — prefix PYTHON_)

Covers layout (PYTHON_LO), packaging (PYTHON_PK), quality (PYTHON_QU), and tests (PYTHON_TS).

Claude Skill adapter (8 rules — prefix CLAUDE_SKILL_)

Covers SKILL.md presence and frontmatter, evals/, referenced directories, and README install path.

Node adapter (8 rules — prefix NODE_)

Covers packaging (NODE_PK), quality (NODE_QU), tests (NODE_TS), CI (NODE_CI), and sanitizing (NODE_SA).

Rust adapter (8 rules — prefix RUST_)

Covers packaging (RUST_PK: Cargo.toml/lock, edition), quality (RUST_QU: toolchain pin), tests (RUST_TS: #[test] annotations), CI (RUST_CI: cargo fmt/clippy/test), and sanitizing (RUST_SA: target/ in .gitignore, cargo-deny/cargo-audit scanning).

Go adapter (7 rules — prefix GO_)

Covers packaging (GO_PK: go.mod/go.sum, go directive), quality (GO_QU: golangci-lint config), tests (GO_TS: *_test.go with func Test*), CI (GO_CI: vet/build + test + lint), and sanitizing (GO_SA: *.test in .gitignore).

Swift adapter (7 rules — prefix SWIFT_)

Covers packaging (SWIFT_PK: Package.swift/.resolved, swift-tools-version), quality (SWIFT_QU: swiftlint/swiftformat config), tests (SWIFT_TS: Tests/**/*.swift with func test*/XCTestCase/@Test), CI (SWIFT_CI: swift build/test + lint), and sanitizing (SWIFT_SA: .build/ and xcuserdata/ in .gitignore).

.NET adapter (7 rules — prefix DOTNET_)

Covers packaging (DOTNET_PK: .csproj with TargetFramework, packages.lock.json), quality (DOTNET_QU: nullable reference types, .editorconfig), tests (DOTNET_TS: xunit/NUnit/MSTest test project), CI (DOTNET_CI: dotnet format/build/test), and sanitizing (DOTNET_SA: bin/ and obj/ in .gitignore).

Rule IDs were renamed in v0.2.0 (e.g. LO001 → PYTHON_LO001). See docs/migrations/0.2.0-rule-prefix-rename.md to update .intendant.toml exemptions.

MCP server

Intendant ships an optional MCP server so any MCP-compatible agent (Claude Code, Claude Desktop, Cursor, …) can query governance state directly.

Install with the extra:

uv tool install 'intendant[mcp]'

Then register the server in your MCP client. Example for Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "intendant": {
      "command": "intendant",
      "args": ["mcp"]
    }
  }
}

Five tools are exposed: audit_repo, explain_rule, list_rules, report_portfolio, diff_portfolio. All return JSON-serializable payloads matching the schemas of the corresponding CLI commands.

Documentation

Roadmap

Future paliers: portfolio polish, additional adapters as needed.

License

MIT — see LICENSE.

Release files for intendant 4.1.0

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

Source distribution (sdist)

Source distribution for intendant 4.1.0
File Size Uploaded
intendant-4.1.0.tar.gz 248.4 kB Details

Built distribution (wheel)

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

Total release size: 432.6 kB

Release files / intendant-4.1.0.tar.gz

Download URL intendant-4.1.0.tar.gz
Size 248.4 kB
Tags Source
SHA-256 checksum
How to use checksums
dd8c5ad0ab52ea95d903cc2fd86c84cb5171da3cb7b6ea1d8aca1167c56efc0b
BLAKE2b-256 checksum
How to use checksums
12a332923168a2ca797329519de2984c4a2317fbe03abbbf3c42ef65a2f2823a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 12, 2026.

Transparency log

Release files / intendant-4.1.0-py3-none-any.whl

Download URL intendant-4.1.0-py3-none-any.whl
Size 184.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
20601a6ca1f5fbaac8a8272e62142b5bbbf8d51477fd24f2822aa9e3a18d2a76
BLAKE2b-256 checksum
How to use checksums
b4b4d9c2ad9294cc35412574242bfe0f4b5ad1b77a953962ef7c1175981746bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 12, 2026.

Transparency log

Release history Release notifications | RSS feed

4.1.1

2 release files

This release

4.1.0 This release

2 release files

4.0.3

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

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