navori 0.1.0

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.md ADDED
@@ -0,0 +1,144 @@
1
+ # navori
2
+
3
+ Multi-agent harness + SDD scaffolder for Claude Code (and other AI engines).
4
+
5
+ `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.
6
+
7
+ ## Instalación
8
+
9
+ ```bash
10
+ npm i -g navori
11
+ # o sin instalar
12
+ npx navori init
13
+ ```
14
+
15
+ ## Quick start
16
+
17
+ ```bash
18
+ # Modo opinado: cero preguntas, todo configurado
19
+ cd ~/tu-repo
20
+ navori init --recommended
21
+
22
+ # O wizard interactivo con detección de stack
23
+ navori init
24
+ ```
25
+
26
+ El `init` detecta automáticamente del repo:
27
+ - **Nombre** del proyecto (de `package.json`, `pyproject.toml`, `Cargo.toml`, git remote o basename)
28
+ - **Stack**: framework (Next.js, Vite, NestJS, Expo, etc.), UI, forms, state, test
29
+ - **Preset sugerido** basado en el stack (ej. `vite-react-ts-mantine`, `nextjs-apollo`, `bun-keystone`)
30
+ - **Quality gate** compuesto de los scripts del `package.json`
31
+ - **Branch base** del git (`origin/HEAD`, fallback main/master/develop)
32
+ - **Infraestructura Claude existente** (`.claude/`, `CLAUDE.md`, `AGENTS.md`, agents, skills) — ofrece coexistir o reemplazar con backup
33
+
34
+ Y genera:
35
+ - `navori.config.json` — fuente de verdad del repo
36
+ - `CLAUDE.md` con managed blocks que el CLI mantiene sincronizados
37
+
38
+ ## Comandos
39
+
40
+ | Comando | Qué hace |
41
+ |---|---|
42
+ | `init` | Bootstrap del repo con detección automática + wizard |
43
+ | `add <plugin>` | Activa un plugin + opcionalmente instala la tool externa |
44
+ | `configure <section>` | Ajusta una sección del config sin re-correr el wizard |
45
+ | `update` | Re-detecta el repo, refresca config y corre sync en un paso |
46
+ | `render` | Genera CLAUDE.md con los managed blocks |
47
+ | `sync` | Refresca managed blocks con conflict resolution + backups |
48
+ | `doctor` | Inspecciona config + reporta procedencia de cada managed block |
49
+ | `workspace <sub>` | Gestiona workspaces cross-repo (init, ls, show, add-repo) |
50
+ | `ticket <sub>` | Gestiona tickets-as-files en un workspace (new, list, show) |
51
+
52
+ ## Plugins disponibles
53
+
54
+ | Plugin | Para qué | External tool |
55
+ |---|---|---|
56
+ | `engram` | Memoria persistente entre sesiones | `engram` binary |
57
+ | `acli` | Leer tickets de Jira desde la terminal | `acli` |
58
+ | `gh` | GitHub Issues, PRs y workflow runs | `gh` |
59
+ | `jscpd` | Detección de duplicación en el diff | `jscpd` (opt-in) |
60
+ | `semgrep` | Security gate local | `semgrep` (opt-in) |
61
+ | `cognitive` | Guardrails de complejidad cognitiva | (ninguna) |
62
+
63
+ Activar uno:
64
+ ```bash
65
+ navori add engram # te ofrece instalar la tool externa si falta
66
+ navori add engram --skip-install # solo registra el plugin
67
+ ```
68
+
69
+ ## Workspace + tickets cross-repo
70
+
71
+ Si un ticket toca varios repos (frontend + backend + microservicio), el workspace te da un punto único:
72
+
73
+ ```bash
74
+ # Crear workspace
75
+ navori workspace init bonum --description "Bonum platform"
76
+
77
+ # Registrar repos del workspace
78
+ navori workspace add-repo bonum --name webapp --path ~/dev/bonum/webapp --stack vite-react-ts-mantine
79
+ navori workspace add-repo bonum --name backend --path ~/dev/bonum/nexus --stack nestjs
80
+
81
+ # Crear ticket
82
+ navori ticket new bonum BNM-123 --title "Checkout flow rebuild"
83
+
84
+ # En cada repo que tocás el ticket, agregá una referencia:
85
+ # echo "ticket: BNM-123" >> progress/current.md
86
+
87
+ # Ver el ticket + en qué repos aparece
88
+ navori ticket show bonum BNM-123
89
+ ```
90
+
91
+ El workspace también guarda defaults heredables:
92
+ ```bash
93
+ navori init --workspace bonum # hereda engines, plugins, branchBase, etc.
94
+ ```
95
+
96
+ Storage: `~/.navori/workspaces/<name>/` (manifest + tickets/ + backups/).
97
+
98
+ ## Managed blocks con versionado
99
+
100
+ Cada bloque que `navori` inyecta en tu `CLAUDE.md` lleva metadata:
101
+
102
+ ```html
103
+ <!-- navori:managed id="idioma-rol" hash="3fbef743" version="0.0.1" source="@navori/core" -->
104
+ contenido sincronizado
105
+ <!-- /navori:managed id="idioma-rol" -->
106
+ ```
107
+
108
+ - **`hash`**: detecta si vos editaste el bloque (sync te avisa antes de pisar)
109
+ - **`version`**: cuando se publica una nueva versión de `@navori/core` o un plugin, `sync` reporta "update available"
110
+ - **`source`**: qué paquete es dueño del bloque (`doctor` te muestra la procedencia de cada uno)
111
+
112
+ Si modificás un managed block a mano y después corrés `sync`, vas a ver:
113
+ ```
114
+ Conflict in 'idioma-rol':
115
+ - tu versión
116
+ + versión del Core
117
+ ```
118
+ Y elegís: `skip-conflicts` (mantener tu edit), `apply-all` (pisar) o `abort`.
119
+
120
+ Backups automáticos en `~/.navori/backups/<timestamp>/` antes de cada `sync` (retención 30 días).
121
+
122
+ ## Customización quirúrgica
123
+
124
+ Cambiar una sola cosa sin re-init:
125
+
126
+ ```bash
127
+ navori configure plugins # multiselect de plugins activos
128
+ navori configure quality-gate # nuevo comando de quality gate
129
+ navori configure language en # switch a inglés (fallback a es)
130
+ navori configure engines # multiselect: claude / agents-md / cursor / copilot
131
+ navori configure workspace bonum # asociar a un workspace
132
+ ```
133
+
134
+ ## Filosofía
135
+
136
+ - **Cero opinión sobre tu proceso**. El CLI detecta y propone; vos decidís.
137
+ - **Coexiste con harness existente**. Modo `coexist` no toca nada que ya tenías.
138
+ - **Nunca pisa silenciosamente**. Hash en el marker + backups antes de cada write.
139
+ - **Output legible siempre**. Texto + `--json` para piping en CI.
140
+ - **Bilingüe ready**. Schema soporta `language: es | en`. Hoy solo `es` está full; `en` cae en fallback honesto.
141
+
142
+ ## Licencia
143
+
144
+ ISC.
@@ -0,0 +1,9 @@
1
+ ## Cierre de sesión
2
+
3
+ Antes de cerrar la sesión:
4
+
5
+ 1. **Quality gate**: corré `{{qualityGate.full}}` y confirmá que pasa (o documentá deuda en `progress/current.md`).
6
+ 2. **History**: agregá entrada en `progress/history.md` con `## YYYY-MM-DD HH:MM <agente> — <resumen>` + cambios + estado del gate.
7
+ 3. **Vaciar current**: dejá `progress/current.md` en estado `idle` o con el siguiente paso explícito.
8
+ 4. **Sin temporales**: borrá scratch files, no dejes `console.log`, `debugger`, ni código comentado.
9
+ 5. **Commit Conventional**: `feat|fix|chore|docs(scope): mensaje`, español MX, atómico. Nunca commitear `.claude/` ni `CLAUDE.md`.
@@ -0,0 +1,12 @@
1
+ ## Formato de respuesta
2
+
3
+ **Bug fix** (sin intro ni cierre):
4
+ CAUSA: <1 línea> / ARCHIVO: <path>:<línea> / FIX: <diff mínimo>
5
+
6
+ **Code review**:
7
+ [CRÍTICO] ... # rompe build, security o pérdida de datos
8
+ [ALTO] ... # bug funcional, regresión
9
+ [MEDIO] ... # legibilidad, naming
10
+
11
+ **Generación**: diff si modifica; archivo completo solo si es nuevo.
12
+ **Commits**: Conventional (`feat(scope): ...`), español MX, atómicos.
@@ -0,0 +1,4 @@
1
+ ## Idioma y rol
2
+
3
+ - Código/JSDoc: inglés. Chat: español MX.
4
+ - Rol Tech Lead Senior. Antes de codear: ¿lo más simple? ¿legible en 6 meses? ¿mantiene patrón existente? Simplicidad > cleverness.
@@ -0,0 +1,5 @@
1
+ ## Tipado fuerte
2
+
3
+ `any` prohibido. Usar `unknown` + narrowing. Tipar explícitamente: parámetros, retornos, callbacks, eventos, props, hooks y responses de services.
4
+
5
+ Excepción: `// any justificado: <razón>` — último recurso, no atajo. Si no hay razón clara, no es justificado.
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@navori/core",
3
+ "version": "0.0.1",
4
+ "description": "Universal harness primitives — managed core assets",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/index.ts",
8
+ "./assets/*": "./core-assets/*"
9
+ },
10
+ "files": [
11
+ "src",
12
+ "core-assets"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ }
17
+ }
@@ -0,0 +1,10 @@
1
+ ## Tickets de Jira (acli)
2
+
3
+ Para leer tickets de Jira usá **acli** (no el MCP de Atlassian).
4
+
5
+ - Ver un ticket: `acli jira workitem view <KEY>` (ej. `acli jira workitem view BNM-123`)
6
+ - Buscar tickets: `acli jira workitem search --jql "<JQL>"`
7
+ - Listar comentarios: `acli jira workitem comment list --key <KEY>`
8
+ - Listar transiciones: `acli jira workitem transition list --key <KEY>`
9
+
10
+ El MCP de Atlassian/Rovo queda como fallback si `acli` falla o no está disponible.
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "acli",
3
+ "name": "Atlassian CLI (Jira tickets)",
4
+ "description": "Lectura de tickets de Jira desde la terminal sin abrir el browser",
5
+ "version": "0.0.1",
6
+ "managed": [
7
+ {
8
+ "id": "acli-protocol",
9
+ "file": "managed/acli-protocol.md",
10
+ "recommendedAgent": "researcher"
11
+ }
12
+ ],
13
+ "externalTool": {
14
+ "name": "acli",
15
+ "checkBinary": "acli",
16
+ "install": {
17
+ "darwin": "brew install atlassian-labs/acli/acli",
18
+ "linux": "curl -fsSL https://acli-releases.atlassian.com/install.sh | bash"
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,9 @@
1
+ ## Complejidad cognitiva (SonarJS)
2
+
3
+ Antes de aprobar un cambio, verificar que las funciones tocadas no exceden el umbral de complejidad cognitiva.
4
+
5
+ - Threshold por default: `cognitive-complexity: ["error", 15]` (ESLint SonarJS).
6
+ - Si una función excede el umbral: **refactorizar antes de aprobar** (extraer funciones, simplificar condicionales, dividir responsabilidades).
7
+ - Casos válidos donde se relaja: state machines explícitas, parsers, switch/case sobre un enum cerrado. Documentar con `// cognitive-complexity-allowed: <razón>` antes del bloque.
8
+
9
+ Tool externa no requerida — la regla corre dentro del lint del proyecto si está configurada. Si no, este protocolo es informativo y debe leerse en code review.
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "cognitive",
3
+ "name": "Cognitive complexity guardrails",
4
+ "description": "Detección de complejidad cognitiva alta via ESLint rule SonarJS",
5
+ "version": "0.0.1",
6
+ "managed": [
7
+ {
8
+ "id": "cognitive-protocol",
9
+ "file": "managed/cognitive-protocol.md",
10
+ "recommendedAgent": "reviewer"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,5 @@
1
+ ## Engram
2
+
3
+ - `mem_save` proactivo tras decisión / bug-fix-con-root-cause / convención / discovery / preferencia confirmada.
4
+ - `mem_search` al inicio si el primer mensaje referencia el proyecto. Verificar en código que lo recordado siga existiendo antes de afirmarlo.
5
+ - `mem_session_summary` obligatorio antes de "listo": Goal · Discoveries · Accomplished · Next Steps · Relevant Files.
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "engram",
3
+ "name": "Engram persistent memory",
4
+ "description": "Memory persistence across Claude Code sessions via MCP server",
5
+ "version": "0.0.1",
6
+ "managed": [
7
+ {
8
+ "id": "engram-protocol",
9
+ "file": "managed/engram-protocol.md",
10
+ "recommendedAgent": "leader"
11
+ }
12
+ ],
13
+ "externalTool": {
14
+ "name": "engram",
15
+ "checkBinary": "engram",
16
+ "install": {
17
+ "darwin": "brew install gentleman-programming/tap/engram",
18
+ "linux": "curl -fsSL https://raw.githubusercontent.com/Gentleman-Programming/engram/main/scripts/install.sh | bash"
19
+ },
20
+ "postInstall": "claude plugin install engram"
21
+ }
22
+ }
@@ -0,0 +1,12 @@
1
+ ## GitHub CLI (gh)
2
+
3
+ Para interactuar con GitHub (issues, PRs, repos) usá **gh**:
4
+
5
+ - Ver issue: `gh issue view <number>` o `gh issue view <number> --comments`
6
+ - Buscar issues: `gh issue list --search "<query>"` o `gh issue list --label bug --state open`
7
+ - Crear PR: `gh pr create --title "..." --body "..."`
8
+ - Ver PR + checks: `gh pr view <number> --checks` o `gh pr checks <number>`
9
+ - Listar PRs: `gh pr list --state open`
10
+ - Ver workflow runs: `gh run list --limit 5` o `gh run view <id> --log-failed`
11
+
12
+ `gh auth status` muestra si está autenticado. Si falla, correr `gh auth login`.
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "gh",
3
+ "name": "GitHub CLI (issues + PRs)",
4
+ "description": "Acceso a Issues, PRs y repos de GitHub desde la terminal",
5
+ "version": "0.0.1",
6
+ "managed": [
7
+ {
8
+ "id": "gh-protocol",
9
+ "file": "managed/gh-protocol.md",
10
+ "recommendedAgent": "commit-pr-pilot"
11
+ }
12
+ ],
13
+ "externalTool": {
14
+ "name": "gh",
15
+ "checkBinary": "gh",
16
+ "install": {
17
+ "darwin": "brew install gh",
18
+ "linux": "(see https://github.com/cli/cli/blob/trunk/docs/install_linux.md)",
19
+ "win32": "winget install --id GitHub.cli"
20
+ },
21
+ "postInstall": "gh auth status || gh auth login"
22
+ }
23
+ }
@@ -0,0 +1,10 @@
1
+ ## Duplicación de código (jscpd)
2
+
3
+ Antes de aprobar un cambio, correr jscpd sobre el diff vs la branch base.
4
+
5
+ - Solo sobre archivos modificados:
6
+ ```
7
+ git diff --name-only $BRANCH_BASE...HEAD | grep -E '\.(ts|tsx|js|jsx)$' | xargs jscpd --silent
8
+ ```
9
+ - Si reporta clones >0 con threshold del proyecto: **no aprobar** el cambio sin justificar (los reviewers deben pedir refactor o extracción).
10
+ - Skip silencioso si `jscpd` no está en `PATH` (no bloquear si el dev no tiene la tool instalada).
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "jscpd",
3
+ "name": "jscpd (code duplication detector)",
4
+ "description": "Detección de duplicación de código en el diff vs branch base",
5
+ "version": "0.0.1",
6
+ "managed": [
7
+ {
8
+ "id": "jscpd-protocol",
9
+ "file": "managed/jscpd-protocol.md",
10
+ "recommendedAgent": "reviewer"
11
+ }
12
+ ],
13
+ "externalTool": {
14
+ "name": "jscpd",
15
+ "checkBinary": "jscpd",
16
+ "install": {
17
+ "darwin": "pnpm add -g jscpd",
18
+ "linux": "pnpm add -g jscpd",
19
+ "win32": "pnpm add -g jscpd"
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,14 @@
1
+ ## Security gate local (semgrep)
2
+
3
+ Antes de cerrar un cambio relevante (auth, RBAC, secrets, input validation), correr semgrep sobre el diff.
4
+
5
+ - Scan rápido del diff:
6
+ ```
7
+ git diff --name-only $BRANCH_BASE...HEAD | xargs semgrep --config=auto --severity=ERROR
8
+ ```
9
+ - Scan completo del proyecto (más lento, opt-in):
10
+ ```
11
+ semgrep --config=auto --error
12
+ ```
13
+ - Reglas custom: ver `.semgrep.yml` en la raíz del repo si existe.
14
+ - Skip silencioso si `semgrep` no está instalado (no bloquear si el dev no lo tiene).
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "semgrep",
3
+ "name": "semgrep (security + pattern analysis)",
4
+ "description": "Detección de vulnerabilidades y patrones inseguros local opt-in",
5
+ "version": "0.0.1",
6
+ "managed": [
7
+ {
8
+ "id": "semgrep-protocol",
9
+ "file": "managed/semgrep-protocol.md",
10
+ "recommendedAgent": "reviewer"
11
+ }
12
+ ],
13
+ "externalTool": {
14
+ "name": "semgrep",
15
+ "checkBinary": "semgrep",
16
+ "install": {
17
+ "darwin": "brew install semgrep",
18
+ "linux": "pipx install semgrep"
19
+ }
20
+ }
21
+ }