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.
- package/README.es.md +467 -0
- package/README.md +248 -249
- package/README.zh-CN.md +423 -0
- package/dist/add.js +3 -0
- package/dist/adopt.js +3 -0
- package/dist/approval-route.js +2 -0
- package/dist/args.js +2 -0
- package/dist/assets/core/core-assets/agents/implementer.md +15 -11
- package/dist/assets/core/core-assets/agents/orchestrator.md +14 -3
- package/dist/assets/core/core-assets/agents/publisher.md +5 -4
- package/dist/assets/core/core-assets/agents/reviewer.md +22 -23
- package/dist/assets/core/core-assets/agents/scribe.md +7 -1
- package/dist/assets/core/core-assets/hooks/_partials/audit-log.sh +109 -9
- package/dist/assets/core/core-assets/hooks/_partials/bash-outcome.sh +98 -10
- package/dist/assets/core/core-assets/hooks/_partials/copy-dest.sh +241 -0
- package/dist/assets/core/core-assets/hooks/_partials/extract-cmd.sh +95 -0
- package/dist/assets/core/core-assets/hooks/_partials/hook-input.sh +3 -2
- package/dist/assets/core/core-assets/hooks/_partials/progress-ratchet.sh +65 -0
- package/dist/assets/core/core-assets/hooks/_partials/review-edit-binding.sh +2 -2
- package/dist/assets/core/core-assets/hooks/audit-mode-close.sh +11 -3
- package/dist/assets/core/core-assets/hooks/audit-mode-trigger.sh +5 -2
- package/dist/assets/core/core-assets/hooks/bash-outcome-watch.sh +4 -0
- package/dist/assets/core/core-assets/hooks/comment-draft-confirm.sh +3 -0
- package/dist/assets/core/core-assets/hooks/engram-write-guard.sh +3 -0
- package/dist/assets/core/core-assets/hooks/general-purpose-confirm.sh +5 -2
- package/dist/assets/core/core-assets/hooks/guard-destructive.sh +72 -3
- package/dist/assets/core/core-assets/hooks/implementer-no-markdown.sh +406 -186
- package/dist/assets/core/core-assets/hooks/managed-drift-watch.sh +41 -12
- package/dist/assets/core/core-assets/hooks/master-accept-confirm.sh +3 -0
- package/dist/assets/core/core-assets/hooks/master-plan-context.sh +1 -0
- package/dist/assets/core/core-assets/hooks/model-advisor.sh +13 -3
- package/dist/assets/core/core-assets/hooks/plan-gate.sh +103 -3
- package/dist/assets/core/core-assets/hooks/pr-publisher-confirm.sh +3 -0
- package/dist/assets/core/core-assets/hooks/quality-gate-pre-commit.sh +112 -59
- package/dist/assets/core/core-assets/hooks/role-guard.sh +41 -1
- package/dist/assets/core/core-assets/hooks/routing-watch.sh +11 -2
- package/dist/assets/core/core-assets/hooks/session-start-context.sh +130 -27
- package/dist/assets/core/core-assets/hooks/stop-verify-reminder.sh +1 -0
- package/dist/assets/core/core-assets/hooks/subagent-no-background.sh +5 -3
- package/dist/assets/core/core-assets/hooks/subagent-stop-handoff.sh +3 -0
- package/dist/assets/core/core-assets/hooks/worktree-reclaim.sh +4 -1
- package/dist/assets/core/core-assets/lib-skills/citty.md +8 -13
- package/dist/assets/core/core-assets/lib-skills/clack.md +5 -5
- package/dist/assets/core/core-assets/managed/orquestacion.md +19 -17
- package/dist/assets/core/core-assets/managed/planificacion.md +3 -2
- package/dist/assets/core/core-assets/managed/sdd.md +2 -0
- package/dist/assets/core/core-assets/settings/settings-base.json +5 -1
- package/dist/assets/core/core-assets/skills/resolve-ticket.md +1 -1
- package/dist/assets/core/core-assets/skills/verify-before-done.md +20 -19
- package/dist/audit.js +33 -0
- package/dist/backup.js +2 -0
- package/dist/backup2.js +3 -0
- package/dist/bench.js +3 -0
- package/dist/claude-infra.js +2 -0
- package/dist/cli-config.js +2 -0
- package/dist/cli-event.js +4 -0
- package/dist/codex-approval.js +2 -0
- package/dist/codex-evaluation.js +2 -0
- package/dist/codex-integration.js +2 -0
- package/dist/codex-profile.js +2 -0
- package/dist/codex.js +4 -0
- package/dist/collect-files.js +2 -0
- package/dist/collect.js +2 -0
- package/dist/config.js +8 -0
- package/dist/configure.js +4 -0
- package/dist/content-identity.js +4 -0
- package/dist/delivery-checks.js +3 -0
- package/dist/detect.js +9 -0
- package/dist/dist.js +68 -0
- package/dist/doctor.js +66 -0
- package/dist/dominio-inject.js +8 -0
- package/dist/dominio.js +4 -0
- package/dist/evidence.js +5 -0
- package/dist/external-providers.js +2 -0
- package/dist/frontmatter.js +8 -0
- package/dist/gate.js +3 -0
- package/dist/handoff.js +4 -0
- package/dist/harness-plan.js +2 -0
- package/dist/home.js +2 -0
- package/dist/hook-bindings.js +13 -0
- package/dist/i18n.js +20 -0
- package/dist/index.js +20 -816
- package/dist/init.js +5 -0
- package/dist/iso.js +2 -0
- package/dist/master.js +38 -0
- package/dist/migrate.js +2 -0
- package/dist/migrations.js +3 -0
- package/dist/model-profile.js +11 -0
- package/dist/monorepo.js +2 -0
- package/dist/native-integration.js +35 -0
- package/dist/paths.js +2 -0
- package/dist/plan.js +8 -0
- package/dist/plugins.js +2 -0
- package/dist/preset.js +4 -0
- package/dist/presets.js +2 -0
- package/dist/prompt.js +46 -0
- package/dist/receipt.js +2 -0
- package/dist/recommended.js +2 -0
- package/dist/refresh.js +5 -0
- package/dist/registry.js +2 -0
- package/dist/registry2.js +5 -0
- package/dist/remove.js +2 -0
- package/dist/render-plan.js +28 -0
- package/dist/render.js +235 -0
- package/dist/requirements.js +5 -0
- package/dist/review-evidence.js +22 -0
- package/dist/role-tools.js +2 -0
- package/dist/scan.js +2 -0
- package/dist/scan2.js +4 -0
- package/dist/schema-url.js +2 -0
- package/dist/schema.js +2 -0
- package/dist/schemas.js +56 -0
- package/dist/semver.js +2 -0
- package/dist/slice.js +14 -0
- package/dist/source-classify.js +2 -0
- package/dist/spec.js +3 -0
- package/dist/state-root.js +2 -0
- package/dist/status.js +3 -0
- package/dist/style.js +3 -0
- package/dist/sync.js +10 -0
- package/dist/ticket.js +7 -0
- package/dist/tools.js +3 -0
- package/dist/trust.js +42 -0
- package/dist/update.js +2 -0
- package/dist/workspace.js +4 -0
- package/dist/workspace2.js +6 -0
- package/dist/zod-helpers.js +2 -0
- 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.
|