navori 0.2.1 → 0.2.2

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 (23) hide show
  1. package/README.md +15 -1
  2. package/dist/assets/core/core-assets/agents/commit-pr-pilot.md +15 -9
  3. package/dist/assets/core/core-assets/lib-skills/formik.md +57 -0
  4. package/dist/assets/core/core-assets/lib-skills/joi-validation.md +73 -0
  5. package/dist/assets/core/core-assets/{presets/express-mongoose/skills → lib-skills}/mongoose.md +3 -2
  6. package/dist/assets/core/core-assets/lib-skills/redux-toolkit.md +59 -0
  7. package/dist/assets/core/core-assets/lib-skills/socketio.md +56 -0
  8. package/dist/assets/core/core-assets/lib-skills/tanstack-query.md +58 -0
  9. package/dist/assets/core/core-assets/managed/cierre-sesion.md +1 -1
  10. package/dist/assets/core/core-assets/managed/idioma-rol.md +1 -1
  11. package/dist/assets/core/core-assets/managed/operaciones-seguras.md +1 -0
  12. package/dist/assets/core/core-assets/presets/background-worker/managed/stack.md +18 -0
  13. package/dist/assets/core/core-assets/presets/background-worker/skills/job-scheduling.md +54 -0
  14. package/dist/assets/core/core-assets/presets/background-worker/skills/queue-consumers.md +55 -0
  15. package/dist/assets/core/core-assets/presets/background-worker/skills/worker-lifecycle.md +57 -0
  16. package/dist/assets/core/core-assets/presets/background-worker.json +39 -0
  17. package/dist/assets/core/core-assets/presets/express-mongoose/managed/stack.md +2 -2
  18. package/dist/assets/core/core-assets/presets/express-mongoose/skills/pr-create.md +18 -18
  19. package/dist/assets/core/core-assets/presets/express-mongoose.json +0 -12
  20. package/dist/assets/core/core-assets/settings/settings-base.json +22 -1
  21. package/dist/index.js +797 -346
  22. package/package.json +4 -3
  23. /package/dist/assets/core/core-assets/{presets/express-mongoose/skills → lib-skills}/zod-validation.md +0 -0
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://navori.dev/schema/navori.preset.v1.json",
3
+ "id": "background-worker",
4
+ "displayName": "Background worker (jobs + queues)",
5
+ "extends": "core",
6
+ "extras": {
7
+ "managed": [
8
+ {
9
+ "id": "stack-background-worker",
10
+ "relPath": "presets/background-worker/managed/stack.md"
11
+ }
12
+ ],
13
+ "agents": [],
14
+ "skills": [
15
+ {
16
+ "id": "worker-lifecycle",
17
+ "relPath": "presets/background-worker/skills/worker-lifecycle.md",
18
+ "destRelPath": ".claude/skills/worker-lifecycle.md"
19
+ },
20
+ {
21
+ "id": "job-scheduling",
22
+ "relPath": "presets/background-worker/skills/job-scheduling.md",
23
+ "destRelPath": ".claude/skills/job-scheduling.md"
24
+ },
25
+ {
26
+ "id": "queue-consumers",
27
+ "relPath": "presets/background-worker/skills/queue-consumers.md",
28
+ "destRelPath": ".claude/skills/queue-consumers.md"
29
+ }
30
+ ],
31
+ "hooks": []
32
+ },
33
+ "invariants": [
34
+ "worker-lifecycle",
35
+ "job-scheduling",
36
+ "queue-consumers",
37
+ "graceful shutdown"
38
+ ]
39
+ }
@@ -1,8 +1,8 @@
1
1
  ## Stack — Express + Mongoose
2
2
 
3
- Backend HTTP sobre Express + Mongoose/MongoDB en TypeScript. Las peticiones fluyen en capas: `route → validate(Zod) → asyncHandler → controller → Model (Mongoose) → ApiResponse`. Los controllers tocan los Models directo (sin repository wrappers); los errores se propagan vía `ApiError` y las respuestas se envuelven en `ApiResponse`. El logging va por el `Logger` de winston, nunca `console.log`.
3
+ Backend HTTP sobre Express + Mongoose/MongoDB en TypeScript. Las peticiones fluyen en capas: `route → validate(schema) → asyncHandler → controller → Model (Mongoose) → ApiResponse`. Los controllers tocan los Models directo (sin repository wrappers); los errores se propagan vía `ApiError` y las respuestas se envuelven en `ApiResponse`. El logging va por el `Logger` de winston, nunca `console.log`.
4
4
 
5
- Regla de oro: nada de `res.json` / `res.status(500)` crudos; nada de `console.log`; nada de `process.env` fuera del módulo de config. La validación SIEMPRE ocurre en el boundary con Zod, y todo `ObjectId` se construye con `new Types.ObjectId(...)`. Aplica las skills `express-routes`, `mongoose`, `zod-validation`, `mongo-aggregations` y `winston-logging` según la capa que toques.
5
+ Regla de oro: nada de `res.json` / `res.status(500)` crudos; nada de `console.log`; nada de `process.env` fuera del módulo de config. La validación SIEMPRE ocurre en el boundary (con el validador del repo — Zod o Joi), y todo `ObjectId` se construye con `new Types.ObjectId(...)`. Aplica las skills `express-routes`, `mongo-aggregations` y `winston-logging` del preset según la capa que toques. Las skills de `mongoose` y de validación (`zod-validation` o `joi-validation`) se inyectan según las dependencias que detecte navori en el repo — si están en `.claude/skills/`, aplícalas.
6
6
 
7
7
  El trabajo de un ticket sigue el pipeline documentado en la skill `ticket-intake` (la orquestadora). No es un generador de specs: es un protocolo que el `leader` ejecuta invocando agentes y skills en orden, con gates objetivos y artefactos en `.claude/progress/`. Mapeo de fases a la infraestructura de navori:
8
8
 
@@ -1,26 +1,29 @@
1
1
  ---
2
2
  name: pr-create
3
- description: Crea un PR en GitHub contra la rama base del repo, delegando title/body a un modelo y validando el output. Antes de crear cualquier PR al cerrar el ciclo de un ticket (Fase 8 de ticket-intake).
3
+ description: Crea un PR en GitHub contra la rama target del repo, delegando title/body a un modelo y validando el output. Antes de crear cualquier PR al cerrar el ciclo de un ticket (Fase 8 de ticket-intake).
4
4
  type: reference
5
5
  ---
6
6
 
7
7
  <!-- candidate: workflow-backend -->
8
8
 
9
- # pr-create — crear PR contra `{{branchBase}}`
9
+ # pr-create — crear PR contra `{{prTarget}}`
10
10
 
11
11
  ## Cuándo usar este skill
12
12
 
13
- Al cierre del ciclo, tras el `APPROVED` del reviewer. Es la Fase 8 del pipeline `ticket-intake`. El pre-flight es bloqueante: ningún PR sale si el gate no está verde o si falta aprobación cuando el harness está activo.
13
+ Al cierre del ciclo, tras el `APPROVED` del reviewer (Fase 8 de `ticket-intake`). El pre-flight es bloqueante: ningún PR sale con el gate en rojo o sin aprobación (harness activo).
14
+
15
+ `{{branchBase}}` es el punto de fork; `{{prTarget}}` es la rama destino del PR. Cuando difieren, el PR y su diff van contra `{{prTarget}}`.
14
16
 
15
17
  ## Pre-flight (bloqueante — cualquier check falla → ABORT con mensaje claro)
16
18
 
17
19
  1. **Working tree limpio** o solo cambios del feature: `git status --porcelain`. Si hay cambios uncommitted que NO son del feature, párate y pregunta.
18
- 2. **No estás en rama base**: aborta si la rama es `main|master|{{branchBase}}`.
20
+ 2. **No estás en una rama protegida**: aborta si la rama actual es `main|master|{{branchBase}}|{{prTarget}}`.
19
21
  3. **`gh` autenticado**: `gh auth status`.
20
22
  4. **Gate verde en este turno**: `{{qualityGate.fast}}`. Falla → manda al implementer.
21
23
  5. **Review APPROVED** (si el harness está activo): `grep -q APPROVED .claude/progress/review_*.md`. Falla → manda al reviewer.
22
- 6. **Hay commits pusheables**: `git log origin/{{branchBase}}..HEAD --oneline`. Vacío → nada que PR-ear.
23
- 7. **Branch sincronizada**: `git fetch origin {{branchBase}}` y `git log HEAD..origin/{{branchBase}} --oneline`. Si origin va adelante, considera rebase y pregunta al usuario.
24
+ 6. **Hay commits para el PR**: `git fetch origin {{prTarget}} --quiet` y `git log origin/{{prTarget}}..HEAD --oneline`. Vacío → nada que PR-ear.
25
+ 7. **Branch sincronizada**: `git log HEAD..origin/{{prTarget}} --oneline`. Si origin va adelante, rebase y pregunta.
26
+ 8. **Arrastre de commits** (solo si `{{branchBase}}` ≠ `{{prTarget}}`): `git rev-list --count origin/{{prTarget}}..origin/{{branchBase}}`. Si es > 0, `{{branchBase}}` va adelantado de `{{prTarget}}` y el PR arrastra esos commits ajenos: avisa y sugiere `git rebase origin/{{prTarget}}` antes de abrir.
24
27
 
25
28
  ## Push y redacción
26
29
 
@@ -28,32 +31,29 @@ Si la branch no está pusheada: `git push -u origin "$current_branch"`. Si el up
28
31
 
29
32
  Delega title + body a un `Agent` (modelo rápido). Reglas que le impones:
30
33
  - **Title**: Conventional Commit con scope de tu dominio, ≤70 chars, español MX, sin emojis ni puntuación final.
31
- - **Body**: markdown con secciones fijas `## Resumen`, `## Cambios`, `## Test plan`, `## Notas` (opcional). Tono directo, sin "Generated by Claude".
32
- - **Contexto al redactor**: branch, base `{{branchBase}}`, ticket, `impl_<feature>.md`, `review_<feature>.md`, `git log {{branchBase}}..HEAD --oneline` y `--stat`.
34
+ - **Body**: secciones fijas `## Resumen`, `## Cambios`, `## Test plan`, `## Notas` (opcional). Tono directo, sin "Generated by Claude".
35
+ - **Contexto al redactor**: branch, base `{{prTarget}}`, ticket, `impl_<feature>.md`, `review_<feature>.md`, y el diff REAL del PR — `git log origin/{{prTarget}}..HEAD --oneline` + `git diff origin/{{prTarget}}...HEAD --stat`.
33
36
  - **Output**: JSON exacto `{"title": "...", "body": "..."}` sin fences.
34
37
 
35
- Valida el output: `title` ≤70 y matchea `^(feat|fix|refactor|chore|docs|style|test|build|ci|perf)(\(.+\))?: `; `body` contiene Resumen, Cambios y Test plan. Si falla, re-invoca al redactor con el feedback (máx. 2 reintentos).
38
+ Valida: `title` ≤70 y Conventional Commit; `body` con Resumen, Cambios y Test plan. Si falla, reintenta (máx. 2).
36
39
 
37
40
  ## Crear el PR
38
41
 
39
42
  ```bash
40
- gh pr create --base {{branchBase}} --title "$title" --body "$body"
43
+ gh pr create --base {{prTarget}} --title "$title" --body "$body"
41
44
  ```
42
45
 
43
46
  Captura la URL del output y muéstrasela al usuario.
44
47
 
45
48
  ## Reglas duras
46
49
 
47
- - **NUNCA `git push --force`** sin que lo pida el usuario.
48
- - **NUNCA `--base main` ni `--base master`.** Siempre `--base {{branchBase}}`.
49
- - **NUNCA `--no-verify`** en commits previos.
50
+ - **NUNCA `git push --force`** ni `--no-verify` sin que lo pida el usuario.
51
+ - **Siempre `--base {{prTarget}}`.** No lo cambies a mano; si el target del repo cambió, ajústalo con `navori configure pr-target`.
50
52
  - **Cambios uncommitted ajenos al feature** → párate y pregunta, no los arrastres al PR.
51
- - **No agregues** "Generated with Claude" ni emojis al body.
52
53
  - **Reviewers/labels**: no los agregues automático salvo que el usuario lo pida.
53
54
 
54
55
  ## Antes de declarar listo
55
56
 
56
- - El pre-flight pasó completo (gate verde, branch ≠ base, commits pusheables, review APPROVED si aplica).
57
- - El title pasó la validación Conventional Commit (≤70 chars) y el body tiene las secciones fijas.
58
- - El PR se creó contra `{{branchBase}}` y su URL quedó mostrada al usuario.
59
- - Post-PR: `mem_save` de cualquier decisión no obvia, entrada en `history.md`, `current.md` a `state: idle`, y `mem_session_summary`.
57
+ - El pre-flight pasó completo y el title/body validaron.
58
+ - El PR se creó contra `{{prTarget}}` y su URL quedó mostrada al usuario.
59
+ - Post-PR: `mem_save` de decisiones no obvias, entrada en `history.md`, `current.md` a `state: idle`, y `mem_session_summary`.
@@ -17,16 +17,6 @@
17
17
  "relPath": "presets/express-mongoose/skills/express-routes.md",
18
18
  "destRelPath": ".claude/skills/express-routes.md"
19
19
  },
20
- {
21
- "id": "mongoose",
22
- "relPath": "presets/express-mongoose/skills/mongoose.md",
23
- "destRelPath": ".claude/skills/mongoose.md"
24
- },
25
- {
26
- "id": "zod-validation",
27
- "relPath": "presets/express-mongoose/skills/zod-validation.md",
28
- "destRelPath": ".claude/skills/zod-validation.md"
29
- },
30
20
  {
31
21
  "id": "mongo-aggregations",
32
22
  "relPath": "presets/express-mongoose/skills/mongo-aggregations.md",
@@ -66,8 +56,6 @@
66
56
  "ApiResponse",
67
57
  "mongoose",
68
58
  "Types.ObjectId",
69
- "zod-validation",
70
- "z.coerce",
71
59
  "ticket-intake",
72
60
  "new-resource"
73
61
  ]
@@ -14,6 +14,18 @@
14
14
  "Bash(git branch*)",
15
15
  "Bash(git fetch*)",
16
16
  "Bash(git stash*)",
17
+ "Bash(git blame*)",
18
+ "Bash(git describe*)",
19
+ "Bash(git rev-parse*)",
20
+ "Bash(git ls-files*)",
21
+ "Bash(git cat-file*)",
22
+ "Bash(git shortlog*)",
23
+ "Bash(git tag -l*)",
24
+ "Bash(git tag --list*)",
25
+ "Bash(git config --get*)",
26
+ "Bash(git config --list*)",
27
+ "Bash(git remote -v*)",
28
+ "Bash(git remote get-url*)",
17
29
  "Read",
18
30
  "Glob",
19
31
  "Grep",
@@ -26,7 +38,16 @@
26
38
  "Bash(which:*)",
27
39
  "Bash(file:*)",
28
40
  "Bash(stat:*)",
29
- "Bash(tree:*)"
41
+ "Bash(tree:*)",
42
+ "Bash(grep:*)",
43
+ "Bash(jq:*)",
44
+ "Bash(diff:*)",
45
+ "Bash(cut:*)",
46
+ "Bash(du:*)",
47
+ "Bash(df:*)",
48
+ "Bash(realpath:*)",
49
+ "Bash(dirname:*)",
50
+ "Bash(basename:*)"
30
51
  ],
31
52
  "ask": [
32
53
  "Bash(rm -rf *)",