@cristiancorreau/forge 2.9.4 → 2.9.6
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/assets/adapters/claude-code/commands/new-feature.md +10 -5
- package/assets/adapters/claude-code/commands/plan.md +61 -36
- package/assets/adapters/claude-code/commands/session-start.md +1 -1
- package/assets/adapters/claude-code/commands/ship.md +6 -4
- package/assets/adapters/claude-code/commands/work.md +8 -6
- package/assets/core/agents/backend-engineer.md +3 -3
- package/assets/core/agents/compliance-reviewer.md +2 -2
- package/assets/core/agents/docs-writer.md +1 -1
- package/assets/core/agents/frontend-engineer.md +2 -2
- package/assets/core/agents/orchestrator.md +8 -6
- package/assets/core/agents/security-auditor.md +1 -1
- package/assets/core/agents/test-engineer.md +1 -1
- package/assets/core/skills/README.md +2 -2
- package/assets/core/skills/aitmpl-search/SKILL.md +7 -19
- package/assets/core/skills/local2prod/SKILL.md +1 -1
- package/assets/core/skills/new-feature/SKILL.md +1 -1
- package/assets/core/skills/phase-kickoff/SKILL.md +2 -0
- package/assets/core/skills/spec/SKILL.md +2 -0
- package/assets/core/skills/wiki-ingest/SKILL.md +7 -7
- package/assets/core/skills/wiki-lint/SKILL.md +4 -4
- package/assets/core/skills/wiki-query/SKILL.md +3 -3
- package/assets/profiles/astro/agents/frontend-engineer.md +4 -3
- package/assets/profiles/django/agents/api-engineer.md +3 -2
- package/assets/profiles/expo/agents/mobile-engineer.md +3 -2
- package/assets/profiles/express/agents/api-engineer.md +1 -0
- package/assets/profiles/fastapi/agents/api-engineer.md +3 -2
- package/assets/profiles/go-gin/agents/api-engineer.md +1 -0
- package/assets/profiles/hono-drizzle/agents/api-engineer.md +3 -2
- package/assets/profiles/laravel/agents/api-engineer.md +5 -4
- package/assets/profiles/laravel/agents/fullstack-engineer.md +2 -1
- package/assets/profiles/laravel/agents/migration-specialist.md +1 -0
- package/assets/profiles/nestjs/agents/api-engineer.md +2 -1
- package/assets/profiles/nextjs-admin/agents/admin-engineer.md +6 -5
- package/assets/profiles/playwright-crawler/agents/scanner-engineer.md +1 -0
- package/assets/profiles/rails/agents/fullstack-engineer.md +2 -1
- package/assets/profiles/sveltekit/agents/frontend-engineer.md +1 -0
- package/assets/profiles/vuenuxt/agents/frontend-engineer.md +4 -3
- package/assets/profiles/wordpress/agents/divi-engineer.md +1 -1
- package/assets/profiles/wordpress/agents/elementor-engineer.md +3 -3
- package/assets/profiles/wordpress/agents/wp-engineer.md +2 -2
- package/dist/commands/init.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
# new-feature
|
|
2
2
|
|
|
3
|
+
> **Atajo de orquestación.** Este comando NO es un flujo competidor: es un wrapper que delega
|
|
4
|
+
> en el pipeline SDD canónico `/plan` → `/work` → `/review` → `/ship`. Usa el mismo template de
|
|
5
|
+
> spec (`core/templates/spec-template.md`) y la misma máquina de estados
|
|
6
|
+
> (`DRAFT` → `REVIEW` → `APPROVED` → `IMPLEMENTED`). No dupliques aquí lógica de esos comandos:
|
|
7
|
+
> invocá cada uno en su etapa.
|
|
8
|
+
|
|
3
9
|
Inicia la implementación de una nueva feature siguiendo SDD (Spec-Driven Development).
|
|
4
10
|
|
|
5
11
|
Argumentos: $ARGUMENTS — nombre de la feature o ruta a la spec existente.
|
|
6
12
|
|
|
7
|
-
1. Si no existe spec para "$ARGUMENTS" en docs/specs
|
|
8
|
-
2.
|
|
9
|
-
3.
|
|
10
|
-
4.
|
|
11
|
-
5. Al terminar, actualizar la spec con las decisiones tomadas durante la implementación.
|
|
13
|
+
1. **Spec** — Si no existe spec para "$ARGUMENTS" en `docs/specs/`, ejecutar `/plan <fase> "$ARGUMENTS"` para crearla (queda en `APPROVED`). Si ya existe, leerla.
|
|
14
|
+
2. **Implementación** — Ejecutar `/work` para implementar la spec aprobada. Propone el team, espera aprobación e implementa con tests junto a la implementación, no al final. `/work` marca la spec como `IMPLEMENTED` y completa "Notas de implementación".
|
|
15
|
+
3. **Review** — Ejecutar `/review` para obtener el veredicto vinculante (persiste en `.claude/review-status.json`).
|
|
16
|
+
4. **Ship** — Si el review resultó `APPROVED` y el usuario lo pide, ejecutar `/ship` para el deploy.
|
|
@@ -16,44 +16,66 @@ Construir el nombre del archivo:
|
|
|
16
16
|
- Tomar el título, convertirlo a minúsculas, reemplazar espacios por guiones, eliminar caracteres especiales → `<slug>`
|
|
17
17
|
- Nombre final: `docs/specs/<fase>-<slug>.md`
|
|
18
18
|
|
|
19
|
-
Crear el archivo con
|
|
19
|
+
Crear el archivo con el template canónico de `core/templates/spec-template.md` (misma fuente única de verdad que el skill `spec`):
|
|
20
20
|
|
|
21
21
|
```markdown
|
|
22
|
-
#
|
|
23
|
-
**Fase:** <fase> | **Estado:** draft | **Fecha:** YYYY-MM-DD
|
|
22
|
+
# <fase> Título de la Feature
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
> Estado: DRAFT | REVIEW | APPROVED | IMPLEMENTED
|
|
25
|
+
> Responsable: [nombre o rol]
|
|
26
|
+
> Creada: YYYY-MM-DD | Actualizada: YYYY-MM-DD
|
|
27
27
|
|
|
28
|
-
##
|
|
29
|
-
[Qué NO cubre esta spec]
|
|
28
|
+
## Contexto
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
- [ ] Criterio 1 (verificable, testeable)
|
|
33
|
-
- [ ] Criterio 2
|
|
30
|
+
Por qué existe esta feature. Qué problema resuelve. Qué pasa si no la hacemos.
|
|
34
31
|
|
|
35
|
-
##
|
|
36
|
-
[Si el proyecto tiene frameworks de compliance en project.yaml, mapear qué artículos aplican. Si no aplica, escribir "N/A".]
|
|
32
|
+
## Decisión
|
|
37
33
|
|
|
38
|
-
|
|
39
|
-
[Casos límite que la implementación debe manejar]
|
|
34
|
+
Qué vamos a implementar exactamente. Ser específico: endpoints, tablas, componentes.
|
|
40
35
|
|
|
41
|
-
##
|
|
42
|
-
[Se llena durante la implementación]
|
|
36
|
+
## Alternativas consideradas
|
|
43
37
|
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
| Opción | Pros | Contras | Descartada por |
|
|
39
|
+
|--------|------|---------|----------------|
|
|
40
|
+
| Opción A | ... | ... | ... |
|
|
41
|
+
| Opción B | ... | ... | ... |
|
|
42
|
+
|
|
43
|
+
## Criterios de aceptación
|
|
44
|
+
|
|
45
|
+
- [ ] Criterio verificable 1
|
|
46
|
+
- [ ] Criterio verificable 2
|
|
47
|
+
- [ ] Criterio verificable N
|
|
48
|
+
|
|
49
|
+
## Impacto de compliance
|
|
50
|
+
|
|
51
|
+
Si el proyecto tiene `compliance.frameworks` configurado, completar:
|
|
52
|
+
|
|
53
|
+
- **Ley 21.719**: art. X → [descripción del impacto]
|
|
54
|
+
- **GDPR**: Art. Y → [descripción del impacto]
|
|
55
|
+
- No aplica (si no hay impacto de compliance)
|
|
56
|
+
|
|
57
|
+
## Dependencias
|
|
58
|
+
|
|
59
|
+
- Requiere que [otra spec ID] esté implementada
|
|
60
|
+
- Bloqueada por [issue/ticket]
|
|
61
|
+
|
|
62
|
+
## Notas de implementación
|
|
63
|
+
|
|
64
|
+
Cualquier decisión tomada durante la implementación que no estaba en la spec original.
|
|
46
65
|
```
|
|
47
66
|
|
|
67
|
+
Marcar el estado inicial como `DRAFT` (la primera línea del bloque de metadata: `> Estado: DRAFT`).
|
|
68
|
+
|
|
48
69
|
### Paso 3 — Guiar al usuario por cada sección
|
|
49
70
|
|
|
50
71
|
Preguntar una sección a la vez, en orden:
|
|
51
72
|
|
|
52
|
-
1. "¿Qué problema concreto resuelve esta feature? ¿Por qué ahora y no más adelante?"
|
|
53
|
-
2. "¿Qué
|
|
54
|
-
3. "¿
|
|
55
|
-
4.
|
|
56
|
-
5.
|
|
73
|
+
1. **Contexto**: "¿Qué problema concreto resuelve esta feature? ¿Por qué ahora y no más adelante? ¿Qué pasa si no la hacemos?"
|
|
74
|
+
2. **Decisión**: "¿Qué vamos a implementar exactamente? Ser específico: endpoints, tablas, componentes."
|
|
75
|
+
3. **Alternativas consideradas**: "¿Qué otras opciones se evaluaron y por qué se descartaron?"
|
|
76
|
+
4. **Criterios de aceptación**: "¿Cuáles son los criterios de aceptación verificables? (cada uno debe ser testeable de forma objetiva)"
|
|
77
|
+
5. Si `project.yaml` tiene frameworks de compliance: "¿Qué artículos o controles de compliance aplican a esta feature?"
|
|
78
|
+
6. **Dependencias**: "¿De qué otras specs o tickets depende esta feature?"
|
|
57
79
|
|
|
58
80
|
Completar el archivo con las respuestas del usuario a medida que avanza.
|
|
59
81
|
|
|
@@ -68,28 +90,31 @@ Leer `project.yaml` → `project.mode`:
|
|
|
68
90
|
**Cómo aplicar el Planner-Critic:**
|
|
69
91
|
|
|
70
92
|
Adoptar el rol de "Critic" y revisar la spec completa buscando:
|
|
71
|
-
- ¿Hay
|
|
93
|
+
- ¿Hay criterios de aceptación que no son objetivamente verificables?
|
|
72
94
|
- ¿Hay términos ambiguos que diferentes personas podrían interpretar distinto?
|
|
73
|
-
- ¿
|
|
74
|
-
- ¿
|
|
95
|
+
- ¿El contexto y la decisión son suficientemente específicos para evitar scope creep?
|
|
96
|
+
- ¿Faltan dependencias o alternativas relevantes que deberían documentarse?
|
|
75
97
|
|
|
76
|
-
Mostrar las críticas como bullet points. Preguntar: "¿Ajustamos la spec antes de
|
|
98
|
+
Mostrar las críticas como bullet points. Preguntar: "¿Ajustamos la spec antes de pasarla a REVIEW?"
|
|
77
99
|
|
|
78
100
|
Si el usuario ajusta: actualizar el archivo y repetir el Critic una vez más.
|
|
79
101
|
|
|
80
|
-
### Paso 5 — Marcar como
|
|
102
|
+
### Paso 5 — Marcar como APPROVED
|
|
81
103
|
|
|
82
104
|
Cuando el usuario aprueba la spec (o decide no aplicar el Critic):
|
|
83
|
-
- Cambiar
|
|
84
|
-
-
|
|
105
|
+
- Cambiar `> Estado: DRAFT` → `> Estado: APPROVED` en el archivo
|
|
106
|
+
- Actualizar la fecha de `Actualizada:` a la fecha de hoy
|
|
107
|
+
- Confirmar: "Spec aprobada: `docs/specs/<archivo>.md`. Ahora podés ejecutar `/work` para implementarla."
|
|
108
|
+
|
|
109
|
+
> Estados de spec (alineados con `core/templates/spec-template.md`): `DRAFT` → `REVIEW` → `APPROVED` → `IMPLEMENTED`. `/plan` crea en `DRAFT` y aprueba a `APPROVED`; `/work` la marca `IMPLEMENTED`.
|
|
85
110
|
|
|
86
111
|
---
|
|
87
112
|
|
|
88
113
|
## Modo listar (`/plan` sin argumentos)
|
|
89
114
|
|
|
90
|
-
Buscar todos los archivos `.md` en `docs/specs/` que contengan
|
|
115
|
+
Buscar todos los archivos `.md` en `docs/specs/` que contengan `> Estado: DRAFT` o `> Estado: REVIEW`.
|
|
91
116
|
|
|
92
|
-
Si no hay ninguno: "No hay specs en estado
|
|
117
|
+
Si no hay ninguno: "No hay specs en estado DRAFT o REVIEW. Ejecutá `/plan <fase> \"<título>\"` para crear una."
|
|
93
118
|
|
|
94
119
|
Si hay alguno: mostrarlos como lista numerada con título, fase y fecha. Ejemplo:
|
|
95
120
|
```
|
|
@@ -106,10 +131,10 @@ Preguntar: "¿Cuál continuamos?"
|
|
|
106
131
|
Leer el archivo de spec indicado.
|
|
107
132
|
|
|
108
133
|
Aplicar el Planner-Critic completo:
|
|
109
|
-
- ¿Los
|
|
110
|
-
- ¿Hay ambigüedades en el
|
|
111
|
-
- ¿
|
|
112
|
-
- ¿
|
|
134
|
+
- ¿Los criterios de aceptación son objetivamente testeables?
|
|
135
|
+
- ¿Hay ambigüedades en el contexto, la decisión o los criterios?
|
|
136
|
+
- ¿Las alternativas consideradas justifican la decisión tomada?
|
|
137
|
+
- ¿Las dependencias están completas y son explícitas?
|
|
113
138
|
|
|
114
139
|
Mostrar sugerencias de mejora como bullet points con la sección específica que afectan.
|
|
115
140
|
|
|
@@ -15,7 +15,7 @@ Ejecutar los siguientes comandos y guardar sus resultados:
|
|
|
15
15
|
## Paso 2 — Leer configuración del proyecto
|
|
16
16
|
|
|
17
17
|
- Si existe `project.yaml` en el directorio actual, leerlo para obtener: `project.mode`, `project.name`, `stack.*`, `agents.active`
|
|
18
|
-
- Si existe `
|
|
18
|
+
- Si existe `wiki/index.md`, leerlo para obtener contexto del proyecto
|
|
19
19
|
- Si ninguno existe, continuar con defaults: mode=startup, sin checks de compliance
|
|
20
20
|
|
|
21
21
|
## Paso 3 — Evaluar escenario y actuar
|
|
@@ -10,10 +10,12 @@ Leer `project.yaml`. Si no existe sección `deploy`: "deploy no configurado en p
|
|
|
10
10
|
|
|
11
11
|
## Paso 1 — Verificar review
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Leer `.claude/review-status.json` (es el archivo que persiste `/review` en su Paso 6).
|
|
14
14
|
|
|
15
|
-
- Si
|
|
16
|
-
-
|
|
15
|
+
- **Si el archivo existe**: parsear su contenido y validar el campo `verdict`.
|
|
16
|
+
- `verdict == "APPROVED"`: continuar. (Opcional: si el `timestamp` del review es anterior al último commit relevante, advertir que el review podría estar desactualizado y pedir confirmación.)
|
|
17
|
+
- `verdict == "CHANGES_REQUESTED"` o `verdict == "BLOCKED"`: "El último review resultó en `<verdict>`. Resolvé los puntos y volvé a ejecutar `/review` antes de hacer deploy." y detener.
|
|
18
|
+
- **Si el archivo NO existe** (fallback): "No se encontró `.claude/review-status.json`. ¿Confirmás que el código fue revisado y aprobado? (s/n)"
|
|
17
19
|
- Si n: "Ejecutá `/review` antes de hacer deploy." y detener.
|
|
18
20
|
|
|
19
21
|
## Paso 2 — Verificar git status
|
|
@@ -31,7 +33,7 @@ Preguntar: "¿Querés mergear el PR actual a main antes del deploy? (s/n)"
|
|
|
31
33
|
Si sí:
|
|
32
34
|
- Ejecutar `gh pr checks` para verificar que todos los checks pasan
|
|
33
35
|
- Si algún check falla: "El PR tiene checks fallando. Resolvelos antes de mergear." y detener.
|
|
34
|
-
- Si todos pasan: ejecutar `gh pr merge --merge`
|
|
36
|
+
- Si todos pasan: ejecutar `gh pr merge --merge`
|
|
35
37
|
|
|
36
38
|
Si no: continuar sin mergear.
|
|
37
39
|
|
|
@@ -6,11 +6,11 @@ Scope: $ARGUMENTS (ej: `--serial`, `--autorun`, o vacío para modo paralelo est
|
|
|
6
6
|
|
|
7
7
|
## Paso 1 — Identificar la spec
|
|
8
8
|
|
|
9
|
-
Buscar archivos `.md` en `docs/specs/` que contengan
|
|
9
|
+
Buscar archivos `.md` en `docs/specs/` que contengan `> Estado: APPROVED`.
|
|
10
10
|
|
|
11
11
|
- Si hay exactamente una: mostrarla y confirmar "Implementando: `<archivo>`."
|
|
12
12
|
- Si hay varias: mostrarlas como lista numerada y pedir que el usuario elija.
|
|
13
|
-
- Si no hay ninguna: "No hay spec en estado
|
|
13
|
+
- Si no hay ninguna: "No hay spec en estado APPROVED. Ejecutá `/plan` primero." y detener.
|
|
14
14
|
|
|
15
15
|
Leer la spec seleccionada completa antes de continuar.
|
|
16
16
|
|
|
@@ -94,8 +94,10 @@ Si hay errores o conflictos: reportar claramente y preguntar cómo proceder. No
|
|
|
94
94
|
|
|
95
95
|
## Paso 7 — Actualizar la spec
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
- Al completar exitosamente: cambiar `**Estado:** in-progress` → `**Estado:** implemented`
|
|
99
|
-
- Completar las secciones "Implementation notes" y "Decisiones tomadas" con lo que se hizo
|
|
97
|
+
Estados de spec (alineados con `core/templates/spec-template.md`): `DRAFT` → `REVIEW` → `APPROVED` → `IMPLEMENTED`.
|
|
100
98
|
|
|
101
|
-
|
|
99
|
+
- Al completar exitosamente: cambiar `> Estado: APPROVED` → `> Estado: IMPLEMENTED`
|
|
100
|
+
- Actualizar la fecha de `Actualizada:` a la fecha de hoy
|
|
101
|
+
- Completar la sección "Notas de implementación" con lo que se hizo y las decisiones tomadas
|
|
102
|
+
|
|
103
|
+
Confirmar: "Implementación completa. Spec actualizada a `IMPLEMENTED`. Podés ejecutar `/review` y luego `/ship`."
|
|
@@ -54,8 +54,8 @@ Implementás el backend del proyecto. Tu scope está definido en el `project.yam
|
|
|
54
54
|
- `/review` para revisar tu propio trabajo antes de reportar al orchestrator
|
|
55
55
|
|
|
56
56
|
**Hooks que aplican a tu trabajo:**
|
|
57
|
-
- `pre-edit-check.
|
|
57
|
+
- `pre-edit-check.js`: te va a advertir si dejás `console.log` o credenciales en código
|
|
58
58
|
- `post-turn-check.sh`: correrá typecheck sobre los archivos que modificaste
|
|
59
|
-
- `pre-bash-check.
|
|
59
|
+
- `pre-bash-check.js` (en proyectos standard/enterprise): bloquea comandos destructivos en producción — si necesitás hacer algo en producción, coordiná con el humano explícitamente
|
|
60
60
|
|
|
61
|
-
**Scope:** Operar solo en
|
|
61
|
+
**Scope:** Operar solo en el directorio de backend del proyecto (el derivado de `stack.backend` en `project.yaml`, o `paths.api` si está definido). No tocar archivos de frontend o mobile sin autorización explícita.
|
|
@@ -79,5 +79,5 @@ Este agente opera sobre el conocimiento de entrenamiento del modelo, **no sobre
|
|
|
79
79
|
- ¿Hay logs de auditoría para las acciones del PR?
|
|
80
80
|
|
|
81
81
|
**Hooks relacionados:**
|
|
82
|
-
-
|
|
83
|
-
- Si
|
|
82
|
+
- Los hooks de guardrail instalados (`pre-edit-check.js`, `pre-bash-check.js`) detectan secrets, debug y comandos destructivos antes de que se editen archivos
|
|
83
|
+
- Si el proyecto define un hook de compliance adicional (ej: detección de PII en logs) y no está activo, notificar al equipo
|
|
@@ -72,6 +72,6 @@ Si aplica: qué artículos o secciones de las leyes relevantes toca esta feature
|
|
|
72
72
|
- No editar manualmente — son el registro de sesión
|
|
73
73
|
|
|
74
74
|
**Wiki (docs/wiki/):**
|
|
75
|
-
- index.md: actualizar con `/
|
|
75
|
+
- index.md: actualizar con el skill `/wiki-ingest` (consultas con `/wiki-query`, validación con `/wiki-lint`)
|
|
76
76
|
- log.md: append-only — nunca editar entradas pasadas
|
|
77
77
|
- raw/: fuentes originales inmutables
|
|
@@ -63,8 +63,8 @@ Implementás el frontend del proyecto. Tu scope está definido en el `project.ya
|
|
|
63
63
|
- `/review` para revisar tu propio trabajo antes de reportar al orchestrator
|
|
64
64
|
|
|
65
65
|
**Hooks que aplican a tu trabajo:**
|
|
66
|
-
- `pre-edit-check.
|
|
66
|
+
- `pre-edit-check.js`: detecta `console.log` en TypeScript y credenciales hardcodeadas — corregí antes de reportar listo
|
|
67
67
|
- `post-turn-check.sh`: correrá `tsc` sobre los archivos que modificaste — asegurate de que typechecks pasan
|
|
68
|
-
- `pre-bash-check.
|
|
68
|
+
- `pre-bash-check.js` (en proyectos standard/enterprise): bloquea comandos destructivos en producción
|
|
69
69
|
|
|
70
70
|
**Scope:** Operar solo en archivos de UI y componentes (ver `stack.frontend` en `project.yaml`). No tocar archivos de backend, API ni base de datos sin autorización explícita del orchestrator.
|
|
@@ -16,7 +16,7 @@ Sos el lead de un agent team. Tu trabajo es coordinar, no implementar.
|
|
|
16
16
|
1. **Recibir tareas** del humano y entenderlas en profundidad.
|
|
17
17
|
2. **Identificar la spec** correspondiente en `docs/specs/`. Si no existe, parar y pedir que se cree.
|
|
18
18
|
3. **Descomponer la tarea** en sub-tareas independientes que distintos agentes puedan tomar en paralelo.
|
|
19
|
-
4. **Spawnear el team** con los agentes apropiados
|
|
19
|
+
4. **Spawnear el team** con los agentes apropiados. El roster se descubre desde `.claude/agents/*.md` (o el `AGENTS.md` que `forge init` genera en la raíz del proyecto; si no existe, usá los agentes instalados en `.claude/agents/`).
|
|
20
20
|
5. **Sintetizar** los resultados al final y reportar al humano.
|
|
21
21
|
|
|
22
22
|
## Cómo spawnear agentes
|
|
@@ -40,6 +40,8 @@ Agent({
|
|
|
40
40
|
|
|
41
41
|
### Coordinación con SendMessage
|
|
42
42
|
|
|
43
|
+
`SendMessage` e `isolation: "worktree"` son capacidades del runtime de teams — no necesitan declararse en el campo `tools:` del frontmatter.
|
|
44
|
+
|
|
43
45
|
```
|
|
44
46
|
SendMessage({ to: "backend-engineer", message: "Tipos listos. Podés continuar." })
|
|
45
47
|
```
|
|
@@ -71,12 +73,12 @@ Esperá aprobación antes de spawnear el team.
|
|
|
71
73
|
|
|
72
74
|
## Reglas
|
|
73
75
|
|
|
74
|
-
- Leé `CLAUDE.md` y `AGENTS.md`
|
|
76
|
+
- Leé `CLAUDE.md` raíz y, si existe, `AGENTS.md` (generado por `forge init`) antes de spawnear cualquier agente.
|
|
75
77
|
- Sin spec en `docs/specs/` → no empieces. Pedí que se cree primero.
|
|
76
78
|
- Mínimo número de agentes que la tarea justifica. <3 archivos → un solo agente basta.
|
|
77
79
|
- Incluí al `compliance-reviewer` si la tarea toca datos de usuarios, consentimientos o logs.
|
|
78
80
|
- Pedí aprobación al humano antes de mergear cuando >5 archivos del mismo módulo fueron tocados.
|
|
79
|
-
-
|
|
81
|
+
- **Techo de paralelismo (concurrentes):** máximo 3 agentes simultáneos en suscripción Pro / hasta 7-8 con Max 20x o API directa. Este es el único límite de agentes concurrentes.
|
|
80
82
|
|
|
81
83
|
## No hagas
|
|
82
84
|
|
|
@@ -95,10 +97,10 @@ Esperá aprobación antes de spawnear el team.
|
|
|
95
97
|
**Reglas obligatorias para el team:**
|
|
96
98
|
1. Nunca delegues implementación sin spec aprobada en `docs/specs/`
|
|
97
99
|
2. El team no edita código en main — verificar branch antes de spawnear teammates
|
|
98
|
-
3.
|
|
100
|
+
3. Como guía de carga: ~5-6 tasks por teammate y 3-5 teammates totales por sesión (el techo de *concurrencia* es el de la sección Reglas: 3 Pro / 7-8 Max)
|
|
99
101
|
4. Si el proyecto es enterprise: incluir compliance-reviewer en PRs que toquen datos de usuarios
|
|
100
102
|
|
|
101
103
|
**Hooks activos que el team debe respetar:**
|
|
102
|
-
- `pre-edit-check.
|
|
104
|
+
- `pre-edit-check.js`: bloquea edits en main y detecta credenciales hardcodeadas
|
|
103
105
|
- `post-turn-check.sh`: corre typecheck al terminar cada turno
|
|
104
|
-
- `pre-bash-check.
|
|
106
|
+
- `pre-bash-check.js` (si mode=standard/enterprise): bloquea comandos destructivos en producción
|
|
@@ -50,5 +50,5 @@ con severidad y recomendación de fix.
|
|
|
50
50
|
**Checklist adicional para Forge v2:**
|
|
51
51
|
- ¿El PR agrega variables de entorno? Verificar que están documentadas en `.env.example`
|
|
52
52
|
- ¿Hay cambios en permisos de `settings.json`? Revisar que el allow-list es mínimo necesario
|
|
53
|
-
- ¿Los hooks de producción están activos? (pre-bash-check.
|
|
53
|
+
- ¿Los hooks de producción están activos? (pre-bash-check.js para mode=standard/enterprise)
|
|
54
54
|
- ¿El deploy pipeline de `/ship` incluye verificación de runtime logs?
|
|
@@ -25,7 +25,7 @@ testeable, se lo pedís al agente que corresponda y esperás.
|
|
|
25
25
|
- **No escribís código de producción.** Si algo no se puede testear, lo reportás.
|
|
26
26
|
- Tests determinísticos — sin `Math.random()` ni `Date.now()` sin mockear.
|
|
27
27
|
- Nombres descriptivos: `describe("cuando X") / it("debería Y")`.
|
|
28
|
-
-
|
|
28
|
+
- Cuando el proyecto tiene base de datos (según `stack` en `project.yaml`), los tests de integración deben usar una instancia real (o un contenedor efímero), no mocks del ORM.
|
|
29
29
|
- Limpiar fixtures después de cada test (transacciones o truncate).
|
|
30
30
|
- Sin `console.log` en tests — el runner lo reportará como falla en CI.
|
|
31
31
|
|
|
@@ -31,7 +31,7 @@ wiki-lint → health check + auto-reparación
|
|
|
31
31
|
| `security-audit` | Universal | No | new-feature, security-auditor |
|
|
32
32
|
| `db-migrate` | Universal | No (solo el ORM del proyecto) | new-feature |
|
|
33
33
|
| `browser-test` | Universal | `agent-browser` CLI (npm i -g) | new-feature, usuario directo |
|
|
34
|
-
| `wiki-ingest` | Wiki | No | usuario directo, docs-writer |
|
|
34
|
+
| `wiki-ingest` | Wiki | No | usuario directo, agente docs-writer |
|
|
35
35
|
| `wiki-query` | Wiki | No | usuario directo, new-feature |
|
|
36
36
|
| `wiki-lint` | Wiki | No | usuario directo |
|
|
37
37
|
| `local2prod` | Universal | CLI del provider de deploy | new-feature |
|
|
@@ -53,7 +53,7 @@ Configurar en `project.yaml` bajo `skills.active`:
|
|
|
53
53
|
- **`new-feature`**: checklist completo de implementación (orquesta los otros)
|
|
54
54
|
|
|
55
55
|
### Wiki — knowledge base del proyecto
|
|
56
|
-
Configurar en `project.yaml` bajo `skills
|
|
56
|
+
Configurar en `project.yaml` bajo `skills`. Generan slash commands `/wiki-ingest`, `/wiki-query`, `/wiki-lint` en Claude Code. La estructura `wiki/` se inicializa con `forge wiki ingest <archivo>`:
|
|
57
57
|
- **`wiki-ingest`**: ingesta fuentes (URL, archivo, texto) → actualiza `raw/` + páginas wiki + index + log
|
|
58
58
|
- **`wiki-query`**: responde preguntas usando el wiki como base, con citas a páginas
|
|
59
59
|
- **`wiki-lint`**: verifica integridad del wiki: links, huérfanos, frontmatter, log
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Skill: aitmpl-search
|
|
2
2
|
|
|
3
3
|
Busca en el catálogo curado de forge: frameworks de agentes IA, MCP servers instalables,
|
|
4
|
-
profiles de stack y herramientas. La búsqueda es offline (catálogo local)
|
|
5
|
-
puede extenderse a GitHub con `--github`.
|
|
4
|
+
profiles de stack y herramientas. La búsqueda es offline (catálogo local).
|
|
6
5
|
|
|
7
6
|
Triggers: /aitmpl-search, "buscar templates", "buscar en catálogo", "templates de AI",
|
|
8
7
|
"buscar template", "buscar MCP", "buscar profile".
|
|
@@ -24,33 +23,22 @@ Triggers: /aitmpl-search, "buscar templates", "buscar en catálogo", "templates
|
|
|
24
23
|
|
|
25
24
|
Búsqueda por texto en el catálogo local:
|
|
26
25
|
```bash
|
|
27
|
-
|
|
26
|
+
forge aitmpl-search "<query>" --limit 10
|
|
28
27
|
```
|
|
29
28
|
|
|
30
|
-
Filtrar por categoría (`
|
|
29
|
+
Filtrar por categoría (`mcp-server`, `framework`, `profile`):
|
|
31
30
|
```bash
|
|
32
|
-
|
|
31
|
+
forge aitmpl-search --category mcp-server
|
|
33
32
|
```
|
|
34
33
|
|
|
35
34
|
Ver todas las categorías disponibles:
|
|
36
35
|
```bash
|
|
37
|
-
|
|
36
|
+
forge aitmpl-search --list-categories
|
|
38
37
|
```
|
|
39
38
|
|
|
40
39
|
Salida JSON (para integración o análisis):
|
|
41
40
|
```bash
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Extender con búsqueda en GitHub (requiere red; límite 60 req/h sin token):
|
|
46
|
-
```bash
|
|
47
|
-
python3 .agentic/scripts/aitmpl-search.py "<query>" --github
|
|
48
|
-
export GITHUB_TOKEN=ghp_... # aumenta a 5000 req/h
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Desde el CLI interactivo:
|
|
52
|
-
```bash
|
|
53
|
-
python3 .agentic/forge.py # → "Buscar templates" → buscar o filtrar por categoría
|
|
41
|
+
forge aitmpl-search "<query>" --json
|
|
54
42
|
```
|
|
55
43
|
|
|
56
44
|
### Paso 2 — Analizar resultados
|
|
@@ -71,4 +59,4 @@ Para profiles, ofrece agregar el profile a `project.yaml` directamente.
|
|
|
71
59
|
|
|
72
60
|
- No asumir que un resultado del catálogo está actualizado — verificar el repositorio antes de recomendar
|
|
73
61
|
- No crear agentes Tier 2 sin revisar si el stack ya tiene un profile en `profiles/`
|
|
74
|
-
- No instalar MCP servers sin verificar que el usuario tiene
|
|
62
|
+
- No instalar MCP servers sin verificar que el usuario tiene las dependencias requeridas
|
|
@@ -27,7 +27,7 @@ git status # confirmar qué va al commit
|
|
|
27
27
|
|
|
28
28
|
git commit -m "tipo(scope): descripción en imperativo
|
|
29
29
|
|
|
30
|
-
Co-Authored-By:
|
|
30
|
+
Co-Authored-By: <modelo> <noreply@anthropic.com>"
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Si ya hay un commit listo, ir directo al Paso 2.
|
|
@@ -117,7 +117,7 @@ Invocar el skill `/security-audit` como checklist mental antes de escribir cualq
|
|
|
117
117
|
# > Estado: IMPLEMENTED
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
6. **Actualizar CLAUDE.md** — mover el ID de spec de "En curso" a "Completadas"
|
|
121
121
|
|
|
122
122
|
---
|
|
123
123
|
|
|
@@ -33,7 +33,7 @@ Si es texto → usar el texto tal como está
|
|
|
33
33
|
### Paso 2 — Almacenar en raw/ (inmutable)
|
|
34
34
|
|
|
35
35
|
```
|
|
36
|
-
Path:
|
|
36
|
+
Path: wiki/raw/<tema>/<YYYY-MM-DD>-<slug-del-titulo>.md
|
|
37
37
|
|
|
38
38
|
Formato del archivo raw:
|
|
39
39
|
---
|
|
@@ -59,14 +59,14 @@ Leer el contenido y identificar:
|
|
|
59
59
|
### Paso 4 — Actualizar páginas wiki
|
|
60
60
|
|
|
61
61
|
Para cada concepto identificado:
|
|
62
|
-
- Si `
|
|
62
|
+
- Si `wiki/concepts/<nombre>.md` existe → agregar sección con nueva info + citar fuente
|
|
63
63
|
- Si no existe → crear la página desde la plantilla
|
|
64
64
|
|
|
65
65
|
Para cada entidad identificada:
|
|
66
|
-
- Si `
|
|
66
|
+
- Si `wiki/entities/<nombre>.md` existe → actualizar con nueva info
|
|
67
67
|
- Si no existe → crear la página desde la plantilla
|
|
68
68
|
|
|
69
|
-
Crear siempre `
|
|
69
|
+
Crear siempre `wiki/sources/<slug>.md` con resumen de la fuente:
|
|
70
70
|
|
|
71
71
|
```markdown
|
|
72
72
|
---
|
|
@@ -95,11 +95,11 @@ tags: [tag1, tag2]
|
|
|
95
95
|
|
|
96
96
|
### Paso 5 — Actualizar index.md y log.md
|
|
97
97
|
|
|
98
|
-
En `
|
|
98
|
+
En `wiki/index.md`:
|
|
99
99
|
- Agregar filas nuevas en las tablas correspondientes (concepts, entities, sources)
|
|
100
100
|
- Si la categoría no existe, crearla
|
|
101
101
|
|
|
102
|
-
En `
|
|
102
|
+
En `wiki/log.md` (append-only — NUNCA editar entradas anteriores):
|
|
103
103
|
|
|
104
104
|
```markdown
|
|
105
105
|
## [<YYYY-MM-DD>] ingest | <título de la fuente>
|
|
@@ -180,4 +180,4 @@ Si la nueva fuente contradice algo en el wiki:
|
|
|
180
180
|
|
|
181
181
|
- `wiki-query` consume las páginas que este skill crea
|
|
182
182
|
- `wiki-lint` verifica la integridad después de un ingest
|
|
183
|
-
- `docs-writer` puede invocar wiki-ingest al documentar una decisión nueva
|
|
183
|
+
- el agente `docs-writer` (no es un skill) puede invocar wiki-ingest al documentar una decisión nueva
|
|
@@ -20,7 +20,7 @@ wiki", "wiki health", "wiki check".
|
|
|
20
20
|
|
|
21
21
|
### 1. Integridad del índice
|
|
22
22
|
|
|
23
|
-
Leer `
|
|
23
|
+
Leer `wiki/index.md` y verificar:
|
|
24
24
|
|
|
25
25
|
```
|
|
26
26
|
✓ Cada [[link]] del índice apunta a un archivo que existe
|
|
@@ -32,10 +32,10 @@ Auto-reparar: agregar al índice los archivos que faltan (con descripción vací
|
|
|
32
32
|
### 2. Wikilinks rotos
|
|
33
33
|
|
|
34
34
|
Buscar en todas las páginas wiki referencias `[[ruta/nombre]]` y verificar que
|
|
35
|
-
el archivo `
|
|
35
|
+
el archivo `wiki/ruta/nombre.md` existe.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
grep -rn "\[\["
|
|
38
|
+
grep -rn "\[\[" wiki/ --include="*.md" | grep -v "raw/"
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Reportar: lista de links rotos con el archivo donde aparecen.
|
|
@@ -53,7 +53,7 @@ Reportar: lista de huérfanas. No auto-borrar — requiere decisión humana.
|
|
|
53
53
|
|
|
54
54
|
### 4. Integridad del log
|
|
55
55
|
|
|
56
|
-
Verificar que `
|
|
56
|
+
Verificar que `wiki/log.md` existe y tiene al menos una entrada.
|
|
57
57
|
El log es append-only — nunca modificar entradas pasadas.
|
|
58
58
|
|
|
59
59
|
Reportar si el log no ha sido actualizado en los últimos 30 días (wiki posiblemente abandonado).
|
|
@@ -22,9 +22,9 @@ sabemos de", "wiki:", "query:", "consultar wiki", "what does the wiki say about"
|
|
|
22
22
|
|
|
23
23
|
### Paso 1 — Leer el índice
|
|
24
24
|
|
|
25
|
-
Leer `
|
|
25
|
+
Leer `wiki/index.md` para identificar qué páginas son relevantes a la pregunta.
|
|
26
26
|
|
|
27
|
-
Si no hay wiki (`
|
|
27
|
+
Si no hay wiki (`wiki/` no existe o está vacío): indicar que el wiki está vacío
|
|
28
28
|
y sugerir usar `/wiki-ingest` para agregar conocimiento.
|
|
29
29
|
|
|
30
30
|
### Paso 2 — Leer páginas relevantes
|
|
@@ -60,7 +60,7 @@ qué fuentes ingestar para cubrir el gap.
|
|
|
60
60
|
Si la pregunta produjo una síntesis nueva (no trivial, reutilizable), archivarla:
|
|
61
61
|
|
|
62
62
|
```
|
|
63
|
-
|
|
63
|
+
wiki/synthesis/<tema>.md
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
Formato:
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: astro
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Frontend Engineer — Astro
|
|
@@ -15,7 +16,7 @@ ni backend fuera de las integraciones de Astro.
|
|
|
15
16
|
|
|
16
17
|
## Stack
|
|
17
18
|
|
|
18
|
-
- **Framework:** Astro
|
|
19
|
+
- **Framework:** Astro (última versión estable)
|
|
19
20
|
- **Rendering:** SSG por defecto; SSR con adaptadores (Vercel, Cloudflare, Node)
|
|
20
21
|
- **UI Islands:** React, Svelte, Vue o Lit según el proyecto
|
|
21
22
|
- **Contenido:** MDX, Content Collections, Markdown
|
|
@@ -36,7 +37,7 @@ ni backend fuera de las integraciones de Astro.
|
|
|
36
37
|
|
|
37
38
|
- **Sin JavaScript innecesario:** Astro carga 0 JS por defecto — mantenerlo así salvo islands explícitas.
|
|
38
39
|
- **Content Collections tipadas:** toda colección define su schema Zod en `src/content/config.ts`.
|
|
39
|
-
- **Sin secrets en el cliente:** variables de entorno con `
|
|
40
|
+
- **Sin secrets en el cliente:** variables de entorno con prefijo `PUBLIC_` son públicas (`import.meta.env.PUBLIC_*`) — solo usarlas para config no sensible.
|
|
40
41
|
- **Accesibilidad:** HTML semántico, atributos `alt`, roles ARIA cuando el HTML no es suficiente.
|
|
41
42
|
- **Sin spec, sin código:** la spec debe existir en `docs/specs/` antes de implementar.
|
|
42
43
|
|
|
@@ -66,7 +67,7 @@ Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/`
|
|
|
66
67
|
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
67
68
|
|
|
68
69
|
### Hooks activos en este stack
|
|
69
|
-
- **`pre-edit-check.
|
|
70
|
+
- **`pre-edit-check.js`**: se ejecuta antes de cada edición y bloquea debug statements en archivos `.astro`, `.ts` y `.tsx`. No dejes `console.log`, `debugger` ni comentarios `// TODO` sin ticket.
|
|
70
71
|
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Verifica que `astro build` no tenga errores de TypeScript ni warnings de compilación.
|
|
71
72
|
|
|
72
73
|
### Reglas de scope
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: api-engineer
|
|
3
|
-
description: "Implementa el backend del proyecto. Django
|
|
3
|
+
description: "Implementa el backend del proyecto. Django (última versión estable) + DRF/Django Ninja + PostgreSQL. Scope: apps/ y config/."
|
|
4
4
|
model: sonnet
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: django
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# API Engineer — Django
|
|
@@ -14,7 +15,7 @@ Implementás el backend del proyecto. Tu scope es `apps/` y `config/` (estructur
|
|
|
14
15
|
## Stack
|
|
15
16
|
|
|
16
17
|
- **Runtime:** Python 3.11+
|
|
17
|
-
- **Framework:** Django
|
|
18
|
+
- **Framework:** Django (última versión estable, preferir la LTS vigente). NO usar Flask ni FastAPI.
|
|
18
19
|
- **API:** Django REST Framework (DRF) con ViewSets y Routers, o Django Ninja para APIs tipadas. No mezcles los dos en el mismo proyecto.
|
|
19
20
|
- **ORM:** Django ORM. NO usar queries raw salvo en migraciones de datos complejas.
|
|
20
21
|
- **Migraciones:** `manage.py makemigrations` + `manage.py migrate`. Un concepto por migración; nombres descriptivos.
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: expo
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Mobile Engineer — Expo SDK
|
|
@@ -23,7 +24,7 @@ Leé ese archivo antes de empezar.
|
|
|
23
24
|
|
|
24
25
|
## Reglas
|
|
25
26
|
|
|
26
|
-
1. **Bundle size controlado:** iOS <200KB, Android <250KB por defecto. Verificar con `expo
|
|
27
|
+
1. **Bundle size controlado:** iOS <200KB, Android <250KB por defecto. Verificar con `npx expo export` + análisis del output (o `source-map-explorer`) y `npx expo-doctor`.
|
|
27
28
|
2. **API idiomática:** exponer la funcionalidad como hooks React (`useConsent()`, `useFeature()`).
|
|
28
29
|
3. **No mezclar APIs nativas y JS bridge en el mismo flujo.** Si necesitás algo nativo, va en su propio módulo aislado.
|
|
29
30
|
4. **Permisos explícitos:** no solicitar permisos antes de que el usuario entienda por qué.
|
|
@@ -61,7 +62,7 @@ Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/`
|
|
|
61
62
|
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
62
63
|
|
|
63
64
|
### Hooks activos en este stack
|
|
64
|
-
- **`pre-edit-check.
|
|
65
|
+
- **`pre-edit-check.js`**: se ejecuta antes de cada edición. Detecta debug statements (`console.log`, `debugger`) en archivos `.ts` y `.tsx`.
|
|
65
66
|
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Corre `tsc --noEmit` para verificar TypeScript estricto. El proyecto usa `strict: true` — cualquier error de tipos bloquea el turno. Corregir antes de reportar al orchestrator.
|
|
66
67
|
|
|
67
68
|
### Reglas de scope
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: fastapi
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# API Engineer — FastAPI
|
|
@@ -77,8 +78,8 @@ El proyecto puede tener slash commands en `.claude/commands/`. Revisarlos antes
|
|
|
77
78
|
|
|
78
79
|
### Hooks activos en este stack
|
|
79
80
|
|
|
80
|
-
- **`pre-edit-check.
|
|
81
|
-
- **`pre-bash-check.
|
|
81
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta `print()` en archivos `.py` que no sean scripts de forge ni archivos en `.agentic/`. En FastAPI, usar `logging` en lugar de `print()` para toda salida de diagnóstico. Además bloquea secrets hardcodeados y protege la rama `main`.
|
|
82
|
+
- **`pre-bash-check.js`** (PreToolUse/Bash): bloquea comandos destructivos en producción. Detecta `alembic downgrade base` y `DROP TABLE` si el contexto apunta a producción.
|
|
82
83
|
|
|
83
84
|
### Reglas de scope
|
|
84
85
|
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: hono-drizzle
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# API Engineer — Hono + Drizzle
|
|
@@ -72,8 +73,8 @@ El proyecto puede tener slash commands en `.claude/commands/`. Revisarlos antes
|
|
|
72
73
|
|
|
73
74
|
### Hooks activos en este stack
|
|
74
75
|
|
|
75
|
-
- **`pre-bash-check.
|
|
76
|
-
- **`pre-edit-check.
|
|
76
|
+
- **`pre-bash-check.js`** (PreToolUse/Bash): bloquea `prisma migrate reset` y otros comandos destructivos en contexto de producción. **Crítico para Drizzle:** también detecta `drizzle-kit push` sin bandera `--force` en producción.
|
|
77
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta `console.log` y `debugger` en archivos `.ts`/`.tsx`, bloquea secrets hardcodeados, y protege la rama `main`.
|
|
77
78
|
|
|
78
79
|
### Reglas de scope
|
|
79
80
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: api-engineer
|
|
3
|
-
description: "Implementa el backend del proyecto. Laravel
|
|
3
|
+
description: "Implementa el backend del proyecto. Laravel (última versión estable) + Sanctum/Passport + PostgreSQL/MySQL. Scope: app/ y routes/api.php."
|
|
4
4
|
model: sonnet
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: laravel
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# API Engineer — Laravel
|
|
@@ -14,7 +15,7 @@ Implementás el backend del proyecto. Tu scope es `app/` y `routes/api.php`. Le
|
|
|
14
15
|
## Stack
|
|
15
16
|
|
|
16
17
|
- **Runtime:** PHP 8.2+
|
|
17
|
-
- **Framework:** Laravel
|
|
18
|
+
- **Framework:** Laravel (última versión estable). NO usar Lumen ni micro-frameworks.
|
|
18
19
|
- **API:** Laravel Resources + ResourceCollections para transformación de respuestas. Form Requests para validación.
|
|
19
20
|
- **ORM:** Eloquent. Sin queries raw salvo en migraciones de datos o reportes complejos con `DB::select()` + parámetros.
|
|
20
21
|
- **Migraciones:** `artisan make:migration` + `artisan migrate`. Un concepto por migración; nombres descriptivos en snake_case.
|
|
@@ -104,8 +105,8 @@ El proyecto puede tener slash commands en `.claude/commands/`. Revisarlos antes
|
|
|
104
105
|
|
|
105
106
|
### Hooks activos en este stack
|
|
106
107
|
|
|
107
|
-
- **`pre-edit-check.
|
|
108
|
-
- **`pre-bash-check.
|
|
108
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta patrones de debug PHP (`var_dump()`, `dd()`, `print_r()`) en archivos `.php`, bloquea secrets hardcodeados, y protege la rama `main`. Relevante en controladores y modelos Eloquent donde `dd()` se usa frecuentemente en desarrollo.
|
|
109
|
+
- **`pre-bash-check.js`** (PreToolUse/Bash): bloquea comandos destructivos en producción. Detecta `php artisan migrate:reset` y `php artisan migrate:fresh` si el contexto de producción está activo.
|
|
109
110
|
|
|
110
111
|
### Reglas de scope
|
|
111
112
|
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: laravel
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Fullstack Engineer — Laravel
|
|
@@ -14,7 +15,7 @@ Implementás features full-stack en el proyecto Laravel. Tu scope es `app/`, `re
|
|
|
14
15
|
## Stack
|
|
15
16
|
|
|
16
17
|
- **Runtime:** PHP 8.2+
|
|
17
|
-
- **Framework:** Laravel
|
|
18
|
+
- **Framework:** Laravel (última versión estable).
|
|
18
19
|
- **Frontend:** Blade + Livewire 3 por defecto. Si el proyecto usa Inertia.js (Vue 3 o React), el `CLAUDE.md` lo indicará.
|
|
19
20
|
- **Estilos:** Tailwind CSS. Sin Bootstrap salvo que el proyecto lo establezca.
|
|
20
21
|
- **Auth:** Laravel Breeze (simple) o Jetstream (equipos + 2FA). No reinventar autenticación.
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: nestjs
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# API Engineer — NestJS
|
|
@@ -15,7 +16,7 @@ Leé ese archivo antes de empezar.
|
|
|
15
16
|
## Stack
|
|
16
17
|
|
|
17
18
|
- **Runtime:** Node.js 20 LTS.
|
|
18
|
-
- **Framework:** NestJS
|
|
19
|
+
- **Framework:** NestJS (última versión estable). Arquitectura modular: un módulo por dominio.
|
|
19
20
|
- **ORM:** Prisma (preferido) o TypeORM con decoradores. NO usar query builders ad-hoc.
|
|
20
21
|
- **Validación:** class-validator + class-transformer en DTOs. Usar `ValidationPipe` global.
|
|
21
22
|
- **Autenticación:** `@nestjs/passport` + JWT. Guards para proteger rutas.
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: admin-engineer
|
|
3
|
-
description: Construye el dashboard de administración del proyecto con Next.js
|
|
3
|
+
description: Construye el dashboard de administración del proyecto con Next.js (última versión estable) + shadcn/ui. NO trabaja fuera del directorio de admin definido en project.yaml.
|
|
4
4
|
model: sonnet
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: nextjs-admin
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
# Admin Engineer — Next.js
|
|
11
|
+
# Admin Engineer — Next.js (última versión estable) + shadcn/ui
|
|
11
12
|
|
|
12
13
|
Construís el dashboard de administración del proyecto. Tu scope es el directorio de admin
|
|
13
14
|
definido en el `CLAUDE.md` del proyecto (típicamente `packages/admin/` o `apps/admin/`).
|
|
@@ -15,7 +16,7 @@ Leé ese archivo antes de empezar.
|
|
|
15
16
|
|
|
16
17
|
## Stack
|
|
17
18
|
|
|
18
|
-
- **Framework:** Next.js
|
|
19
|
+
- **Framework:** Next.js (última versión estable) con App Router.
|
|
19
20
|
- **UI:** shadcn/ui + Tailwind 4. NO Tailwind 3, NO Material UI, NO Chakra, NO Mantine.
|
|
20
21
|
- **Forms:** React Hook Form + Zod.
|
|
21
22
|
- **Estado servidor:** TanStack Query. NO SWR, NO useEffect para fetch.
|
|
@@ -68,8 +69,8 @@ El proyecto puede tener slash commands en `.claude/commands/`. Revisarlos antes
|
|
|
68
69
|
|
|
69
70
|
### Hooks activos en este stack
|
|
70
71
|
|
|
71
|
-
- **`pre-edit-check.
|
|
72
|
-
- **`pre-bash-check.
|
|
72
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta `console.log` y `debugger` en archivos `.ts`/`.tsx`, bloquea secrets hardcodeados, y protege la rama `main`. Especialmente relevante en componentes React donde los `console.log` de debug son comunes.
|
|
73
|
+
- **`pre-bash-check.js`** (PreToolUse/Bash): bloquea comandos destructivos en producción. Aplica si el proyecto usa Prisma como ORM (detecta `prisma migrate reset`).
|
|
73
74
|
|
|
74
75
|
### Reglas de scope
|
|
75
76
|
|
|
@@ -5,6 +5,7 @@ model: sonnet
|
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: rails
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Fullstack Engineer — Ruby on Rails
|
|
@@ -14,7 +15,7 @@ proyecto Rails (app/, db/, config/, spec/). Leé el `CLAUDE.md` del proyecto ant
|
|
|
14
15
|
|
|
15
16
|
## Stack
|
|
16
17
|
|
|
17
|
-
- **Framework:** Ruby on Rails
|
|
18
|
+
- **Framework:** Ruby on Rails (última versión estable).
|
|
18
19
|
- **Base de datos:** PostgreSQL. Sin SQLite en producción.
|
|
19
20
|
- **Frontend:** Hotwire (Turbo + Stimulus) por defecto. Si el proyecto usa React/Vue, el `CLAUDE.md` lo indicará.
|
|
20
21
|
- **Tests:** RSpec + FactoryBot + Shoulda Matchers. Capybara para tests de sistema.
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: frontend-engineer
|
|
3
|
-
description: "Construye apps con Nuxt
|
|
3
|
+
description: "Construye apps con Nuxt (última versión estable) + Vue 3 Composition API + Pinia + TypeScript. Scope: app/ o src/ (páginas, componentes, composables, stores)."
|
|
4
4
|
model: sonnet
|
|
5
5
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
6
|
tier: 2
|
|
7
7
|
profile: vuenuxt
|
|
8
|
+
last_verified: "2026-06"
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Frontend Engineer — Vue/Nuxt
|
|
11
12
|
|
|
12
|
-
Construís aplicaciones con Nuxt
|
|
13
|
+
Construís aplicaciones con Nuxt (última versión estable) y Vue 3. Tu scope es `app/` o `src/` según cómo esté configurado el proyecto. Leé el `CLAUDE.md` del proyecto antes de empezar.
|
|
13
14
|
|
|
14
15
|
## Stack
|
|
15
16
|
|
|
16
|
-
- **Framework:** Nuxt
|
|
17
|
+
- **Framework:** Nuxt (última versión estable). NO usar Nuxt 2 ni Vue 2.
|
|
17
18
|
- **UI:** Vue 3 con Composition API (`<script setup>`). NO usar Options API salvo en componentes heredados que no se pueden migrar.
|
|
18
19
|
- **State:** Pinia para estado global. Composables con `ref`/`computed` para estado local.
|
|
19
20
|
- **Routing:** File-based routing de Nuxt (`pages/`). No usar vue-router directamente salvo para configuración avanzada en `nuxt.config.ts`.
|
|
@@ -259,7 +259,7 @@ Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/`
|
|
|
259
259
|
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
260
260
|
|
|
261
261
|
### Hooks activos en este stack
|
|
262
|
-
- **`pre-edit-check.
|
|
262
|
+
- **`pre-edit-check.js`**: se ejecuta antes de cada edición. Detecta patrones de debug PHP (`var_dump()`, `print_r()`, `error_log()`) en archivos `.php` del child theme y módulos personalizados.
|
|
263
263
|
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Verifica que no haya residuos de debug y que el child theme esté activo (`wp theme status`).
|
|
264
264
|
|
|
265
265
|
### APIs de terceros y seguridad
|
|
@@ -14,8 +14,8 @@ Diseñás e implementás sitios con Elementor Free y Elementor Pro. Tu scope inc
|
|
|
14
14
|
|
|
15
15
|
## Stack
|
|
16
16
|
|
|
17
|
-
- **WordPress:**
|
|
18
|
-
- **Elementor Free:** última versión estable (
|
|
17
|
+
- **WordPress:** última versión estable.
|
|
18
|
+
- **Elementor Free:** última versión estable (serie 3.x).
|
|
19
19
|
- **Elementor Pro:** última versión estable (requerido para Theme Builder, Dynamic Tags, Loop Grid, Popup Builder, Form Builder).
|
|
20
20
|
- **PHP:** 8.1+.
|
|
21
21
|
- **Child theme:** obligatorio. Nunca modificar el parent theme directamente.
|
|
@@ -295,7 +295,7 @@ Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/`
|
|
|
295
295
|
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
296
296
|
|
|
297
297
|
### Hooks activos en este stack
|
|
298
|
-
- **`pre-edit-check.
|
|
298
|
+
- **`pre-edit-check.js`**: se ejecuta antes de cada edición. Detecta patrones de debug PHP (`var_dump()`, `print_r()`, `error_log()`) en archivos `.php` del child theme, widgets personalizados y dynamic tags.
|
|
299
299
|
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Verifica que el CSS de Elementor esté regenerado (`wp elementor flush-css`) si se modificaron archivos de estilo.
|
|
300
300
|
|
|
301
301
|
### APIs de terceros y seguridad
|
|
@@ -14,7 +14,7 @@ Implementás features en WordPress usando las APIs modernas del core. Tu scope e
|
|
|
14
14
|
|
|
15
15
|
## Stack
|
|
16
16
|
|
|
17
|
-
- **WordPress:**
|
|
17
|
+
- **WordPress:** última versión estable (Full Site Editing desde 6.0). Verificar con `wp core version`.
|
|
18
18
|
- **PHP:** 8.1+. Sin código legacy con `mysql_*` ni funciones deprecadas.
|
|
19
19
|
- **Editor:** Gutenberg / Block Editor. Sin Classic Editor salvo que el `CLAUDE.md` lo exija.
|
|
20
20
|
- **Bloques:** `@wordpress/create-block` para scaffolding. Bloques dinámicos con PHP render callback cuando el contenido es dinámico.
|
|
@@ -202,7 +202,7 @@ Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/`
|
|
|
202
202
|
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
203
203
|
|
|
204
204
|
### Hooks activos en este stack
|
|
205
|
-
- **`pre-edit-check.
|
|
205
|
+
- **`pre-edit-check.js`**: se ejecuta antes de cada edición. Detecta patrones de debug PHP (`var_dump()`, `print_r()`, `error_log()`) en archivos `.php`. Estos nunca deben llegar a producción.
|
|
206
206
|
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Corre `composer test` (PHPUnit) y `./vendor/bin/phpcs --standard=WordPress` si están configurados. Corregir errores antes de reportar.
|
|
207
207
|
|
|
208
208
|
### APIs de terceros y seguridad
|
package/dist/commands/init.js
CHANGED
|
@@ -410,7 +410,7 @@ export async function init(args) {
|
|
|
410
410
|
...allAgents.map(a => `.claude/agents/${a}.md`),
|
|
411
411
|
];
|
|
412
412
|
const ts = new Date().toISOString();
|
|
413
|
-
saveManifest(projectRoot, buildManifest(runtime, installedFiles, projectRoot, '2.9.
|
|
413
|
+
saveManifest(projectRoot, buildManifest(runtime, installedFiles, projectRoot, '2.9.6', ts));
|
|
414
414
|
},
|
|
415
415
|
},
|
|
416
416
|
]);
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cristiancorreau/forge",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.6",
|
|
4
4
|
"description": "Agentic development framework — multi-runtime support for Claude Code, OpenCode, Codex and Kiro",
|
|
5
5
|
"author": "Cristian Correa <cristian@socialweb.cl>",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"build:all": "npm run build:assets && npm run build",
|
|
29
29
|
"dev": "tsc --watch",
|
|
30
30
|
"prepublishOnly": "npm run build:all",
|
|
31
|
-
"test": "node --test test/commands.test.mjs"
|
|
31
|
+
"test": "node --test test/commands.test.mjs test/assets.test.mjs"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
34
|
"dist",
|