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 <project-id> sync # 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.
Without --project, the block shows your personal memory and goes to .nura/personal.md. nura sync requires nura 0.3.1 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=029326088f7b -->
## 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.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 Nura. It writes nothing:
nura sync --audit
It prints a table with one row per line, then a summary. For example:
items 713 · agree 21 · disagree 10 · weak 241 · unmatched 441
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. Unmatched means Nura has no record for the line. Lines in the block are stamped, so they always agree.