navori 0.12.1 → 0.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.es.md +467 -0
  2. package/README.md +248 -249
  3. package/README.zh-CN.md +423 -0
  4. package/dist/add.js +3 -0
  5. package/dist/adopt.js +3 -0
  6. package/dist/approval-route.js +2 -0
  7. package/dist/args.js +2 -0
  8. package/dist/assets/core/core-assets/agents/implementer.md +15 -11
  9. package/dist/assets/core/core-assets/agents/orchestrator.md +14 -3
  10. package/dist/assets/core/core-assets/agents/publisher.md +5 -4
  11. package/dist/assets/core/core-assets/agents/reviewer.md +22 -23
  12. package/dist/assets/core/core-assets/agents/scribe.md +7 -1
  13. package/dist/assets/core/core-assets/hooks/_partials/audit-log.sh +109 -9
  14. package/dist/assets/core/core-assets/hooks/_partials/bash-outcome.sh +98 -10
  15. package/dist/assets/core/core-assets/hooks/_partials/copy-dest.sh +241 -0
  16. package/dist/assets/core/core-assets/hooks/_partials/extract-cmd.sh +95 -0
  17. package/dist/assets/core/core-assets/hooks/_partials/hook-input.sh +3 -2
  18. package/dist/assets/core/core-assets/hooks/_partials/progress-ratchet.sh +65 -0
  19. package/dist/assets/core/core-assets/hooks/_partials/review-edit-binding.sh +2 -2
  20. package/dist/assets/core/core-assets/hooks/audit-mode-close.sh +11 -3
  21. package/dist/assets/core/core-assets/hooks/audit-mode-trigger.sh +5 -2
  22. package/dist/assets/core/core-assets/hooks/bash-outcome-watch.sh +4 -0
  23. package/dist/assets/core/core-assets/hooks/comment-draft-confirm.sh +3 -0
  24. package/dist/assets/core/core-assets/hooks/engram-write-guard.sh +3 -0
  25. package/dist/assets/core/core-assets/hooks/general-purpose-confirm.sh +5 -2
  26. package/dist/assets/core/core-assets/hooks/guard-destructive.sh +72 -3
  27. package/dist/assets/core/core-assets/hooks/implementer-no-markdown.sh +406 -186
  28. package/dist/assets/core/core-assets/hooks/managed-drift-watch.sh +41 -12
  29. package/dist/assets/core/core-assets/hooks/master-accept-confirm.sh +3 -0
  30. package/dist/assets/core/core-assets/hooks/master-plan-context.sh +1 -0
  31. package/dist/assets/core/core-assets/hooks/model-advisor.sh +13 -3
  32. package/dist/assets/core/core-assets/hooks/plan-gate.sh +103 -3
  33. package/dist/assets/core/core-assets/hooks/pr-publisher-confirm.sh +3 -0
  34. package/dist/assets/core/core-assets/hooks/quality-gate-pre-commit.sh +112 -59
  35. package/dist/assets/core/core-assets/hooks/role-guard.sh +41 -1
  36. package/dist/assets/core/core-assets/hooks/routing-watch.sh +11 -2
  37. package/dist/assets/core/core-assets/hooks/session-start-context.sh +130 -27
  38. package/dist/assets/core/core-assets/hooks/stop-verify-reminder.sh +1 -0
  39. package/dist/assets/core/core-assets/hooks/subagent-no-background.sh +5 -3
  40. package/dist/assets/core/core-assets/hooks/subagent-stop-handoff.sh +3 -0
  41. package/dist/assets/core/core-assets/hooks/worktree-reclaim.sh +4 -1
  42. package/dist/assets/core/core-assets/lib-skills/citty.md +8 -13
  43. package/dist/assets/core/core-assets/lib-skills/clack.md +5 -5
  44. package/dist/assets/core/core-assets/managed/orquestacion.md +19 -17
  45. package/dist/assets/core/core-assets/managed/planificacion.md +3 -2
  46. package/dist/assets/core/core-assets/managed/sdd.md +2 -0
  47. package/dist/assets/core/core-assets/settings/settings-base.json +5 -1
  48. package/dist/assets/core/core-assets/skills/resolve-ticket.md +1 -1
  49. package/dist/assets/core/core-assets/skills/verify-before-done.md +20 -19
  50. package/dist/audit.js +33 -0
  51. package/dist/backup.js +2 -0
  52. package/dist/backup2.js +3 -0
  53. package/dist/bench.js +3 -0
  54. package/dist/claude-infra.js +2 -0
  55. package/dist/cli-config.js +2 -0
  56. package/dist/cli-event.js +4 -0
  57. package/dist/codex-approval.js +2 -0
  58. package/dist/codex-evaluation.js +2 -0
  59. package/dist/codex-integration.js +2 -0
  60. package/dist/codex-profile.js +2 -0
  61. package/dist/codex.js +4 -0
  62. package/dist/collect-files.js +2 -0
  63. package/dist/collect.js +2 -0
  64. package/dist/config.js +8 -0
  65. package/dist/configure.js +4 -0
  66. package/dist/content-identity.js +4 -0
  67. package/dist/delivery-checks.js +3 -0
  68. package/dist/detect.js +9 -0
  69. package/dist/dist.js +68 -0
  70. package/dist/doctor.js +66 -0
  71. package/dist/dominio-inject.js +8 -0
  72. package/dist/dominio.js +4 -0
  73. package/dist/evidence.js +5 -0
  74. package/dist/external-providers.js +2 -0
  75. package/dist/frontmatter.js +8 -0
  76. package/dist/gate.js +3 -0
  77. package/dist/handoff.js +4 -0
  78. package/dist/harness-plan.js +2 -0
  79. package/dist/home.js +2 -0
  80. package/dist/hook-bindings.js +13 -0
  81. package/dist/i18n.js +20 -0
  82. package/dist/index.js +20 -816
  83. package/dist/init.js +5 -0
  84. package/dist/iso.js +2 -0
  85. package/dist/master.js +38 -0
  86. package/dist/migrate.js +2 -0
  87. package/dist/migrations.js +3 -0
  88. package/dist/model-profile.js +11 -0
  89. package/dist/monorepo.js +2 -0
  90. package/dist/native-integration.js +35 -0
  91. package/dist/paths.js +2 -0
  92. package/dist/plan.js +8 -0
  93. package/dist/plugins.js +2 -0
  94. package/dist/preset.js +4 -0
  95. package/dist/presets.js +2 -0
  96. package/dist/prompt.js +46 -0
  97. package/dist/receipt.js +2 -0
  98. package/dist/recommended.js +2 -0
  99. package/dist/refresh.js +5 -0
  100. package/dist/registry.js +2 -0
  101. package/dist/registry2.js +5 -0
  102. package/dist/remove.js +2 -0
  103. package/dist/render-plan.js +28 -0
  104. package/dist/render.js +235 -0
  105. package/dist/requirements.js +5 -0
  106. package/dist/review-evidence.js +22 -0
  107. package/dist/role-tools.js +2 -0
  108. package/dist/scan.js +2 -0
  109. package/dist/scan2.js +4 -0
  110. package/dist/schema-url.js +2 -0
  111. package/dist/schema.js +2 -0
  112. package/dist/schemas.js +56 -0
  113. package/dist/semver.js +2 -0
  114. package/dist/slice.js +14 -0
  115. package/dist/source-classify.js +2 -0
  116. package/dist/spec.js +3 -0
  117. package/dist/state-root.js +2 -0
  118. package/dist/status.js +3 -0
  119. package/dist/style.js +3 -0
  120. package/dist/sync.js +10 -0
  121. package/dist/ticket.js +7 -0
  122. package/dist/tools.js +3 -0
  123. package/dist/trust.js +42 -0
  124. package/dist/update.js +2 -0
  125. package/dist/workspace.js +4 -0
  126. package/dist/workspace2.js +6 -0
  127. package/dist/zod-helpers.js +2 -0
  128. package/package.json +11 -11
package/README.es.md ADDED
@@ -0,0 +1,467 @@
1
+ > [English](https://github.com/UlisesCm/navori-harness/blob/main/packages/cli/README.md) | [Español](https://github.com/UlisesCm/navori-harness/blob/main/packages/cli/README.es.md) | [简体中文](https://github.com/UlisesCm/navori-harness/blob/main/packages/cli/README.zh-CN.md)
2
+
3
+ # navori
4
+
5
+ Multi-agent harness + SDD scaffolder for Claude Code (and other AI engines).
6
+
7
+ `navori` lleva tu setup de Claude Code (agentes, skills, hooks, CLAUDE.md, AGENTS.md) a múltiples repos con un solo comando — sin perder customización local, sin sobrescribir lo que ya tenías.
8
+
9
+ También renderiza un harness Codex completo: `AGENTS.md`, skills en
10
+ `.agents/skills/`, agentes y hooks en `.codex/`, y MCP project-local.
11
+
12
+ ## Perfiles de engines
13
+
14
+ ```jsonc
15
+ // Paridad completa para ambos proveedores
16
+ { "engines": ["claude", "codex"] }
17
+
18
+ // Claude completo + guía AGENTS.md ligera para Codex y otras herramientas
19
+ { "engines": ["claude", "agents-md"] }
20
+
21
+ // Solo guía universal, con el menor número de archivos
22
+ { "engines": ["agents-md"] }
23
+
24
+ // Solo Pi (opt-in; ver docs/pi.md)
25
+ { "engines": ["pi"] }
26
+ ```
27
+
28
+ `codex` ya incluye y administra `AGENTS.md`; no necesitas combinarlo con
29
+ `agents-md`. Si ambos aparecen en un config, el adapter Codex toma precedencia
30
+ para evitar bloques duplicados.
31
+
32
+ ## Instalación
33
+
34
+ ```bash
35
+ npm i -g navori
36
+ # o sin instalar
37
+ npx navori init
38
+ ```
39
+
40
+ ## Quick start
41
+
42
+ ```bash
43
+ # Modo opinado: cero preguntas, harness completo sin instalar software externo
44
+ # (engram siempre activo, +gh si el repo tiene remote de GitHub).
45
+ # Avisa si falta el binario de algún plugin habilitado y cómo instalarlo.
46
+ cd ~/tu-repo
47
+ navori init --recommended
48
+
49
+ # + proveedores externos (tgrep, acli) + pre-commit hook +
50
+ # scan-monorepo + project block estricto — requiere instalar los binarios de esos proveedores.
51
+ # También avisa si falta algún binario y cómo instalarlo, sin instalarlo nunca.
52
+ navori init --full
53
+
54
+ # O wizard interactivo con detección de stack
55
+ navori init
56
+ ```
57
+
58
+ El `init` detecta automáticamente del repo:
59
+ - **Nombre** del proyecto (de `package.json`, `pyproject.toml`, `Cargo.toml`, git remote o basename)
60
+ - **Stack**: framework (Next.js, Vite, NestJS, Express, Astro, etc.), UI, forms, state, test
61
+ - **Preset sugerido** según el stack (ej. `vite-react-ts-mantine`, `nextjs`, `express-mongoose`)
62
+ - **Quality gate** compuesto de los scripts del `package.json`
63
+ - **Branch base** del git (`origin/HEAD`, fallback main/master/develop)
64
+ - **Infraestructura Claude existente** (`.claude/`, `CLAUDE.md`, `AGENTS.md`, agents, skills) — ofrece coexistir o reemplazar con backup
65
+
66
+ Y genera:
67
+ - `navori.config.json` — fuente de verdad del repo
68
+ - `CLAUDE.md` con managed blocks que el CLI mantiene sincronizados
69
+ - `.claude/` con agentes, skills, hooks y settings
70
+
71
+ ## Aviso opcional de actualización
72
+
73
+ En comandos interactivos, navori puede avisar si detecta una versión más nueva. La
74
+ consulta al registro de npm se ejecuta en segundo plano y no bloquea el comando;
75
+ por eso, la primera ejecución solo inicia la actualización de la caché y el aviso
76
+ puede aparecer en una ejecución posterior. Se limita a una consulta y un aviso
77
+ cada 24 horas. No se muestra en CI, en modo JSON ni en comandos de ayuda o versión.
78
+
79
+ Para desactivarlo, define `NAVORI_NO_UPDATE_NOTIFIER=1`. El aviso recomienda el
80
+ comando de actualización según el instalador detectado, con `npx` como alternativa.
81
+ No instala ni actualiza automáticamente y tampoco ejecuta `render`: después de
82
+ actualizar navori, corre `navori render --apply` para aplicar los cambios a tu
83
+ harness.
84
+
85
+ ### Avisos de actualización de herramientas de plugin
86
+
87
+ Plugins como `engram` pueden declarar `latestRelease` en su manifest para recibir
88
+ avisos cuando existe una versión más nueva. El aviso aparece al final del contexto de
89
+ arranque, en un espacio reservado de 300 caracteres, una vez cada 24 h por versión.
90
+
91
+ La consulta se ejecuta:
92
+ - **Fuente**: `api.github.com/repos/<owner>/<repo>/releases/latest` o
93
+ `registry.npmjs.org/<package>/latest` (sin token, solo un User-Agent `navori/<version>`)
94
+ - **Frecuencia**: máximo una solicitud por herramienta por día, reservada bajo un lock
95
+ - **Red**: la carga de red ocurre en un worker detached en segundo plano; la sesión
96
+ nunca espera
97
+ - **Caché**: `~/.navori/tool-versions/` (similar a `~/.navori/update-notice/`)
98
+ - **CI**: sin red — ni refrescos ni avisos
99
+
100
+ Desactívalo junto con el aviso de navori: `NAVORI_NO_UPDATE_NOTIFIER=1`.
101
+
102
+ **Limitaciones:**
103
+ - Codex en sandboxes sin red no obtiene refrescos ni avisos.
104
+ - pi no tiene hooks de sesión: ahí los avisos solo aparecen en `navori doctor`.
105
+ - Si el aviso no cabe en su reserva, se muestra un puntero a `navori doctor` y el aviso
106
+ se reintenta en la siguiente sesión (no se marca como entregado).
107
+ - `doctor` muestra todos los avisos como filas informativas, sin aplicar `--strict`.
108
+
109
+ Si un cierre abrupto deja bloqueado el aviso, solo intervendrás si el lock persiste
110
+ más de un minuto. En ese caso, detén todos los procesos `navori` y elimina
111
+ `~/.navori/tool-versions/lock` o `~/.navori/update-notice/lock`; conserva los archivos
112
+ de caché de ambos directorios.
113
+
114
+ ## Comandos
115
+
116
+ | Comando | Qué hace |
117
+ |---|---|
118
+ | `init` | Bootstrap del repo con detección automática + wizard (o `--recommended` sin preguntas y sin instalar software externo, o `--full` para sumar proveedores externos + política estricta) |
119
+ | `add <plugin>` | Activa un plugin y opcionalmente instala la tool externa |
120
+ | `remove <plugin>` | Desactiva un plugin y limpia sus bloques managed, sub-bloques y scripts |
121
+ | `configure <section>` | Ajusta una sección del config sin re-correr el wizard |
122
+ | `adopt <path>` | Toma un archivo de `.claude/` que escribiste a mano bajo gestión de navori: lo envuelve en un bloque managed sin reescribir su contenido (preview por default) |
123
+ | `refresh` | Re-detecta el repo, refresca config y corre sync en un paso |
124
+ | `update` | Actualiza el propio navori desde npm y luego corre `refresh` con el binario nuevo (ver [Actualizar navori](#actualizar-navori)) |
125
+ | `render` | Genera los archivos nativos de cada engine configurado (preview por default; `--apply` escribe). `--all` renderea todos los repos del registro global; `--prune` limpia los que ya no existen |
126
+ | `registry <sub>` | Registro global de tus repos con navori, para `render --all` (`ls`, `scan <dir>`, `add`, `remove`, `prune`) |
127
+ | `sync` | Refresca todos los engines configurados con conflict resolution + backups. Los bloques en conflicto se resuelven con `--interactive` (diff, keep-mine / accept-new) o en bloque con `--accept-new` / `--keep-mine`. Los archivos completos sin marcador se resuelven archivo por archivo en modo interactivo (diff, keep / accept); `--accept-new-files` acepta en bloque los resolvibles |
128
+ | `preset init <id>` | Scaffoldea un preset local en `.navori/presets/<id>/` |
129
+ | `scan` | Detecta workspaces nuevos en monorepos (`pnpm-workspace.yaml` / `package.json#workspaces`) |
130
+ | `doctor` | Audita el config + drift de cada managed block (CLAUDE.md **y AGENTS.md**), orden canónico, markers malformados, desincronización de monorepo y tools externas faltantes (`--strict` para CI). Informativo, sin afectar `--strict`: versiones instaladas con problema conocido (`externalTool.versionAdvisory`) y avisos de versiones nuevas de herramientas (`navori tools notice`) |
131
+ | `status` | Snapshot rápido: config, plugins activos, conteo de drift y próximos pasos |
132
+ | `audit` | Reporta cómo corrió el harness de verdad: atribución de tokens, huecos de adherencia y outcomes de revisión y receipt; disponibilidad de herramientas por ventanas; eficiencia y ciclo de vida por tarea aceptada. `--snapshot` guarda una foto nombrada del rango y `--compare` la contrasta con otra por cohorte, con causas y evidencia |
133
+ | `gate <fast\|full>` | Corre `qualityGate.fast` o `qualityGate.full` con la salida completa en un log (`.navori/state/gate/`) y solo un veredicto compacto en stdout. Flag: `--cwd <path>` |
134
+ | `receipt <sub>` | Recibo de los bytes revisados antes de publicar: `sign` (`--feature <id>`, `--gate-ran scoped\|full`, `--spec <dir> --milestone <Mn>` o `--phase <name\|index>`), `check`, `gate --spec <dir> --milestone <Mn>` o `--phase <name\|index>` (decide si el milestone necesita el gate acotado o el completo) y `review begin` / `review seal --nonce <n>` (sidecar de revisión con identidad de contenido). Flags comunes: `--target <ref>`, `--dir <path>`, `--json` |
135
+ | `spec <classify\|check> <feature>` | `classify` decide si una spec sale en 1 PR o en una PR por entrega (umbrales de `sdd.deliveries`); `check` valida su `tasks.md`: milestones, criterios, cobertura y entregas verticales. Flags: `--cwd`, `--json` |
136
+ | `tools notice [--ack <pluginId@x.y.z,…>]` | Emite los avisos de versiones de herramientas externas pendientes para el hook de arranque; `--ack` los marca como entregados |
137
+ | `handoff <check\|log-review>` | `check` valida el handoff del implementer (`impl_<feature>.json`) antes de despachar al siguiente agente; `log-review <feature>` valida `review_<feature>.json` y agrega a `findings.jsonl` los hallazgos con score >= 50 (`navori handoff check <feature> [--for scribe] [--produced-by reviewer [--since <iso>]] [--dir <path>] [--cwd <checkout>] [--json]`) |
138
+ | `plan <sub>` | Planificación por niveles (`harness.planTiers`): `classify [--files\|--diff]` mide complejidad y nivel de una tarea, `render`/`update` mantienen el workplan Markdown en sync con su JSON, `check` valida su esquema y reglas, `gate` es el hook `PreToolUse(Agent)` que niega el despacho sin workplan válido |
139
+ | `master <sub>` | Flujo guiado del plan maestro por etapas (`init`, `ux`, `mode`, `template`, `check`, `advance`, `status`, `part`, `close`) y entregas de sus partes: `delivery-slice`, `delivery-check`, `delivery-baseline`, `delivery-queue`, `delivery-criterion`, `delivery-review`, `delivery-present`, `delivery-decision`, `delivery-publication`, `delivery-revoke`. Las que autorizan o aprueban llevan `--approved-by` |
140
+ | `bench` | Corre `render` en dry-run N veces y reporta latencias (detecta regresiones locales) |
141
+ | `workspace <sub>` | Gestiona workspaces cross-repo (`init`, `ls`, `show`, `link`, `add-repo`, `set-default`, `render`, `rename`, `delete`) |
142
+ | `ticket <sub>` | Gestiona tickets-as-files en un workspace (`new`, `list`, `show`, `archive`, `delete`) |
143
+ | `dominio <sub>` | Base de conocimiento durable del workspace (`init`, `list`, `show`, `reindex`, `doctor`, `inject`) |
144
+ | `codex <sub>` | Comandos específicos de Codex; hoy `trust` aprueba los hooks del proyecto en `~/.codex/config.toml` |
145
+ | `backup <sub>` | Lista y restaura backups de `~/.navori/backups/` |
146
+ | `migrations <sub>` | Lista y restaura migraciones de `~/.navori/migrations/` |
147
+
148
+ ## Presets
149
+
150
+ Un preset aporta skills y reglas específicas del stack además del core. El `init` te sugiere uno según lo que detecta.
151
+
152
+ **Presets oficiales (incluidos):**
153
+
154
+ | Preset | Stack |
155
+ |---|---|
156
+ | `vite-react-ts` | Vite + React + TS (SPA, agnóstico de UI-lib) |
157
+ | `vite-react-ts-mantine` | Vite + React + TS + Mantine (SPA) |
158
+ | `nextjs` | Next.js (App Router) |
159
+ | `react-native-expo` | React Native + Expo (app móvil) |
160
+ | `astro` | Astro (static / SSR) |
161
+ | `nestjs` | NestJS (backend) |
162
+ | `express` | Express (backend, agnóstico de DB) |
163
+ | `express-mongoose` | Express + Mongoose (backend) |
164
+ | `fastapi-python` | FastAPI (backend, Python) |
165
+ | `bun-keystone` | Keystone 6 + Prisma (backend, Bun) |
166
+ | `background-worker` | Worker de fondo (jobs + colas: agenda / bullmq / amqplib) |
167
+ | `medusa` | Medusa.js v2 (backend) |
168
+ | `monorepo-turbopnpm` | Monorepo con Turborepo + pnpm workspaces |
169
+
170
+ Los presets **neutros** (`vite-react-ts`, `express`) traen las skills genéricas del stack sin atarte a una lib; los especializados (`…-mantine`, `…-mongoose`) agregan las skills de esa capa encima.
171
+
172
+ **¿Tu stack no tiene preset oficial?** No pasa nada. El `init` instala el harness completo (agentes, gates, protocolo, SDD) y funciona desde ya — solo te quedas sin los skills específicos del stack. El init te avisa, te deja en el baseline (`preset: custom`) y te sugiere cubrir el gap con un preset local.
173
+
174
+ **Presets locales** — crea uno checked-in al repo bajo `.navori/presets/<id>/`:
175
+
176
+ ```bash
177
+ navori preset init sveltekit
178
+ # ✓ .navori/presets/sveltekit/ (manifest + managed/stack.md + skills/)
179
+ # ✓ navori.config.json → preset: sveltekit
180
+ # → edita las plantillas y corre 'navori render --apply'
181
+ ```
182
+
183
+ La resolución es **local → bundled**: si tienes un preset local con el mismo id que uno oficial, gana el local. Así puedes override un preset incluido sin tocar el paquete.
184
+
185
+ ## Plugins disponibles
186
+
187
+ | Plugin | Para qué | External tool |
188
+ |---|---|---|
189
+ | `engram` | Memoria persistente entre sesiones | `engram` binary |
190
+ | `codegraph` | Descubrimiento estructural de código vía MCP; opt-in explícito (no incluido en `--full`) | `codegraph` binary |
191
+ | `tgrep` | Descubrimiento textual de código vía CLI indexado | `tgrep` binary |
192
+ | `acli` | Leer tickets de Jira desde la terminal | `acli` |
193
+ | `gh` | GitHub Issues, PRs y workflow runs | `gh` |
194
+
195
+ > `codegraph` y `tgrep` se retiraron brevemente el 2026-09-15 y se reintrodujeron el
196
+ > 2026-09-16 (#838) con una integración que los hace trabajar entre sí — acta en
197
+ > [`docs/research/tgrep-como-funcionaba.md`](https://github.com/UlisesCm/navori-harness/blob/main/docs/research/tgrep-como-funcionaba.md).
198
+
199
+ Activar uno:
200
+ ```bash
201
+ navori add engram # te ofrece instalar la tool externa si falta
202
+ navori add engram --skip-install # solo registra el plugin
203
+ ```
204
+
205
+ ## Planificación por niveles (`harness.planTiers`)
206
+
207
+ Con `harness.planTiers: true` en `navori.config.json`, `navori plan classify` mide la
208
+ complejidad de una tarea (señales como dinero/credenciales/PII, dependencia nueva, migración de
209
+ esquema, o tocar una ruta de `project.criticalPaths`) y la ubica en un nivel 0–3. El hook
210
+ `PreToolUse(Agent)` (`navori plan gate`) niega el despacho de un subagente sin el workplan que su
211
+ nivel exige, y escala la exigencia tras dos rechazos seguidos. Si `navori` falta o su build no tiene el
212
+ subcomando `plan`, el hook no tiene veredicto y, en modos que muestran el prompt, pide
213
+ confirmación en vez de dejarte sin salida (en `bypassPermissions`, `dontAsk` o `plan` sigue
214
+ bloqueando). `navori plan classify --diff`
215
+ corre el mismo clasificador contra `git diff --name-only <base>...HEAD` para avisar cuando el
216
+ trabajo se salió del nivel que el workplan declaró.
217
+
218
+ `project.criticalPaths` (array de globs) es opcional: sin él, `classify` solo detecta el criterio
219
+ "toca un área crítica" cuando se declara explícitamente con `--criticalArea`, en vez de inferirlo
220
+ de los archivos tocados.
221
+
222
+ El agente `architect` ya no tiene un flag `harness.architect` — renderiza siempre, con
223
+ `models.architect`/`effort.architect` (`opus`/`xhigh` por default) ajustando su tier. Un config
224
+ que todavía trae `harness.architect` falla con un aviso de clave retirada en vez de ignorarla en
225
+ silencio; `navori configure migrate` la quita.
226
+
227
+ ## Entregas de specs (`sdd.deliveries`)
228
+
229
+ Una spec grande no tiene por qué salir en una sola PR. `navori spec classify <feature>` la mide
230
+ contra los umbrales de `sdd.deliveries` en `navori.config.json` (`splitMinTasks`, `splitMinLoc`,
231
+ `maxPrsPerSpec`; defaults 12 tareas, 1500 LOC estimadas y 4 PRs) y dice si sale en una PR o en una
232
+ PR por entrega. `navori spec check` valida el `tasks.md` contra su gramática:
233
+
234
+ - **`E<n>`**: entrega; una PR cada una.
235
+ - **`M<n>`**: milestone; cada uno se verifica y se commitea por separado.
236
+ - **`T<n>`**: tarea; declara los `R<n>` que cubre.
237
+
238
+ El gate completo corre una vez por PR, no una vez por milestone; el gate por milestone lo decide
239
+ `navori receipt gate`.
240
+
241
+ ## Harness de workspaces (`monorepo.workspaceHarness`)
242
+
243
+ `monorepo.workspaceHarness` decide cuánto harness recibe cada workspace de un monorepo. Es un solo
244
+ valor para todo el repo:
245
+
246
+ - `minimal` (default): su archivo de contexto más las skills que la raíz no tiene ya. Una skill
247
+ idéntica a la de la raíz no se duplica.
248
+ - `full`: todo, como antes de recortar.
249
+ - `root`: solo su archivo de contexto (`CLAUDE.md`, y `AGENTS.md` bajo Codex). La raíz escribe las
250
+ skills de librería y de preset que declaran los workspaces.
251
+
252
+ `navori doctor` trata `minimal` y `root` como harness recortado, y avisa si el valor es `full`.
253
+
254
+ ## Harness defensivo (read-only por default)
255
+
256
+ El harness que genera `navori` trae permisos seguros desde el arranque, para que tengas menos prompts en lo cotidiano sin bajar la guardia en lo peligroso:
257
+
258
+ - **Las lecturas no piden confirmación**: `git status/diff/log/show`, `ls`, `cat`, `grep`, `Read`/`Glob`/`Grep`, etc. corren sin interrumpirte.
259
+ - **Lo destructivo pide confirmación** (`ask`): `rm -rf`, `git push --force`, `git reset --hard`, `git clean -f`, `chmod -R`, …
260
+ - **Descartar trabajo sin commitear se bloquea** (`guard-destructive`, `exit 2`, sin aprobación posible): `git reset --hard`, `git checkout -f`, `git checkout -- .` (o `git checkout .`), `git restore <rutas>` sin `--staged`, y `git clean -f` (sin `-n`). El bloqueo depende del estado: si el árbol está limpio, no hay nada que perder y el comando pasa. Si el directorio destino no se puede inspeccionar (variable, sustitución o ruta inexistente), también bloquea. El mensaje indica la ruta para hacerlo de forma segura.
261
+ - **El `publisher` no reescribe historia**: tras un commit fallido no ejecuta `git reset` ni reescribe commits. Reporta con `git status` y `git log -1 --stat`, y la recuperación queda para el orquestador o el usuario.
262
+ - **Lo catastrófico se rechaza** (`deny`): `rm -rf /`, `sudo rm`, `mkfs`, …
263
+ - Un hook `guard-destructive` actúa como backstop adicional.
264
+
265
+ **Estado efímero fuera del árbol**: los dos hooks del harness (`managed-drift-watch.sh` y `routing-watch.sh`) escriben su estado en `<git-common-dir>/navori/` — fuera del árbol de trabajo, invisible a `git status`. Además, `render` y `sync` escriben un `.claude/.gitignore` versionado que ignora `progress/`, `worktrees/` y `settings.local.json`, impidiendo que esos paths aparezcan como untracked en `git status`. Si `codex` está habilitado, también genera `.codex/.gitignore` con solo entradas efímeras de ese directorio. Para repos actualizados, también ignora los archivos legacy `.claude/.managed-drift-stamp` y `.claude/.routing-watch/`. Nada que los engines necesiten se ignora.
266
+
267
+ ## Workspace + tickets cross-repo
268
+
269
+ Si un ticket toca varios repos (frontend + backend + microservicio), el workspace te da un punto único:
270
+
271
+ ```bash
272
+ # Crear workspace
273
+ navori workspace init bonum --description "Bonum platform"
274
+
275
+ # Registrar repos del workspace
276
+ navori workspace add-repo bonum --name webapp --path ~/dev/bonum/webapp --stack vite-react-ts-mantine
277
+ navori workspace add-repo bonum --name backend --path ~/dev/bonum/nexus --stack nestjs
278
+
279
+ # Crear ticket
280
+ navori ticket new bonum BNM-123 --title "Checkout flow rebuild"
281
+
282
+ # En cada repo que toca el ticket, agrega una referencia:
283
+ # echo "ticket: BNM-123" >> progress/current.md
284
+
285
+ # Ver el ticket + en qué repos aparece
286
+ navori ticket show bonum BNM-123
287
+ ```
288
+
289
+ El workspace también guarda defaults heredables:
290
+ ```bash
291
+ navori init --workspace bonum # hereda engines, plugins, branchBase, etc.
292
+
293
+ # Ajustar un default sin editar el manifest a mano
294
+ navori workspace set-default bonum branchBase main
295
+ navori workspace set-default bonum prTarget develop # PRs van a develop, no a main
296
+ navori workspace set-default bonum engines claude,cursor
297
+ navori workspace set-default bonum plugins.engram.enabled true
298
+ ```
299
+
300
+ Y re-renderizar todos los repos del workspace de una vez:
301
+ ```bash
302
+ navori workspace render bonum # preview (no toca disco)
303
+ navori workspace render bonum --apply # escribe en cada repo
304
+ ```
305
+
306
+ Storage: `~/.navori/workspaces/<name>/` (manifest + tickets/ + backups/).
307
+
308
+ ## Rollout global tras un bump de navori
309
+
310
+ Cuando actualizas el CLI (`npm i -g navori@latest`), el registro global mete los
311
+ cambios a **todos** tus repos en un comando — sin ir uno por uno:
312
+
313
+ ```bash
314
+ navori render --all # preview: qué cambiaría en cada repo del registro
315
+ navori render --all --apply # escribe el render nuevo en todos
316
+ navori render --all --verbose # además lista cada bloque managed que cambió, por repo
317
+ navori render --all --prune # además limpia repos que ya no existen
318
+ ```
319
+
320
+ El output es un registro autoexplicativo: header con el registro y el modo
321
+ (preview/apply), una línea por repo (`created`/`updated`/`conflict`/`removed`/`unchanged`),
322
+ un aviso que **nombra** los repos con bloques editados a mano (conflict, que el
323
+ render no pisa) y un roll-up `ok · changed · conflict · failed`.
324
+
325
+ El registro (`~/.navori/registry.json`) se puebla solo: cada `navori init` /
326
+ `navori refresh` te da de alta. Para arrancar con lo que ya tenías instalado,
327
+ escanéalo una vez:
328
+
329
+ ```bash
330
+ navori registry scan ~/dev ~/otra-carpeta # registra todo lo que tenga navori.config.json
331
+ navori registry ls # ver el registro (✓ presente / ✗ missing)
332
+ navori registry prune # quitar los que ya no existen
333
+ ```
334
+
335
+ Es ortogonal a los workspaces: el registro es "qué repos existen"; el workspace
336
+ es el perfil de policy (branchBase/prTarget) que cada repo hereda.
337
+
338
+ ## Managed blocks con versionado
339
+
340
+ Cada bloque que `navori` inyecta en tu `CLAUDE.md` lleva metadata:
341
+
342
+ ```html
343
+ <!-- navori:managed id="idioma-rol" hash="3fbef743" version="0.0.1" source="@navori/core" -->
344
+ contenido sincronizado
345
+ <!-- /navori:managed id="idioma-rol" -->
346
+ ```
347
+
348
+ - **`hash`**: detecta si editaste el bloque (sync te avisa antes de pisarlo)
349
+ - **`version`**: cuando se publica una nueva versión de `@navori/core` o un plugin, `sync` reporta "update available"
350
+ - **`source`**: qué paquete es dueño del bloque (`doctor` te muestra la procedencia de cada uno)
351
+
352
+ Si modificas un managed block a mano y después corres `sync`, vas a ver:
353
+ ```
354
+ Conflict in 'idioma-rol':
355
+ - tu versión
356
+ + versión del Core
357
+ ```
358
+ Y eliges `skip-conflicts`, resolución interactiva para bloques de `CLAUDE.md`, o `abort`.
359
+ Los conflictos de archivo completo nunca se pisan automáticamente.
360
+
361
+ Backups automáticos en `~/.navori/backups/<timestamp>/` antes de cada `sync` (retención 30 días).
362
+
363
+ ## Customización quirúrgica
364
+
365
+ Cambiar una sola cosa sin re-init:
366
+
367
+ ```bash
368
+ navori configure plugins # multiselect de plugins activos
369
+ navori configure quality-gate # comandos del quality gate
370
+ navori configure language en # switch a inglés (fallback a es)
371
+ navori configure engines # multiselect: claude / codex / agents-md / cursor / copilot / pi
372
+ navori configure branch-base main # punto de fork / rama protegida
373
+ navori configure pr-target develop # rama destino del PR (gh pr create --base)
374
+ navori configure workspace bonum # asociar a un workspace
375
+ navori configure migrate # renombra claves retiradas (el config vuelve a cargar)
376
+ ```
377
+
378
+ `migrate` es la salida cuando un `navori.config.json` quedó bloqueado por claves retiradas de
379
+ `harness`/`models`/`effort`: cualquier otro comando aborta al leerlo, así que este lee el JSON
380
+ crudo, respalda el archivo y lo reescribe. Los renames 1:1 son automáticos; cuando dos claves
381
+ retiradas caen en la misma con valores distintos no se infiere nada — se pregunta, o se pasa por
382
+ `--scout=<modelo> --scout-effort=<nivel>`. `--dry-run` no escribe, y `--all` barre el registry
383
+ completo (preview salvo `--apply`).
384
+
385
+ ## Claves de config para el gate y los hooks nativos
386
+
387
+ - `qualityGate.scoped` (string): carril acotado del reviewer — los checks baratos de `full` más los tests relacionados con el diff. Si falta, usa `fast`. Se interpola como `navori.scopedGate`.
388
+ - `qualityGate.nativeHooks` (boolean): declara que el pre-commit nativo del proyecto ya corre `fast`; el hook `quality-gate-pre-commit` omite solo su paso de gate.
389
+ - `plugins.<id>.nativeHook` (boolean): el hook git nativo corre el check de ese plugin, así que su hook no se registra (los scripts se siguen instalando).
390
+
391
+ ## Tope de `progress/current.md`
392
+
393
+ `progress/current.md` se carga en cada sesión, así que tiene un tope. El hook pre-commit bloquea los commits de agente que lo dejan sobre el tope duro o lo hacen crecer estando ya sobre él (los commits humanos no se bloquean). `navori doctor` lo mide en bytes con los mismos topes y avisa; el hook de inicio de sesión advierte, sin bloquear, al pasar el tope suave.
394
+
395
+ ## Migrando a 0.12
396
+
397
+ - Se retiró el comando `global` y el colector launchd (`audit --collect` sigue). `doctor --json` ya no emite `globalScope`.
398
+ - Se retiraron los plugins `jscpd` y `semgrep`: `navori add jscpd|semgrep` responde que están retirados.
399
+ - El piso de Pi sube a 1.1.0: Pi 0.87.x pierde `navori_subagent`. Node mínimo: >= 22.12.
400
+ - `navori update` ahora actualiza el CLI (consulta npm, confirma, instala y luego corre `navori refresh`). El comportamiento anterior es ahora `navori refresh`, sin alias: los scripts que usaban `navori update` para re-sincronizar el harness deben cambiar a `navori refresh`.
401
+ - Migra con `navori render --apply` (poda los assets retirados que navori gestionaba) y luego `navori doctor` (reporta los restos).
402
+
403
+ ## Extender el harness en tu repo
404
+
405
+ navori instala un baseline; lo que lo vuelve valioso en **tu** repo es el conocimiento que sólo
406
+ tú tienes. Hay cuatro destinos, ordenados de más barato a más caro en archivos, revisión y tokens
407
+ por sesión. Empieza arriba de la tabla: el escalón más barato suele ser además el más efectivo.
408
+
409
+ | Lo que tienes | Dónde va |
410
+ |---|---|
411
+ | Una regla de tu repo (un patrón propio, la convención de tu data layer) | la **user-section** de la skill que ya cubre el tema |
412
+ | Conocimiento que ninguna skill instalada cubre | **skill project-local** |
413
+ | Conocimiento de un stack, reusable entre repos | **preset local** (`navori preset init <id>`) |
414
+ | Envoltura de un binario o servidor MCP | **plugin** (va a navori, no a tu repo) |
415
+
416
+ **La user-section es el default.** Cada skill que navori renderiza trae un sentinel
417
+ `<!-- navori:user-section -->`; todo lo que escribas después es tuyo y `render`/`sync` no lo tocan
418
+ nunca. Cero archivos nuevos, cero config, y la regla queda donde el agente ya iba a mirar.
419
+
420
+ **Una skill project-local** son dos pasos:
421
+
422
+ ```bash
423
+ # 1. la forma DIRECTORIO es la única que el host descubre.
424
+ # Un `<id>.md` suelto en .claude/skills/ no se carga nunca.
425
+ mkdir -p .claude/skills/mi-skill && $EDITOR .claude/skills/mi-skill/SKILL.md
426
+
427
+ # 2. declara el id en navori.config.json:
428
+ # "project": { "localSkills": ["mi-skill"] }
429
+ navori doctor # valida que el archivo exista y que su description diga CUÁNDO usarla
430
+ ```
431
+
432
+ Su frontmatter necesita `name`, `type` (`behavior` \| `reference` \| `tool`) y una `description`
433
+ con **trigger de activación**. El host carga las skills on-demand leyendo esa línea, así que un
434
+ *"Usar cuando…"* es lo que la pone a trabajar sola en el momento justo. `navori doctor` te avisa
435
+ cuando a una le falta, que suele ser el arreglo de mayor retorno: el contenido ya está escrito.
436
+
437
+ navori **nunca escribe dentro** de una skill project-local: no lleva bloque managed ni
438
+ user-section, es tuya entera.
439
+
440
+ → Guía completa (con las cuatro preguntas que hacen fuerte a una propuesta):
441
+ [`docs/EXTENDING.md`](https://github.com/UlisesCm/navori-harness/blob/main/docs/EXTENDING.es.md).
442
+ Contrato del `SKILL.md`: [`docs/recipes/skill-authoring.md`](https://github.com/UlisesCm/navori-harness/blob/main/docs/recipes/skill-authoring.es.md).
443
+
444
+ ## Filosofía
445
+
446
+ - **Cero opinión sobre tu proceso**. El CLI detecta y propone; tú decides.
447
+ - **Coexiste con harness existente**. El modo `coexist` no toca nada que ya tenías.
448
+ - **Nunca pisa silenciosamente**. Hash en el marker + backups antes de cada write.
449
+ - **Read-only por default**. Las lecturas no piden permiso; lo destructivo sí.
450
+ - **Output legible siempre**. Texto + `--json` para piping en CI.
451
+ - **Bilingüe ready**. El schema soporta `language: es | en`. Hoy `es` está full; `en` cae en fallback honesto.
452
+
453
+ ## Licencia
454
+
455
+ MIT.
456
+
457
+ ## Actualizar navori
458
+
459
+ `navori update` consulta npm por la última versión de navori y muestra el comando de
460
+ instalación según cómo lo tengas: npm global, devDependency, dependency o `npx`. Pide
461
+ confirmación (salvo `--yes`), instala y corre `navori refresh` con el binario nuevo.
462
+
463
+ - `--cli-only`: se detiene tras actualizar el CLI, sin `refresh`.
464
+ - Sin red o ya en la última versión: corre `refresh` directo.
465
+ - Si la instalación falla: imprime el comando manual y sale con código 1.
466
+ - Sin TTY y sin `--yes`: imprime el comando y sale con código 1.
467
+ - Solo soporta npm.