Every repo, its own harness
You copy .claude/ from one project to the next. Keeping it in sync is manual and error-prone.
Agents, skills, hooks, permissions and memory — versioned in one config and rebuildable with a single command. Renders to Claude Code, Codex, Cursor, Copilot and AGENTS.md without overwriting a line of yours.
npx navori init With no harness, your sentence reaches a model that decides alone. This is everything navori puts in its path — eight stops, from the sentence to the commit, and back into memory.
Before the model reads your prompt, a startup hook has already run. That's the difference between an assistant that starts blank every morning and one that opens the session knowing where it stands.
If you work with multiple projects and AI agents, you know exactly what we mean.
You copy .claude/ from one project to the next. Keeping it in sync is manual and error-prone.
Claude has .claude/, Cursor has .cursor/, Copilot has .github/copilot-instructions.md. Same intent, three files.
Skills, hooks, and Spec-Driven Development conventions decay when there's no way to version and roll them forward.
Three additive scopes, each opt-in. None degrades the one below it: the machine layer steps aside the moment it finds a repo with navori.
A checked-in navori.config.json is the source of truth. render rebuilds CLAUDE.md, .claude/ and progress/ from it — idempotent, and without touching what you wrote.
navori.config.json
navori init Sessions that start outside a navori repo — a scratch dir, someone else's project, your home — have no harness at all. The global layer installs a floor of doctrine in ~/.claude, and steps aside on its own when the repo brings its own.
~/.claude · ~/.navori/global.json
navori global init Org-wide defaults — quality gate, branch base, conventions — plus the Dominio: durable facts that span repos and fit in no single CLAUDE.md. A data model, a contract between services, a shared gotcha.
~/.navori/workspaces/<org>/
navori workspace · navori dominio Zero footprint without opt-in: without the matching init, navori has not written a single byte outside your repo.
Each layer composes on top of the previous one. You choose how much control you want at project level.
The baseline navori owns: agents, skills, hooks and the doctrine blocks. Always present.
Stack-specific defaults — Next.js, NestJS, Astro, Expo, Medusa, monorepos and more. Missing yours? Scaffold a local one with `navori preset init`.
Org-wide rules shared across repos, plus the workspace Dominio.
What's unique to this repo in navori.config.json: quality gate, critical areas, legacy paths and the plugins you enable.
Per-engine rendering for Claude Code, Codex, Cursor, Copilot and AGENTS.md — all on one pipeline.
{
"$schema": "https://ulisescm.github.io/navori-harness/schema/navori.config.v1.json",
"name": "your-app",
"engines": ["claude", "codex"],
"preset": "nextjs",
"branchBase": "main",
"commits": "conventional-es",
"qualityGate": {
"full": "pnpm lint && pnpm test"
},
"plugins": {
"engram": { "enabled": true },
"codegraph": { "enabled": true },
"tgrep": { "enabled": true },
"semgrep": { "enabled": true },
"gh": { "enabled": true }
},
"project": {
"criticalAreas": ["auth", "billing"],
"legacyPaths": ["src/legacy"]
},
"audit": { "mode": "always" }
} Click a layer to highlight what it contributes. Adapters materialize it in each engine's native format.
Pick a layer to see what it adds.
Every plugin is a bundle: its skill, its protocol block, its permissions and its doctor check. Enable the ones you want and the harness knows when to reach for them — and when not to.
acli external Reading and writing tickets through acli, from the right account. Ticket intake starts at the ticket, not at a description pasted by hand.
codegraph search A local AST graph of the repo. Where a symbol lives, who calls it and what breaks if you change it — one query instead of a round of greps and reads.
engram context Decisions, root causes and conventions that survive session close and context compaction. You don't re-explain on Monday what you settled on Friday.
gh external Issues, PRs and checks through gh. The agent reads the ticket, opens the PR in the repo's format, and knows how to read a red CI.
jscpd quality Catches copy-paste before it becomes debt. An agent that can't see the code that already exists rewrites it; this is what shows it.
semgrep quality Static analysis for dangerous patterns over the diff, wired into the reviewer's gate instead of sitting there as a step someone has to remember to run.
tgrep search A trigram index over the repo. Which files hold this string, with the exit-code contract intact and no fight over which engine the machine happens to have.
navori generates the harness; it does not run grep, the tests or the linter on the agent's behalf. It dictates which tool to use and under what doctrine — the rest is executed by whoever owns it.
Writing doctrine is easy; knowing whether anyone followed it isn't. navori audit answers the two questions nothing else does: where the tokens went, and which instructions nobody obeyed.
$ navori audit --session latest◇ navori-harness · 2026-09-12 ─────────╮│ 1 sesiones · 19 agentes ││ facturable 2.3M tok ││ arranque 346k tok ││ hallazgos 1 alto · 3 medio │╰──────────────────────────────────────╯→ report.md · report.json
Billable, startup, and per agent. The harness's cost stops being a hunch and becomes a number you can attack.
Severity-ranked findings about real routing: the skill that got ignored, the search that took the expensive path, the delegation that never happened.
The event log the hooks write (what the harness did), the transcript (the only place tokens live), and the host's OTel events (which permission was approved, which skill was active).
With no prior --start there is no log to audit and navori observes nothing. The report lands as markdown and JSON under ~/.navori/audits/.
Every subcommand the CLI registers, grouped by when you actually need it. Each one has its own reference page.
The same harness materialized in each one's native format, over a single render pipeline. Adding the sixth costs a declarative table, not a rewrite.
.claude/
agents · skills · hooks · settings.json with permissions
.codex/ + .agents/skills/
custom agents · skills · hooks · MCP servers
AGENTS.md
universal spec · read by Cursor, Codex, Gemini and Copilot
.cursor/rules/
.mdc rules · project context
.github/copilot-instructions.md
workspace instructions
No global install needed. Use npx.
npx navori init
Answer a few prompts and get navori.config.json plus the rendered harness.
? Project › my-app ? Engine › claude ? Preset › nextjs ✓ Done — 5 created
Edit the config, run render --apply, commit. Fully idempotent.
$ vim navori.config.json $ npx navori render --apply $ git add . && git commit
navori coexists. init detects your existing harness and only adds managed blocks marked with delimiters; your custom content stays put. If you want navori to take over one of your files, 'navori adopt' wraps it without changing a word of what it says. And if your setup already ships its own orchestration or SDD, blocks.exclude lets navori opt out of rendering those blocks so it never competes with yours.
Five, all shipped: Claude Code (.claude/), native Codex (agents, skills, hooks and MCP), universal AGENTS.md, Cursor (.cursor/rules/) and Copilot. They run on one render pipeline, so a fix reaches all of them at once instead of diverging in silence.
No. navori is a scaffolder: it generates the harness and gets out of the way. The tool runs on any Node 20+ and renders to five different engines.
render previews by default: without --apply it never touches disk. When it does write, it leaves a restorable snapshot first via 'navori backup', and the write is atomic. Outside the repo nothing exists that you didn't ask for by name: no 'global init', no global layer; no '--start', no audit.
npx navori@latest sync. It refreshes only managed blocks without touching your code; with --interactive you resolve block by block whatever you edited by hand. 'navori update' tells you what would change first.
Less than you'd think — and you no longer have to take that on faith: 'navori audit' tells you where a real session's tokens went. Each agent runs with its own model and effort — the muscle only where judgment lives, mechanical work on a light model — and every subagent returns its conclusion instead of a dump of what it read.