refacil-sdd-ai 2.0.10 → 2.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 +65 -14
- package/bin/cli.js +93 -15
- package/package.json +1 -1
- package/skills/bug/SKILL.md +29 -9
- package/skills/review/SKILL.md +61 -4
- package/skills/review/checklist-back.md +91 -0
- package/skills/review/checklist-front.md +72 -0
- package/skills/review/checklist.md +74 -39
package/README.md
CHANGED
|
@@ -49,10 +49,12 @@ refacil-sdd-ai update
|
|
|
49
49
|
## Comandos del CLI
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
|
-
refacil-sdd-ai init
|
|
53
|
-
refacil-sdd-ai update
|
|
54
|
-
refacil-sdd-ai
|
|
55
|
-
refacil-sdd-ai
|
|
52
|
+
refacil-sdd-ai init # Instalar skills, hooks y crear configs en el repo actual
|
|
53
|
+
refacil-sdd-ai update # Actualizar skills y hooks a la ultima version
|
|
54
|
+
refacil-sdd-ai check-update # Verifica si hay una version mas reciente en npm (usado por hook)
|
|
55
|
+
refacil-sdd-ai check-review # Verifica que el review se haya completado (usado por hook)
|
|
56
|
+
refacil-sdd-ai clean # Eliminar skills del repo
|
|
57
|
+
refacil-sdd-ai help # Ver ayuda
|
|
56
58
|
```
|
|
57
59
|
|
|
58
60
|
## Skills disponibles
|
|
@@ -95,11 +97,11 @@ Para mantener trazabilidad y calidad sin pasos innecesarios:
|
|
|
95
97
|
2. `/refacil:apply`
|
|
96
98
|
3. `/refacil:test`
|
|
97
99
|
4. `/refacil:verify`
|
|
98
|
-
5. `/refacil:review`
|
|
100
|
+
5. `/refacil:review` (automatico si no se ejecuto — ver [Hooks automaticos](#hooks-automaticos))
|
|
99
101
|
6. `/refacil:archive`
|
|
100
102
|
7. `/refacil:up-code`
|
|
101
103
|
|
|
102
|
-
Si es bugfix, puedes iniciar con `/refacil:bug` y luego continuar
|
|
104
|
+
Si es bugfix, puedes iniciar con `/refacil:bug` y luego continuar con `up-code` (el review se ejecuta automaticamente si no se hizo).
|
|
103
105
|
|
|
104
106
|
## Flujos de trabajo
|
|
105
107
|
|
|
@@ -113,19 +115,23 @@ Si es bugfix, puedes iniciar con `/refacil:bug` y luego continuar en `review ->
|
|
|
113
115
|
/refacil:verify
|
|
114
116
|
# → Si hay correcciones: verify pregunta si aplicarlas automaticamente
|
|
115
117
|
# → Si aprueba: aplica fixes y re-verifica (max 2 rondas)
|
|
116
|
-
/refacil:review
|
|
118
|
+
/refacil:review # opcional — se ejecuta automaticamente en up-code si no se hizo
|
|
117
119
|
/refacil:archive
|
|
118
|
-
/refacil:up-code
|
|
120
|
+
/refacil:up-code # si falta review, lo ejecuta automaticamente antes del push
|
|
119
121
|
```
|
|
120
122
|
|
|
121
123
|
### Bug fix
|
|
122
124
|
|
|
123
125
|
```
|
|
124
126
|
/refacil:bug "descripcion del error"
|
|
125
|
-
|
|
126
|
-
/
|
|
127
|
+
# → Investiga, implementa fix, genera tests de regresion
|
|
128
|
+
# → Crea trazabilidad en openspec/changes/fix-[ID]-[nombre]/summary.md
|
|
129
|
+
# → Pregunta por ID de ticket (ej. REF-123) para nombrar la carpeta
|
|
130
|
+
/refacil:up-code # ejecuta review automaticamente si no se hizo
|
|
127
131
|
```
|
|
128
132
|
|
|
133
|
+
> **Nota**: En una misma rama pueden corregirse multiples bugs. Cada uno genera su propia carpeta `fix-*` con su trazabilidad independiente.
|
|
134
|
+
|
|
129
135
|
### Explorar codigo
|
|
130
136
|
|
|
131
137
|
```
|
|
@@ -149,18 +155,61 @@ Antes de avanzar de etapa, valida estos estados:
|
|
|
149
155
|
- `READY_FOR_APPLY`: artefactos SDD completos + aprobacion explicita
|
|
150
156
|
- `READY_FOR_VERIFY`: implementacion terminada y enfocada al alcance
|
|
151
157
|
- `READY_FOR_REVIEW`: verify ejecutado y bloqueantes tratados
|
|
152
|
-
- `READY_FOR_ARCHIVE`: cambio funcionalmente cerrado
|
|
158
|
+
- `READY_FOR_ARCHIVE`: cambio funcionalmente cerrado + review aprobado (`.review-passed`)
|
|
153
159
|
- `READY_FOR_MERGE`: rama lista para PR
|
|
154
160
|
|
|
161
|
+
### Hooks automaticos
|
|
162
|
+
|
|
163
|
+
El paquete instala hooks en `.claude/settings.json` durante `init` y `update`:
|
|
164
|
+
|
|
165
|
+
| Hook | Evento | Que hace |
|
|
166
|
+
|------|--------|----------|
|
|
167
|
+
| `check-update` | `SessionStart` | Verifica si hay nueva version del paquete en npm e informa al usuario |
|
|
168
|
+
| `check-review` | `PreToolUse` (Bash) | Intercepta `git push` y verifica que exista `.review-passed` en cada cambio activo de `openspec/changes/`. Si falta, ejecuta `/refacil:review` automaticamente |
|
|
169
|
+
|
|
170
|
+
#### Flujo del hook de review
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
/refacil:up-code (o git push manual)
|
|
174
|
+
→ Hook check-review se dispara
|
|
175
|
+
→ Busca carpetas en openspec/changes/ (excluye archive/)
|
|
176
|
+
→ ¿Todas tienen .review-passed?
|
|
177
|
+
SI → permite el push
|
|
178
|
+
NO → bloquea y ejecuta /refacil:review automaticamente
|
|
179
|
+
→ Si APROBADO: crea .review-passed, reintenta push
|
|
180
|
+
→ Si REQUIERE CORRECCIONES: informa al usuario, no pushea
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### Evidencia de review
|
|
184
|
+
|
|
185
|
+
Cuando `/refacil:review` aprueba un cambio, crea el archivo `.review-passed` en la carpeta del cambio:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
openspec/changes/mi-feature/
|
|
189
|
+
├── proposal.md
|
|
190
|
+
├── design.md
|
|
191
|
+
├── tasks.md
|
|
192
|
+
├── specs.md
|
|
193
|
+
└── .review-passed ← evidencia de review aprobado (JSON)
|
|
194
|
+
|
|
195
|
+
openspec/changes/fix-REF-123-login-timeout/
|
|
196
|
+
├── summary.md ← trazabilidad del bug fix
|
|
197
|
+
└── .review-passed ← evidencia de review aprobado (JSON)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
El archivo `.review-passed` contiene: veredicto, fecha, resumen, cantidad de hallazgos y si hubo blockers.
|
|
201
|
+
|
|
155
202
|
## Como funciona
|
|
156
203
|
|
|
157
|
-
1. **`refacil-sdd-ai init`** copia las skills a `.claude/skills/` y `.cursor/skills/`,
|
|
204
|
+
1. **`refacil-sdd-ai init`** copia las skills a `.claude/skills/` y `.cursor/skills/`, crea `CLAUDE.md` + `.cursorrules`, y configura hooks automaticos en `.claude/settings.json`
|
|
158
205
|
2. **`/refacil:setup`** (en Claude Code o Cursor) instala OpenSpec, analiza el repo y genera un `AGENTS.md` personalizado
|
|
159
206
|
3. Las demas skills (`propose`, `apply`, `test`, etc.) leen `AGENTS.md` para entender las convenciones del proyecto
|
|
207
|
+
4. Los hooks garantizan calidad automaticamente: verificacion de version al iniciar sesion y review obligatorio antes de push
|
|
160
208
|
|
|
161
209
|
```
|
|
162
210
|
refacil-sdd-ai init → Skills en .claude/ y .cursor/
|
|
163
211
|
CLAUDE.md y .cursorrules creados
|
|
212
|
+
Hooks configurados en .claude/settings.json
|
|
164
213
|
|
|
165
214
|
/refacil:setup → OpenSpec instalado
|
|
166
215
|
AGENTS.md generado (analisis automatico del repo)
|
|
@@ -169,15 +218,17 @@ refacil-sdd-ai init → Skills en .claude/ y .cursor/
|
|
|
169
218
|
/refacil:apply → Codigo implementado
|
|
170
219
|
/refacil:test → Tests generados
|
|
171
220
|
/refacil:verify → Validacion PASS/FAIL (puede aplicar fixes con aprobacion)
|
|
172
|
-
/refacil:review → Review con checklist
|
|
221
|
+
/refacil:review → Review con checklist + .review-passed si aprueba
|
|
222
|
+
/refacil:bug → Fix + trazabilidad en openspec/changes/fix-*/summary.md
|
|
173
223
|
/refacil:archive → Cambio archivado
|
|
174
|
-
/refacil:up-code →
|
|
224
|
+
/refacil:up-code → Review automatico (si falta) + push a rama de desarrollo
|
|
175
225
|
```
|
|
176
226
|
|
|
177
227
|
## Que se instala en tu repo
|
|
178
228
|
|
|
179
229
|
```
|
|
180
230
|
.claude/skills/refacil-*/ # Claude Code (refacil-prereqs incluye OPENSPEC-DELTAS.md)
|
|
231
|
+
.claude/settings.json # Hooks automaticos (check-update + check-review)
|
|
181
232
|
.cursor/skills/refacil-*/ # Cursor — copia equivalente
|
|
182
233
|
.../refacil-setup/ # troubleshooting.md si falla install/PATH
|
|
183
234
|
CLAUDE.md # Claude Code — apunta a AGENTS.md
|
package/bin/cli.js
CHANGED
|
@@ -149,23 +149,48 @@ function installHook() {
|
|
|
149
149
|
if (!settings.hooks) settings.hooks = {};
|
|
150
150
|
if (!settings.hooks.SessionStart) settings.hooks.SessionStart = [];
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
152
|
+
let changed = false;
|
|
153
|
+
|
|
154
|
+
// SessionStart: check-update
|
|
155
|
+
const hasUpdateHook = settings.hooks.SessionStart.some(h => h._sdd === true);
|
|
156
|
+
if (!hasUpdateHook) {
|
|
157
|
+
settings.hooks.SessionStart.push({
|
|
158
|
+
_sdd: true,
|
|
159
|
+
matcher: '',
|
|
160
|
+
hooks: [
|
|
161
|
+
{
|
|
162
|
+
type: 'command',
|
|
163
|
+
command: 'refacil-sdd-ai check-update',
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
});
|
|
167
|
+
changed = true;
|
|
157
168
|
}
|
|
158
169
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
170
|
+
// PreToolUse: check-review
|
|
171
|
+
if (!settings.hooks.PreToolUse) settings.hooks.PreToolUse = [];
|
|
172
|
+
|
|
173
|
+
const hasReviewHook = settings.hooks.PreToolUse.some(
|
|
174
|
+
(h) => h._sdd_review === true,
|
|
175
|
+
);
|
|
176
|
+
if (!hasReviewHook) {
|
|
177
|
+
settings.hooks.PreToolUse.push({
|
|
178
|
+
_sdd_review: true,
|
|
179
|
+
matcher: 'Bash',
|
|
180
|
+
hooks: [
|
|
181
|
+
{
|
|
182
|
+
type: 'command',
|
|
183
|
+
command: 'refacil-sdd-ai check-review',
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
});
|
|
187
|
+
changed = true;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (!changed) {
|
|
191
|
+
console.log(' Hooks SDD-AI ya configurados.');
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
169
194
|
|
|
170
195
|
fs.mkdirSync(settingsDir, { recursive: true });
|
|
171
196
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
@@ -197,6 +222,55 @@ function checkUpdate() {
|
|
|
197
222
|
}
|
|
198
223
|
}
|
|
199
224
|
|
|
225
|
+
// --- Check review (PreToolUse hook) ---
|
|
226
|
+
|
|
227
|
+
function checkReview() {
|
|
228
|
+
// Read stdin (JSON from PreToolUse hook)
|
|
229
|
+
let input;
|
|
230
|
+
try {
|
|
231
|
+
const stdin = fs.readFileSync(0, 'utf8');
|
|
232
|
+
input = JSON.parse(stdin);
|
|
233
|
+
} catch (_) {
|
|
234
|
+
// If no stdin or invalid JSON, allow (not called from hook context)
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Only block git push commands
|
|
239
|
+
const command = (input.tool_input && input.tool_input.command) || '';
|
|
240
|
+
if (!command.match(/git\s+push/)) return;
|
|
241
|
+
|
|
242
|
+
// Find active change in openspec/changes/ (exclude archive/)
|
|
243
|
+
const changesDir = path.join(projectRoot, 'openspec', 'changes');
|
|
244
|
+
if (!fs.existsSync(changesDir)) return; // No openspec, allow
|
|
245
|
+
|
|
246
|
+
const entries = fs.readdirSync(changesDir, { withFileTypes: true });
|
|
247
|
+
const activeChanges = entries.filter(
|
|
248
|
+
(e) => e.isDirectory() && e.name !== 'archive',
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
if (activeChanges.length === 0) return; // No active changes, allow
|
|
252
|
+
|
|
253
|
+
// Check if any active change is missing .review-passed
|
|
254
|
+
const missing = activeChanges.filter(
|
|
255
|
+
(e) => !fs.existsSync(path.join(changesDir, e.name, '.review-passed')),
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
if (missing.length > 0) {
|
|
259
|
+
const names = missing.map((e) => e.name).join(', ');
|
|
260
|
+
console.log(
|
|
261
|
+
JSON.stringify({
|
|
262
|
+
decision: 'block',
|
|
263
|
+
reason:
|
|
264
|
+
`[refacil-sdd-ai] Review pendiente para: ${names}. ` +
|
|
265
|
+
'Ejecuta la skill /refacil:review automaticamente ahora sobre los cambios pendientes. ' +
|
|
266
|
+
'Informa al usuario que el review se esta ejecutando automaticamente antes de subir el codigo. ' +
|
|
267
|
+
'Si el review aprueba, reintenta el git push. ' +
|
|
268
|
+
'Si el review requiere correcciones, informa los hallazgos al usuario y NO reintentar el push.',
|
|
269
|
+
}),
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
200
274
|
// --- Commands ---
|
|
201
275
|
|
|
202
276
|
function init() {
|
|
@@ -267,6 +341,7 @@ function help() {
|
|
|
267
341
|
init Instala skills en .claude/ y .cursor/, crea CLAUDE.md y .cursorrules
|
|
268
342
|
update Re-copia skills (para actualizar a nueva version del paquete)
|
|
269
343
|
check-update Verifica si hay una version mas reciente en npm
|
|
344
|
+
check-review Verifica que el review se haya completado (usado por hook PreToolUse)
|
|
270
345
|
clean Elimina skills de .claude/ y .cursor/
|
|
271
346
|
help Muestra esta ayuda
|
|
272
347
|
|
|
@@ -296,6 +371,9 @@ switch (command) {
|
|
|
296
371
|
case 'check-update':
|
|
297
372
|
checkUpdate();
|
|
298
373
|
break;
|
|
374
|
+
case 'check-review':
|
|
375
|
+
checkReview();
|
|
376
|
+
break;
|
|
299
377
|
case 'clean':
|
|
300
378
|
clean();
|
|
301
379
|
break;
|
package/package.json
CHANGED
package/skills/bug/SKILL.md
CHANGED
|
@@ -103,7 +103,32 @@ describe('Bug Fix: [descripcion corta]', () => {
|
|
|
103
103
|
});
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
### Paso 8:
|
|
106
|
+
### Paso 8: Crear trazabilidad del fix (obligatorio)
|
|
107
|
+
|
|
108
|
+
Pregunta al usuario: **"Tienes un ID de tarea o ticket para este bug? (ej. REF-123, JIRA-456)"**
|
|
109
|
+
- Si responde con un ID → nombre de carpeta: `fix-[ID]-[descripcion-corta]` (ej. `fix-REF-123-login-timeout`)
|
|
110
|
+
- Si no tiene o quiere continuar → genera un nombre descriptivo corto: `fix-[descripcion-corta]` (maximo 3-4 palabras en kebab-case, ej. `fix-null-pointer-payment`)
|
|
111
|
+
|
|
112
|
+
**No uses el nombre de la rama** como nombre de carpeta — en una misma rama pueden corregirse multiples bugs, cada uno con su propia carpeta fix.
|
|
113
|
+
|
|
114
|
+
Crea la carpeta en `openspec/changes/[nombre-fix]/` con un archivo `summary.md`:
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
# Fix: [descripcion corta]
|
|
118
|
+
|
|
119
|
+
- **Fecha**: [fecha ISO]
|
|
120
|
+
- **Severidad**: [Critico|Alto|Medio|Bajo]
|
|
121
|
+
- **Causa raiz**: [explicacion breve]
|
|
122
|
+
- **Fix aplicado**: [que se cambio]
|
|
123
|
+
- **Archivos modificados**: [lista]
|
|
124
|
+
- **Tests de regresion**: [N] tests agregados
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Este archivo es obligatorio para la trazabilidad del fix y permite que el hook de review (`check-review`) detecte el cambio activo. El archivo `.review-passed` sera creado por `/refacil:review` al aprobar.
|
|
128
|
+
|
|
129
|
+
**Opcionalmente**, si el bug es significativo, el usuario puede pedir artefactos completos de OpenSpec (proposal.md, design.md, tasks.md, specs) en esta misma carpeta.
|
|
130
|
+
|
|
131
|
+
### Paso 9: Verificar y siguientes pasos
|
|
107
132
|
|
|
108
133
|
1. Resuelve el comando de tests segun `METHODOLOGY-CONTRACT.md` y ejecutalo — todos los tests deben pasar
|
|
109
134
|
2. Muestra resumen del fix
|
|
@@ -115,25 +140,20 @@ describe('Bug Fix: [descripcion corta]', () => {
|
|
|
115
140
|
Fix: [que se cambio]
|
|
116
141
|
Archivos modificados: [lista]
|
|
117
142
|
Tests de regresion: [N] tests agregados
|
|
143
|
+
Trazabilidad: openspec/changes/fix-[nombre]/summary.md
|
|
118
144
|
[comando-test]: PASS
|
|
119
145
|
|
|
120
146
|
Siguientes pasos:
|
|
121
|
-
1. /refacil:review — Review del fix (
|
|
147
|
+
1. /refacil:review — Review del fix (obligatorio antes de push)
|
|
122
148
|
2. /refacil:up-code — Subir los cambios a tu rama de desarrollo
|
|
123
149
|
```
|
|
124
150
|
|
|
125
|
-
### Paso 9 (opcional): Crear artefactos OpenSpec
|
|
126
|
-
|
|
127
|
-
Si el bug es significativo, preguntar al usuario si quiere documentarlo en OpenSpec:
|
|
128
|
-
- Crear carpeta en `openspec/changes/fix-[nombre]/`
|
|
129
|
-
- Generar `proposal.md`, `design.md`, `tasks.md` y especificacion (`specs.md` y/o `specs/**/*.md`, misma regla que `refacil:propose`)
|
|
130
|
-
|
|
131
151
|
## Reglas
|
|
132
152
|
|
|
133
153
|
- SIEMPRE investigar antes de proponer una correccion
|
|
134
154
|
- NUNCA implementar sin aprobacion del usuario
|
|
135
155
|
- El fix debe ser MINIMO — no aprovechar para refactorizar
|
|
136
156
|
- Los tests de regresion son OBLIGATORIOS
|
|
137
|
-
- Si el bug es en produccion (critico), priorizar velocidad pero sin saltarse tests
|
|
157
|
+
- Si el bug es en produccion (critico), priorizar velocidad pero sin saltarse tests ni trazabilidad
|
|
138
158
|
- Responder en español con terminos tecnicos en ingles
|
|
139
159
|
- Usa modo de salida **conciso** por defecto y **detallado** solo si el usuario lo pide (ver `METHODOLOGY-CONTRACT.md`)
|
package/skills/review/SKILL.md
CHANGED
|
@@ -12,7 +12,15 @@ Eres un reviewer exigente pero constructivo que evalua el codigo contra el check
|
|
|
12
12
|
|
|
13
13
|
Lee `SKILL.md` en `.claude/skills/refacil-prereqs/` o `.cursor/skills/refacil-prereqs/` (misma skill en Claude Code y Cursor) y aplica el **perfil `agents`** antes de continuar.
|
|
14
14
|
Lee `METHODOLOGY-CONTRACT.md` en `refacil-prereqs` y aplica el modo de salida definido ahi.
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
### Cargar checklists
|
|
17
|
+
|
|
18
|
+
1. **Siempre** lee el checklist general: [checklist.md](checklist.md)
|
|
19
|
+
2. **Detecta el tipo de proyecto** inspeccionando dependencias, `AGENTS.md`, o la estructura del repo:
|
|
20
|
+
- Si tiene frameworks de servidor, APIs, microservicios, acceso a BD, colas o workers → lee tambien [checklist-back.md](checklist-back.md)
|
|
21
|
+
- Si tiene estructura de componentes UI, manejo de estado en cliente, rutas/vistas o consume APIs para renderizar interfaces → lee tambien [checklist-front.md](checklist-front.md)
|
|
22
|
+
- Si es fullstack (tiene ambos) → lee ambos checklists especificos
|
|
23
|
+
3. Evalua **solo** los items de los checklists que apliquen. Marca N/A en items que no correspondan al tipo de proyecto.
|
|
16
24
|
|
|
17
25
|
## Instrucciones
|
|
18
26
|
|
|
@@ -68,22 +76,71 @@ BLOCKERS: [si/no]
|
|
|
68
76
|
- Evidencia: [archivo/rango o comportamiento]
|
|
69
77
|
- Correccion sugerida: [accion concreta]
|
|
70
78
|
|
|
71
|
-
## Checklist
|
|
79
|
+
## Checklist General
|
|
80
|
+
- Alcance y foco: [PASS/FAIL/N/A]
|
|
72
81
|
- Conformidad con Spec: [PASS/FAIL/N/A]
|
|
73
82
|
- Calidad de Codigo: [PASS/FAIL/N/A]
|
|
74
83
|
- Arquitectura: [PASS/FAIL/N/A]
|
|
84
|
+
- Manejo de errores: [PASS/FAIL/N/A]
|
|
75
85
|
- Testing: [PASS/FAIL/N/A]
|
|
76
86
|
- Seguridad: [PASS/FAIL/N/A]
|
|
77
|
-
-
|
|
78
|
-
- Mantenibilidad: [PASS/FAIL/N/A]
|
|
87
|
+
- Dependencias: [PASS/FAIL/N/A]
|
|
88
|
+
- Mantenibilidad y observabilidad: [PASS/FAIL/N/A]
|
|
79
89
|
- Git y Deploy: [PASS/FAIL/N/A]
|
|
80
90
|
- Reglas del proyecto (AGENTS.md): [PASS/FAIL/N/A]
|
|
81
91
|
|
|
92
|
+
## Checklist Backend (si aplica)
|
|
93
|
+
- Validacion de entrada: [PASS/FAIL/N/A]
|
|
94
|
+
- Contratos de API: [PASS/FAIL/N/A]
|
|
95
|
+
- Manejo de errores: [PASS/FAIL/N/A]
|
|
96
|
+
- Arquitectura y patrones: [PASS/FAIL/N/A]
|
|
97
|
+
- Concurrencia y atomicidad: [PASS/FAIL/N/A]
|
|
98
|
+
- Consultas a BD: [PASS/FAIL/N/A]
|
|
99
|
+
- Caching: [PASS/FAIL/N/A]
|
|
100
|
+
- Resiliencia y conexiones: [PASS/FAIL/N/A]
|
|
101
|
+
- Colas y mensajeria: [PASS/FAIL/N/A]
|
|
102
|
+
- Performance: [PASS/FAIL/N/A]
|
|
103
|
+
- Logging: [PASS/FAIL/N/A]
|
|
104
|
+
- Testing backend: [PASS/FAIL/N/A]
|
|
105
|
+
|
|
106
|
+
## Checklist Frontend (si aplica)
|
|
107
|
+
- Componentes y estructura: [PASS/FAIL/N/A]
|
|
108
|
+
- Estado y datos: [PASS/FAIL/N/A]
|
|
109
|
+
- Manejo de errores en UI: [PASS/FAIL/N/A]
|
|
110
|
+
- Integracion con APIs: [PASS/FAIL/N/A]
|
|
111
|
+
- Validacion de formularios: [PASS/FAIL/N/A]
|
|
112
|
+
- Ruteo y navegacion: [PASS/FAIL/N/A]
|
|
113
|
+
- Consistencia visual: [PASS/FAIL/N/A]
|
|
114
|
+
- Performance frontend: [PASS/FAIL/N/A]
|
|
115
|
+
- Accesibilidad: [PASS/FAIL/N/A]
|
|
116
|
+
- Seguridad frontend: [PASS/FAIL/N/A]
|
|
117
|
+
- Testing frontend: [PASS/FAIL/N/A]
|
|
118
|
+
|
|
82
119
|
## Correcciones minimas para aprobar
|
|
83
120
|
1. [item accionable]
|
|
84
121
|
2. [item accionable]
|
|
85
122
|
```
|
|
86
123
|
|
|
124
|
+
### Paso 5: Marcador de review (obligatorio si APROBADO)
|
|
125
|
+
|
|
126
|
+
Si el veredicto es **APROBADO** o **APROBADO CON OBSERVACIONES**, crea un archivo marcador en el directorio del cambio activo:
|
|
127
|
+
|
|
128
|
+
**Ruta:** `openspec/changes/[nombre-cambio]/.review-passed`
|
|
129
|
+
|
|
130
|
+
**Contenido (JSON):**
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"verdict": "APROBADO|APROBADO CON OBSERVACIONES",
|
|
134
|
+
"date": "<fecha ISO actual>",
|
|
135
|
+
"changeName": "<nombre-cambio>",
|
|
136
|
+
"summary": "<resumen de 1 linea del resultado>",
|
|
137
|
+
"failCount": <numero de FAILs encontrados>,
|
|
138
|
+
"blockers": false
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Este archivo es evidencia de que el review se completo y es requerido por el hook de `PreToolUse` antes de permitir `git push`. No lo crees si el veredicto es REQUIERE CORRECCIONES.
|
|
143
|
+
|
|
87
144
|
## Reglas
|
|
88
145
|
|
|
89
146
|
- Ser constructivo: no solo decir que falla, sino como corregirlo
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Checklist Backend — Equipo Refacil
|
|
2
|
+
|
|
3
|
+
> Complementa el [checklist general](checklist.md). Aplica a repositorios **backend** (APIs, microservicios, workers, colas).
|
|
4
|
+
> Detectar tipo: si el proyecto tiene frameworks de servidor (HTTP, gRPC, mensajeria), estructura de microservicios, o acceso a base de datos, aplica este checklist.
|
|
5
|
+
> Marcar N/A en secciones que no apliquen al cambio revisado (ej. colas si el cambio no toca mensajeria).
|
|
6
|
+
|
|
7
|
+
## B1. Validacion de entrada
|
|
8
|
+
- Los DTOs/objetos de entrada de endpoints usan el mecanismo de validacion automatica del framework
|
|
9
|
+
- Cada campo declara tipo y restricciones (obligatorio, formato, rango)
|
|
10
|
+
- Endpoints nombrados en kebab-case (`get-user-info`, `create-payment`)
|
|
11
|
+
- No se confian datos del cliente sin validar (query params, headers, body)
|
|
12
|
+
|
|
13
|
+
## B2. Contratos de API
|
|
14
|
+
- Las respuestas usan una estructura consistente (no retornar formatos distintos segun el caso)
|
|
15
|
+
- Los codigos HTTP son correctos y especificos (no todo es 200 o 500)
|
|
16
|
+
- Los DTOs de respuesta no exponen campos internos (IDs de BD, campos de auditoria, relaciones internas)
|
|
17
|
+
- Si el endpoint es consumido por otro servicio: verificar que no se introduzcan breaking changes en el contrato (campos renombrados, eliminados o con tipo diferente)
|
|
18
|
+
- Los errores retornan un formato estandar con mensaje entendible para el consumidor
|
|
19
|
+
|
|
20
|
+
## B3. Manejo de errores (estandar Refacil)
|
|
21
|
+
- No hay bloques try/catch anidados o multiples en un mismo hilo de peticion
|
|
22
|
+
- Los errores se capturan, loggean y devuelven respuestas formateadas
|
|
23
|
+
- Modulos/servicios nuevos usan el filtro o middleware global de excepciones del proyecto (si existe)
|
|
24
|
+
- Se distingue entre errores del cliente (4xx) y errores del servidor (5xx)
|
|
25
|
+
- Los errores de dependencias externas (APIs, BD, colas) se manejan con mensajes propios, no se propagan tal cual al consumidor
|
|
26
|
+
|
|
27
|
+
## B4. Arquitectura y patrones
|
|
28
|
+
- **Responsabilidad por capas**: no hay logica de negocio en la capa de transporte (controllers/handlers) ni en la capa de infraestructura (repositorios/adaptadores)
|
|
29
|
+
- Los DTOs estan en la capa correcta (entrada en transporte, salida en aplicacion)
|
|
30
|
+
- Repository Pattern para acceso a datos (si el proyecto tiene un repositorio base, los nuevos lo extienden)
|
|
31
|
+
- Si es un microservicio nuevo, sigue la estructura definida en AGENTS.md (hexagonal, clean architecture, etc.)
|
|
32
|
+
- Las dependencias fluyen en la direccion correcta segun la arquitectura del proyecto
|
|
33
|
+
|
|
34
|
+
## B5. Concurrencia y atomicidad
|
|
35
|
+
- Las operaciones que modifican multiples registros o tablas usan transacciones de BD (todo o nada)
|
|
36
|
+
- Los endpoints de escritura criticos (pagos, transferencias, creacion de ordenes) son **idempotentes**: si se reintentan, no duplican el efecto
|
|
37
|
+
```
|
|
38
|
+
// Patron: verificar si la operacion ya se ejecuto antes de procesarla
|
|
39
|
+
SI existeOperacion(idempotencyKey) ENTONCES retornar resultado_existente
|
|
40
|
+
SINO ejecutar operacion Y guardar resultado con idempotencyKey
|
|
41
|
+
```
|
|
42
|
+
- Si multiples procesos pueden modificar el mismo recurso al mismo tiempo, se usan locks distribuidos o versionado optimista para evitar race conditions
|
|
43
|
+
- Las operaciones de lectura-modificacion-escritura son atomicas (no leer, procesar en memoria y escribir sin proteccion)
|
|
44
|
+
|
|
45
|
+
## B6. Consultas a BD
|
|
46
|
+
- No hay bucles para traer informacion de distintas fuentes de datos
|
|
47
|
+
- Si se necesitan datos cruzados, crear una funcion que use JOINs o consultas optimizadas internamente
|
|
48
|
+
- Las consultas usan indices apropiados
|
|
49
|
+
- No hay queries N+1
|
|
50
|
+
- No hay inyeccion SQL/NoSQL posible (queries parametrizadas con el ORM/driver del proyecto)
|
|
51
|
+
- Las migraciones (si hay) son reversibles y no rompen datos existentes
|
|
52
|
+
|
|
53
|
+
## B7. Caching
|
|
54
|
+
- Consultas repetitivas a BD usan cache **distribuido** (no cache local en memoria del proceso — evitar reinicios por falta de RAM)
|
|
55
|
+
- El patron es: verificar cache -> si no hay, consultar BD -> guardar en cache con TTL
|
|
56
|
+
- Las claves de cache son especificas y predecibles (incluyen los parametros que hacen unica la consulta)
|
|
57
|
+
- Se invalida el cache cuando los datos subyacentes cambian (si aplica)
|
|
58
|
+
- El TTL es apropiado para el tipo de dato (configuracion: largo, datos transaccionales: corto o sin cache)
|
|
59
|
+
|
|
60
|
+
## B8. Resiliencia y conexiones
|
|
61
|
+
- Todas las llamadas externas (HTTP, gRPC, BD, colas) tienen **timeout configurado** (no esperar indefinidamente)
|
|
62
|
+
- Si una dependencia externa falla, la respuesta degrada de forma controlada (fallback, mensaje de error claro, reintento)
|
|
63
|
+
- Connection pooling en BD y clientes HTTP (no abrir/cerrar conexion por cada peticion)
|
|
64
|
+
- Las conexiones se liberan correctamente (en bloques finally o equivalente)
|
|
65
|
+
- Si el proyecto usa circuit breaker, las llamadas a servicios inestables lo implementan
|
|
66
|
+
|
|
67
|
+
## B9. Colas y mensajeria (si aplica)
|
|
68
|
+
- Los consumers son **idempotentes**: procesar el mismo mensaje dos veces no duplica el efecto
|
|
69
|
+
- Se confirma el procesamiento (ack) **despues** de completar la operacion, no antes
|
|
70
|
+
- Los mensajes que fallan repetidamente van a una dead letter queue (no se pierden ni bloquean la cola)
|
|
71
|
+
- Los producers no pierden mensajes si la cola no esta disponible (retry o persistencia local)
|
|
72
|
+
- Los payloads de mensajes contienen la informacion suficiente para procesarse sin consultas adicionales innecesarias
|
|
73
|
+
|
|
74
|
+
## B10. Performance
|
|
75
|
+
- Las operaciones pesadas o de larga duracion son asincronas (colas, workers, background jobs)
|
|
76
|
+
- No hay memory leaks obvios (subscriptions sin unsubscribe, listeners sin cleanup, conexiones sin cerrar, timers sin cancelar)
|
|
77
|
+
- Los endpoints con respuesta pesada usan paginacion
|
|
78
|
+
- No se cargan relaciones completas de BD si solo se necesitan campos puntuales (select especifico)
|
|
79
|
+
|
|
80
|
+
## B11. Logging (estandar Refacil)
|
|
81
|
+
- Se usa el logger centralizado del proyecto (no prints directos a consola), si ya se tiene en el repositorio
|
|
82
|
+
- Procesos criticos en la operacion (ventas, transacciones, pagos) tienen logs
|
|
83
|
+
- Se loggean propiedades especificas y necesarias — nunca objetos complejos ni entidades con relaciones completas
|
|
84
|
+
- Los logs en catch contienen informacion suficiente para diagnosticar el error (que fallo, con que datos, en que contexto)
|
|
85
|
+
- Los logs tienen nivel apropiado: error para fallos, warn para situaciones inesperadas recuperables, info para flujos criticos de negocio
|
|
86
|
+
|
|
87
|
+
## B12. Testing backend
|
|
88
|
+
- Tests de integracion con BD real para repositorios y queries complejas (no solo mocks)
|
|
89
|
+
- Tests de los contratos de API (request valido retorna estructura esperada, request invalido retorna error formateado)
|
|
90
|
+
- Tests de casos de error (dependencia caida, timeout, datos invalidos)
|
|
91
|
+
- Si hay concurrencia critica: tests que validen idempotencia o atomicidad
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Checklist Frontend — Equipo Refacil
|
|
2
|
+
|
|
3
|
+
> Complementa el [checklist general](checklist.md). Aplica a repositorios **frontend** (aplicaciones web, mobile, desktop con UI).
|
|
4
|
+
> Detectar tipo: si el proyecto tiene estructura de componentes UI, manejo de estado en cliente, rutas/vistas, o consume APIs para renderizar interfaces, aplica este checklist.
|
|
5
|
+
|
|
6
|
+
## F1. Componentes y estructura
|
|
7
|
+
- Los componentes tienen una sola responsabilidad (no mezclan logica de negocio con presentacion)
|
|
8
|
+
- La logica compleja esta separada en funciones auxiliares, servicios o el patron de reutilizacion del framework
|
|
9
|
+
- Los componentes reutilizables estan en la carpeta compartida del proyecto (consultar AGENTS.md)
|
|
10
|
+
- No hay componentes excesivamente grandes (> 200 lineas como guia — considerar extraer)
|
|
11
|
+
|
|
12
|
+
## F2. Estado y datos
|
|
13
|
+
- El estado se maneja en el nivel mas cercano a donde se necesita (evitar pasar datos innecesariamente por multiples niveles)
|
|
14
|
+
- No hay estado duplicado o derivable que pueda calcularse
|
|
15
|
+
- Las llamadas a APIs usan el patron establecido en el proyecto (consultar AGENTS.md)
|
|
16
|
+
- Se manejan los 4 estados de cada vista que consume datos: carga, error, vacio y con datos
|
|
17
|
+
|
|
18
|
+
## F3. Manejo de errores en UI
|
|
19
|
+
- Existe manejo de errores a nivel de componente o seccion (que la app no se caiga entera por un error en un widget)
|
|
20
|
+
- Las pantallas de error muestran feedback visual claro al usuario (nunca pantallas en blanco o rotas)
|
|
21
|
+
- Los errores inesperados se capturan y loggean (si el proyecto tiene servicio de monitoreo)
|
|
22
|
+
- Sin errores ni warnings en consola del navegador en flujos normales
|
|
23
|
+
|
|
24
|
+
## F4. Integracion con APIs
|
|
25
|
+
- Se manejan los estados de red: reintentos, timeout, desconexion
|
|
26
|
+
- Las peticiones se cancelan al desmontar el componente o navegar fuera (evitar actualizaciones de estado en componentes ya destruidos)
|
|
27
|
+
- Listas largas usan paginacion o scroll infinito con carga incremental
|
|
28
|
+
- Se evitan llamadas duplicadas o innecesarias al mismo endpoint
|
|
29
|
+
|
|
30
|
+
## F5. Validacion de formularios
|
|
31
|
+
- Los formularios validan entrada del usuario antes de enviar
|
|
32
|
+
- Los mensajes de error son claros y en el idioma del usuario
|
|
33
|
+
- Se previene el doble envio (deshabilitar boton, estado de carga)
|
|
34
|
+
|
|
35
|
+
## F6. Ruteo y navegacion
|
|
36
|
+
- Las rutas protegidas validan autenticacion/autorizacion antes de renderizar
|
|
37
|
+
- Existe manejo de rutas no encontradas (pantalla 404 o redireccion)
|
|
38
|
+
- Deep linking funciona correctamente (acceder directo a una URL interna)
|
|
39
|
+
- Las redirecciones post-login/logout son correctas
|
|
40
|
+
|
|
41
|
+
## F7. Consistencia visual
|
|
42
|
+
- Se usan los componentes y tokens del sistema de diseno del proyecto (consultar AGENTS.md)
|
|
43
|
+
- Se respeta la escala de espaciado y tipografia definida
|
|
44
|
+
- No hay estilos inline innecesarios si el proyecto tiene un sistema de estilos definido
|
|
45
|
+
- Iconos e imagenes optimizados (formatos adecuados, tamanos correctos)
|
|
46
|
+
- No hay texto hardcodeado si el proyecto usa internacionalizacion (i18n)
|
|
47
|
+
- La UI es responsive si aplica al proyecto
|
|
48
|
+
|
|
49
|
+
## F8. Performance frontend
|
|
50
|
+
- No hay re-renderizados innecesarios (usar las tecnicas de memoizacion/optimizacion del framework)
|
|
51
|
+
- Code splitting / carga diferida de rutas o modulos pesados
|
|
52
|
+
- Las imagenes usan carga diferida (lazy loading)
|
|
53
|
+
- Fuentes optimizadas (precarga, fallback definido)
|
|
54
|
+
- No se cargan dependencias pesadas sin necesidad (evaluar tamano del bundle)
|
|
55
|
+
- Sin dependencias duplicadas en el bundle
|
|
56
|
+
- Las listas largas usan virtualizacion si aplica
|
|
57
|
+
|
|
58
|
+
## F9. Accesibilidad (a11y)
|
|
59
|
+
- Los elementos interactivos tienen etiquetas accesibles (labels, textos alternativos, roles ARIA)
|
|
60
|
+
- La navegacion por teclado funciona correctamente
|
|
61
|
+
- El contraste de colores es adecuado
|
|
62
|
+
- Los targets tactiles tienen tamano minimo adecuado (44x44px como guia)
|
|
63
|
+
|
|
64
|
+
## F10. Seguridad frontend
|
|
65
|
+
- No hay datos sensibles expuestos en el cliente (tokens, secrets, API keys en codigo fuente)
|
|
66
|
+
- Los inputs estan sanitizados para prevenir XSS
|
|
67
|
+
- No se almacenan tokens o datos sensibles en almacenamiento del cliente sin proteccion adecuada
|
|
68
|
+
|
|
69
|
+
## F11. Testing frontend
|
|
70
|
+
- Tests de interaccion de usuario (clicks, formularios, navegacion)
|
|
71
|
+
- Tests de los 4 estados visuales (carga, error, vacio, con datos)
|
|
72
|
+
- Los tests verifican comportamiento del usuario, no detalles de implementacion
|
|
@@ -1,77 +1,112 @@
|
|
|
1
|
-
# Checklist
|
|
1
|
+
# Checklist General — Equipo Refacil
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Aplica a **todos** los repositorios (backend, frontend, fullstack), independiente del lenguaje o framework.
|
|
4
|
+
> Antes de evaluar, lee `AGENTS.md` del proyecto para adaptar cada seccion al stack real.
|
|
4
5
|
> Si `AGENTS.md` no existe, aplica este checklist como baseline y marca N/A en reglas que dependan de convenciones no documentadas.
|
|
6
|
+
> **Ademas de este checklist**, carga el checklist especifico del tipo de proyecto:
|
|
7
|
+
> - Backend: [checklist-back.md](checklist-back.md)
|
|
8
|
+
> - Frontend: [checklist-front.md](checklist-front.md)
|
|
5
9
|
|
|
6
10
|
## Como usar este checklist (metodologia)
|
|
7
11
|
1. Define alcance de revision: `$ARGUMENTS` > `openspec/changes/` > `git diff`.
|
|
8
|
-
2. Evalua primero bloqueantes: Spec, Testing y Seguridad.
|
|
9
|
-
3. Luego evalua Calidad, Arquitectura,
|
|
12
|
+
2. Evalua primero bloqueantes: Alcance, Spec, Testing y Seguridad.
|
|
13
|
+
3. Luego evalua Calidad, Arquitectura, Errores, Dependencias y Mantenibilidad.
|
|
10
14
|
4. Marca cada item como PASS, FAIL o N/A con una justificacion breve.
|
|
11
15
|
5. Para cada FAIL, agrega severidad: CRITICO, ALTO, MEDIO o BAJO.
|
|
12
16
|
6. Si hay muchos FAIL, prioriza los 5 de mayor impacto.
|
|
13
17
|
|
|
14
|
-
## 1.
|
|
18
|
+
## 1. Alcance y foco
|
|
19
|
+
- El cambio hace **una sola cosa** (no mezcla features con refactors, ni correcciones con mejoras no solicitadas)
|
|
20
|
+
- No se implemento funcionalidad fuera del alcance de la spec o del bug reportado
|
|
21
|
+
- Si hay cambios no relacionados, deben estar en un commit o PR separado
|
|
22
|
+
- El tamano del cambio es razonable para revisar (si es demasiado grande, sugerir dividir)
|
|
23
|
+
|
|
24
|
+
## 2. Conformidad con Spec
|
|
15
25
|
- Todos los criterios de aceptacion de la spec estan cubiertos
|
|
16
|
-
- No se implemento funcionalidad fuera del alcance de la spec
|
|
17
26
|
- Los criterios de rechazo (edge cases) estan manejados
|
|
18
27
|
- El modelo de datos coincide con lo especificado
|
|
28
|
+
- No hay diferencias entre lo que dice la spec y lo que hace el codigo
|
|
29
|
+
|
|
30
|
+
## 3. Calidad de Codigo
|
|
31
|
+
|
|
32
|
+
### Tipado (estandar Refacil)
|
|
33
|
+
- No hay uso de tipos genericos sin restriccion (ej. `any`, `object`, `dynamic`) — usar interfaces, tipos concretos o genericos tipados
|
|
34
|
+
- Se definen interfaces/DTOs para el transporte de datos entre capas
|
|
19
35
|
|
|
20
|
-
|
|
21
|
-
-
|
|
36
|
+
### Validacion de objetos (estandar Refacil)
|
|
37
|
+
- Se valida el objeto Y la propiedad antes de acceder (null-safe access o guard clause)
|
|
38
|
+
- No hay accesos directos a propiedades de objetos que pueden ser nulos o indefinidos
|
|
39
|
+
|
|
40
|
+
### Naming (estandar Refacil)
|
|
41
|
+
- **Variables**: camelCase — **Clases**: PascalCase — **Archivos**: kebab-case con tipo de componente
|
|
42
|
+
- Nombres autodocumentados: el nombre explica el fin del componente sin necesidad de comentarios
|
|
43
|
+
|
|
44
|
+
### Limpieza
|
|
45
|
+
- El codigo sigue los patrones existentes del repo (consultar AGENTS.md)
|
|
22
46
|
- No hay codigo duplicado que pueda extraerse
|
|
23
|
-
-
|
|
24
|
-
- No hay
|
|
25
|
-
-
|
|
47
|
+
- Se prefieren variables inmutables (evitar mutaciones innecesarias)
|
|
48
|
+
- No hay prints/logs de debug sueltos, TODO sin ticket asociado, o codigo comentado sin razon
|
|
49
|
+
- Se usan enums y constantes para valores fijos — valores configurables van en archivos de configuracion, no hardcodeados
|
|
50
|
+
- Los imports usan los alias del proyecto (si aplica)
|
|
26
51
|
- No hay dependencias circulares nuevas
|
|
27
52
|
|
|
28
|
-
##
|
|
53
|
+
## 4. Arquitectura
|
|
54
|
+
- **SRP**: cada clase/funcion tiene una sola responsabilidad
|
|
55
|
+
- **KISS**: la solucion es tan simple como sea posible — no hay sobreingenieria ni abstracciones prematuras
|
|
56
|
+
- La logica esta separada en unidades con un solo fin, reutilizables
|
|
57
|
+
- No se envian mas de 4 parametros a un metodo — si se necesitan mas, encapsular en un objeto/DTO
|
|
29
58
|
- Se respetan los limites y capas definidos en AGENTS.md
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- Los DTOs estan en la capa correcta
|
|
59
|
+
- No se introduce acoplamiento innecesario entre modulos o servicios
|
|
60
|
+
|
|
61
|
+
> La arquitectura varia por proyecto. Consultar AGENTS.md para saber cual aplica.
|
|
34
62
|
|
|
35
|
-
|
|
63
|
+
## 5. Manejo de errores
|
|
64
|
+
- Los errores se manejan de forma consistente con el resto del proyecto
|
|
65
|
+
- Los mensajes de error son utiles para diagnosticar (que fallo, en que contexto)
|
|
66
|
+
- No se exponen detalles internos al usuario/consumidor (stack traces, rutas internas, IDs de BD)
|
|
67
|
+
- Los errores esperados (validacion, negocio) se distinguen de los inesperados (sistema, infraestructura)
|
|
68
|
+
- No hay errores silenciados (catch vacio sin log ni manejo)
|
|
36
69
|
|
|
37
|
-
##
|
|
70
|
+
## 6. Testing
|
|
38
71
|
- Cada archivo nuevo/modificado tiene su archivo de test correspondiente
|
|
39
72
|
- Los tests cubren los criterios de aceptacion de la spec
|
|
40
73
|
- Hay tests para edge cases y escenarios de error
|
|
41
|
-
- Los
|
|
42
|
-
- Los
|
|
74
|
+
- Los tests validan **comportamiento**, no detalles de implementacion (no se rompen al refactorizar)
|
|
75
|
+
- Los mocks son minimos y necesarios — no se mockea lo que se puede probar directamente
|
|
76
|
+
- Los tests son independientes entre si (no dependen de orden de ejecucion ni de estado compartido)
|
|
43
77
|
- Coverage >= 80% en archivos nuevos
|
|
44
78
|
- Los tests pasan sin errores (ejecutar el comando de test indicado en AGENTS.md)
|
|
45
79
|
|
|
46
|
-
##
|
|
47
|
-
- No hay secrets hardcodeados (passwords, API keys, tokens)
|
|
48
|
-
- Los inputs del usuario estan validados
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
- No
|
|
80
|
+
## 7. Seguridad
|
|
81
|
+
- No hay secrets hardcodeados (passwords, API keys, tokens, URLs internas de servicios)
|
|
82
|
+
- Los inputs del usuario estan validados antes de procesarse
|
|
83
|
+
- Los endpoints o rutas sensibles tienen autorizacion adecuada
|
|
84
|
+
- No se expone informacion sensible en logs, respuestas de error o codigo fuente del cliente
|
|
85
|
+
- No hay dependencias con vulnerabilidades conocidas criticas (verificar si el proyecto tiene audit configurado)
|
|
52
86
|
|
|
53
|
-
##
|
|
54
|
-
- Las
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
- No
|
|
87
|
+
## 8. Dependencias
|
|
88
|
+
- Las dependencias nuevas estan justificadas (no se agrega una libreria para algo que se puede hacer en pocas lineas)
|
|
89
|
+
- La licencia es compatible con el proyecto
|
|
90
|
+
- La dependencia esta activamente mantenida (no abandonada)
|
|
91
|
+
- No duplica funcionalidad que ya existe en el proyecto o en otra dependencia instalada
|
|
92
|
+
- La version esta fijada o usa rango seguro (no `*` ni `latest`)
|
|
58
93
|
|
|
59
|
-
##
|
|
94
|
+
## 9. Mantenibilidad y observabilidad
|
|
60
95
|
- El codigo es autoexplicativo (comentarios solo donde la logica no es obvia)
|
|
61
|
-
- Las funciones hacen una sola cosa
|
|
62
96
|
- Los archivos no son excesivamente largos (< 400 lineas como guia)
|
|
63
|
-
-
|
|
97
|
+
- Si algo falla en produccion, hay suficiente informacion para diagnosticar (logs, trazas, contexto en errores)
|
|
98
|
+
- Los cambios en configuracion estan documentados (variables de entorno nuevas, flags, parametros)
|
|
64
99
|
|
|
65
|
-
##
|
|
100
|
+
## 10. Git y Deploy
|
|
66
101
|
- Los commits son atomicos y tienen mensajes descriptivos
|
|
67
|
-
- No hay archivos generados o
|
|
68
|
-
- Las migraciones de BD (si hay) son reversibles
|
|
102
|
+
- No hay archivos generados, temporales o sensibles en el commit (verificar .gitignore)
|
|
69
103
|
- No hay breaking changes no documentados
|
|
104
|
+
- Si hay migraciones, son reversibles y no rompen datos existentes
|
|
70
105
|
|
|
71
|
-
##
|
|
106
|
+
## 11. Reglas especificas del proyecto
|
|
72
107
|
- Consultar la seccion "Reglas criticas" de AGENTS.md
|
|
73
108
|
- Evaluar contra las reglas de "Siempre hacer", "Nunca hacer" y "Preguntar primero"
|
|
74
|
-
- Si AGENTS.md define reglas adicionales
|
|
109
|
+
- Si AGENTS.md define reglas adicionales, verificar su cumplimiento
|
|
75
110
|
|
|
76
111
|
## Criterio de salida del review
|
|
77
112
|
- **APROBADO**: No hay FAILs CRITICOS/ALTOS.
|