rational-agnostic
Vendor-agnostic governance and traceability layer for AI coding agents: records decisions, tracks tasks, and anchors code back to its rationale via an MCP server and CLI.
Documentation
rational-agnostic
A vendor-agnostic, file-based governance & traceability layer for AI coding agents.
rational-agnostic sits above any agent framework (Claude Code, Codex, Cursor,
Copilot, Jules, β¦). It is the shared, durable record that agents of any vendor
read from and write to:
- π§ Decisions β every non-trivial choice is recorded as an ADR-style file explaining why (in English).
- π Traceability β every generated function carries a
// @why: D-xxxxtag; you can take a function, hash it, and find the decision behind it. - π€ Shared memory β a cross-vendor meeting point so agents don't lose context between sessions or between each other.
- β
Task state β one file per task + a status board, so everyone knows what's
doing,blockedordone. - π Learnings β the system distills recurring patterns from past decisions and code, and keeps improving.
- π― Token-aware context β
get_contextreturns a minimal relevant bundle within a token budget, instead of dumping history.
Everything is persisted in English, even when the user works in another language, so the knowledge base stays portable, searchable and diffable.
Design principle:
AGENTS.mddescribes how the system is structured and used β never what your project is about. Project rationale lives in the decision records.
Install
npm install -g rational-agnostic # or: npx rational-agnostic <command>
Quickstart
Every project starts with init, which scaffolds AGENTS.md, the
.rational-agnostic/ store, and wires every major AI agent (see
Zero-config agent wiring):
cd your-repo
rational-agnostic init # creates AGENTS.md + .rational-agnostic/
Already have a codebase? Run adopt (brownfield)
If the repo already had code before rational-agnostic, don't start from a blank slate β have it inventory what exists and lay out an onboarding plan. This is the recommended path for any non-empty project:
rational-agnostic init # 1. scaffold (adopt needs this first)
rational-agnostic adopt # 2. read-only inventory + plan:
# languages, manifests, entry points,
# largest/most-central files, tag coverage
rational-agnostic adopt --write # 3. persist an "as-built" baseline decision,
# open an adoption task, post a brief to
# shared memory β then point your agent here
Nothing breaks on day one: existing untagged code is allowed (verify only
flags @why tags that point to a missing decision, never legacy code). From
there you work the plan incrementally β largest/most central modules first β
recording a decision and tagging the code for each design choice you can infer.
Never invent rationale: if you can't tell why something exists, ask (append a
question to shared memory) instead of fabricating a decision.
MCP-capable agents have the same two steps as the
adopt_reportandstart_adoptiontools.
Record a decision and tag the code
Record a decision and tag the code it justifies:
rational-agnostic decision add \
--title "Use JWT for auth" \
--summary "Chose JWT over sessions for stateless scaling" \
--context "API must scale horizontally without sticky sessions" \
--decision "Short-lived JWT access tokens + refresh tokens" \
--why "Stateless tokens avoid shared session storage" \
--author agent:anthropic:claude-code --tags auth,security
# -> Created D-ea3ec7 β tag code with: // @why: D-ea3ec7
// @why: D-ea3ec7
function issueToken(user) { /* ... */ }
Find why a function exists β by location or by hash:
rational-agnostic why src/auth.js issueToken
printf '%s' "$(cat the-body)" | rational-agnostic hash # -> sha256
rational-agnostic why --hash <sha256>
Gate your commits with traceability:
rational-agnostic init --hook # installs a pre-commit `verify` gate
rational-agnostic verify # exit 1 on orphan tags / bad task status
Zero-config agent wiring
init doesn't just scaffold the data store β it wires every major AI agent for
you, so whoever runs npx rational-agnostic init gets a ready-to-use setup with
no manual MCP configuration. It generates (and safely merges into, never
clobbers) the file each client actually reads:
| Agent | MCP config written | Instructions file |
|---|---|---|
| Claude Code | .mcp.json (auto-discovered) | CLAUDE.md β AGENTS.md |
| Cursor | .cursor/mcp.json | AGENTS.md |
| Codex | .codex/config.toml | AGENTS.md |
| Gemini CLI | .gemini/settings.json | GEMINI.md β AGENTS.md |
| Copilot | .vscode/mcp.json | .github/copilot-instructions.md β AGENTS.md |
Open any of those agents in the repo and the MCP server + protocol are already in
place (restart the client once to load MCP; approve/trust it if prompted). Opt out
with rational-agnostic init --no-mcp.
The CLI needs none of this β every operation is also a command, so any agent
can use rational-agnostic with zero setup by running npx rational-agnostic β¦
straight from AGENTS.md. MCP is just a more token-efficient interface on top.
Connect an AI agent (MCP) manually
If a client wasn't auto-wired, add this stdio server to its config:
{
"mcpServers": {
"rational-agnostic": { "command": "npx", "args": ["-y", "rational-agnostic", "mcp"] }
}
}
The agent then sees 22 tools β get_context, search, record_decision,
tag_code, create_task, set_task_status, read_memory, append_memory,
record_learning, distill, verify, and more. Agents are told how to use them
by the generated AGENTS.md.
What gets stored
AGENTS.md generic manifest: how to use the package + where things live
.rational-agnostic/
config.json locale, canonical "en", embeddings provider, verify rules
decisions/ D-*.md one decision per file (Context / Decision / Why / Consequences)
tasks/ T-*.md one task per file
board.json status index
memory/ shared.md cross-agent shared memory
agents/*.md per-agent scratch
knowledge/ learnings.md accumulated learnings
conventions.md emergent conventions
index/ registry.json code anchor -> decision map (+ SHA for drift)
embeddings/ rebuildable semantic index (gitignored)
Semantic retrieval & tokens
Search and get_context use embeddings. Out of the box they run on a
deterministic lexical embedder with zero extra dependencies β nothing to
download, no network, no native binaries. For higher-quality semantic search you
can opt into a local, offline transformer model (Xenova/all-MiniLM-L6-v2,
no API key) by installing it yourself:
npm install @huggingface/transformers # optional; enables the local model
It is not a dependency on purpose: it pulls sharp/onnxruntime (~135 MB,
and the source of the libvips/libheif/librsvg advisories if you add it). When
absent, the lexical fallback keeps search working everywhere; when present, the
code detects and uses it automatically. The vector index is a rebuildable cache β
the markdown files are always the source of truth:
rational-agnostic search "how are auth tokens issued"
rational-agnostic context --task T-0001 --budget 1500
rational-agnostic reindex
Library
import { init, decisions, getContext, verify } from "rational-agnostic";
Documentation
A detailed, self-contained explainer (what was built, why, and how it works) is
in docs/how-it-works.html
β clone the repo and open it in a browser. Available in English (primary),
Spanish, Chinese and Japanese via the in-page language switcher.
Security & footprint
The default install is deliberately lean and npm audit reports 0
vulnerabilities β no native binaries, no install scripts, no network access at
install time:
- Heavy ML stack is opt-in.
@huggingface/transformers(and itssharp/onnxruntimesubtree, ~135 MB, which carried the libvips/libheif/librsvg advisories) is not declared as a dependency at all. The embedder loads it via a guarded, indirect dynamicimportonly if you install it yourself, so the default footprint stays ~27 MB and clean. - Small, trusted runtime deps.
commander(CLI, zero-dep),gray-matter(YAML frontmatter),proper-lockfile(safe cross-process writes),zodβ₯ 4.6.7 (schema validation, past the GHSA-mrhx-c7xc-m3w5 DoS) and the official@modelcontextprotocol/sdk. - Deliberately not reinvented. YAML frontmatter, cross-process locking and CLI parsing stay on their small, trusted libraries: a hand-rolled replacement would trade a negligible supply-chain reduction for real correctness risk (your decision records are hand-editable and must round-trip exactly).
Run npm audit any time to check the current state. Report a vulnerability via
the repo's issues.
License
MIT Β© Paco Aguilera