navori AI harness
open source · 5 engines

The multi-agent harness for any repo.

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
MIT Node ≥ 20 0 runtime deps
Claude Code
~/your-repo  ·  zsh
$ navori init --recommended
✓ stack: Next.js · pnpm
✓ engines: claude · codex
✓ plugins: engram · codegraph · tgrep
→ rendering managed assets
✓ CLAUDE.md · AGENTS.md
✓ .claude/ agents · skills · hooks
✓ .claude/settings.json permisos
✓ Done — 34 created · 0 overwritten
22 commands 12 presets 7 plugins 5 engines 8 agents 41 skills
MIT Node ≥ 20 0 runtime deps v0.9.0
Anatomy of a session

Follow one prompt through the harness

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.

your prompt
fix the login bug support reported
what is saved returns as the next session's context from the previous session SessionStart boots the harness CLAUDE.md this repo's rules skills this task's guide Dominio workspace-wide facts engram what was already settled orchestrator splits and delegates codegraph where it lives · who calls it tgrep which files hold it scout maps or investigates implementer writes the code auditor hunts what hurts PreToolUse blocks the destructive permissions allow · ask · deny semgrep security on the diff jscpd duplication quality gate lint · tests · format reviewer approves or rejects commit + PR commit + PR engram saves the decision 1 Arrives 2 Context 3 Orchestrates 4 Locates 5 Works 6 Guards 7 Filters 8 Closes

You type a sentence. Nobody has thought yet.

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.

The walkthrough runs on its own. Tap a stop to jump to it.
The problem

Every repo reinvents the same thing

If you work with multiple projects and AI agents, you know exactly what we mean.

01

Every repo, its own harness

You copy .claude/ from one project to the next. Keeping it in sync is manual and error-prone.

02

Every engine, its own config

Claude has .claude/, Cursor has .cursor/, Copilot has .github/copilot-instructions.md. Same intent, three files.

03

SDD erodes over time

Skills, hooks, and Spec-Driven Development conventions decay when there's no way to version and roll them forward.

Scopes

The harness no longer lives only in the repo

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.

per repo

The repo

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
per machine

The machine

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
per organization

The workspace

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.

How it works

Five cascading layers , one source of truth

Each layer composes on top of the previous one. You choose how much control you want at project level.

  1. Core

    The baseline navori owns: agents, skills, hooks and the doctrine blocks. Always present.

    navori
  2. Preset

    Stack-specific defaults — Next.js, NestJS, Astro, Expo, Medusa, monorepos and more. Missing yours? Scaffold a local one with `navori preset init`.

    preset
  3. Workspace

    Org-wide rules shared across repos, plus the workspace Dominio.

    org
  4. Project

    What's unique to this repo in navori.config.json: quality gate, critical areas, legacy paths and the plugins you enable.

    you
  5. Adapters

    Per-engine rendering for Claude Code, Codex, Cursor, Copilot and AGENTS.md — all on one pipeline.

    engine
navori.config.json source of truth
{
  "$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" }
}
Live

See what each layer contributes

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.

Engine adapters → .claude/ + CLAUDE.md output
CLAUDE.md
  • idioma-rol · formato-respuesta · tipado-fuerte · cierre-sesion core
  • engram-protocol project
.claude/agents/
  • orchestrator · implementer · reviewer · scout · … core
.claude/skills/
  • verify-before-done · debug-failure core
  • nextjs-app-router · nextjs-data-fetching preset
.claude/settings.json
  • permisos + hooks base core
  • hooks de plugins (engram, gh) project
.claude/hooks/quality-gate-pre-commit.sh
  • qualityGate.fast heredado workspace
progress/
  • current.md · history.md core
Toolbox

navori doesn't run the tools , it teaches the agent to use them

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

Jira

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

Search by structure

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

Persistent memory

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

GitHub

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

Duplication

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

Security

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

Search by content

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.

Observability

The harness that audits itself

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
$ 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

Where the tokens went

Billable, startup, and per agent. The harness's cost stops being a hunch and becomes a number you can attack.

Which instructions nobody followed

Severity-ranked findings about real routing: the skill that got ignored, the search that took the expensive path, the delegation that never happened.

Three sources that don't replace each other

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).

Opt-in, one session at a time

With no prior --start there is no log to audit and navori observes nothing. The report lands as markdown and JSON under ~/.navori/audits/.

Commands

The whole lifecycle , command by command.

Every subcommand the CLI registers, grouped by when you actually need it. Each one has its own reference page.

Multi-engine

One config , five engines.

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.

available

Claude Code

.claude/

agents · skills · hooks · settings.json with permissions

available

Codex

.codex/ + .agents/skills/

custom agents · skills · hooks · MCP servers

available

AGENTS.md

AGENTS.md

universal spec · read by Cursor, Codex, Gemini and Copilot

available

Cursor

.cursor/rules/

.mdc rules · project context

available

Copilot

.github/copilot-instructions.md

workspace instructions

Quickstart

From zero to productive in three steps

Install

No global install needed. Use npx.

npx navori init

Initialize

Answer a few prompts and get navori.config.json plus the rendered harness.

? Project › my-app
? Engine › claude
? Preset › nextjs
✓ Done — 5 created

Render whenever you change something

Edit the config, run render --apply, commit. Fully idempotent.

$ vim navori.config.json
$ npx navori render --apply
$ git add . && git commit
FAQ

What you're probably wondering

What if I already have a hand-rolled .claude/?

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.

Which engines does it support today?

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.

Do I need Claude Code to use navori?

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.

How invasive is it? Can I roll it back?

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.

How do I upgrade my project when a new version ships?

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.

Isn't running a multi-agent harness expensive?

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.