Skip to content

CLI reference ​

Every command, with its own --help and what it does. Inside a workspace, every command except create, upgrade, login and logout runs the version pinned in .rness/package.json, whichever rness you type.

Usage: rness [options] [command]

Configuration-plane CLI for rness workspaces

Options:
  -v, --version                       print the version
  -h, --help                          display help for command

Commands:
  context [options]                   Resolve and print the context for a scope
  status [options] [tab]              Show the status of every decision,
                                      specification and plan, a tab per
                                      directory
  validate [options]                  Check the .rness/ tree against the
                                      contract and every generated block
  sync [options]                      Write the rness block into every AGENTS.md
                                      of the cloned repositories
  pulse                               Show the agent's work on the
                                      organization's board
  mcp [options]                       Serve the workspace context to agents over
                                      MCP (stdio, read-only)
  add [options] <repo>                Clone (or adopt) a repository under org/
                                      and declare it in rness.json
  login [options]                     Log in to GitHub, to list and clone
                                      private repositories
  logout                              Forget the GitHub login of this machine
  upgrade|update [options] [version]  Move this workspace to another @rness/cli:
                                      pin it in .rness/package.json, install,
                                      sync
  create [options] [name]             Create or join a GitHub organization's
                                      workspace, or a blank one with --blank
  help [command]                      display help for command

rness create ​

Usage: rness create [options] [name]

Create or join a GitHub organization's workspace, or a blank one with --blank

Arguments:
  name               the GitHub organization, same as --org; with --blank, the
                     workspace directory

Options:
  --org <name>       the GitHub organization, exact name (github.com/<name>)
  --repos <list>     comma-separated repositories for your workspace (catalogue
                     entries are cloned, others added)
  --provider <name>  where the organization lives: github (gitlab, atlassian
                     later)
  --pm <name>        package manager for .rness/ (npm, pnpm, yarn, bun; default:
                     the one running this command)
  --ssh              force git@github.com: (default: SSH when it works, else
                     HTTPS)
  --https            force https://github.com/
  --blank            a local workspace with no GitHub organization: .rness/, an
                     empty org/, the root files
  --agent <name>     a new workspace's agent, declared in rness.json
                     (repeatable; supported: claude)
  --skip-install     do not install .rness/ dependencies
  -y, --yes          do not ask for confirmation
  --template <name>  reserved
  -h, --help         display help for command

create never runs inside a workspace. It creates <org>/ in the current directory, with the organization's exact name, and either scaffolds .rness/ (a new organization) or clones the existing <org>/.rness (joining). In a terminal it lists the organization's repositories to pick from, with every catalogue repository pre-selected when joining; picked repositories are cloned under org/, new ones are added to the catalogue. Without a terminal or with --yes, --repos is the selection, and a join without --repos clones the whole catalogue. Logged in, it offers to create the private <org>/.rness on GitHub and push. A cancelled prompt writes nothing and exits 0.

In a terminal, before the organization, it asks Where does your organization live?: GitHub, the one this version talks to; GitLab and Atlassian (Bitbucket + Jira) are listed, disabled. --provider github answers it off a terminal. The answer is written to rness.json as provider (the catalogue). A join asks too, then takes the provider the organization's rness.json names; --blank asks nothing.

Joining is served by the version the organization pinned, whatever copy you ran: create installs .rness/ and hands the first sync to it.

rness add ​

Usage: rness add [options] <repo>

Clone (or adopt) a repository under org/ and declare it in rness.json

Arguments:
  repo             <repo>, <owner>/<repo>, or a clone URL

Options:
  --scopes <list>  comma-separated sub-directories to declare as scopes
                   extending the repository
  --ssh            force git@github.com: (default: SSH when it works, else
                   HTTPS)
  --https          force https://github.com/
  -y, --yes        do not ask for confirmation
  -h, --help       display help for command

add clones the repository under org/ — or adopts a clone already there — and declares it in rness.json for the whole team: an entry in repos, a scope of the same name, and one scope per --scopes directory, each extending the repository. Names are lowercased. In a workspace that clones over SSH, a failing SSH test offers --https for that repository only.

rness sync ​

Usage: rness sync [options]

Write the rness block into every AGENTS.md of the cloned repositories

Options:
  --scope <name>  only this scope (the root block is skipped)
  --check         render and compare only; exit 1 when a block is out of date
  --pull          git pull --ff-only in every clean clone
  --all           clone every rness.json repository missing from org/
  --agent <name>  declare an agent in rness.json, then write its files
                  (repeatable; supported: claude)
  -y, --yes       do not ask for confirmation
  -h, --help      display help for command

sync renders the context of every scope and writes it into the AGENTS.md of your clones, as a block between <!-- BEGIN rness --> and <!-- END rness -->; the rest of each file is untouched. A CLAUDE.md holding @AGENTS.md is created next to it when there is none. In a terminal, catalogue repositories missing from org/ are offered for cloning first; with --yes or --check they are named on one not cloned: line instead. A clone rness.json does not know gets no block and a not in rness.json: line. --check writes nothing and exits 1 when a block is out of date — the command for a repository's CI. With agents declared in rness.json, it also writes the files those agents need (agent targets).

rness context ​

Usage: rness context [options]

Resolve and print the context for a scope

Options:
  --scope <name>  scope to resolve (default: the scope owning the current
                  directory)
  --json          print JSON instead of Markdown
  -h, --help      display help for command

context prints the resolved context — standards, ADRs, specifications, plans and skills — of one scope: the global files of each collection, the scope's own, and everything along its extends chain. Without --scope, the scope owning the current directory; at the workspace root, the global files only. --json prints the same as one object. No prompt, no network.

rness status ​

Usage: rness status [options] [tab]

Show the status of every decision, specification and plan, a tab per directory

Arguments:
  tab         open on this tab: adr, specs, plans, …

Options:
  -h, --help  display help for command

status shows where every decision, specification and plan stands: a tab for ADRs, one for specifications, one for plans, and one for each other directory of .rness/ whose Markdown files carry a status in their front matter; a line per document, newest first — its number or date, its title, its status. In a terminal it is a full-screen view: ←/→ or Tab change tab, ↑/↓, PgUp/PgDn and Home/End scroll, q or Esc closes and gives the screen back. Off a terminal — a pipe, CI, an agent's tool — it prints Markdown, a table per tab; rness status specs prints that one. It reads .rness/ and writes nothing. In Claude Code, /rness:status shows the tables (agent targets).

rness validate ​

Usage: rness validate [options]

Check the .rness/ tree against the contract and every generated block

Options:
  -h, --help  display help for command

validate checks .rness/ against its contract — rness.json, and the front matter and allowed statuses of every ADR, specification and plan — and, when org/ clones are present, every generated block: stale (its hash no longer matches a fresh render, or someone edited inside the markers) is a problem, missing is a warning. So is a value an agent target needs and a clone lacks. It warns when the scaffold merged in .rness is behind the pin. It runs alone in a checkout of .rness/, which is what the scaffold's CI workflow does. No prompt, no network.

rness mcp ​

Usage: rness mcp [options]

Serve the workspace context to agents over MCP (stdio, read-only)

Options:
  -h, --help  display help for command

mcp is a local MCP server, started by an agent over stdio — not a command to type. It reads the workspace's .rness/ and writes nothing. Four tools answer "what applies here" and "where was this decided":

ToolReturns
rness_context({ scope? })The scope of the working directory, or the one named, and what applies to it: standards, decisions, specifications and plans — id, status, title and path, no bodies.
rness_list({ collection, status? })Every document of a collection, across scopes, optionally of one status.
rness_read({ path })One file of .rness/, by its path there; 256 KiB at most, nothing outside .rness/.
rness_search({ query, collection? })The documents whose text matches, most matching first, with the matching lines.

.rness/ is read again on each call, so an edit shows at once. It speaks the MCP revision 2026-07-28 and the earlier ones that open with initialize (2025-11-25 back to 2024-11-05). For Claude Code, rness sync registers it in each repository (agent targets). Another agent can run the same command from a clone.

rness pulse ​

Usage: rness pulse [options] [command]

Show the agent's work on the organization's board

Options:
  -h, --help        display help for command

Commands:
  create [options]  Create the organization's Agent Pulse board and sync it
  sync [options]    Bring the board up to date with the documents of .rness/
  help [command]    display help for command

pulse shows the documents of .rness/, and the agent at work on them, in the organization's GitHub Projects: a project named Agent Pulse, a board per directory, each document an issue of <org>/.rness whose body is the document (Agent Pulse).

rness pulse create, once per organization, needs an org in rness.json — a blank workspace is refused — and no pulse declared yet. It creates the project and at once writes "pulse": { "project": <number> }, and the provider, into rness.json; then it adds the fields and the views and runs a first sync, its created line saying what it added. A step failing after the project exits 1 with the pulse declared: rness pulse sync completes the layout. Commit rness.json in .rness. A workspace with no provider whose repositories look like GitLab is refused before anything is created: write "provider": "github" if the organization is on GitHub.

Both need Issues on <org>/.rness. Without them they stop before writing anything, with:

text
the pulse needs Issues on <org>/.rness: turn them on in its Settings

rness pulse sync, as often as wanted, works in two passes. First each document gets its issue — created, or reopened — with its label and fields; then the bodies that changed are written, since a body links to other documents' issues. It archives the items whose document is gone and adds the option or the board a new status or directory needs. It says what it did to the issues, then to the items: created 1 issue, reopened 1 issue, synced 52 items: 1 created, 2 updated, 49 unchanged.

The synced line also counts the items it archived. On one of GitHub's rate limits it waits as GitHub says, and says so as it begins (waiting 60 s — GitHub's rate limit), 10 minutes at most in all; past that it stops with how many changes it did not make, and the next sync makes them.

Both also need a login with the project scope (rness login). Without one, create offers to log in, in a terminal; with -y or off a terminal, the pulse stops with the pulse needs a GitHub login: run rness login or the pulse needs the project scope: run rness login. A classic GITHUB_TOKEN works when it carries the scope; a fine-grained or GitHub App token reports no scope, and the pulse refuses it. When GitHub cannot be reached, it says so (cannot reach GitHub: …) instead of asking for a login.

rness upgrade ​

Usage: rness upgrade|update [options] [version]

Move this workspace to another @rness/cli: pin it in .rness/package.json,
install, sync

Arguments:
  version     an exact version (default: the latest release)

Options:
  -y, --yes   do not ask for confirmation
  -h, --help  display help for command

upgrade merges the target version's scaffold into .rness with git, pins the version in .rness/package.json, installs with the workspace's package manager, syncs through the new copy — the blocks and the agent files — then commits .rness (the scaffold, merged with git). The next steps say what is left: push .rness, and per repository the files the sync changed. A hook refusing the commit leaves everything staged, and upgrade exits 1. .rness must be clean, with no merge in progress. It is never delegated: the copy you ran is the one that upgrades. Teammates' next rness command installs the new pin itself.

rness login ​

Usage: rness login [options]

Log in to GitHub, to list and clone private repositories

Options:
  --setup-git     make rness git's credential helper for github.com
  --no-setup-git  do not ask about git
  -h, --help      display help for command

login connects rness to your GitHub account through GitHub's device flow — a code to approve at https://github.com/login/device, from any machine — so that create lists your private repositories and organizations, and clones over HTTPS carry the login. The login is one file under your config directory, readable by you only; the token lives 8 hours and is renewed on its own. GITHUB_TOKEN, then GH_TOKEN, win over it. --setup-git makes rness git's credential helper for github.com, for your own git pull and git push; it needs a global install.

It asks for the repo and read:org scopes, and for project too where the workspace declares a pulse, or when rness pulse create runs it: a developer who never uses the pulse grants nothing more. A login made before the pulse was declared lacks the scope: run rness login again. A provider written in rness.json that this version cannot talk to is refused.

rness logout ​

Usage: rness logout [options]

Forget the GitHub login of this machine

Options:
  -h, --help  display help for command

logout forgets the login of this machine and undoes the git credential helper. The authorization itself is revoked in GitHub's settings; the command prints the link.

Environment ​

VariableEffect
RNESS_NO_INSTALL=1After a pull that moved the pin, do not install it: warn and run the command anyway. For CI, a container image, a machine that cannot install.
RNESS_NO_DELEGATE=1Run the copy you invoked, never the pinned one.
RNESS_DEBUG=1Stack traces on errors, and a line naming the copy delegated to.
GITHUB_TOKEN, GH_TOKENUsed before the stored login, in that order: CI needs no rness login.
NO_COLOR=1, FORCE_COLOR=1Plain output, or coloured output through a pipe. Output through a pipe or in CI is plain by default.

Exit codes ​

CodeMeaning
0Success — including a prompt the user cancelled or declined.
1Failure: a handled error, a stale block under --check, a problem under validate.
2Bad usage — or a command that needs a terminal, run without one and without --yes.

Released under the MIT License. Analytics without cookies, by PostHog.