Cada repo, su propio harness
Copias y pegas .claude/ de un proyecto a otro. Mantenerlo sincronizado es manual y propenso a errores.
Agentes, skills, hooks, permisos y memoria — versionados en un solo config y reconstruibles con un comando. Se renderiza a Claude Code, Codex, Cursor, Copilot y AGENTS.md sin pisar una línea de lo tuyo.
npx navori init Sin harness, tu frase llega sola a un modelo que decide por su cuenta. Esto es todo lo que navori pone en el camino — ocho paradas, de la frase al commit, y de vuelta a la memoria.
Antes de que el modelo lea tu prompt, un hook de arranque ya corrió. Es la diferencia entre un asistente que empieza en blanco cada mañana y uno que abre la sesión sabiendo dónde está parado.
Si trabajas con varios proyectos y agentes de IA, sabes a qué nos referimos.
Copias y pegas .claude/ de un proyecto a otro. Mantenerlo sincronizado es manual y propenso a errores.
Claude tiene .claude/, Cursor tiene .cursor/, Copilot tiene .github/copilot-instructions.md. La misma intención, tres archivos.
Las skills, los hooks y las convenciones de Spec-Driven Development se pierden con el tiempo si no hay una forma de versionarlas y actualizarlas.
Tres alcances aditivos, cada uno opt-in. Ninguno degrada al de abajo: el de la máquina se hace a un lado en cuanto encuentra un repo con navori.
navori.config.json checked-in es la fuente de verdad. render reconstruye CLAUDE.md, .claude/ y progress/ desde ahí, idempotente y sin tocar lo que escribiste tú.
navori.config.json
navori init Las sesiones que arrancan fuera de un repo con navori —un scratch, un repo ajeno, tu home— hoy no tienen harness de ninguna clase. La capa global instala un piso de doctrina en ~/.claude, y se aparta sola cuando el repo trae el suyo.
~/.claude · ~/.navori/global.json
navori global init Defaults de toda la org —quality gate, branch base, convenciones— y el Dominio: los hechos durables que cruzan repos y no caben en el CLAUDE.md de ninguno. Un modelo de datos, un contrato entre servicios, un gotcha compartido.
~/.navori/workspaces/<org>/
navori workspace · navori dominio Huella cero sin opt-in: sin el init correspondiente, navori no escribió un solo byte fuera de tu repo.
Cada capa se compone sobre la anterior. Tú decides cuánto control quieres a nivel proyecto.
El baseline gestionado por navori: agentes, skills, hooks y los bloques de doctrina. Siempre presente.
Configuración por stack — Next.js, NestJS, Astro, Expo, Medusa, monorepos y más. ¿Falta el tuyo? Creas uno local con `navori preset init`.
Reglas de toda tu organización compartidas entre repos, más el Dominio del workspace.
Lo específico del repo en navori.config.json: quality gate, áreas críticas, rutas legacy y los plugins que habilitas.
Renderizado por engine para Claude Code, Codex, Cursor, Copilot y AGENTS.md, todos sobre el mismo 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" }
} Haz click en una capa para resaltar qué parte del harness genera. Los adapters lo materializan en el formato nativo de cada engine.
Selecciona una capa para ver su aporte.
Cada plugin es un bundle: trae su skill, su bloque de protocolo, sus permisos y su check de doctor. Habilitas el que quieres y el harness sabe cuándo recurrir a él — y cuándo no.
acli externo Lectura y escritura de tickets por acli, con la cuenta correcta. El intake de un ticket empieza por el ticket, no por una descripción pegada a mano.
codegraph búsqueda Un grafo AST local del repo. Dónde vive un símbolo, quién lo llama y qué se rompe si lo cambias — una consulta en vez de una ronda de greps y lecturas.
engram contexto Decisiones, causas raíz y convenciones que sobreviven al cierre de sesión y a las compactaciones de contexto. No vuelves a explicar el lunes lo que decidiste el viernes.
gh externo Issues, PRs y checks por gh. El agente lee el ticket, abre el PR con el formato del repo y sabe leer un CI en rojo.
jscpd calidad Detecta copy-paste antes de que se vuelva deuda. Un agente que no ve el código que ya existe lo reescribe; esto es lo que se lo enseña.
semgrep calidad Análisis estático de patrones peligrosos sobre el diff, integrado al gate del reviewer en lugar de quedar como un paso que alguien tiene que acordarse de correr.
tgrep búsqueda Índice de trigramas sobre el repo. Qué archivos contienen esta cadena, con el contrato de exit code intacto y sin pelear con el motor que tenga la máquina.
navori genera el harness; no corre grep, ni los tests, ni el linter por el agente. Dicta qué herramienta usar y con qué doctrina — el resto lo ejecuta quien corresponde.
Escribir doctrina es fácil; saber si alguien la siguió, no. navori audit responde las dos preguntas que ninguna otra cosa responde: a dónde se fueron los tokens y qué instrucciones nadie obedeció.
$ 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
Facturable, arranque y por agente. El costo del harness deja de ser una intuición y pasa a ser un número que puedes atacar.
Hallazgos con severidad sobre el ruteo real: la skill que se ignoró, la búsqueda que fue por el camino caro, la delegación que no ocurrió.
El log que escriben los hooks (qué hizo el harness), el transcript (el único lugar donde viven los tokens) y los eventos OTel del host (qué permiso se aprobó y qué skill estaba activa).
Sin un --start previo no hay log que auditar y navori no observa nada. El reporte queda en markdown y JSON dentro de ~/.navori/audits/.
Todos los subcomandos que el CLI registra, agrupados por el momento en que los necesitas. Cada uno tiene su página de referencia.
El mismo harness materializado en el formato nativo de cada uno, sobre un solo pipeline de render. Agregar el sexto cuesta una tabla declarativa, no reescribir nada.
.claude/
agentes · skills · hooks · settings.json con permisos
.codex/ + .agents/skills/
agentes propios · skills · hooks · servidores MCP
AGENTS.md
spec universal · la leen Cursor, Codex, Gemini y Copilot
.cursor/rules/
reglas .mdc · contexto de proyecto
.github/copilot-instructions.md
instrucciones de workspace
Sin instalación global. Usa npx.
npx navori init
Responde unas preguntas y obtén navori.config.json + el harness renderizado.
? Project › my-app ? Engine › claude ? Preset › nextjs ✓ Done — 5 created
Edita el config, corre 'render --apply' y commitea. Todo idempotente.
$ vim navori.config.json $ npx navori render --apply $ git add . && git commit
navori coexiste. init detecta tu harness existente y solo agrega bloques managed con marcadores; tu contenido personalizado queda intacto. Si quieres que navori se haga cargo de un archivo tuyo, 'navori adopt' lo envuelve sin cambiar una palabra de lo que dice. Y si tu setup ya trae su propia orquestación o SDD, blocks.exclude deja que navori opte por no renderear esos bloques para no competir con los tuyos.
Cinco, todos entregados: Claude Code (.claude/), Codex nativo (agentes, skills, hooks y MCP), AGENTS.md universal, Cursor (.cursor/rules/) y Copilot. Corren sobre el mismo pipeline de render, así que un arreglo llega a todos a la vez en lugar de divergir en silencio.
No. navori es un scaffolder: genera el harness y se sale del camino. La herramienta corre en cualquier Node 20+ y renderiza a cinco engines distintos.
render hace preview por default: sin --apply no toca disco. Cuando escribe, deja antes un snapshot restaurable con 'navori backup', y la escritura es atómica. Fuera del repo no existe nada que no hayas pedido por su nombre: sin 'global init' no hay capa global, sin '--start' no hay auditoría.
npx navori@latest sync. Actualiza solo los bloques managed sin tocar tu código; con --interactive resuelves bloque por bloque lo que hayas editado a mano. 'navori update' te dice antes qué cambiaría.
Menos de lo que parece, y ya no hace falta creerlo: 'navori audit' te dice a dónde se fueron los tokens de una sesión real. Cada agente corre con su modelo y su effort — el músculo solo donde hay juicio, lo mecánico en un modelo ligero — y cada subagente devuelve su conclusión en vez del volcado de lo que leyó.