Menu The indra CLI

indra CLI

The indra CLI

One small binary: graph memory and an agent web console. Install and build it.

One small CLI for AI agent harnesses: a graph memory your agents (and you) can read and write, and a web console to view, monitor and run the agents themselves. One Rust binary for Linux, macOS and Windows, with no runtime, database, server or account to set up.

It is named for Indra's net (Indrajala): an endless net with a jewel at every knot, each jewel reflecting all the others. That is the memory model - everything links to everything - and Indra, king of the devas, is a fitting name for the thing that commands the agents.

CommandWhat it does
indra mem ...Graph memory: Markdown notes with typed [[links]], ranked recall that follows links, a terminal tree view. Obsidian-compatible.
indra serveWeb console: agents, skills and prompts (view and edit), graph maps, memory, live run monitoring, and launching agents with a live view of their subagents and tool calls.
indra ls, indra checkThe console's picture in the terminal, and a config check.
indra nodes, indra runAgents on this machine and on remote ones over SSH: node health, and multi-step workflows run in dependency order across them.
indra initA commented indra.toml for custom harnesses, runners and presets.
indra review, indra publish, indra mem record-runThe deterministic parts of a review: the PR review cache, local metrics, posting to GitHub, publish plans, recording a run into memory. See Review tooling.
indra skillsSync the skills mirror, or install the skills for Claude Code, Codex or opencode.

The security harness is the default profile, any Claude Code project is picked up automatically, and any other harness is a few lines of TOML.

Install

One line (picks the build for your machine, checks its SHA-256, puts it on your PATH):

curl -fsSL https://raw.githubusercontent.com/dmdhrumilmistry/indra/main/install.sh | sh   # Linux, macOS
irm https://raw.githubusercontent.com/dmdhrumilmistry/indra/main/install.ps1 | iex       # Windows (PowerShell)

Then indra serve --open. The installers also set up Tab completion for your shell. They take INDRA_VERSION=indra-v0.2.0 for a specific release, INDRA_INSTALL_DIR for another folder (default ~/.local/bin, or %LOCALAPPDATA%\Programs\indra), INDRA_AUTO_UPDATE=1 to turn on automatic updates, and INDRA_NO_COMPLETIONS=1 to skip completion.

Updates. indra update installs the newest release (--check only asks; --version picks one), checking its SHA-256. Once a day, when you use indra in a terminal, it looks for a new release in the background and the next command tells you, at most once a day. To have it install new releases by itself:

indra update --auto on    # off: back to just telling you

The check runs at most once a day, in a detached indra update --background, never slows a command down, and also runs every few hours inside a long-running indra serve (the console's version shows when a new one is out; an automatic update takes effect when indra serve restarts). INDRA_NO_UPDATE_CHECK=1 turns checks off entirely, and they are off under CI and for the remote side of a node. What it knows is in <data dir>/update.json.

Tab completion. The installers set it up; by hand:

indra completions --install          # your shell (bash, zsh, fish, PowerShell)
indra completions zsh > _indra       # or print the script for a shell and place it yourself
indra completions --uninstall        # undo

For bash, zsh and PowerShell, --install writes the script under indra's data directory and one marked block (# >>> indra completions >>>) in ~/.bashrc, ~/.zshrc or $PROFILE that loads it; fish gets ~/.config/fish/completions/indra.fish. indra update refreshes the script, so new commands complete after an update.

Prebuilt, by hand: download indra-<target> from an indra-v* release (each file has a .sha256, and SHA256SUMS lists them all), rename it to indra (indra.exe on Windows) and put it on your PATH. Builds exist for Linux (x86_64 and arm64, static, any distro), macOS (Apple silicon and Intel) and Windows (x86_64).

One binary for every role. The console (indra serve) and a machine that runs agents for it (indra node connect, or plain SSH) are the same file, like gh or docker: one download, one version to keep in step, no mismatched pieces.

From source (any platform with Rust 1.89+):

cargo install --locked --git https://github.com/dmdhrumilmistry/indra indra
# or, from a clone:
cargo install --locked --path tools/indra

Review tooling

The deterministic parts of a review are subcommands of the same binary, so the indra plugin's skills need no interpreter on any platform:

CommandWhat it does
indra mem record-run <run_dir>Record a finished run's verified.jsonl into memory: findings, false positives as learnings, class and file hubs, chains-with links. A finding seen again (by fingerprint) gets a "seen again" line. Never copies evidence, payloads or secrets. --dry-run prints the indra mem commands instead.
indra publish plan <run_dir> --to jira|github|confluence|notionThe exact records to publish, with indra-fingerprint: markers for de-duplication; refuses if evidence or a payload would leak into one.
indra review cache --skills <dir> get|put|changed|stat|prune|clear|key|kb-versionThe PR review cache. Keys hash every sh-kb-* knowledge base, the skill version and the model, and it fails closed: a stale "clean" never suppresses a finding.
indra review metrics start|event|finish|report|path|purgeLocal-only run metrics (tokens, duration, model, cache reuse) in append-only JSONL; credentials are redacted before they are written.
indra review post --repo R --pr N --payload P --verdict VPost the review and set the commit status through gh, recovering a 422 by moving comments into the body, and never leaving the status at pending.
indra skills sync [--check], indra skills install --to agents|claude|opencodeKeep the repository's skills/ mirror current, or install the skills where an agent looks for them.

Maintainer commands: indra dev site builds the website (site/ plus the docs pages listed in site/pages.toml, rendered from the Markdown, with a broken-link check), and `indra dev dashes [--fix]` finds em and en dashes.

The same, from the console

Every one of these is also in indra serve, calling the same code, so the command line and the console always agree:

Writes are refused when the console is read-only; previews and dry runs are not. Posting runs gh as you, on the machine running indra serve, after you confirm.

CallSame as
GET /api/run/actions?key=what the run supports, its repository and PR
POST /api/run/record {key, dry_run}indra mem record-run
POST /api/run/publish {key, to, min_severity, statuses, max}indra publish plan
POST /api/run/post {key, repo, pr, dry_run, no_status}indra review post
POST /api/pr-review {pr, target, profile, tier, deep, fail_on, dry_run}starts /sh-pr-review
GET /api/run/findings, POST /api/run/triage, GET /api/run/comparetriage and comparison (see the guide)
GET /api/toolsindra review cache stat, indra review metrics report, indra skills sync --check
POST /api/tools/cache {action: prune|clear, max_age_days, repo}indra review cache prune|clear
POST /api/tools/metrics/purge {older_than_days}indra review metrics purge
POST /api/tools/skills/sync, POST /api/tools/skills/install {to, scope, target}indra skills sync, indra skills install
POST /api/tools/site, GET /api/tools/dashesindra dev site, indra dev dashes

Development

cd tools/indra
cargo test            # unit tests, API security tests, end-to-end tests of `indra mem`,
                      # and orchestration over SSH (with a stand-in ssh client)
cargo clippy --all-targets -- -D warnings
cargo fmt --check
cargo run -- serve --target /path/to/project

src/mem/ is the memory engine, src/deck/ the console, ui/ its front end (plain JavaScript, embedded at build time), src/review.rs, src/publish.rs and src/mem/record.rs the review tooling, src/skills.rs and src/site.rs the maintainer tools. The tests start stand-in agents written in Python, so cargo test needs python3 on Unix; nothing that ships does. Dependencies: axum, tokio, clap, serde, serde_json, toml, getrandom (and libc on Unix).

MIT licensed, like the rest of this repository.