Docs · Coding agents
Claude Code, Gemini CLI, Cursor, Copilot and Codex each read a memory file in your repo. nura sync writes one managed block into those files from your Nura memory, and reads back what changed. Your commits can close plans too. Every agent reads the same open plans and decisions, and nothing changes in Nura without evidence.
Start
nura login # sign in (opens your browser)
nura --project Atlas sync # link the repo to a project (name or id); reconcile, render, stamp
nura sync is one command. It reads what changed since the last sync and closes plans on evidence, writes the block, and stamps the lines that name a record. The first run in a terminal also sets up the repo. If the repo has no agent file, it asks which agent you use and creates that file. When it finishes, it offers to install the hooks.
The repo remembers its project, so later syncs and the hooks need no --project. A repo that isn't linked to a project refuses and says how to link it. It never falls back to your personal memory on its own. To sync your personal memory on purpose, run nura sync --personal; that block goes to .nura/personal.md, never to a tracked file. These need nura 0.3.2 or later; see the nura CLI to install or upgrade.
The managed block
nura sync writes the block into the agent files the repo already has. It does not create one outside the first-run prompt. To write to a file the repo doesn't have yet, name it with --files, for example nura sync --render --files AGENTS.md.
| Agent | File |
|---|---|
| Claude Code | CLAUDE.md |
| Codex | AGENTS.md |
| Gemini CLI | GEMINI.md |
| Cursor | .cursor/rules/nura.mdc |
| GitHub Copilot | .github/copilot-instructions.md |
The block sits between two markers. Text outside the markers belongs to you:
<!-- nura:begin v1 scope=project:harbor rendered=2026-09-30T14:02Z sig=65359b267778 -->
## Nura — project:harbor (generated; do not edit inside this block)
…
### Open plans
- [ ] Rotate the Stripe keys · owner: priya · due 2026-10-03 · nura:pl_8f3a1c2e
- [ ] Ship the pricing page · owner: marco · blocked on the copy · nura:pl_51d0b7aa
### Pending decisions
- Auth provider for the mobile app — options on record, no decision · nura:dc_0c44e9f1
### Decisions (current)
- Postgres over Mongo (2026-09-12) · nura:dc_7a91bbbb
<!-- nura:end -->
nura:<bucket>_<8hex>. For example, nura:pl_… is a plan and nura:dc_… is a decision. The stamp is how a change in the file finds its record.owner: priya), never as @-handles. Gemini CLI treats an @ word in GEMINI.md as a file to import. Work you assigned to Nura reads owner: assistant.N more — nura search --scope …..nura/personal.md, never to a tracked file. The .nura/ folder is excluded through .git/info/exclude.Closing a plan
A plan closes in Nura in one of three ways:
Rotate Stripe keys
Nura-Closes: nura:pl_8f3a1c2e
Nura-Closes: <id> closes the plan. Nura records the commit as the evidence and credits the person who committed it.Nura-Ref: <id> links the commit to the plan without closing it.Nura-Reopens: <id> reopens a closed plan.nura sync · advanced
nura sync --render # only write the block; no reconcile, no stamps
nura sync --reconcile # only read the files' edits and the commits since the last sync
nura sync --dry-run # show what would change; write nothing
nura sync --audit # match every line in the agent files to Nura; writes nothing
nura sync --files CLAUDE.md # only these files (globs work)
nura sync --undo # remove the block and every id sync added; Nura is not changed
--reconcile prints a receipt with one line per change. For example:
nura sync --reconcile
close Rotate the Stripe keys — via commit 13c88498 · avery.lin@example.com
already done: Ship the pricing page
refused nura:pl_deadbeef: unknown
candidate (not applied): done with the copy review
Use --dry-run to see the same receipt as would close … lines with nothing written. For scripts and CI, put --json before the command: nura --json sync --reconcile. --quiet prints nothing, which is what the hooks use.
nura hooks
nura hooks install # add the hooks to this repo
nura hooks doctor # list what's installed and when the last sync ran
nura hooks uninstall # remove them
post-commit, post-merge and post-checkout run nura sync --quiet. prepare-commit-msg suggests a Nura-Closes: trailer when the files you've staged share words with an open plan's title. The suggestion is a comment, so git drops it unless you uncomment it. Nothing is added to your message on its own.SessionStart renders the block and Stop reconciles. Both are set in .claude/settings.json. Session hooks exist for Claude Code only. The git hooks work with every agent.Teams
.nura/agent-block.md and the output names who isn't on the project. With --commit, it refuses instead (exit 3).nura sync --map-author priya@example.com=@priya
Mappings are kept in the repo, in .nura/authors.json. A commit from an author Nura can't match is credited to whoever ran the sync, and the git author is kept alongside.
Moving an existing file over
If your CLAUDE.md already tracks plans by hand, run the audit before the first render. It matches every open, done and pending line in your agent files (plus docs/memory/*.md) to the project's records. It writes nothing:
nura --project Atlas sync --audit
It prints a table with one row per file and record, then a summary that counts those same rows. For example:
rows: agree 18 · disagree 0 · weak 345 (from 478 matched segments) · unmatched items 527
Agree means the file and Nura say the same thing. Disagree means they don't, for example the file says done and Nura says open. Weak means the match is uncertain, so it's yours to judge. Unmatched counts the lines Nura has no record for. A long note line is read in pieces (segments), and the pieces that match the same record share one row. Lines in the block are stamped, so they always agree.
[x], [ ]) covers the whole line.'Open the beta' doesn't make a line open.