@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,351 @@
|
|
|
1
|
+
---
|
|
2
|
+
created: "2024-01-15"
|
|
3
|
+
status: active
|
|
4
|
+
type: reference
|
|
5
|
+
tags: [diataxis, patrones, documentacion, escritura]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Diátaxis — Patrones Detallados por Tipo
|
|
9
|
+
|
|
10
|
+
## Patrones de Tutorial
|
|
11
|
+
|
|
12
|
+
### Estructura canónica
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
# [Verbo + objeto del aprendizaje]
|
|
16
|
+
|
|
17
|
+
## Qué vas a construir
|
|
18
|
+
[Resultado tangible que el lector obtendrá]
|
|
19
|
+
|
|
20
|
+
## Prerequisitos
|
|
21
|
+
[Lista exacta: software, conocimientos, acceso]
|
|
22
|
+
|
|
23
|
+
## Paso 1: [Acción concreta en infinitivo]
|
|
24
|
+
[Instrucciones paso a paso]
|
|
25
|
+
[Código completo y ejecutable]
|
|
26
|
+
|
|
27
|
+
### ✅ Verificación
|
|
28
|
+
[Comando o acción para confirmar que funciona]
|
|
29
|
+
|
|
30
|
+
## Paso N: ...
|
|
31
|
+
|
|
32
|
+
## Resumen
|
|
33
|
+
[Qué se aprendió]
|
|
34
|
+
[Próximos pasos sugeridos]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Tono
|
|
38
|
+
|
|
39
|
+
- **Didáctico y paciente**: No asumir conocimiento previo del tema
|
|
40
|
+
- **Un concepto a la vez**: Cada paso introduce UNA cosa nueva
|
|
41
|
+
- **Alentador**: Mostrar progreso visible y frecuentemente
|
|
42
|
+
- **Concreto**: Usar ejemplos específicos, no abstractos
|
|
43
|
+
|
|
44
|
+
### Longitud
|
|
45
|
+
|
|
46
|
+
- **Ideal**: 500-1500 palabras
|
|
47
|
+
- **Máximo**: 2000 palabras — si es más, dividir en tutoriales secuenciales
|
|
48
|
+
- **Mínimo**: 300 palabras — si es menos, probablemente es un how-to
|
|
49
|
+
|
|
50
|
+
### Cuándo escribir un tutorial
|
|
51
|
+
|
|
52
|
+
- Un usuario nuevo necesita aprender una habilidad fundamental
|
|
53
|
+
- Hay un flujo de onboarding que nadie ha documentado
|
|
54
|
+
- Un concepto clave se enseña repetidamente a nuevas personas
|
|
55
|
+
|
|
56
|
+
### Ejemplo concreto
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
---
|
|
60
|
+
created: "2024-03-10"
|
|
61
|
+
status: active
|
|
62
|
+
type: tutorial
|
|
63
|
+
tags: [onboarding, api, express]
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
# Crear tu primer endpoint con Express
|
|
67
|
+
|
|
68
|
+
## Qué vas a construir
|
|
69
|
+
Un endpoint GET /api/health que responda con el estado del servidor.
|
|
70
|
+
|
|
71
|
+
## Prerequisitos
|
|
72
|
+
- Node.js 18+ instalado
|
|
73
|
+
- Editor de código
|
|
74
|
+
- Terminal
|
|
75
|
+
|
|
76
|
+
## Paso 1: Inicializar el proyecto
|
|
77
|
+
|
|
78
|
+
Crea una carpeta nueva e inicializa el proyecto:
|
|
79
|
+
|
|
80
|
+
\`\`\`bash
|
|
81
|
+
mkdir mi-api && cd mi-api
|
|
82
|
+
npm init -y
|
|
83
|
+
npm install express
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
### ✅ Verificación
|
|
87
|
+
Deberías ver `node_modules/` y `package.json` en la carpeta.
|
|
88
|
+
|
|
89
|
+
## Paso 2: Crear el servidor
|
|
90
|
+
|
|
91
|
+
Crea `index.js`:
|
|
92
|
+
|
|
93
|
+
\`\`\`javascript
|
|
94
|
+
const express = require('express');
|
|
95
|
+
const app = express();
|
|
96
|
+
|
|
97
|
+
app.get('/api/health', (req, res) => {
|
|
98
|
+
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
app.listen(3000, () => {
|
|
102
|
+
console.log('Servidor corriendo en http://localhost:3000');
|
|
103
|
+
});
|
|
104
|
+
\`\`\`
|
|
105
|
+
|
|
106
|
+
### ✅ Verificación
|
|
107
|
+
Ejecuta `node index.js` y abre `http://localhost:3000/api/health` en el navegador.
|
|
108
|
+
Deberías ver `{"status":"ok","timestamp":"..."}`.
|
|
109
|
+
|
|
110
|
+
## Resumen
|
|
111
|
+
Aprendiste a crear un servidor Express con un endpoint GET.
|
|
112
|
+
Próximo paso: [[tutorials/add-database]] para conectar una base de datos.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Anti-patrones de tutorial
|
|
116
|
+
|
|
117
|
+
| Anti-patrón | Por qué es malo | Qué hacer en su lugar |
|
|
118
|
+
|-------------|----------------|----------------------|
|
|
119
|
+
| Explicar teoría antes de practicar | Aburre al principiante | Explicar MIENTRAS se hace |
|
|
120
|
+
| Saltarse pasos de verificación | El lector se pierde sin saberlo | Verificar después de CADA paso |
|
|
121
|
+
| Asumir conocimiento previo | Frustra al principiante | Listar prerequisitos explícitos |
|
|
122
|
+
| Código incompleto o seudo-código | No se puede ejecutar | Código SIEMPRE completo y ejecutable |
|
|
123
|
+
| Cubrir múltiples temas | Satura al lector | Un tutorial = un tema |
|
|
124
|
+
| Enlaces a docs externas para lo básico | Interrumpe el flujo | Incluir todo lo necesario inline |
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Patrones de How-to
|
|
129
|
+
|
|
130
|
+
### Estructura canónica
|
|
131
|
+
|
|
132
|
+
```markdown
|
|
133
|
+
# Cómo [resolver problema específico]
|
|
134
|
+
|
|
135
|
+
## Cuándo usar esto
|
|
136
|
+
[1-3 líneas: escenario donde aplica esta guía]
|
|
137
|
+
|
|
138
|
+
## Pasos
|
|
139
|
+
1. [Acción directa]
|
|
140
|
+
2. [Acción directa]
|
|
141
|
+
...
|
|
142
|
+
|
|
143
|
+
## Resultado esperado
|
|
144
|
+
[Qué se obtiene al final]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Tono
|
|
148
|
+
|
|
149
|
+
- **Directo**: Al grano, sin preámbulos
|
|
150
|
+
- **Asume conocimiento**: El lector ya conoce el sistema
|
|
151
|
+
- **Práctico**: Pasos concretos, no explicaciones teóricas
|
|
152
|
+
- **Sin justificación**: No explicar por qué — si el lector pregunta por qué, necesita una explicación, no un how-to
|
|
153
|
+
|
|
154
|
+
### Cuándo dividir un how-to
|
|
155
|
+
|
|
156
|
+
- Más de 10 pasos → dividir en how-tos más específicos
|
|
157
|
+
- Cubre más de un problema → un how-to por problema
|
|
158
|
+
- Tiene secciones de explicación → extraer la explicación a explanation/
|
|
159
|
+
|
|
160
|
+
### Ejemplo concreto
|
|
161
|
+
|
|
162
|
+
```markdown
|
|
163
|
+
---
|
|
164
|
+
created: "2024-03-10"
|
|
165
|
+
status: active
|
|
166
|
+
type: how-to
|
|
167
|
+
tags: [auth, jwt, middleware]
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
# Cómo agregar autenticación JWT a una API existente
|
|
171
|
+
|
|
172
|
+
## Cuándo usar esto
|
|
173
|
+
Cuando tienes una API Express funcionando y necesitas proteger endpoints con JWT.
|
|
174
|
+
|
|
175
|
+
## Pasos
|
|
176
|
+
|
|
177
|
+
1. Instalar dependencias:
|
|
178
|
+
|
|
179
|
+
\`\`\`bash
|
|
180
|
+
npm install jsonwebtoken bcryptjs
|
|
181
|
+
\`\`\`
|
|
182
|
+
|
|
183
|
+
2. Crear middleware de auth en `src/middleware/auth.js`:
|
|
184
|
+
|
|
185
|
+
\`\`\`javascript
|
|
186
|
+
const jwt = require('jsonwebtoken');
|
|
187
|
+
|
|
188
|
+
function authMiddleware(req, res, next) {
|
|
189
|
+
const token = req.headers.authorization?.split(' ')[1];
|
|
190
|
+
if (!token) return res.status(401).json({ error: 'Token requerido' });
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
req.user = jwt.verify(token, process.env.JWT_SECRET);
|
|
194
|
+
next();
|
|
195
|
+
} catch {
|
|
196
|
+
res.status(401).json({ error: 'Token inválido' });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
module.exports = authMiddleware;
|
|
201
|
+
\`\`\`
|
|
202
|
+
|
|
203
|
+
3. Proteger endpoints:
|
|
204
|
+
|
|
205
|
+
\`\`\`javascript
|
|
206
|
+
const auth = require('./middleware/auth');
|
|
207
|
+
app.get('/api/profile', auth, (req, res) => { ... });
|
|
208
|
+
\`\`\`
|
|
209
|
+
|
|
210
|
+
## Resultado esperado
|
|
211
|
+
Los endpoints protegidos requieren un JWT válido en el header `Authorization: Bearer <token>`.
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Anti-patrones de how-to
|
|
215
|
+
|
|
216
|
+
| Anti-patrón | Por qué es malo | Qué hacer en su lugar |
|
|
217
|
+
|-------------|----------------|----------------------|
|
|
218
|
+
| Explicar conceptos básicos | El lector ya debería saberlo | Link a tutorial si necesita base |
|
|
219
|
+
| Narrativa o storytelling | No es lo que busca el lector | Pasos directos y enumerados |
|
|
220
|
+
| Múltiples soluciones alternativas | Confunde al lector | Una solución, la mejor práctica |
|
|
221
|
+
| Prerequisitos extensos | Si necesita mucho setup, es un tutorial | Simplificar o link a tutorial |
|
|
222
|
+
| "Opcionalmente puedes..." | Genera incertidumbre | Un camino claro |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Patrones de Referencia
|
|
227
|
+
|
|
228
|
+
### Estructura canónica
|
|
229
|
+
|
|
230
|
+
```markdown
|
|
231
|
+
# [Nombre del sistema/API/interfaz]
|
|
232
|
+
|
|
233
|
+
## [Sección principal]
|
|
234
|
+
|
|
235
|
+
| Parámetro | Tipo | Requerido | Descripción | Default |
|
|
236
|
+
|-----------|------|-----------|-------------|---------|
|
|
237
|
+
| ... | ... | ... | ... | ... |
|
|
238
|
+
|
|
239
|
+
## Códigos de respuesta
|
|
240
|
+
|
|
241
|
+
| Código | Significado | Cuándo se retorna |
|
|
242
|
+
|--------|------------|-------------------|
|
|
243
|
+
| ... | ... | ... |
|
|
244
|
+
|
|
245
|
+
## Ejemplos
|
|
246
|
+
[Un ejemplo mínimo por cada caso de uso principal]
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Tono
|
|
250
|
+
|
|
251
|
+
- **Neutral y factual**: Sin opiniones, sin narrativa
|
|
252
|
+
- **Estructurado**: Tablas > listas > prosa
|
|
253
|
+
- **Completo**: Incluir TODOS los parámetros, TODOS los casos
|
|
254
|
+
- **Sin explicaciones**: Si necesita explicarse, linkear a explanation/
|
|
255
|
+
|
|
256
|
+
### Pistas para auto-generación
|
|
257
|
+
|
|
258
|
+
Si el código tiene:
|
|
259
|
+
- **OpenAPI/Swagger**: Generar referencia desde el spec
|
|
260
|
+
- **TypeScript interfaces**: Extraer tipos y comentarios JSDoc
|
|
261
|
+
- **JSON Schema**: Usar el schema como base
|
|
262
|
+
- **CLI con `--help`**: Capturar la salida completa
|
|
263
|
+
|
|
264
|
+
### Qué incluir siempre
|
|
265
|
+
|
|
266
|
+
- Todos los parámetros/props/campos con tipo y descripción
|
|
267
|
+
- Valores por defecto
|
|
268
|
+
- Valores permitidos (enums)
|
|
269
|
+
- Restricciones (min, max, formato)
|
|
270
|
+
- Códigos de error
|
|
271
|
+
- Ejemplos mínimos por cada caso principal
|
|
272
|
+
|
|
273
|
+
### Anti-patrones de referencia
|
|
274
|
+
|
|
275
|
+
| Anti-patrón | Por qué es malo | Qué hacer en su lugar |
|
|
276
|
+
|-------------|----------------|----------------------|
|
|
277
|
+
| Prosa narrativa | La referencia debe ser consultable | Tablas y listas |
|
|
278
|
+
| Ejemplos sin contexto | No se sabe cuándo usar cada uno | Un ejemplo por caso de uso |
|
|
279
|
+
| Parámetros parciales | El lector no puede confiar en la doc | Documentar TODO o indicar qué falta |
|
|
280
|
+
| Explicar el porqué | No es el lugar | Link a explanation/ |
|
|
281
|
+
| Obviar edge cases | Sorprende al lector | Documentar todos los casos |
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Patrones de Explicación
|
|
286
|
+
|
|
287
|
+
### Estructura canónica
|
|
288
|
+
|
|
289
|
+
```markdown
|
|
290
|
+
# [Tema o pregunta que se responde]
|
|
291
|
+
|
|
292
|
+
## Contexto
|
|
293
|
+
[Por qué existe, qué problema aborda]
|
|
294
|
+
|
|
295
|
+
## Cómo funciona
|
|
296
|
+
[Vista general conceptual — sin código]
|
|
297
|
+
|
|
298
|
+
## Alternativas consideradas
|
|
299
|
+
[Qué otras opciones existían]
|
|
300
|
+
|
|
301
|
+
## Implicaciones
|
|
302
|
+
[Qué significa para el presente y futuro]
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Tono
|
|
306
|
+
|
|
307
|
+
- **Discursivo y analítico**: Como una conversación con un colega experto
|
|
308
|
+
- **Conectivo**: Relacionar con otros conceptos, ADRs, decisiones
|
|
309
|
+
- **Histórico**: Contar la historia de por qué se llegó aquí
|
|
310
|
+
- **Sin código** (o mínimo): El foco es el entendimiento, no la implementación
|
|
311
|
+
|
|
312
|
+
### Cuándo es necesaria una explicación
|
|
313
|
+
|
|
314
|
+
- Un ADR necesita más contexto del que cabe en 1-3 oraciones
|
|
315
|
+
- Un concepto se referencia en múltiples how-tos/tutoriales y merece su propio espacio
|
|
316
|
+
- Alguien preguntó "¿por qué hicimos esto así?" más de una vez
|
|
317
|
+
- Hay confusión recurrente sobre un tema
|
|
318
|
+
|
|
319
|
+
### Vinculación con ADRs
|
|
320
|
+
|
|
321
|
+
```markdown
|
|
322
|
+
Para la decisión formal, ver [[ADR-003-event-sourcing]].
|
|
323
|
+
Este documento explica el contexto y las implicaciones en mayor detalle.
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Anti-patrones de explicación
|
|
327
|
+
|
|
328
|
+
| Anti-patrón | Por qué es malo | Qué hacer en su lugar |
|
|
329
|
+
|-------------|----------------|----------------------|
|
|
330
|
+
| Instrucciones paso a paso | Eso es un tutorial o how-to | Enfocarse en el porqué |
|
|
331
|
+
| Listar todas las opciones de config | Eso es referencia | Explicar la lógica detrás |
|
|
332
|
+
| Sin contexto histórico | Pierde el valor de la explicación | Incluir cómo se llegó ahí |
|
|
333
|
+
| Demasiado abstracto | No ayuda a entender | Usar analogías concretas |
|
|
334
|
+
| Repetir el ADR palabra por palabra | No agrega valor | Expandir con contexto y matices |
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Anti-patrones Transversales
|
|
339
|
+
|
|
340
|
+
### Anti-patrones que aplican a TODOS los tipos
|
|
341
|
+
|
|
342
|
+
| Anti-patrón | Descripción | Solución |
|
|
343
|
+
|-------------|-------------|----------|
|
|
344
|
+
| **Documento camaleón** | Intenta ser dos tipos a la vez | Un doc = un tipo. Separar. |
|
|
345
|
+
| **Contenido placeholder** | "TODO: agregar contenido" | Escribir contenido real o no crear |
|
|
346
|
+
| **Sin frontmatter** | Archivo sin metadatos YAML | Siempre incluir frontmatter |
|
|
347
|
+
| **Sin fecha** | No se sabe cuándo se creó | Siempre incluir `created` |
|
|
348
|
+
| **Términos sin definir** | Jerga sin referencia a CONTEXT.md | Definir o linkear |
|
|
349
|
+
| **Enlaces rotos** | Referencias a archivos que no existen | Verificar antes de publicar |
|
|
350
|
+
| **Contenido duplicado** | Misma info en múltiples archivos | Referenciar, no duplicar |
|
|
351
|
+
| **Sin verificación** | No hay forma de saber si está actualizado | Incluir `last-reviewed` en frontmatter |
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
name: Docs Health Check
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
paths:
|
|
6
|
+
- 'docs/**'
|
|
7
|
+
- 'AGENTS.md'
|
|
8
|
+
- 'README.md'
|
|
9
|
+
- 'CHANGELOG.md'
|
|
10
|
+
pull_request:
|
|
11
|
+
paths:
|
|
12
|
+
- 'docs/**'
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
docs-check:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
name: Verificar documentación
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Verificar frontmatter YAML en todos los .md de docs/
|
|
22
|
+
run: |
|
|
23
|
+
echo "🔍 Verificando frontmatter YAML..."
|
|
24
|
+
errors=0
|
|
25
|
+
for file in $(find docs -name "*.md" -type f); do
|
|
26
|
+
if ! head -1 "$file" | grep -q "^---"; then
|
|
27
|
+
echo "❌ Sin frontmatter: $file"
|
|
28
|
+
errors=$((errors + 1))
|
|
29
|
+
fi
|
|
30
|
+
done
|
|
31
|
+
if [ $errors -gt 0 ]; then
|
|
32
|
+
echo "::error::$errors archivo(s) sin frontmatter YAML"
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
echo "✅ Todos los archivos tienen frontmatter"
|
|
36
|
+
|
|
37
|
+
- name: Verificar que no hay archivos vacíos en docs/
|
|
38
|
+
run: |
|
|
39
|
+
echo "🔍 Verificando archivos vacíos..."
|
|
40
|
+
errors=0
|
|
41
|
+
for file in $(find docs -name "*.md" -type f); do
|
|
42
|
+
# Un archivo con solo frontmatter tiene menos de 10 líneas útiles
|
|
43
|
+
content_lines=$(grep -v "^---$" "$file" | grep -v "^$" | wc -l)
|
|
44
|
+
if [ "$content_lines" -lt 3 ]; then
|
|
45
|
+
echo "⚠️ Archivo con poco contenido: $file ($content_lines líneas)"
|
|
46
|
+
fi
|
|
47
|
+
done
|
|
48
|
+
echo "✅ Verificación de archivos vacíos completada"
|
|
49
|
+
|
|
50
|
+
- name: Verificar links internos rotos
|
|
51
|
+
run: |
|
|
52
|
+
echo "🔍 Verificando links internos..."
|
|
53
|
+
errors=0
|
|
54
|
+
for file in $(find docs -name "*.md" -type f); do
|
|
55
|
+
# Extraer links relativos tipo [text](path.md)
|
|
56
|
+
links=$(grep -oP '\[.*?\]\(\K[^)]+' "$file" | grep -v "^http" | grep -v "^#" || true)
|
|
57
|
+
dir=$(dirname "$file")
|
|
58
|
+
for link in $links; do
|
|
59
|
+
# Resolver path relativo
|
|
60
|
+
target=$(realpath --relative-to=. "$dir/$link" 2>/dev/null || echo "")
|
|
61
|
+
if [ -n "$target" ] && [ ! -f "$target" ]; then
|
|
62
|
+
echo "❌ Link roto en $file → $link"
|
|
63
|
+
errors=$((errors + 1))
|
|
64
|
+
fi
|
|
65
|
+
done
|
|
66
|
+
done
|
|
67
|
+
if [ $errors -gt 0 ]; then
|
|
68
|
+
echo "::warning::$errors link(s) interno(s) rotos encontrados"
|
|
69
|
+
else
|
|
70
|
+
echo "✅ Todos los links internos son válidos"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
- name: Verificar CONTEXT.md tiene contenido
|
|
74
|
+
run: |
|
|
75
|
+
echo "🔍 Verificando CONTEXT.md..."
|
|
76
|
+
if [ -f "docs/CONTEXT.md" ]; then
|
|
77
|
+
completeness=$(grep -oP 'completeness:\s*"\K[0-9]+' docs/CONTEXT.md || echo "0")
|
|
78
|
+
if [ "$completeness" -lt 20 ]; then
|
|
79
|
+
echo "::warning::CONTEXT.md tiene completeness: ${completeness}%. Priorizar su actualización."
|
|
80
|
+
else
|
|
81
|
+
echo "✅ CONTEXT.md completeness: ${completeness}%"
|
|
82
|
+
fi
|
|
83
|
+
else
|
|
84
|
+
echo "::error::docs/CONTEXT.md no existe"
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
- name: Resumen
|
|
89
|
+
run: |
|
|
90
|
+
echo "📊 Resumen de documentación:"
|
|
91
|
+
echo " Archivos .md en docs/: $(find docs -name '*.md' -type f | wc -l)"
|
|
92
|
+
echo " ADRs: $(find docs/adr -name '*.md' -not -name 'TEMPLATE*' -type f 2>/dev/null | wc -l)"
|
|
93
|
+
echo " Tutoriales: $(find docs/tutorials -name '*.md' -type f 2>/dev/null | wc -l)"
|
|
94
|
+
echo " Guías: $(find docs/guides -name '*.md' -type f 2>/dev/null | wc -l)"
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
---
|
|
2
|
+
created: "2025-01-01"
|
|
3
|
+
status: active
|
|
4
|
+
type: design-system
|
|
5
|
+
tags: [diseño, ui, componentes, colores, tipografía, design-system]
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
name: "[Nombre del Design System]"
|
|
8
|
+
description: "Sistema de diseño visual para {{PROJECT_NAME}}"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Design System — {{PROJECT_NAME}}
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
# ⚠️ VALORES DE EJEMPLO — NO SON LOS TOKENS DEL PROYECTO
|
|
15
|
+
# Los valores abajo son ilustrativos (basados en paleta Tailwind).
|
|
16
|
+
# Reemplazar con los tokens reales del proyecto.
|
|
17
|
+
# Para extraer tokens automáticamente del código, usar la skill `doc-design`.
|
|
18
|
+
|
|
19
|
+
colors:
|
|
20
|
+
primary:
|
|
21
|
+
50: "#eff6ff" # Fondo claro
|
|
22
|
+
100: "#dbeafe" # Hover sutil
|
|
23
|
+
500: "#3b82f6" # Color principal
|
|
24
|
+
600: "#2563eb" # Hover
|
|
25
|
+
700: "#1d4ed8" # Activo / Pressed
|
|
26
|
+
900: "#1e3a5f" # Texto sobre claro
|
|
27
|
+
secondary:
|
|
28
|
+
50: "#f8fafc"
|
|
29
|
+
500: "#64748b"
|
|
30
|
+
700: "#334155"
|
|
31
|
+
900: "#0f172a"
|
|
32
|
+
semantic:
|
|
33
|
+
success: "#22c55e"
|
|
34
|
+
warning: "#f59e0b"
|
|
35
|
+
error: "#ef4444"
|
|
36
|
+
info: "#3b82f6"
|
|
37
|
+
neutral:
|
|
38
|
+
white: "#ffffff"
|
|
39
|
+
gray-100: "#f1f5f9"
|
|
40
|
+
gray-300: "#cbd5e1"
|
|
41
|
+
gray-500: "#64748b"
|
|
42
|
+
gray-700: "#334155"
|
|
43
|
+
black: "#0f172a"
|
|
44
|
+
brand:
|
|
45
|
+
corporate: "#[COLOR_PRINCIPAL]"
|
|
46
|
+
accent: "#[COLOR_SECUNDARIO]"
|
|
47
|
+
|
|
48
|
+
typography:
|
|
49
|
+
fontFamily:
|
|
50
|
+
base: "[Nombre de fuente], sans-serif"
|
|
51
|
+
heading: "[Nombre de fuente], sans-serif"
|
|
52
|
+
mono: "[Nombre de fuente monoespaciada], monospace"
|
|
53
|
+
fontSize:
|
|
54
|
+
xs: "0.75rem" # 12px
|
|
55
|
+
sm: "0.875rem" # 14px
|
|
56
|
+
base: "1rem" # 16px
|
|
57
|
+
lg: "1.125rem" # 18px
|
|
58
|
+
xl: "1.25rem" # 20px
|
|
59
|
+
2xl: "1.5rem" # 24px
|
|
60
|
+
3xl: "1.875rem" # 30px
|
|
61
|
+
4xl: "2.25rem" # 36px
|
|
62
|
+
fontWeight:
|
|
63
|
+
regular: "400"
|
|
64
|
+
medium: "500"
|
|
65
|
+
semibold: "600"
|
|
66
|
+
bold: "700"
|
|
67
|
+
lineHeight:
|
|
68
|
+
tight: "1.25"
|
|
69
|
+
base: "1.5"
|
|
70
|
+
relaxed: "1.75"
|
|
71
|
+
|
|
72
|
+
rounded:
|
|
73
|
+
none: "0"
|
|
74
|
+
sm: "0.25rem"
|
|
75
|
+
md: "0.375rem"
|
|
76
|
+
lg: "0.5rem"
|
|
77
|
+
xl: "0.75rem"
|
|
78
|
+
full: "9999px"
|
|
79
|
+
|
|
80
|
+
spacing:
|
|
81
|
+
unit: "0.25rem" # Base: 4px
|
|
82
|
+
scale: [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24]
|
|
83
|
+
|
|
84
|
+
components:
|
|
85
|
+
button:
|
|
86
|
+
variants: [primary, secondary, ghost, danger]
|
|
87
|
+
sizes: [sm, md, lg]
|
|
88
|
+
borderRadius: "md"
|
|
89
|
+
input:
|
|
90
|
+
variants: [default, error, disabled]
|
|
91
|
+
borderRadius: "md"
|
|
92
|
+
height: "2.5rem"
|
|
93
|
+
card:
|
|
94
|
+
borderRadius: "lg"
|
|
95
|
+
shadow: "0 1px 3px rgba(0,0,0,0.1)"
|
|
96
|
+
padding: "1.5rem"
|
|
97
|
+
modal:
|
|
98
|
+
borderRadius: "xl"
|
|
99
|
+
maxWidth: "32rem"
|
|
100
|
+
overlay: "rgba(0,0,0,0.5)"
|
|
101
|
+
table:
|
|
102
|
+
headerBg: "gray-100"
|
|
103
|
+
rowHover: "gray-50"
|
|
104
|
+
borderColor: "gray-300"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Visión general
|
|
110
|
+
|
|
111
|
+
Este documento es la fuente de verdad para las decisiones visuales del proyecto. Todo cambio de UI debe consultar este archivo primero. Si el cambio requiere un nuevo token o componente, actualizar este archivo antes de implementar.
|
|
112
|
+
|
|
113
|
+
Los tokens de diseño viven aquí. Los componentes se implementan en código y **referencian** estos tokens.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Colores
|
|
118
|
+
|
|
119
|
+
### Paleta principal
|
|
120
|
+
|
|
121
|
+
| Token | Valor | Uso |
|
|
122
|
+
|-------|-------|-----|
|
|
123
|
+
| `primary-500` | `#[valor]` | Botones principales, links activos, elementos de acción |
|
|
124
|
+
| `primary-700` | `#[valor]` | Botones en estado hover/active |
|
|
125
|
+
| `secondary-500` | `#[valor]` | Elementos secundarios, iconos, texto complementario |
|
|
126
|
+
|
|
127
|
+
### Colores semánticos
|
|
128
|
+
|
|
129
|
+
| Token | Valor | Cuándo usarlo |
|
|
130
|
+
|-------|-------|---------------|
|
|
131
|
+
| `success` | `#[valor]` | Operaciones exitosas, confirmaciones, estados positivos |
|
|
132
|
+
| `warning` | `#[valor]` | Advertencias, datos que requieren atención sin ser error |
|
|
133
|
+
| `error` | `#[valor]` | Errores, validaciones fallidas, operaciones fallidas |
|
|
134
|
+
| `info` | `#[valor]` | Información contextual, tooltips, ayuda |
|
|
135
|
+
|
|
136
|
+
### Reglas de contraste
|
|
137
|
+
|
|
138
|
+
- Todo texto sobre fondos de color debe cumplir con **WCAG 2.1 nivel AA** (ratio mínimo 4.5:1 para texto normal, 3:1 para texto grande).
|
|
139
|
+
- Verificar contraste con [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/).
|
|
140
|
+
- Nunca usar `gray-300` como color de texto sobre fondo blanco.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Tipografía
|
|
145
|
+
|
|
146
|
+
### Jerarquía
|
|
147
|
+
|
|
148
|
+
| Elemento | Tamaño | Peso | Line-height | Uso |
|
|
149
|
+
|----------|--------|------|-------------|-----|
|
|
150
|
+
| H1 | `2.25rem` (36px) | Bold (700) | Tight (1.25) | Título de página. Una sola vez por página. |
|
|
151
|
+
| H2 | `1.5rem` (24px) | Semibold (600) | Tight (1.25) | Título de sección. |
|
|
152
|
+
| H3 | `1.25rem` (20px) | Semibold (600) | Base (1.5) | Título de subsección o card. |
|
|
153
|
+
| H4 | `1.125rem` (18px) | Medium (500) | Base (1.5) | Títulos menores. |
|
|
154
|
+
| Body | `1rem` (16px) | Regular (400) | Base (1.5) | Texto de párrafo. |
|
|
155
|
+
| Small | `0.875rem` (14px) | Regular (400) | Base (1.5) | Texto secundario, labels, helpers. |
|
|
156
|
+
| Caption | `0.75rem` (12px) | Regular (400) | Base (1.5) | Notas legales, timestamps, metadatos. |
|
|
157
|
+
|
|
158
|
+
### Reglas
|
|
159
|
+
|
|
160
|
+
- Máximo **3 niveles de headings** por página (H1 → H2 → H3).
|
|
161
|
+
- No usar H1 más de una vez por vista.
|
|
162
|
+
- Texto siempre en `base` (16px) como mínimo. No usar `xs` para texto funcional.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Layout y espaciado
|
|
167
|
+
|
|
168
|
+
### Grid
|
|
169
|
+
|
|
170
|
+
- Grid base de **4px**. Todo espaciado debe ser múltiplo de 4.
|
|
171
|
+
- Container máximo: `1280px` centrado.
|
|
172
|
+
- Padding lateral del container: `1.5rem` en mobile, `2rem` en desktop.
|
|
173
|
+
|
|
174
|
+
### Breakpoints
|
|
175
|
+
|
|
176
|
+
| Nombre | Ancho | Dispositivo |
|
|
177
|
+
|--------|-------|-------------|
|
|
178
|
+
| `sm` | `640px` | Mobile horizontal |
|
|
179
|
+
| `md` | `768px` | Tablet vertical |
|
|
180
|
+
| `lg` | `1024px` | Tablet horizontal / laptop |
|
|
181
|
+
| `xl` | `1280px` | Desktop |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Elevación (Shadows)
|
|
186
|
+
|
|
187
|
+
| Nivel | Sombra | Uso |
|
|
188
|
+
|-------|--------|-----|
|
|
189
|
+
| `none` | `none` | Elementos flat, backgrounds |
|
|
190
|
+
| `sm` | `0 1px 2px rgba(0,0,0,0.05)` | Cards en reposo |
|
|
191
|
+
| `md` | `0 4px 6px rgba(0,0,0,0.1)` | Cards con hover, dropdowns |
|
|
192
|
+
| `lg` | `0 10px 15px rgba(0,0,0,0.1)` | Modales, popovers |
|
|
193
|
+
| `xl` | `0 20px 25px rgba(0,0,0,0.15)` | Elementos flotantes destacados |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Componentes
|
|
198
|
+
|
|
199
|
+
### Botones
|
|
200
|
+
|
|
201
|
+
| Variante | Fondo | Texto | Borde |
|
|
202
|
+
|----------|-------|-------|-------|
|
|
203
|
+
| **Primary** | `primary-500` | `white` | Ninguno |
|
|
204
|
+
| **Secondary** | `white` | `gray-700` | `gray-300` |
|
|
205
|
+
| **Ghost** | Transparente | `gray-700` | Ninguno |
|
|
206
|
+
| **Danger** | `error` | `white` | Ninguno |
|
|
207
|
+
|
|
208
|
+
| Tamaño | Height | Padding horizontal | Font size |
|
|
209
|
+
|--------|--------|-------------------|-----------|
|
|
210
|
+
| `sm` | `2rem` | `0.75rem` | `sm` |
|
|
211
|
+
| `md` | `2.5rem` | `1rem` | `base` |
|
|
212
|
+
| `lg` | `3rem` | `1.5rem` | `lg` |
|
|
213
|
+
|
|
214
|
+
### Inputs
|
|
215
|
+
|
|
216
|
+
- Altura: `2.5rem`
|
|
217
|
+
- Border: `1px solid gray-300`
|
|
218
|
+
- Border focus: `2px solid primary-500`
|
|
219
|
+
- Border error: `2px solid error`
|
|
220
|
+
- Placeholder: `gray-500`
|
|
221
|
+
- Mensaje de error debajo del input en color `error`, tamaño `sm`.
|
|
222
|
+
|
|
223
|
+
### Cards
|
|
224
|
+
|
|
225
|
+
- Border radius: `lg`
|
|
226
|
+
- Sombra: `sm` en reposo, `md` en hover
|
|
227
|
+
- Padding interno: `1.5rem`
|
|
228
|
+
- Separación entre cards: `1rem`
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Comportamiento responsive
|
|
233
|
+
|
|
234
|
+
Principio: **Mobile first**. Se diseña para mobile y se escala hacia desktop.
|
|
235
|
+
|
|
236
|
+
1. En mobile (< 768px): una sola columna, navegación colapsada, cards apiladas.
|
|
237
|
+
2. En tablet (768px - 1024px): dos columnas donde aplique, sidebar colapsable.
|
|
238
|
+
3. En desktop (> 1024px): layout completo con sidebar expandida.
|
|
239
|
+
|
|
240
|
+
Regla: ningún elemento debe quedar fuera de viewport o requerir scroll horizontal en ningún breakpoint.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Cómo actualizar este archivo
|
|
245
|
+
|
|
246
|
+
Cuando se añada o cambie un elemento visual:
|
|
247
|
+
|
|
248
|
+
1. Actualizar el token en el bloque YAML de arriba.
|
|
249
|
+
2. Actualizar la tabla en la sección correspondiente.
|
|
250
|
+
3. Verificar que los componentes que usan ese token sigan teniendo contraste adecuado.
|
|
251
|
+
4. Si el cambio es significativo, crear un ADR explicando el motivo.
|
|
252
|
+
|
|
253
|
+
Para gestión integral del design system, usar la skill `doc-design`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
created: "2026-05-07"
|
|
3
|
+
updated: "2026-05-07"
|
|
4
|
+
status: deprecated
|
|
5
|
+
type: redirect
|
|
6
|
+
tags: [flujo, diagrama, agentes]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# ⚠️ Este archivo ha sido fusionado
|
|
10
|
+
|
|
11
|
+
Todo el contenido de diagramas de flujo, estructura de agentes y flujos de decisión se ha consolidado en:
|
|
12
|
+
|
|
13
|
+
→ **[`docs/internal/agent-guide.md`](../internal/agent-guide.md)**
|
|
14
|
+
|
|
15
|
+
Este archivo se mantiene como redirect para no romper enlaces existentes.
|