RAC — lint and diff product requirements written in Markdown.
Project description
Requirements as Code
Treat product knowledge like source code.
RAC is a command-line tool for managing requirements, decisions, roadmaps, prompts, and design artifacts as plain Markdown, right inside your Git repository.
pip install requirements-as-code
What is RAC?
The code is structured, the tests are automated, the infrastructure is versioned — but the reasoning behind what you build is scattered across documents, tickets, chats, and AI conversations. RAC brings that knowledge back into the repository.
You write product thinking in Markdown; RAC validates it, inspects it, and connects it — so it stays durable, reviewable, and usable as context for both humans and AI. No proprietary formats, no hosted platform, no lock-in.
Who is it for?
- Software and product teams who want the why behind their software versioned alongside the code.
- AI-native teams who need structured, durable context instead of more scattered chat history.
Install
Requires Python 3.11+.
pip install requirements-as-code
# or
uv tool install requirements-as-code
Quick Start
rac validate requirement.md # check one artifact
rac validate rac/ # check every artifact in a directory
rac inspect requirement.md # see its type and completeness
rac stats rac/ # summarize a directory of artifacts
rac review rac/ # full repository review, worst problems first
New to RAC? Walk through your first artifact in five minutes: docs/quickstart.md.
Supported Artifact Types
- Requirements — what needs to exist
- Decisions — why choices were made (ADRs)
- Roadmaps — where the product is heading
- Prompts — reusable AI collaboration patterns
- Designs — product experience thinking
Everything stays plain Markdown — see docs/artifacts.md.
Documentation
- Quickstart — install and try RAC in five minutes
- CLI reference — every command, flag, and exit code
- Artifact types — the five types and their sections
- Relationships — link artifacts and validate the links
- Repository workflow — organize a repo with RAC
- Testing & contributing — local setup and verification
- Examples — small, realistic artifacts
How RAC earns trust
RAC asks you to trust it with your product knowledge, so it holds itself to the same standard it applies to your repository:
- It dogfoods itself. RAC's own planning corpus under
rac/is validated by RAC in CI (rac validate rac/,rac relationships rac/ --validate,rac review rac/) — if the tool's rules break the tool's own artifacts, the build fails. - Output is a contract. Golden tests pin the CLI's human and JSON output byte-for-byte; any change to what RAC prints is reviewed as a product change.
- JSON is versioned. Machine-readable output carries a
schema_versionand only changes additively.
Project Status
RAC is early and evolving quickly. A terminal Explorer for browsing your knowledge base is planned. Contributions, ideas, and experiments are welcome — see CONTRIBUTING.md.
License
MIT
Project details
Release history Release notifications | RSS feed
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 requirements_as_code-0.7.13.tar.gz.
File metadata
- Download URL: requirements_as_code-0.7.13.tar.gz
- Upload date:
- Size: 968.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a641355d2c6a60dc4f109ae0c72b0b4c82f1f90dc0df0c7ef8905610a6c952c0
|
|
| MD5 |
daaaa210540d110a4b387cd6cf952fc6
|
|
| BLAKE2b-256 |
ebef9c492ff495ba59147da99ccbb765758db8a5008575b907f5a3228e6bc18f
|
Provenance
The following attestation bundles were made for requirements_as_code-0.7.13.tar.gz:
Publisher:
python-publish.yml on tcballard/requirements-as-code
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
requirements_as_code-0.7.13.tar.gz -
Subject digest:
a641355d2c6a60dc4f109ae0c72b0b4c82f1f90dc0df0c7ef8905610a6c952c0 - Sigstore transparency entry: 1771396591
- Sigstore integration time:
-
Permalink:
tcballard/requirements-as-code@947d078b2729648070521efb48f0d180c7569e10 -
Branch / Tag:
refs/tags/v0.7.13 - Owner: https://github.com/tcballard
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@947d078b2729648070521efb48f0d180c7569e10 -
Trigger Event:
release
-
Statement type:
File details
Details for the file requirements_as_code-0.7.13-py3-none-any.whl.
File metadata
- Download URL: requirements_as_code-0.7.13-py3-none-any.whl
- Upload date:
- Size: 91.0 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 |
2856496362ae901c2684a4951e53d83bcfa47ea8e844898df36f7f63bd4b2dd6
|
|
| MD5 |
07de124dedfb1df88cf36d3a3b3565c8
|
|
| BLAKE2b-256 |
b88328291fbb064d6d577bfb8e26d664f0a15bcaa87c51cd87963e9c5f09d0e5
|
Provenance
The following attestation bundles were made for requirements_as_code-0.7.13-py3-none-any.whl:
Publisher:
python-publish.yml on tcballard/requirements-as-code
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
requirements_as_code-0.7.13-py3-none-any.whl -
Subject digest:
2856496362ae901c2684a4951e53d83bcfa47ea8e844898df36f7f63bd4b2dd6 - Sigstore transparency entry: 1771396684
- Sigstore integration time:
-
Permalink:
tcballard/requirements-as-code@947d078b2729648070521efb48f0d180c7569e10 -
Branch / Tag:
refs/tags/v0.7.13 - Owner: https://github.com/tcballard
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@947d078b2729648070521efb48f0d180c7569e10 -
Trigger Event:
release
-
Statement type: