Skip to main content

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-head treats 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-head refuses.
  • A shallow clone may miss older records. intentline why says so.
  • Intentline uses the repository you are in. Inside a submodule, that is the submodule, not the parent.
  • On a deleted path, why may find nothing. intentline show <id> still prints the record.
  • In an empty repository, init and capture work. why says 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)

Source distribution for intentline 0.1.0
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)

Table of built distributions (wheels) for intentline 0.1.0
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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