sdd-es 2.0.0 → 2.6.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/.claude/settings.json +29 -29
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +10 -7
- package/.claude-plugin/plugin.json +59 -37
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +77 -40
- package/agents/architecture-designer.md +211 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +11 -16
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +268 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +288 -0
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/cli/index.js +1 -2
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +521 -0
- package/commands/sdd.configurar.md +34 -1
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.crear-mcp.md +2 -0
- package/commands/sdd.defect-report.md +134 -0
- package/commands/sdd.descubrir.md +19 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +120 -3
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +272 -52
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +93 -4
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +81 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +61 -185
- package/docs/FABRICA.md +163 -115
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +15 -10
- package/plantillas/job-story-mejorar-prompt.md +107 -0
- package/presets/enterprise.yaml +6 -0
- package/presets/lean.yaml +4 -0
- package/presets/startup.yaml +6 -0
- package/skills/adr-indexer/SKILL.md +181 -0
- package/skills/cache-audit/SKILL.md +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +68 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +177 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/mcp-figma/README.md +0 -158
- package/mcp-figma/package.json +0 -7
- package/mcp-figma/src/component-generator.js +0 -162
- package/mcp-figma/src/design-system-analyzer.js +0 -247
- package/mcp-figma/src/figma-client.js +0 -75
- package/mcp-figma/src/index.js +0 -114
- package/mcp-figma/src/mcp.js +0 -97
- package/mcp-figma/src/style-mapper.js +0 -85
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
package/docs/EJEMPLO-PRACTICA.md
DELETED
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
# Ejemplo Práctico — API de Lista de Tareas desde Cero
|
|
2
|
-
|
|
3
|
-
Este ejemplo recorre el flujo completo de SDD-ES construyendo una API REST de lista de tareas con Node.js + Express + SQLite. No asume ningún código previo.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Contexto del proyecto
|
|
8
|
-
|
|
9
|
-
Tienes una carpeta vacía. Quieres construir una API que permita crear, listar, completar y eliminar tareas.
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
mkdir mi-api-tareas
|
|
13
|
-
cd mi-api-tareas
|
|
14
|
-
git init
|
|
15
|
-
bash /ruta/a/sdd-es/instalar.sh
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Abre Claude Code en `mi-api-tareas`.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Paso 1 — Constitución
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
/sdd.constitucion
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Claude detecta que el proyecto está vacío y te pregunta por el stack. Respondes:
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
Stack: Node.js con Express
|
|
32
|
-
Base de datos: SQLite (sin ORM, queries directas)
|
|
33
|
-
Tests: Jest
|
|
34
|
-
Calidad: cobertura mínima 80%, funciones ≤40 líneas, sin any en TypeScript
|
|
35
|
-
Sin TypeScript por ahora — JavaScript puro
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Claude genera `.sdd/memoria/constitucion.md` con tus principios.
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## Paso 2 — Primera especificación
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
/sdd.especificar API de lista de tareas — CRUD completo con SQLite
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Claude detecta que es un cambio **mediano** (varios endpoints, BD, tests) y genera la spec:
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
✅ Spec creada: .sdd/especificaciones/2026-06-09-api-lista-tareas/spec.md
|
|
52
|
-
|
|
53
|
-
⚠️ 2 puntos requieren aclaración.
|
|
54
|
-
|
|
55
|
-
PRÓXIMO PASO RECOMENDADO:
|
|
56
|
-
/sdd.aclarar — resolver los [NECESITA_ACLARACION]
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
La spec generada contiene secciones como:
|
|
60
|
-
|
|
61
|
-
```markdown
|
|
62
|
-
## 4. Historias de Usuario
|
|
63
|
-
|
|
64
|
-
### HU-001: Gestión de tareas
|
|
65
|
-
Como usuario de la API
|
|
66
|
-
Quiero crear, listar, completar y eliminar tareas
|
|
67
|
-
Para organizar mi trabajo
|
|
68
|
-
|
|
69
|
-
Criterios de aceptación:
|
|
70
|
-
- [ ] CA-001-01: POST /tareas crea una tarea con título obligatorio (P1)
|
|
71
|
-
- [ ] CA-001-02: GET /tareas devuelve todas las tareas ordenadas por fecha (P1)
|
|
72
|
-
- [ ] CA-001-03: PATCH /tareas/:id/completar marca la tarea como completa (P1)
|
|
73
|
-
- [ ] CA-001-04: DELETE /tareas/:id elimina la tarea (P1)
|
|
74
|
-
- [ ] CA-001-05: POST /tareas sin título devuelve 400 con mensaje de error (P1)
|
|
75
|
-
- [ ] CA-001-06: PATCH /tareas/:id con ID inexistente devuelve 404 (P2)
|
|
76
|
-
|
|
77
|
-
## 8. Fuera de Alcance
|
|
78
|
-
|
|
79
|
-
❌ Autenticación de usuarios
|
|
80
|
-
❌ Múltiples listas por usuario
|
|
81
|
-
❌ Prioridades o etiquetas
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Paso 3 — Aclarar ambigüedades
|
|
87
|
-
|
|
88
|
-
```
|
|
89
|
-
/sdd.aclarar
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Claude encuentra 2 puntos sin definir y pregunta:
|
|
93
|
-
|
|
94
|
-
```
|
|
95
|
-
🔴 ACLARACIONES CRÍTICAS
|
|
96
|
-
|
|
97
|
-
1. [Datos] — ¿Las tareas tienen fecha de vencimiento?
|
|
98
|
-
a) Sí, campo opcional `vence_en` (ISO 8601)
|
|
99
|
-
b) No, solo título y estado
|
|
100
|
-
|
|
101
|
-
2. [Formato] — ¿Qué devuelve DELETE /tareas/:id?
|
|
102
|
-
a) 204 sin body
|
|
103
|
-
b) 200 con la tarea eliminada
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Respondes: `1.b, 2.a`
|
|
107
|
-
|
|
108
|
-
Claude actualiza la spec y elimina los marcadores `[NECESITA_ACLARACION]`.
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Paso 4 — Plan técnico
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
/sdd.planificar
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
El arquitecto, el asesor de datos y el crítico trabajan en paralelo. Claude genera `.sdd/especificaciones/{ID}/plan.md`:
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
── Constitutional AI Check ─────────────────────────────
|
|
122
|
-
✅ Stack: Express + SQLite — alineado con constitución
|
|
123
|
-
✅ Patrones: módulos ES, funciones ≤40 líneas
|
|
124
|
-
✅ Sin dependencias nuevas más allá de express y better-sqlite3
|
|
125
|
-
─────────────────────────────────────────────────────────
|
|
126
|
-
|
|
127
|
-
📋 Plan técnico generado
|
|
128
|
-
• 6 archivos afectados
|
|
129
|
-
• 2 dependencias nuevas (express, better-sqlite3)
|
|
130
|
-
• 4 decisiones técnicas
|
|
131
|
-
• 1 riesgo identificado
|
|
132
|
-
|
|
133
|
-
⚠️ PUNTOS DESTACADOS:
|
|
134
|
-
• Riesgo medio: SQLite no soporta concurrencia alta — documentado, aceptado
|
|
135
|
-
para el scope actual (API local/dev)
|
|
136
|
-
|
|
137
|
-
POR FAVOR REVISA EL PLAN:
|
|
138
|
-
/sdd.planificar aprobar — continuar al desglose
|
|
139
|
-
/sdd.planificar revisar — discutir cambios
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Revisas el plan en `.sdd/especificaciones/{ID}/plan.md`. Ves que el arquitecto propuso esta estructura:
|
|
143
|
-
|
|
144
|
-
```
|
|
145
|
-
src/
|
|
146
|
-
db.js ← inicialización de SQLite
|
|
147
|
-
tareas.js ← lógica de negocio
|
|
148
|
-
rutas.js ← endpoints Express
|
|
149
|
-
app.js ← setup de Express
|
|
150
|
-
server.js ← punto de entrada
|
|
151
|
-
tests/
|
|
152
|
-
tareas.test.js
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
/sdd.planificar aprobar
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## Paso 5 — Desglose en tareas
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
/sdd.tareas
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
✅ 8 tareas generadas
|
|
169
|
-
|
|
170
|
-
DISTRIBUCIÓN POR AGENTE:
|
|
171
|
-
• arquitecto: 1 (estructura base)
|
|
172
|
-
• desarrollador-backend: 5 (BD, lógica, rutas)
|
|
173
|
-
• tester: 2 (tests unitarios + integración)
|
|
174
|
-
|
|
175
|
-
COBERTURA:
|
|
176
|
-
• 6/6 CAs cubiertos
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
Las tareas generadas en `.sdd/especificaciones/{ID}/tareas.md`:
|
|
180
|
-
|
|
181
|
-
```
|
|
182
|
-
T001 — Inicializar proyecto e instalar dependencias [arquitecto]
|
|
183
|
-
T002 — Crear módulo de BD (db.js + migración inicial) [backend]
|
|
184
|
-
T003 — Tests unitarios de la capa de datos [tester]
|
|
185
|
-
T004 — Implementar lógica de tareas (tareas.js) [backend]
|
|
186
|
-
T005 — Tests unitarios de lógica [tester]
|
|
187
|
-
T006 — Implementar rutas Express (rutas.js) [backend]
|
|
188
|
-
T007 — Setup de app.js y server.js [backend]
|
|
189
|
-
T008 — Tests de integración (API completa) [tester]
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## Paso 6 — Implementación
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
/sdd.implementar
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Claude muestra el progreso en tiempo real:
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
🔧 T001 — Inicializar proyecto e instalar dependencias
|
|
204
|
-
Agente: arquitecto (modelo: opus)
|
|
205
|
-
Tiempo estimado: S
|
|
206
|
-
|
|
207
|
-
✅ T001 completada — Verificación: PASADA
|
|
208
|
-
|
|
209
|
-
🔧 T002 — Crear módulo de BD
|
|
210
|
-
Agente: desarrollador-backend (modelo: sonnet)
|
|
211
|
-
|
|
212
|
-
── Validación de convenciones: src/db.js (fuentes: constitución, inferido) ──
|
|
213
|
-
✅ Sin violaciones
|
|
214
|
-
────────────────────────────────────────────────────────────────────────────
|
|
215
|
-
|
|
216
|
-
✅ T002 completada — Verificación: PASADA
|
|
217
|
-
|
|
218
|
-
🔧 T003 — Tests unitarios de la capa de datos
|
|
219
|
-
Agente: tester (modelo: sonnet)
|
|
220
|
-
✅ T003 completada
|
|
221
|
-
|
|
222
|
-
[...continúa para T004–T008...]
|
|
223
|
-
|
|
224
|
-
✅ T008 completada
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
El código generado en `src/db.js`:
|
|
228
|
-
|
|
229
|
-
```javascript
|
|
230
|
-
import Database from 'better-sqlite3'
|
|
231
|
-
import { join, dirname } from 'node:path'
|
|
232
|
-
import { fileURLToPath } from 'node:url'
|
|
233
|
-
|
|
234
|
-
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
235
|
-
const DB_PATH = join(__dirname, '..', 'tareas.db')
|
|
236
|
-
|
|
237
|
-
let db
|
|
238
|
-
|
|
239
|
-
export function getDb() {
|
|
240
|
-
if (!db) {
|
|
241
|
-
db = new Database(DB_PATH)
|
|
242
|
-
db.pragma('journal_mode = WAL')
|
|
243
|
-
inicializar(db)
|
|
244
|
-
}
|
|
245
|
-
return db
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function inicializar(db) {
|
|
249
|
-
db.exec(`
|
|
250
|
-
CREATE TABLE IF NOT EXISTS tareas (
|
|
251
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
252
|
-
titulo TEXT NOT NULL,
|
|
253
|
-
completa INTEGER NOT NULL DEFAULT 0,
|
|
254
|
-
creada_en TEXT NOT NULL DEFAULT (datetime('now'))
|
|
255
|
-
)
|
|
256
|
-
`)
|
|
257
|
-
}
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
Y en `src/tareas.js`:
|
|
261
|
-
|
|
262
|
-
```javascript
|
|
263
|
-
import { getDb } from './db.js'
|
|
264
|
-
|
|
265
|
-
export function listarTareas() {
|
|
266
|
-
return getDb()
|
|
267
|
-
.prepare('SELECT * FROM tareas ORDER BY creada_en DESC')
|
|
268
|
-
.all()
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
export function crearTarea(titulo) {
|
|
272
|
-
if (!titulo || titulo.trim().length === 0) {
|
|
273
|
-
throw new Error('El título es obligatorio')
|
|
274
|
-
}
|
|
275
|
-
const stmt = getDb().prepare('INSERT INTO tareas (titulo) VALUES (?)')
|
|
276
|
-
const result = stmt.run(titulo.trim())
|
|
277
|
-
return getDb().prepare('SELECT * FROM tareas WHERE id = ?').get(result.lastInsertRowid)
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
export function completarTarea(id) {
|
|
281
|
-
const tarea = getDb().prepare('SELECT * FROM tareas WHERE id = ?').get(id)
|
|
282
|
-
if (!tarea) return null
|
|
283
|
-
getDb().prepare('UPDATE tareas SET completa = 1 WHERE id = ?').run(id)
|
|
284
|
-
return { ...tarea, completa: 1 }
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
export function eliminarTarea(id) {
|
|
288
|
-
const result = getDb().prepare('DELETE FROM tareas WHERE id = ?').run(id)
|
|
289
|
-
return result.changes > 0
|
|
290
|
-
}
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
---
|
|
294
|
-
|
|
295
|
-
## Paso 7 — Verificación final
|
|
296
|
-
|
|
297
|
-
Al terminar todas las tareas, Claude invoca automáticamente al revisor y corre los tests:
|
|
298
|
-
|
|
299
|
-
```
|
|
300
|
-
📊 Implementación Completada: 2026-06-09-api-lista-tareas
|
|
301
|
-
|
|
302
|
-
Tareas: 8/8 ✅
|
|
303
|
-
Tests: Jest — 14 pasados, 0 fallidos
|
|
304
|
-
Cobertura: 87% (umbral: 80%) ✅
|
|
305
|
-
Constitución: ✅
|
|
306
|
-
|
|
307
|
-
Revisión del agente revisor:
|
|
308
|
-
✅ Todos los CAs cubiertos por tests
|
|
309
|
-
✅ Funciones ≤40 líneas (máx. encontrada: 18 líneas)
|
|
310
|
-
🟡 Sugerencia: añadir middleware de manejo de errores global (no bloqueante)
|
|
311
|
-
|
|
312
|
-
SIGUIENTES PASOS:
|
|
313
|
-
/sdd.verificar — verificación final contra spec original
|
|
314
|
-
/sdd.snapshot — actualizar SNAPSHOT del producto
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
```
|
|
318
|
-
/sdd.verificar
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
```
|
|
322
|
-
✅ Verificación completada
|
|
323
|
-
|
|
324
|
-
CA-001-01: POST /tareas crea tarea ✅ test: "debería crear tarea con título"
|
|
325
|
-
CA-001-02: GET /tareas devuelve ordenadas ✅ test: "debería listar en orden descendente"
|
|
326
|
-
CA-001-03: PATCH completa la tarea ✅ test: "debería marcar como completa"
|
|
327
|
-
CA-001-04: DELETE elimina la tarea ✅ test: "debería eliminar y devolver 204"
|
|
328
|
-
CA-001-05: POST sin título → 400 ✅ test: "debería devolver 400 sin título"
|
|
329
|
-
CA-001-06: PATCH ID inexistente → 404 ✅ test: "debería devolver 404 si no existe"
|
|
330
|
-
|
|
331
|
-
6/6 criterios de aceptación verificados ✅
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## Resultado final
|
|
337
|
-
|
|
338
|
-
```
|
|
339
|
-
mi-api-tareas/
|
|
340
|
-
├── src/
|
|
341
|
-
│ ├── db.js ← BD SQLite
|
|
342
|
-
│ ├── tareas.js ← lógica de negocio
|
|
343
|
-
│ ├── rutas.js ← endpoints Express
|
|
344
|
-
│ ├── app.js ← setup Express
|
|
345
|
-
│ └── server.js ← punto de entrada
|
|
346
|
-
├── tests/
|
|
347
|
-
│ └── tareas.test.js ← 14 tests, 87% cobertura
|
|
348
|
-
├── package.json
|
|
349
|
-
├── tareas.db ← BD generada en primera ejecución
|
|
350
|
-
└── .sdd/
|
|
351
|
-
├── memoria/constitucion.md
|
|
352
|
-
├── especificaciones/2026-06-09-api-lista-tareas/
|
|
353
|
-
│ ├── spec.md
|
|
354
|
-
│ ├── plan.md
|
|
355
|
-
│ ├── tareas.md
|
|
356
|
-
│ └── checklist-spec.md
|
|
357
|
-
└── SNAPSHOT.md
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
**Lo que SDD-ES garantizó:**
|
|
361
|
-
- Cada línea de código está trazada a un criterio de aceptación
|
|
362
|
-
- El revisor verificó independientemente del implementador
|
|
363
|
-
- La constitución se cumplió en cada decisión técnica
|
|
364
|
-
- Los tests no son decorativos — cada CA tiene su test
|
|
365
|
-
|
|
366
|
-
---
|
|
367
|
-
|
|
368
|
-
## Próxima feature
|
|
369
|
-
|
|
370
|
-
```
|
|
371
|
-
/sdd.especificar añadir prioridad a las tareas (alta/media/baja)
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
El sistema detecta que hay una spec anterior completada, carga el contexto del proyecto (constitución + snapshot) y empieza desde cero — sin repetir preguntas ya respondidas.
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
## Ver también
|
|
379
|
-
|
|
380
|
-
- [FLUJO.md](FLUJO.md) — diagrama completo del flujo
|
|
381
|
-
- [AGENTES.md](AGENTES.md) — qué hace cada agente
|
|
382
|
-
- [PERSONALIZACION.md](PERSONALIZACION.md) — ajustar modelos, activar/desactivar agentes
|
|
383
|
-
- [FILOSOFIA.md](FILOSOFIA.md) — por qué SDD con IA
|
package/mcp-figma/README.md
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# sdd-figma-mcp
|
|
2
|
-
|
|
3
|
-
MCP server local para integración de Figma con proyectos que usan SDD-ES. Lo usa el agente `desarrollador-frontend` para analizar el sistema de diseño del proyecto, traer componentes de Figma y generar código adaptado — sin romper lo que ya existe.
|
|
4
|
-
|
|
5
|
-
## Qué hace
|
|
6
|
-
|
|
7
|
-
| Herramienta | Qué resuelve |
|
|
8
|
-
|---|---|
|
|
9
|
-
| `analizar_sistema_diseño` | Lee tokens, colores, tipografía y componentes del proyecto local |
|
|
10
|
-
| `evaluar_ui_existente` | Score 0-100 + problemas + sugerencias de mejora |
|
|
11
|
-
| `conectar_figma` | Verifica PAT y metadata del archivo |
|
|
12
|
-
| `listar_componentes` | Lista componentes publicados en el archivo Figma |
|
|
13
|
-
| `traer_componente` | Detalle completo de un nodo: estructura, fills, texto, dimensiones |
|
|
14
|
-
| `mapear_estilos` | Cruza colores/tipografía de Figma con tokens del proyecto |
|
|
15
|
-
| `generar_componente` | Código React/Vue adaptado al sistema de diseño local |
|
|
16
|
-
| `sugerir_mejoras` | Lista priorizada de mejoras al design system |
|
|
17
|
-
|
|
18
|
-
## Instalación
|
|
19
|
-
|
|
20
|
-
### 1. Sin dependencias — listo para ejecutar
|
|
21
|
-
|
|
22
|
-
No hay `npm install`. El servidor usa exclusivamente módulos built-in de Node.js (`readline`, `fs`, `path`) y `fetch` nativo (disponible desde Node 18). El `package.json` es solo un descriptor — no instala nada.
|
|
23
|
-
|
|
24
|
-
### 2. Obtener el Personal Access Token de Figma
|
|
25
|
-
|
|
26
|
-
1. Abre Figma → Menú de usuario (esquina superior derecha) → **Settings**
|
|
27
|
-
2. Pestaña **Security** → **Personal access tokens** → **Generate new token**
|
|
28
|
-
3. Dale un nombre (ej. `sdd-figma-mcp`) y copia el token
|
|
29
|
-
|
|
30
|
-
### 3. Definir FIGMA_PAT como variable de entorno del sistema
|
|
31
|
-
|
|
32
|
-
El MCP lee el token desde `process.env.FIGMA_PAT` — **no está hardcodeado en ningún archivo de configuración** para evitar que quede en el repositorio.
|
|
33
|
-
|
|
34
|
-
Claude Code hereda las variables de entorno de la sesión donde se lanza, así que basta con definirla una vez en el sistema:
|
|
35
|
-
|
|
36
|
-
**Windows (PowerShell, permanente para el usuario):**
|
|
37
|
-
```powershell
|
|
38
|
-
[System.Environment]::SetEnvironmentVariable("FIGMA_PAT", "tu-token-aqui", "User")
|
|
39
|
-
# Cierra y vuelve a abrir la terminal para que tome efecto
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
**Windows (solo sesión actual):**
|
|
43
|
-
```powershell
|
|
44
|
-
$env:FIGMA_PAT = "tu-token-aqui"
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**macOS / Linux (permanente):**
|
|
48
|
-
```bash
|
|
49
|
-
echo 'export FIGMA_PAT="tu-token-aqui"' >> ~/.zshrc # o ~/.bashrc
|
|
50
|
-
source ~/.zshrc
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
> Si el proyecto tiene un `.env` que Claude Code carga automáticamente, también puedes agregar `FIGMA_PAT=tu-token` ahí — el proceso Node lo hereda igual.
|
|
54
|
-
|
|
55
|
-
### 4. Registrar el MCP en Claude Code
|
|
56
|
-
|
|
57
|
-
Agrega esto a tu `.claude/settings.json` (o `~/.claude/settings.json` para uso global):
|
|
58
|
-
|
|
59
|
-
```json
|
|
60
|
-
{
|
|
61
|
-
"mcpServers": {
|
|
62
|
-
"sdd-figma": {
|
|
63
|
-
"command": "node",
|
|
64
|
-
"args": ["/ruta/absoluta/al/sdd-lite/mcp-figma/src/index.js"]
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
No hay campo `env` — el servidor hereda `FIGMA_PAT` directamente del entorno del sistema (paso 3). Así el token nunca queda registrado en ningún archivo de configuración del repositorio.
|
|
71
|
-
|
|
72
|
-
> Reemplaza `/ruta/absoluta/al/sdd-lite` con la ruta real donde instalaste SDD-ES.
|
|
73
|
-
> En Windows usa barras invertidas dobles: `"c:\\\\Users\\\\usuario\\\\sdd-lite\\\\mcp-figma\\\\src\\\\index.js"`
|
|
74
|
-
|
|
75
|
-
### 5. Verificar
|
|
76
|
-
|
|
77
|
-
Reinicia Claude Code y ejecuta en cualquier proyecto frontend:
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
analizar_sistema_diseño({ project_root: "." })
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Deberías ver el perfil del sistema de diseño del proyecto.
|
|
84
|
-
|
|
85
|
-
## Cómo encontrar el file_key de Figma
|
|
86
|
-
|
|
87
|
-
La URL de Figma tiene este formato:
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
https://www.figma.com/file/ABCDEF123456/nombre-del-archivo?node-id=0:1
|
|
91
|
-
^^^^^^^^^^^^
|
|
92
|
-
este es el file_key
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Cómo encontrar el node_id
|
|
96
|
-
|
|
97
|
-
1. Selecciona el frame o componente en Figma
|
|
98
|
-
2. La URL cambia a: `?node-id=123:456`
|
|
99
|
-
3. Ese valor (`123:456` o en formato `123-456`) es el `node_id`
|
|
100
|
-
|
|
101
|
-
## Flujo típico de uso
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
# 1. Analiza lo que ya tiene el proyecto
|
|
105
|
-
analizar_sistema_diseño({ project_root: "/mi/proyecto" })
|
|
106
|
-
|
|
107
|
-
# 2. Conecta con el archivo de Figma
|
|
108
|
-
conectar_figma({ file_key: "ABCDEF123456" })
|
|
109
|
-
|
|
110
|
-
# 3. Lista los componentes disponibles
|
|
111
|
-
listar_componentes({ file_key: "ABCDEF123456", filter: "Button" })
|
|
112
|
-
|
|
113
|
-
# 4. Trae el componente que quieres implementar
|
|
114
|
-
traer_componente({ file_key: "ABCDEF123456", node_id: "123:456" })
|
|
115
|
-
|
|
116
|
-
# 5. Verifica que los estilos tienen equivalente en el proyecto
|
|
117
|
-
mapear_estilos({ file_key: "ABCDEF123456", node_id: "123:456", project_root: "/mi/proyecto" })
|
|
118
|
-
|
|
119
|
-
# 6. Genera el código adaptado
|
|
120
|
-
generar_componente({ file_key: "ABCDEF123456", node_id: "123:456", project_root: "/mi/proyecto" })
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Stacks soportados
|
|
124
|
-
|
|
125
|
-
| Framework | CSS | Estado |
|
|
126
|
-
|---|---|---|
|
|
127
|
-
| React / Next.js | Tailwind CSS | ✅ Completo |
|
|
128
|
-
| React / Next.js | CSS Modules | ✅ Completo |
|
|
129
|
-
| Vue 3 | Tailwind / Scoped CSS | ✅ Completo |
|
|
130
|
-
| React / Next.js | styled-components | ⚠️ Parcial (genera CSS Module) |
|
|
131
|
-
| Angular | Cualquiera | ⚠️ Genera React, ajusta manualmente |
|
|
132
|
-
| Svelte | Cualquiera | 🔜 En roadmap |
|
|
133
|
-
|
|
134
|
-
## Variables de entorno
|
|
135
|
-
|
|
136
|
-
| Variable | Requerida | Descripción |
|
|
137
|
-
|---|---|---|
|
|
138
|
-
| `FIGMA_PAT` | Sí | Personal Access Token de Figma |
|
|
139
|
-
|
|
140
|
-
## Estructura del proyecto
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
mcp-figma/
|
|
144
|
-
├── src/
|
|
145
|
-
│ ├── index.js ← Servidor MCP + definición de tools
|
|
146
|
-
│ ├── mcp.js ← Protocolo JSON-RPC 2.0 sobre stdio (sin deps)
|
|
147
|
-
│ ├── figma-client.js ← Cliente HTTP de la API de Figma
|
|
148
|
-
│ ├── design-system-analyzer.js ← Análisis del sistema de diseño local
|
|
149
|
-
│ ├── style-mapper.js ← Mapeo de estilos Figma ↔ tokens locales
|
|
150
|
-
│ └── component-generator.js ← Generación de código por framework
|
|
151
|
-
└── package.json ← Cero dependencias — solo descriptor
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Limitaciones conocidas
|
|
155
|
-
|
|
156
|
-
- La detección de tokens en Tailwind usa análisis estático de texto (no ejecuta el módulo), por lo que configs muy dinámicas pueden no detectarse completamente
|
|
157
|
-
- La generación de componentes es un punto de partida — siempre revisa accesibilidad, props faltantes y manejo de estado
|
|
158
|
-
- La API de Figma Variables (tokens del sistema de diseño de Figma) requiere plan Professional o superior
|