Intentline
Git-native intent ledger. Capture why a change exists, and get it back when you review, debug, or hand the repo to an agent.
Code is cheap to write. Understanding it is not.
The reason for a change dies in a chat or a head.
Reviewers reverse-engineer a clean diff, and the next session invents a history that was never true.
Intentline stores a small structured record next to the code, links it to the commit with a Intentline-Id trailer, and returns it at a file and line.
Status: v0.1.0. Not on PyPI yet.
Install
Intentline is not on PyPI yet. Install it from git:
uv tool install git+https://github.com/sabadia/intentline
After it is published:
uv tool install intentline
The optional MCP extra is uv tool install 'intentline[mcp]'. Core commands need no account and no API key.
Quickstart
cd your-repo
intentline init
intentline install-hooks
git add src/app.py
intentline capture --goal "Close invoices once a day."
intentline link <id>
git add .intentline
git commit -m "feat: close invoices once a day"
intentline why src/app.py:1
intentline capture --pending is the same mark as intentline link <id>. If you abort the commit after the hook runs, that mark is already gone; run intentline link <id> again.
Principles
- No invented why. Empty fields stay empty. Agents draft; humans affirm.
- Local-first. No account, no server, no API key on the core path.
- Git is the bus. Records are YAML in
.intentline/records/. The link is a commit trailer. - Small records. A screen, not an essay.
The product spec is docs/01-product-spec.md.
Limits
--amend-headtreats a commit as pushed when any of this clone's remote-tracking refs contain it. That check does not contact the network. On a detached HEAD, capture and link still work;--amend-headrefuses.- A shallow clone may miss older records.
intentline whysays so. - Intentline uses the repository you are in. Inside a submodule, that is the submodule, not the parent.
- On a deleted path,
whymay find nothing.intentline show <id>still prints the record. - In an empty repository, init and capture work.
whysays there are no commits yet and exits 0. - Two captures at once: the last write wins, and the ids do not collide.
- Records are committed with the code. Do not put secrets in goals. Intentline does not scan for them.
Exit codes
intentline --help lists them, from 0 ok through 9 not found. The contract is docs/03-schema-cli-hooks.md.
Docs
| Doc | What it is |
|---|---|
| CLAUDE.md | Operating manual for the coding agent |
| docs/00-handoff.md | How to start Claude Code on this package |
| docs/01-product-spec.md | Problem, users, scope, metrics |
| docs/02-architecture.md | Components, flows, trade-offs |
| docs/03-schema-cli-hooks.md | Schema, CLI, hooks, exit codes |
| docs/04-roadmap.md | Phases and issue catalog |
| docs/05-quality.md | Tests, CI, security, release bar |
| docs/06-github-protocol.md | Repo, board, catch-up, next-action rules |
| docs/07-agent-integrations.md | Skill, MCP, hooks, AGENTS.md — how any coding agent uses Intentline |
| docs/adapters/claude-code.md | Claude Code skill, MCP, and Stop hook |
| docs/adapters/other-agents.md | Codex, Cursor, Copilot, and the shell fallback |
Use from a coding agent
An agent recalls a reason, captures a draft, and checks that a large change has a record. It does not affirm. It does not invent rejected, assumptions, or falsifier.
intentline why path/to/file.py:88
intentline capture --goal "the user's goal" --file path/to/file.py --pending
intentline check
intentline install-agent copies one skill into the project and appends the managed block to AGENTS.md. If intentline is not on PATH, skills/intentline/scripts/why.sh exits 0 and prints No record: intentline is not on PATH. skills/intentline/scripts/capture.sh exits 127.
MCP is optional, local, and stdio-only. Install it with uv tool install 'intentline[mcp]'. The server does not affirm.
{
"mcpServers": {
"intentline": {
"command": "intentline-mcp"
}
}
}
Where that JSON goes: Claude Code and Codex, Cursor, Copilot, and other agents.
License
Apache License 2.0. See LICENSE.
Metadata
Release files for intentline 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| intentline-0.1.0.tar.gz | 239.6 kB | Without provenance | Details for intentline-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| intentline-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for intentline-0.1.0-py3-none-any.whl |
Total release size: 308.9 kB
Release files / intentline-0.1.0.tar.gz
| Download URL | intentline-0.1.0.tar.gz |
|---|---|
| Size | 239.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
407fa853050a5f9b14ed9b5f6e1936923c0a8fc365d71d076925b7daadf00046
|
|
BLAKE2b-256 checksum How to use checksums |
6fc6266c98e174d03db99d66a5db8383adc79a90ad5efad73212482551758261
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / intentline-0.1.0-py3-none-any.whl
| Download URL | intentline-0.1.0-py3-none-any.whl |
|---|---|
| Size | 69.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a93b173caf1980ddeab2b7f1ffc3770d81e81eef4d6a6c9c3ffb33fbbc5c13be
|
|
BLAKE2b-256 checksum How to use checksums |
2c2ad7aa1f324bf7333de380100e5395f446fdc41eb0b3df8f453c2f863f5a1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for intentline 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.