@damenor/agent-docs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -0
- package/dist/index.js +568 -0
- package/package.json +53 -0
- package/templates/base/AGENTS.md +177 -0
- package/templates/base/CHANGELOG.md +86 -0
- package/templates/base/README.md +110 -0
- package/templates/base/docs/CONTEXT.md +111 -0
- package/templates/base/docs/README.md +131 -0
- package/templates/base/docs/adr/TEMPLATE.md +83 -0
- package/templates/modules/agents/.agents/agents/doc-designer.md +56 -0
- package/templates/modules/agents/.agents/agents/doc-maintainer.md +54 -0
- package/templates/modules/agents/.agents/agents/doc-reviewer.md +80 -0
- package/templates/modules/agents/.agents/agents/doc-writer.md +66 -0
- package/templates/modules/agents/.agents/agents/reviewer.md +138 -0
- package/templates/modules/agents/.agents/skills/doc-design/SKILL.md +359 -0
- package/templates/modules/agents/.agents/skills/doc-design/references/design-system-format.md +550 -0
- package/templates/modules/agents/.agents/skills/doc-maintain/SKILL.md +345 -0
- package/templates/modules/agents/.agents/skills/doc-maintain/references/triggers.md +311 -0
- package/templates/modules/agents/.agents/skills/doc-review/SKILL.md +324 -0
- package/templates/modules/agents/.agents/skills/doc-review/references/health-checklist.md +290 -0
- package/templates/modules/agents/.agents/skills/doc-scaffold/SKILL.md +277 -0
- package/templates/modules/agents/.agents/skills/doc-scaffold/references/diataxis-quick-ref.md +149 -0
- package/templates/modules/agents/.agents/skills/doc-write/SKILL.md +414 -0
- package/templates/modules/agents/.agents/skills/doc-write/references/adr-format.md +194 -0
- package/templates/modules/agents/.agents/skills/doc-write/references/diataxis-patterns.md +351 -0
- package/templates/modules/ci/.github/workflows/docs-check.yml +94 -0
- package/templates/modules/design/docs/DESIGN.md +253 -0
- package/templates/modules/explanation/docs/explanation/agent-flow.md +15 -0
- package/templates/modules/explanation/docs/explanation/architecture.md +138 -0
- package/templates/modules/guides/docs/guides/deployment.md +189 -0
- package/templates/modules/guides/docs/guides/runbooks/TEMPLATE.md +86 -0
- package/templates/modules/guides/docs/guides/troubleshooting.md +65 -0
- package/templates/modules/operations/docs/operations/README.md +115 -0
- package/templates/modules/product/docs/product/overview.md +90 -0
- package/templates/modules/product/docs/roadmap.md +80 -0
- package/templates/modules/reference/docs/reference/api.md +131 -0
- package/templates/modules/reference/docs/reference/code-style.md +275 -0
- package/templates/modules/reference/docs/reference/configuration.md +117 -0
- package/templates/modules/reference/docs/reference/infrastructure.md +191 -0
- package/templates/modules/tutorials/docs/tutorials/environment-setup.md +212 -0
- package/templates/modules/tutorials/docs/tutorials/first-task.md +246 -0
- package/templates/modules/tutorials/docs/tutorials/quick-start.md +146 -0
- package/templates/shared/.editorconfig +20 -0
- package/templates/shared/.markdownlint.json +14 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doc-write
|
|
3
|
+
description: >
|
|
4
|
+
Escribe documentación siguiendo las convenciones Diátaxis + ADR + CONTEXT.
|
|
5
|
+
Clasifica contenido por tipo antes de escribir, genera ADRs cuando aplica,
|
|
6
|
+
y mantiene CONTEXT.md actualizado. Todo el contenido en español con términos
|
|
7
|
+
técnicos en inglés.
|
|
8
|
+
TRIGGER: Cuando el usuario dice "escribir doc", "documentar X", "crear ADR",
|
|
9
|
+
"actualizar CONTEXT", "nueva documentación", o se necesita crear/actualizar
|
|
10
|
+
cualquier archivo de documentación.
|
|
11
|
+
license: Apache-2.0
|
|
12
|
+
metadata:
|
|
13
|
+
author: damenordev
|
|
14
|
+
version: "1.0"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# doc-write
|
|
18
|
+
|
|
19
|
+
## Cuándo Usar
|
|
20
|
+
|
|
21
|
+
- **Crear documentación nueva**: Cualquier archivo de doc que se necesite generar
|
|
22
|
+
- **Actualizar documentación existente**: Modificar docs que están desactualizados
|
|
23
|
+
- **Escribir ADRs**: Documentar decisiones arquitectónicas significativas
|
|
24
|
+
- **Actualizar CONTEXT.md**: Agregar términos del dominio que surgieron
|
|
25
|
+
- **Actualizar docs/README.md**: Reflejar cambios en el mapa de documentación
|
|
26
|
+
- **Post-feature**: Después de implementar una feature que necesita documentación
|
|
27
|
+
|
|
28
|
+
## Patrones Críticos
|
|
29
|
+
|
|
30
|
+
### REGLA #1: Clasificar por Diátaxis ANTES de escribir
|
|
31
|
+
|
|
32
|
+
Siempre determinar el tipo ANTES de empezar a escribir:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
1. ¿Qué necesita el lector?
|
|
36
|
+
├── Aprender algo nuevo → Tutorial
|
|
37
|
+
├── Resolver un problema → How-to
|
|
38
|
+
├── Consultar información → Referencia
|
|
39
|
+
└── Entender el porqué → Explicación
|
|
40
|
+
|
|
41
|
+
2. ¿Es una decisión arquitectónica? → ADR (revisar criterios)
|
|
42
|
+
|
|
43
|
+
3. ¿Es un término del dominio? → CONTEXT.md
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### REGLA #2: ADRs — Solo cuando los 3 criterios se cumplen
|
|
47
|
+
|
|
48
|
+
Un ADR se escribe SOLO cuando TODAS estas condiciones son verdaderas:
|
|
49
|
+
|
|
50
|
+
1. **Difícil de revertir**: Cambiar esta decisión tendría costo alto (tiempo, dinero, datos)
|
|
51
|
+
2. **Sorprendente**: Un recién llegado no esperaría esta decisión o necesitaría contexto
|
|
52
|
+
3. **Trade-off real**: Hay alternativas válidas con pros/cons genuinos
|
|
53
|
+
|
|
54
|
+
**Si falla cualquier criterio, NO es un ADR.**
|
|
55
|
+
|
|
56
|
+
Ver [ADR Format](references/adr-format.md) para detalles completos.
|
|
57
|
+
|
|
58
|
+
### REGLA #3: CONTEXT.md — Agregar términos cuando emergen
|
|
59
|
+
|
|
60
|
+
- Agregar términos nuevos cuando aparecen en código o conversaciones
|
|
61
|
+
- Marcar términos ambiguos con `⚠️ AMBIGUO`
|
|
62
|
+
- Mostrar relaciones entre términos (`→`, `←→`, `parte-de`)
|
|
63
|
+
- No repetir lo que ya está en referencia — solo términos del dominio
|
|
64
|
+
|
|
65
|
+
### REGLA #4: Actualizar docs/README.md al agregar archivos
|
|
66
|
+
|
|
67
|
+
El mapa de documentación siempre debe reflejar la realidad:
|
|
68
|
+
- Agregar nuevas entradas cuando se crean archivos
|
|
69
|
+
- Marcar como obsoletas las entradas de archivos eliminados
|
|
70
|
+
- Actualizar descripciones si el contenido cambió significativamente
|
|
71
|
+
|
|
72
|
+
### REGLA #5: Frontmatter YAML obligatorio
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
---
|
|
76
|
+
created: "2026-05-07"
|
|
77
|
+
updated: "2026-05-07"
|
|
78
|
+
status: active | draft | stub | deprecated
|
|
79
|
+
type: tutorial | how-to | reference | explanation | adr | design | product
|
|
80
|
+
tags: [tag1, tag2, tag3]
|
|
81
|
+
---
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Sin `owner`. Siempre incluir `updated` al modificar.
|
|
85
|
+
|
|
86
|
+
### REGLA #6: Audiencia DUAL — humanos Y agentes IA
|
|
87
|
+
|
|
88
|
+
Escribir para:
|
|
89
|
+
- **Humanos**: Claridad, ejemplos, flujo lógico
|
|
90
|
+
- **Agentes IA**: Estructura consistente, términos definidos en CONTEXT.md, referencias cruzadas claras
|
|
91
|
+
|
|
92
|
+
### REGLA #7: Contenido en español, términos técnicos en inglés
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
✅ "Para configurar el middleware de autenticación..."
|
|
96
|
+
✅ "El endpoint /api/users retorna un array de objetos..."
|
|
97
|
+
✅ "El componente Button acepta la prop `variant`..."
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### REGLA #8: NUNCA crear contenido placeholder/TODO
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
❌ MAL: "TODO: agregar ejemplos" — mejor NO crear el archivo
|
|
104
|
+
❌ MAL: "Contenido pendiente de redacción" — mejor NO crear el archivo
|
|
105
|
+
✅ BIEN: Escribir contenido real y completo, o no crear el archivo
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Guías por Tipo
|
|
109
|
+
|
|
110
|
+
### Tutorial
|
|
111
|
+
|
|
112
|
+
**Orientación**: Aprendizaje — el usuario aprende haciendo
|
|
113
|
+
|
|
114
|
+
**Estructura**:
|
|
115
|
+
```markdown
|
|
116
|
+
---
|
|
117
|
+
created: "..."
|
|
118
|
+
status: active
|
|
119
|
+
type: tutorial
|
|
120
|
+
tags: [...]
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
# [Título descriptivo del objetivo de aprendizaje]
|
|
124
|
+
|
|
125
|
+
## Qué vas a construir
|
|
126
|
+
[Descripción del resultado final — 2-3 líneas]
|
|
127
|
+
|
|
128
|
+
## Prerequisitos
|
|
129
|
+
[Lista concreta de lo que se necesita antes de empezar]
|
|
130
|
+
|
|
131
|
+
## Paso 1: [Acción concreta]
|
|
132
|
+
[Instrucciones + código]
|
|
133
|
+
### ✅ Verificación
|
|
134
|
+
[Cómo confirmar que el paso funcionó]
|
|
135
|
+
|
|
136
|
+
## Paso 2: [Acción concreta]
|
|
137
|
+
...
|
|
138
|
+
|
|
139
|
+
## Resumen
|
|
140
|
+
[Qué se aprendió, qué sigue]
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Tono**: Didáctico, paciente. Un concepto a la vez. Verificar comprensión en cada paso.
|
|
144
|
+
|
|
145
|
+
**Longitud**: 500-2000 palabras. Si es más largo, dividir en tutoriales secuenciales.
|
|
146
|
+
|
|
147
|
+
**No incluir**: Explicaciones profundas del porqué (eso es explicación), referenciar otros docs.
|
|
148
|
+
|
|
149
|
+
### How-to (Guía práctica)
|
|
150
|
+
|
|
151
|
+
**Orientación**: Resolver un problema — el usuario ya tiene conocimiento previo
|
|
152
|
+
|
|
153
|
+
**Estructura**:
|
|
154
|
+
```markdown
|
|
155
|
+
---
|
|
156
|
+
created: "..."
|
|
157
|
+
status: active
|
|
158
|
+
type: how-to
|
|
159
|
+
tags: [...]
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
# Cómo [resolver problema específico]
|
|
163
|
+
|
|
164
|
+
## Cuándo usar esto
|
|
165
|
+
[1-2 líneas describiendo el escenario]
|
|
166
|
+
|
|
167
|
+
## Pasos
|
|
168
|
+
1. [Acción directa con código]
|
|
169
|
+
2. [Acción directa con código]
|
|
170
|
+
...
|
|
171
|
+
|
|
172
|
+
## Resultado esperado
|
|
173
|
+
[Qué debería verse/funcionar al final]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Tono**: Directo, sin rodeos. Asume que el lector conoce el sistema. No explicar conceptos básicos.
|
|
177
|
+
|
|
178
|
+
**Cuándo dividir**: Si tiene más de 10 pasos o cubre más de un problema, dividir en múltiples how-tos.
|
|
179
|
+
|
|
180
|
+
### Referencia
|
|
181
|
+
|
|
182
|
+
**Orientación**: Información factual — el usuario busca un dato específico
|
|
183
|
+
|
|
184
|
+
**Estructura**:
|
|
185
|
+
```markdown
|
|
186
|
+
---
|
|
187
|
+
created: "..."
|
|
188
|
+
status: active
|
|
189
|
+
type: reference
|
|
190
|
+
tags: [...]
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
# [Nombre de la API/sistema/interfaz]
|
|
194
|
+
|
|
195
|
+
## [Sección principal — endpoints, métodos, props, etc.]
|
|
196
|
+
|
|
197
|
+
| Nombre | Tipo | Descripción | Default |
|
|
198
|
+
|--------|------|-------------|---------|
|
|
199
|
+
| ... | ... | ... | ... |
|
|
200
|
+
|
|
201
|
+
## Ejemplos
|
|
202
|
+
[Código mínimo por cada caso de uso principal]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Tono**: Neutral, factual, sin narrativa. Tablas y listas sobre prosa.
|
|
206
|
+
|
|
207
|
+
**Qué incluir**: TODOS los parámetros, TODOS los valores posibles, TODOS los edge cases.
|
|
208
|
+
|
|
209
|
+
**Qué NO incluir**: Explicaciones de por qué, tutoriales de uso, narrativa.
|
|
210
|
+
|
|
211
|
+
### Explicación
|
|
212
|
+
|
|
213
|
+
**Orientación**: Comprensión — el usuario quiere entender el porqué
|
|
214
|
+
|
|
215
|
+
**Estructura**:
|
|
216
|
+
```markdown
|
|
217
|
+
---
|
|
218
|
+
created: "..."
|
|
219
|
+
status: active
|
|
220
|
+
type: explanation
|
|
221
|
+
tags: [...]
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
# [Tema que se explica]
|
|
225
|
+
|
|
226
|
+
## Contexto
|
|
227
|
+
[Por qué existe esto, qué problema resuelve]
|
|
228
|
+
|
|
229
|
+
## Cómo funciona
|
|
230
|
+
[Vista general sin entrar en código]
|
|
231
|
+
|
|
232
|
+
## Alternativas consideradas
|
|
233
|
+
[Qué otras opciones existían y por qué se eligió esta]
|
|
234
|
+
|
|
235
|
+
## Implicaciones
|
|
236
|
+
[Qué significa esta decisión para el futuro]
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Tono**: Discursivo, analítico. Conectar con ADRs cuando aplique (`docs/adr/001-*.md`).
|
|
240
|
+
|
|
241
|
+
**Cuándo es necesaria**: Cuando un ADR necesita más contexto del que cabe en el formato mínimo, o cuando un concepto se referencia repetidamente en how-tos y tutoriales.
|
|
242
|
+
|
|
243
|
+
## Guías de ADRs
|
|
244
|
+
|
|
245
|
+
### Criterios estrictos (los 3 deben cumplirse)
|
|
246
|
+
|
|
247
|
+
1. **Difícil de revertir**: El cambio tiene costo alto si se revierte
|
|
248
|
+
2. **Sorprendente**: Alguien nuevo no lo esperaría o preguntaría "¿por qué?"
|
|
249
|
+
3. **Trade-off real**: Hay alternativas genuinas con ventajas y desventajas
|
|
250
|
+
|
|
251
|
+
### Qué califica como ADR
|
|
252
|
+
|
|
253
|
+
- Forma de la arquitectura (monolito vs microservicios, layered vs hexagonal)
|
|
254
|
+
- Patrones de integración (sync vs async, REST vs GraphQL vs gRPC)
|
|
255
|
+
- Lock-in tecnológico (base de datos, cloud provider, librería core)
|
|
256
|
+
- Decisiones de borde (qué va dentro vs fuera del servicio)
|
|
257
|
+
- Desviaciones deliberadas (cuando se rompe una convención a propósito)
|
|
258
|
+
- Restricciones invisibles (limitaciones no obvias del stack o del dominio)
|
|
259
|
+
|
|
260
|
+
### Qué NO califica como ADR
|
|
261
|
+
|
|
262
|
+
- Elecciones obvias (usar Git, usar testing)
|
|
263
|
+
- Fácil de revertir (renombrar una variable, mover un archivo)
|
|
264
|
+
- Sin alternativas reales (no hay otra opción razonable)
|
|
265
|
+
|
|
266
|
+
### Formato mínimo del ADR
|
|
267
|
+
|
|
268
|
+
```markdown
|
|
269
|
+
---
|
|
270
|
+
created: "2026-05-07"
|
|
271
|
+
updated: "2026-05-07"
|
|
272
|
+
status: proposed | accepted | deprecated | superseded
|
|
273
|
+
type: adr
|
|
274
|
+
tags: [arquitectura, decision]
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
# ADR-001: [Título breve de la decisión]
|
|
278
|
+
|
|
279
|
+
[1-3 oraciones explicando la decisión, el porqué, y las alternativas consideradas.
|
|
280
|
+
No más de un párrafo. Si necesita más contexto, crear un explanation/ vinculado.]
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Ejemplo real**:
|
|
284
|
+
|
|
285
|
+
```markdown
|
|
286
|
+
# ADR-002: Usar PostgreSQL con Prisma ORM
|
|
287
|
+
|
|
288
|
+
Elegimos PostgreSQL + Prisma como capa de datos porque el proyecto necesita
|
|
289
|
+
relaciones complejas entre entidades y Prisma proporciona type-safety en
|
|
290
|
+
TypeScript. Se consideró MongoDB + Mongoose (rechazado por necesitar joins
|
|
291
|
+
frecuentes) y raw SQL (rechazado por perder type-safety).
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Ver [ADR Format](references/adr-format.md) para referencia completa.
|
|
295
|
+
|
|
296
|
+
## Referencias Cruzadas
|
|
297
|
+
|
|
298
|
+
Usar wikilinks donde sea útil:
|
|
299
|
+
|
|
300
|
+
```markdown
|
|
301
|
+
Ver [[CONTEXT]] para definiciones de términos del dominio.
|
|
302
|
+
Relacionado con [[ADR-001-event-sourcing]].
|
|
303
|
+
Para pasos prácticos, ver [[how-to/add-new-endpoint]].
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Proceso de Escritura
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
1. Identificar QUÉ se necesita documentar
|
|
310
|
+
2. Clasificar por Diátaxis (tutorial/how-to/reference/explanation) o ADR
|
|
311
|
+
3. Verificar que no existe ya un archivo para lo mismo
|
|
312
|
+
4. Escribir con el formato y tono correspondiente al tipo
|
|
313
|
+
5. Agregar frontmatter YAML
|
|
314
|
+
6. Actualizar docs/README.md si es un archivo nuevo
|
|
315
|
+
7. Actualizar docs/CONTEXT.md si hay términos nuevos
|
|
316
|
+
8. Verificar que el contenido es real (no placeholder)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## Comandos
|
|
320
|
+
|
|
321
|
+
### Verificación pre-escritura
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
1. ¿Ya existe un archivo para este contenido? → Buscar en docs/README.md
|
|
325
|
+
2. ¿Es el tipo correcto? → Verificar con árbol de decisión Diátaxis
|
|
326
|
+
3. ¿Hay términos del dominio nuevos? → Preparar entrada para CONTEXT.md
|
|
327
|
+
4. ¿Necesita ADR? → Verificar los 3 criterios
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Verificación post-escritura
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
1. ¿Tiene frontmatter YAML? → status, type, tags, created
|
|
334
|
+
2. ¿Está en la carpeta correcta? → tutorials/, how-to/, reference/, explanation/, docs/adr/
|
|
335
|
+
3. ¿docs/README.md refleja el nuevo archivo? → Actualizar mapa
|
|
336
|
+
4. ¿CONTEXT.md tiene los términos nuevos? → Agregar si aplica
|
|
337
|
+
5. ¿El contenido es real? → Sin TODO, sin placeholder, sin secciones vacías
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## Ejemplos Reales por Tipo
|
|
341
|
+
|
|
342
|
+
### Tutorial — Ejemplo de output
|
|
343
|
+
|
|
344
|
+
```markdown
|
|
345
|
+
---
|
|
346
|
+
created: "2026-05-07"
|
|
347
|
+
updated: "2026-05-07"
|
|
348
|
+
status: active
|
|
349
|
+
type: tutorial
|
|
350
|
+
tags: [auth, jwt, onboarding]
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
# Implementar autenticación JWT
|
|
354
|
+
|
|
355
|
+
## Qué vas a construir
|
|
356
|
+
Un flujo completo de login/registro con JWT y refresh tokens.
|
|
357
|
+
|
|
358
|
+
## Prerequisitos
|
|
359
|
+
- Proyecto corriendo localmente (ver [[tutorials/quick-start]])
|
|
360
|
+
- Conocimiento básico de HTTP headers
|
|
361
|
+
|
|
362
|
+
## Paso 1: Instalar dependencias
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
npm install jsonwebtoken bcryptjs
|
|
366
|
+
npm install -D @types/jsonwebtoken @types/bcryptjs
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### ✅ Verificación
|
|
370
|
+
```bash
|
|
371
|
+
npm ls jsonwebtoken
|
|
372
|
+
# → jsonwebtoken@9.0.2
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## Paso 2: Crear el servicio de auth
|
|
376
|
+
...[pasos con código real]
|
|
377
|
+
|
|
378
|
+
## Resumen
|
|
379
|
+
Aprendiste a implementar JWT con refresh tokens.
|
|
380
|
+
Siguiente: [[guides/how-to-protect-routes]]
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### How-to — Ejemplo de output
|
|
384
|
+
|
|
385
|
+
```markdown
|
|
386
|
+
---
|
|
387
|
+
created: "2026-05-07"
|
|
388
|
+
updated: "2026-05-07"
|
|
389
|
+
status: active
|
|
390
|
+
type: how-to
|
|
391
|
+
tags: [deployment, vercel, production]
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
# Cómo hacer deploy a producción
|
|
395
|
+
|
|
396
|
+
## Cuándo usar esto
|
|
397
|
+
Cuando una feature aprobada en staging está lista para producción.
|
|
398
|
+
|
|
399
|
+
## Pasos
|
|
400
|
+
1. Crear PR de `develop` a `main`
|
|
401
|
+
2. Esperar que CI pase (lint + test + build)
|
|
402
|
+
3. Merge con squash
|
|
403
|
+
4. Vercel deploya automáticamente desde `main`
|
|
404
|
+
5. Verificar en https://[dominio]
|
|
405
|
+
|
|
406
|
+
## Rollback
|
|
407
|
+
Si algo falla: Vercel Dashboard → Deployments → "Promote to Production" en el deploy anterior
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
## Recursos
|
|
411
|
+
|
|
412
|
+
- [Diátaxis Patterns](references/diataxis-patterns.md) — Patrones detallados por tipo con ejemplos
|
|
413
|
+
- [ADR Format](references/adr-format.md) — Referencia completa del formato ADR
|
|
414
|
+
- Skills relacionados: `doc-scaffold` (inicializar docs), `doc-review` (auditar docs), `doc-maintain` (mantener docs sincronizados), `doc-design` (sistema de diseño)
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
created: "2024-01-15"
|
|
3
|
+
status: active
|
|
4
|
+
type: reference
|
|
5
|
+
tags: [adr, decision, arquitectura, formato]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Formato ADR — Referencia Completa
|
|
9
|
+
|
|
10
|
+
## Qué es un ADR
|
|
11
|
+
|
|
12
|
+
Un ADR (Architecture Decision Record) es un documento que captura una decisión arquitectónica importante, el contexto en que se tomó, y sus consecuencias. En este proyecto, los ADRs usan un **formato mínimo**: título + 1-3 oraciones.
|
|
13
|
+
|
|
14
|
+
## Los 3 Criterios Obligatorios
|
|
15
|
+
|
|
16
|
+
Un ADR se escribe **SOLO** cuando **TODAS** estas condiciones son verdaderas:
|
|
17
|
+
|
|
18
|
+
### 1. Difícil de revertir
|
|
19
|
+
|
|
20
|
+
La decisión tiene un costo alto si se revierte:
|
|
21
|
+
- Tiempo significativo de refactorización
|
|
22
|
+
- Migración de datos compleja o riesgosa
|
|
23
|
+
- Cambio que afecta múltiples equipos o servicios
|
|
24
|
+
- Contrato que compromete recursos a largo plazo
|
|
25
|
+
|
|
26
|
+
**No es difícil de revertir**: Renombrar una variable, mover un archivo, cambiar un color en CSS
|
|
27
|
+
|
|
28
|
+
### 2. Sorprendente
|
|
29
|
+
|
|
30
|
+
Un recién llegado al proyecto no esperaría esta decisión o necesitaría contexto adicional para entenderla:
|
|
31
|
+
- "¿Por qué usan PostgreSQL y no MongoDB para esto?"
|
|
32
|
+
- "¿Por qué la auth está en un servicio separado?"
|
|
33
|
+
- "¿Por qué no usan el framework estándar del equipo?"
|
|
34
|
+
|
|
35
|
+
**No es sorprendente**: Usar Git, tener tests, usar Tailwind para CSS
|
|
36
|
+
|
|
37
|
+
### 3. Trade-off real
|
|
38
|
+
|
|
39
|
+
Hay alternativas válidas con ventajas y desventajas genuinas:
|
|
40
|
+
- Opción A: Más rápido pero menos mantenible
|
|
41
|
+
- Opción B: Más caro pero más confiable
|
|
42
|
+
- Opción C: Estándar del equipo pero no ideal para este caso
|
|
43
|
+
|
|
44
|
+
**No es trade-off real**: No hay otra opción razonable, o la "alternativa" es claramente inferior
|
|
45
|
+
|
|
46
|
+
## Plantilla
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
---
|
|
50
|
+
created: "2024-01-15"
|
|
51
|
+
status: proposed | accepted | deprecated | superseded-by:ADR-NNN
|
|
52
|
+
type: adr
|
|
53
|
+
tags: [tag1, tag2]
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
# ADR-NNN: [Título breve de la decisión]
|
|
57
|
+
|
|
58
|
+
[1-3 oraciones explicando:
|
|
59
|
+
- QUÉ se decidió
|
|
60
|
+
- POR QUÉ (la razón principal)
|
|
61
|
+
- QUÉ ALTERNATIVAS se consideraron brevemente]
|
|
62
|
+
|
|
63
|
+
<!-- Si se necesita más contexto, crear un archivo en explanation/ vinculado -->
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Qué Califica como ADR — Ejemplos
|
|
67
|
+
|
|
68
|
+
### Sí califica
|
|
69
|
+
|
|
70
|
+
| Ejemplo | Difícil de revertir | Sorprendente | Trade-off real |
|
|
71
|
+
|---------|---------------------|--------------|----------------|
|
|
72
|
+
| Elegir monolito modular vs microservicios | Alta reescritura | Alguien esperaría microservicios | Escalabilidad vs complejidad |
|
|
73
|
+
| Usar event sourcing para auditoría | Cambio fundamental de arquitectura | No es el enfoque típico | Consistencia vs complejidad |
|
|
74
|
+
| Elegir PostgreSQL sobre MongoDB | Migración de datos + queries | Datos semi-estructurados en relacional | ACID vs flexibilidad |
|
|
75
|
+
| Implementar auth propia vs Auth0 | Cambio afecta todos los usuarios | Auth0 es el default del equipo | Control vs velocidad |
|
|
76
|
+
| Usar GraphQL en vez de REST | Cambio de contrato con clientes | REST es el estándar | Flexibilidad vs simplicidad |
|
|
77
|
+
| Separar servicio de notificaciones | Refactor multi-equipo | Parecería del mismo dominio | Escalabilidad vs latencia |
|
|
78
|
+
| No usar ORM, usar queries raw | Requiere reescribir capa de datos | El equipo usa ORM por defecto | Performance vs productividad |
|
|
79
|
+
| Usar CQRS para el módulo de reporting | Cambio en patrón de datos | Reporting directo es más simple | Performance de lectura vs complejidad |
|
|
80
|
+
|
|
81
|
+
### No califica
|
|
82
|
+
|
|
83
|
+
| Ejemplo | Por qué no | Criterio que falla |
|
|
84
|
+
|---------|-----------|-------------------|
|
|
85
|
+
| Usar Git para control de versiones | Es el estándar de la industria | No es sorprendente |
|
|
86
|
+
| Agregar ESLint al proyecto | Se puede quitar en 5 minutos | No es difícil de revertir |
|
|
87
|
+
| Usar React para el frontend | Es la elección obvia del equipo | No es sorprendente, no hay trade-off |
|
|
88
|
+
| Nombrar variables en inglés | Es la convención del equipo | No hay trade-off real |
|
|
89
|
+
| Usar dotenv para variables de entorno | Es el estándar, fácil de cambiar | Falla los 3 criterios |
|
|
90
|
+
| Agregar prettier | Se quita con un commit | No es difícil de revertir |
|
|
91
|
+
|
|
92
|
+
## Convención de Numeración
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
ADR-001: Título de la primera decisión
|
|
96
|
+
ADR-002: Título de la segunda decisión
|
|
97
|
+
ADR-003: ...
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Reglas
|
|
101
|
+
|
|
102
|
+
- **Numeración secuencial**: ADR-001, ADR-002, ADR-003...
|
|
103
|
+
- **Sin gaps**: No saltar números. Si un ADR se descarta, se marca como `status: deprecated` pero el número no se reutiliza
|
|
104
|
+
- **Prefijo en archivo**: `docs/adr/001-titulo-kebab-case.md`
|
|
105
|
+
- **Título único**: El título debe ser descriptivo y no repetirse
|
|
106
|
+
|
|
107
|
+
### Nombre de archivo
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
docs/adr/
|
|
111
|
+
├── TEMPLATE.md # Plantilla reutilizable
|
|
112
|
+
├── 001-monolito-modular.md
|
|
113
|
+
├── 002-postgresql-sobre-mongodb.md
|
|
114
|
+
├── 003-event-sourcing-auditoria.md
|
|
115
|
+
└── 004-auth-propia-vs-auth0.md
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Ciclo de Vida
|
|
119
|
+
|
|
120
|
+
### Estados de un ADR
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
proposed → accepted → deprecated
|
|
124
|
+
↘ superseded-by: ADR-NNN
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### proposed
|
|
128
|
+
|
|
129
|
+
El ADR se está discutiendo. Aún no es la decisión final.
|
|
130
|
+
|
|
131
|
+
```yaml
|
|
132
|
+
status: proposed
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### accepted
|
|
136
|
+
|
|
137
|
+
La decisión fue tomada y se implementa.
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
status: accepted
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### deprecated
|
|
144
|
+
|
|
145
|
+
La decisión ya no aplica pero se mantiene por historial.
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
status: deprecated
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### superseded
|
|
152
|
+
|
|
153
|
+
Una decisión posterior reemplaza este ADR.
|
|
154
|
+
|
|
155
|
+
```yaml
|
|
156
|
+
status: superseded-by:ADR-005
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
En el ADR que reemplaza:
|
|
160
|
+
```yaml
|
|
161
|
+
status: accepted
|
|
162
|
+
supersedes: ADR-003
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Cuándo Expandir un ADR
|
|
166
|
+
|
|
167
|
+
Si un ADR necesita más de 3 oraciones, crear un archivo en `explanation/` vinculado:
|
|
168
|
+
|
|
169
|
+
```markdown
|
|
170
|
+
# ADR-003: Event sourcing para auditoría
|
|
171
|
+
|
|
172
|
+
Decidimos usar event sourcing para el módulo de auditoría porque los requisitos
|
|
173
|
+
regulatorios exigen un historial inmutable de cambios. Consideramos append-only
|
|
174
|
+
tables pero event sourcing provee mejor trazabilidad. Ver [[explanation/event-sourcing]]
|
|
175
|
+
para contexto detallado.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
En `explanation/event-sourcing.md`:
|
|
179
|
+
- Contexto regulatorio completo
|
|
180
|
+
- Alternativas evaluadas con pros/cons detallados
|
|
181
|
+
- Implicaciones para el equipo y la arquitectura
|
|
182
|
+
- Plan de implementación
|
|
183
|
+
|
|
184
|
+
## Errores Comunes
|
|
185
|
+
|
|
186
|
+
| Error | Solución |
|
|
187
|
+
|-------|----------|
|
|
188
|
+
| Escribir ADRs para TODO | Solo escribir cuando los 3 criterios se cumplen |
|
|
189
|
+
| ADRs de 2 páginas | Formato mínimo: 1-3 oraciones. Expandir en explanation/ |
|
|
190
|
+
| Numeración inconsistente | Usar secuencial sin gaps |
|
|
191
|
+
| Olvidar actualizar estado | Cambiar `status` cuando la decisión cambia |
|
|
192
|
+
| No vincular con explicaciones | Agregar wikilinks a explanation/ cuando sea necesario |
|
|
193
|
+
| Repetir el mismo ADR | Buscar ADRs existentes antes de crear uno nuevo |
|
|
194
|
+
| ADR sin contexto de alternativas | Siempre mencionar qué alternativas se consideraron |
|