Multi-stack project governance framework
Project description
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
v4.0.0 — stable. 70 rules across 6 stacks (python, claude-skill, node, rust, go, swift),
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="..."
# 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"
[[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 70 rules
Health check
intendant doctor # verify install integrity
Coverage
70 rules total. Transverse rules apply to every stack; adapter rules apply only to the declared stack.
Transverse (19 rules)
| Family | Prefix | Count | Examples |
|---|---|---|---|
| Docs & governance | DG |
5 | README, CLAUDE.md, ADRs, LICENSE, specs local-only |
| Layout | LO |
1 | docs/ directory |
| Releases | RL |
5 | CHANGELOG, conventional commits, release-please, SemVer, branch protection |
| CI | CI |
3 | workflow present, commit-msg check, caching |
| Sanitizing | SA |
4 | pre-commit baseline, gitleaks, .env.example, .gitignore |
| 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 (7 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).
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).
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.tomlexemptions.
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
- Handbook — charter + all 70 rules with rationale.
- Multi-stack repositories —
[[subprojects]]syntax and scoped exemptions. - ADRs — justified architecture decisions.
- Migrations — upgrade guides between major versions.
Roadmap
Future paliers: portfolio polish, additional adapters as needed.
License
MIT — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file intendant-4.0.2.tar.gz.
File metadata
- Download URL: intendant-4.0.2.tar.gz
- Upload date:
- Size: 224.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b1728e90d02526c60acaebcddc552a6513bda8bfdc876803f68bf3fb09e0c21
|
|
| MD5 |
5fa17d5f665e478fad3e46011a1b8387
|
|
| BLAKE2b-256 |
2b58f2759c14366da2a039bdeae261136deb0df9bea8de944251562635bde4ab
|
Provenance
The following attestation bundles were made for intendant-4.0.2.tar.gz:
Publisher:
release-please.yml on dgrauet/intendant
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
intendant-4.0.2.tar.gz -
Subject digest:
0b1728e90d02526c60acaebcddc552a6513bda8bfdc876803f68bf3fb09e0c21 - Sigstore transparency entry: 1680774579
- Sigstore integration time:
-
Permalink:
dgrauet/intendant@8d145141f145f790029d5a107b3cadf7aebdf0ff -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dgrauet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-please.yml@8d145141f145f790029d5a107b3cadf7aebdf0ff -
Trigger Event:
push
-
Statement type:
File details
Details for the file intendant-4.0.2-py3-none-any.whl.
File metadata
- Download URL: intendant-4.0.2-py3-none-any.whl
- Upload date:
- Size: 105.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c569760269eb3ab9ceca1356f88ad0d7e635baa25847cc22018af84fe24ccc8f
|
|
| MD5 |
52492fe6cd987b9967cb3152e20d2cac
|
|
| BLAKE2b-256 |
ed39aa72c3134fb4c847182c1ddbe2066bd4485cbd1c9c89f3968327d3cda5a8
|
Provenance
The following attestation bundles were made for intendant-4.0.2-py3-none-any.whl:
Publisher:
release-please.yml on dgrauet/intendant
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
intendant-4.0.2-py3-none-any.whl -
Subject digest:
c569760269eb3ab9ceca1356f88ad0d7e635baa25847cc22018af84fe24ccc8f - Sigstore transparency entry: 1680774639
- Sigstore integration time:
-
Permalink:
dgrauet/intendant@8d145141f145f790029d5a107b3cadf7aebdf0ff -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dgrauet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-please.yml@8d145141f145f790029d5a107b3cadf7aebdf0ff -
Trigger Event:
push
-
Statement type: