sdd-es 2.0.0 → 2.5.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 +21 -45
- package/LICENSE +21 -0
- package/README.md +51 -21
- package/agents/architecture-designer.md +174 -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 +3 -1
- 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 +232 -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 +154 -0
- package/cli/index.js +1 -2
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.compliance.md +516 -0
- package/commands/sdd.configurar.md +33 -0
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +68 -1
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +203 -23
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +70 -1
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.verificar.md +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/FABRICA.md +164 -115
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +237 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +5 -3
- 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/memory-compactor/SKILL.md +114 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +154 -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/.claude-plugin/marketplace.json +0 -31
- package/.claude-plugin/plugin.json +0 -97
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/docs/EJEMPLOS.md +0 -212
- /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
|
@@ -42,11 +42,94 @@ cat .sdd/memoria/constitucion.md
|
|
|
42
42
|
| `fase A` | **Por fase**: solo las tareas de la Fase A |
|
|
43
43
|
| `revisar` | **Revisión**: invocar revisor sobre tareas completadas |
|
|
44
44
|
|
|
45
|
-
## PASO 3 —
|
|
45
|
+
## PASO 3 — Gate Humano (aprobación antes de ejecutar)
|
|
46
|
+
|
|
47
|
+
Antes de tocar cualquier archivo, muestra este resumen al usuario y espera confirmación:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
51
|
+
🏗️ PLAN DE IMPLEMENTACIÓN — {SPEC_ID}
|
|
52
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
53
|
+
|
|
54
|
+
📋 Tareas en cola: [N] tareas
|
|
55
|
+
🤖 Agentes que activarán: [lista única de agentes]
|
|
56
|
+
📁 Archivos a modificar: [lista de rutas, deducida de tareas.md]
|
|
57
|
+
⏱️ Tiempo estimado: [S: <15min / M: 15-45min / L: >45min]
|
|
58
|
+
💡 Modo de ejecución: [PTC paralelo / Secuencial]
|
|
59
|
+
|
|
60
|
+
⚡ Nivel de esfuerzo recomendado: [según agentes activos]
|
|
61
|
+
• Si hay agentes OPUS (arquitecto/critico/seguridad/asesor-datos):
|
|
62
|
+
Escribe `/effort xhigh` en Claude Code antes de responder sí.
|
|
63
|
+
• Si solo hay agentes SONNET: `/effort medium` (o el default está bien)
|
|
64
|
+
• Si solo hay agentes HAIKU: `/effort low`
|
|
65
|
+
Puedes ignorar esto si ya lo configuraste o si prefieres el default.
|
|
66
|
+
|
|
67
|
+
¿Procedo con la implementación?
|
|
68
|
+
→ Responde **sí** para comenzar
|
|
69
|
+
→ Responde **editar** para ajustar tareas antes
|
|
70
|
+
→ Responde **cancelar** para salir
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Bypass automático** (no pide confirmación) cuando:
|
|
74
|
+
- La variable de entorno `SDD_AUTO=1` está definida
|
|
75
|
+
- El argumento incluye la palabra `forzar` (ej: `/sdd.implementar forzar`)
|
|
76
|
+
- El modo es `continuar` (ya hubo confirmación previa)
|
|
77
|
+
|
|
78
|
+
Si el usuario responde `editar` → detente y ofrece abrir `tareas.md` con un editor.
|
|
79
|
+
Si responde `cancelar` → detente con mensaje: "Implementación cancelada. Cuando quieras continuar: `/sdd.implementar`"
|
|
80
|
+
|
|
81
|
+
## PASO 3.5 — Crear TODO list para visualización
|
|
46
82
|
|
|
47
83
|
Usa `TodoWrite` para mostrar el progreso en tiempo real al usuario. Crea un TODO por tarea pendiente.
|
|
48
84
|
|
|
49
|
-
## PASO
|
|
85
|
+
## PASO 4 — Model routing (asignación de modelo por agente)
|
|
86
|
+
|
|
87
|
+
Antes de despachar cada agente, aplica esta tabla de routing. El modelo correcto se inyecta en el prompt del agente:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
ROUTING DE MODELOS:
|
|
91
|
+
|
|
92
|
+
Grupo OPUS (decisiones de alto impacto, razonamiento extendido):
|
|
93
|
+
→ arquitecto, critico, seguridad, asesor-datos
|
|
94
|
+
→ Modelo: claude-opus-4-8
|
|
95
|
+
|
|
96
|
+
Grupo SONNET (implementación estándar, análisis medio):
|
|
97
|
+
→ desarrollador-backend, desarrollador-frontend, tester
|
|
98
|
+
→ desarrollador-mobile, operaciones, disenador-api, revisor
|
|
99
|
+
→ Modelo: claude-sonnet-4-6
|
|
100
|
+
|
|
101
|
+
Grupo HAIKU (búsqueda, resumen, tareas de baja complejidad):
|
|
102
|
+
→ investigador, documentador
|
|
103
|
+
→ Modelo: claude-haiku-4-5-20251001
|
|
104
|
+
|
|
105
|
+
Override: si userConfig.modelo_principal está definido en plugin.json,
|
|
106
|
+
aplícalo solo al Grupo OPUS (respeta preferencia del usuario para
|
|
107
|
+
decisiones críticas sin afectar el costo de tareas rutinarias).
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## PASO 4.5 — Planificación PTC (Programmatic Tool Calling) + revisión paralela
|
|
111
|
+
|
|
112
|
+
Antes de ejecutar, clasifica las tareas seleccionadas según la skill `orquestacion-ptc`.
|
|
113
|
+
|
|
114
|
+
**Revisión paralela post-implementación (B3):** Al terminar todas las tareas de implementación, si la spec toca áreas sensibles (auth, datos, APIs externas, seguridad), despacha revisor + crítico + seguridad en paralelo con PTC — los tres reciben el mismo diff y sus reportes se agregan en el reporte final. Esto es más barato que invocarlos secuencialmente.
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// PTC revisión paralela (solo si la spec toca áreas sensibles)
|
|
118
|
+
const revisores = [
|
|
119
|
+
{ agente: "revisor", prompt: promptRevision(diff, spec, plan) },
|
|
120
|
+
{ agente: "critico", prompt: promptCritico(diff, spec, plan) },
|
|
121
|
+
{ agente: "seguridad", prompt: promptSeguridad(diff, spec) },
|
|
122
|
+
];
|
|
123
|
+
const reportes = await Promise.all(
|
|
124
|
+
revisores.map(r => Task(r.agente, r.prompt))
|
|
125
|
+
);
|
|
126
|
+
// Agregar solo veredictos + hallazgos bloqueantes
|
|
127
|
+
return reportes.map((r, i) => ({
|
|
128
|
+
agente: revisores[i].agente,
|
|
129
|
+
veredicto: r.veredicto, // APROBADO | OBSERVACIONES | RECHAZADO
|
|
130
|
+
bloqueantes: r.bloqueantes, // array de strings, vacío si no hay
|
|
131
|
+
}));
|
|
132
|
+
```
|
|
50
133
|
|
|
51
134
|
Antes de ejecutar, clasifica las tareas seleccionadas según la skill `orquestacion-ptc`:
|
|
52
135
|
|
|
@@ -95,11 +178,11 @@ Tras el bloque PTC, **procesa las tareas del siguiente nivel del grafo** de form
|
|
|
95
178
|
|
|
96
179
|
---
|
|
97
180
|
|
|
98
|
-
## PASO
|
|
181
|
+
## PASO 5 — Ciclo por tarea
|
|
99
182
|
|
|
100
183
|
Para CADA tarea seleccionada, ejecuta este ciclo:
|
|
101
184
|
|
|
102
|
-
###
|
|
185
|
+
### 5.1 — Verificar precondiciones
|
|
103
186
|
|
|
104
187
|
```bash
|
|
105
188
|
# La tarea no debe estar completada/bloqueada
|
|
@@ -109,7 +192,7 @@ Para CADA tarea seleccionada, ejecuta este ciclo:
|
|
|
109
192
|
Si una dependencia no está completa:
|
|
110
193
|
> ⏸️ T00X depende de T00Y (no completada). Cambio el orden y ejecuto T00Y primero.
|
|
111
194
|
|
|
112
|
-
###
|
|
195
|
+
### 5.2 — Anunciar inicio
|
|
113
196
|
|
|
114
197
|
```
|
|
115
198
|
🔧 T00X — [Nombre]
|
|
@@ -121,13 +204,13 @@ Si una dependencia no está completa:
|
|
|
121
204
|
|
|
122
205
|
Marca la tarea como `en_progreso` en `.estado-tareas.json` y actualiza el TodoWrite.
|
|
123
206
|
|
|
124
|
-
###
|
|
207
|
+
### 5.3 — Hook por tarea (opcional)
|
|
125
208
|
|
|
126
209
|
```bash
|
|
127
210
|
[ -f ".sdd/hooks/antes_cada_tarea.sh" ] && bash .sdd/hooks/antes_cada_tarea.sh "$TAREA_ID"
|
|
128
211
|
```
|
|
129
212
|
|
|
130
|
-
###
|
|
213
|
+
### 5.4 — Activar MCP de Figma si la tarea es de UI/frontend
|
|
131
214
|
|
|
132
215
|
**Antes de delegar al agente frontend**, verifica si la tarea es de tipo UI:
|
|
133
216
|
|
|
@@ -154,7 +237,7 @@ SI el agente NO es frontend → salta este paso
|
|
|
154
237
|
|
|
155
238
|
> **Sin PAT / sin Figma:** Si `FIGMA_PAT` no está definido o la conexión falla, continúa sin el MCP — no bloquea la implementación.
|
|
156
239
|
|
|
157
|
-
###
|
|
240
|
+
### 5.5 — Constitutional AI pre-check
|
|
158
241
|
|
|
159
242
|
Antes de delegar al agente, extrae las restricciones de constitución relevantes para la tarea:
|
|
160
243
|
|
|
@@ -173,7 +256,7 @@ esac
|
|
|
173
256
|
|
|
174
257
|
Inyecta el resultado en el contexto del agente como **restricciones explícitas**, no como contexto de fondo.
|
|
175
258
|
|
|
176
|
-
###
|
|
259
|
+
### 5.6 — Delegar al agente
|
|
177
260
|
|
|
178
261
|
Usa la herramienta `Task` para invocar al agente asignado. El agente recibe:
|
|
179
262
|
|
|
@@ -194,7 +277,7 @@ El agente debe:
|
|
|
194
277
|
6. Devolver lista de archivos modificados
|
|
195
278
|
7. **NUNCA modificar `package.json` ni instalar paquetes** salvo que la spec lo indique de forma explícita — usar exclusivamente las dependencias ya presentes en el proyecto
|
|
196
279
|
|
|
197
|
-
###
|
|
280
|
+
### 5.7 — Checkpoint de salida + Evaluator-Optimizer
|
|
198
281
|
|
|
199
282
|
Antes de marcar la tarea como completada, verifica en dos niveles:
|
|
200
283
|
|
|
@@ -219,6 +302,35 @@ Antes de marcar la tarea como completada, verifica en dos niveles:
|
|
|
219
302
|
# Python: python -m pytest [directorio_afectado] -q
|
|
220
303
|
```
|
|
221
304
|
|
|
305
|
+
**Nivel 4 — Evaluator-Optimizer (solo para agentes del Grupo OPUS: arquitecto, critico, seguridad, asesor-datos)**
|
|
306
|
+
|
|
307
|
+
Si el agente de la tarea es del Grupo OPUS, activa el ciclo Evaluador-Optimizador:
|
|
308
|
+
|
|
309
|
+
```
|
|
310
|
+
CICLO EVALUADOR-OPTIMIZADOR (máx. 3 iteraciones):
|
|
311
|
+
|
|
312
|
+
1. El agente implementador entrega su output (iteración actual)
|
|
313
|
+
|
|
314
|
+
2. El agente REVISOR evalúa el output contra los CAs de la tarea:
|
|
315
|
+
- Puntúa cada CA de 0 a 10
|
|
316
|
+
- Score final = promedio
|
|
317
|
+
- Umbral de aprobación: 8/10
|
|
318
|
+
|
|
319
|
+
3. Si score ≥ 8 → PASA directamente (el output es aceptable)
|
|
320
|
+
|
|
321
|
+
4. Si score < 8 e iteraciones < 3:
|
|
322
|
+
- El revisor devuelve feedback específico al agente implementador
|
|
323
|
+
- El agente implementador mejora el output incorporando el feedback
|
|
324
|
+
- Repetir desde paso 2
|
|
325
|
+
|
|
326
|
+
5. Si score < 8 tras la 3ª iteración:
|
|
327
|
+
→ FALLA con reporte detallado (score, CAs que no pasan, razón)
|
|
328
|
+
→ No se hacen más intentos automáticos
|
|
329
|
+
|
|
330
|
+
Importante: el ciclo NO se aplica a agentes del Grupo SONNET ni HAIKU
|
|
331
|
+
para evitar consumo excesivo de tokens en tareas rutinarias.
|
|
332
|
+
```
|
|
333
|
+
|
|
222
334
|
Si cualquier nivel falla:
|
|
223
335
|
1. Marca como `bloqueada` con descripción del fallo
|
|
224
336
|
2. **NO continúa con tareas dependientes**
|
|
@@ -230,7 +342,7 @@ Si cualquier nivel falla:
|
|
|
230
342
|
> b) Saltar y continuar (no recomendado)
|
|
231
343
|
> c) Detener y revisar manualmente
|
|
232
344
|
|
|
233
|
-
###
|
|
345
|
+
### 5.8 — Actualizar estado
|
|
234
346
|
|
|
235
347
|
```bash
|
|
236
348
|
# .estado-tareas.json: T00X → completada
|
|
@@ -238,13 +350,13 @@ Si cualquier nivel falla:
|
|
|
238
350
|
# .sdd/estado.json: ultima_actualizacion
|
|
239
351
|
```
|
|
240
352
|
|
|
241
|
-
###
|
|
353
|
+
### 5.9 — Hook post-tarea (opcional)
|
|
242
354
|
|
|
243
355
|
```bash
|
|
244
356
|
[ -f ".sdd/hooks/despues_cada_tarea.sh" ] && bash .sdd/hooks/despues_cada_tarea.sh "$TAREA_ID"
|
|
245
357
|
```
|
|
246
358
|
|
|
247
|
-
###
|
|
359
|
+
### 5.10 — Reportar
|
|
248
360
|
|
|
249
361
|
```
|
|
250
362
|
✅ T00X completada
|
|
@@ -255,13 +367,13 @@ Si cualquier nivel falla:
|
|
|
255
367
|
|
|
256
368
|
## VALIDACIÓN DE SALIDA
|
|
257
369
|
|
|
258
|
-
El checkpoint de salida se aplica por tarea (ver paso
|
|
370
|
+
El checkpoint de salida se aplica por tarea (ver paso 5.7 — cuatro niveles: criterio de tarea, artefactos esperados, no regresión, Evaluator-Optimizer para agentes OPUS). Al final de todas las tareas, la validación global se ejecuta en el PASO 6 mediante el revisor y la suite de tests completa.
|
|
259
371
|
|
|
260
372
|
**Condición de bloqueo**: si cualquier checkpoint individual falla y el usuario no elige continuar explícitamente, la implementación se detiene y no avanza a `/sdd.verificar`.
|
|
261
373
|
|
|
262
|
-
## PASO
|
|
374
|
+
## PASO 6 — Al terminar todas las tareas
|
|
263
375
|
|
|
264
|
-
###
|
|
376
|
+
### 6.1 — Invocar revisor
|
|
265
377
|
|
|
266
378
|
```bash
|
|
267
379
|
# Usar el agente revisor con modelo de su config (recomendado: opus)
|
|
@@ -272,7 +384,7 @@ El revisor cruza el código generado contra:
|
|
|
272
384
|
- Las decisiones del plan
|
|
273
385
|
- Los principios de la constitución
|
|
274
386
|
|
|
275
|
-
###
|
|
387
|
+
### 6.2 — Invocar tester para correr toda la suite
|
|
276
388
|
|
|
277
389
|
```bash
|
|
278
390
|
# Detectar framework de tests automáticamente y correr
|
|
@@ -284,11 +396,11 @@ npm test 2>/dev/null || pnpm test 2>/dev/null || yarn test 2>/dev/null || \
|
|
|
284
396
|
echo "NO_FRAMEWORK_DETECTADO"
|
|
285
397
|
```
|
|
286
398
|
|
|
287
|
-
###
|
|
399
|
+
### 6.3 — Invocar seguridad (si la tarea tocaba área sensible)
|
|
288
400
|
|
|
289
401
|
Auditoría automática si la implementación tocó: autenticación, manejo de datos personales, queries dinámicas, APIs externas, manejo de archivos.
|
|
290
402
|
|
|
291
|
-
## PASO
|
|
403
|
+
## PASO 7 — Reporte final exhaustivo
|
|
292
404
|
|
|
293
405
|
```markdown
|
|
294
406
|
## 📊 Implementación Completada: {ID}
|
|
@@ -342,7 +454,7 @@ Cubre: {Lista de CAs}
|
|
|
342
454
|
```
|
|
343
455
|
```
|
|
344
456
|
|
|
345
|
-
## PASO
|
|
457
|
+
## PASO 8 — Actualizar estado global
|
|
346
458
|
|
|
347
459
|
```json
|
|
348
460
|
{
|
|
@@ -356,13 +468,81 @@ Cubre: {Lista de CAs}
|
|
|
356
468
|
}
|
|
357
469
|
```
|
|
358
470
|
|
|
359
|
-
## PASO
|
|
471
|
+
## PASO 9 — Hook post-ejecución
|
|
360
472
|
|
|
361
473
|
```bash
|
|
362
474
|
[ -f ".sdd/hooks/despues_implementar.sh" ] && bash .sdd/hooks/despues_implementar.sh
|
|
363
475
|
```
|
|
364
476
|
|
|
365
|
-
## PASO
|
|
477
|
+
## PASO 10 — Deploy automático (si está configurado)
|
|
478
|
+
|
|
479
|
+
**Solo si perfil == "guiado" Y vercel configurado:**
|
|
480
|
+
|
|
481
|
+
```bash
|
|
482
|
+
# Verificar si Vercel está configurado
|
|
483
|
+
if grep -q "deploy.platform: vercel" .sdd/sdd.config.yaml; then
|
|
484
|
+
echo ""
|
|
485
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
486
|
+
echo "🚀 DESPLIEGUE AUTOMÁTICO"
|
|
487
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
488
|
+
echo ""
|
|
489
|
+
echo "✅ Tu app está lista para internet."
|
|
490
|
+
echo ""
|
|
491
|
+
echo "CHECKLIST PRE-DEPLOY:"
|
|
492
|
+
echo " ✅ Código construido y verificado"
|
|
493
|
+
echo " ✅ Tests pasando"
|
|
494
|
+
echo " ✅ Sin secretos en el código"
|
|
495
|
+
echo ""
|
|
496
|
+
echo "¿Publico tu app en internet?"
|
|
497
|
+
echo "(Responde: sí / cambio algo / después)"
|
|
498
|
+
echo ""
|
|
499
|
+
|
|
500
|
+
read -p "Tu respuesta: " DEPLOY_CHOICE
|
|
501
|
+
|
|
502
|
+
if [ "$DEPLOY_CHOICE" = "sí" ]; then
|
|
503
|
+
echo ""
|
|
504
|
+
echo "⏳ Publicando en Vercel..."
|
|
505
|
+
echo ""
|
|
506
|
+
|
|
507
|
+
# Invocar skill vercel-deploy
|
|
508
|
+
bash "$(dirname "$0")/../skills/vercel-deploy/vercel-deploy.sh" \
|
|
509
|
+
--spec-id "$SPEC_ID" \
|
|
510
|
+
--profile "guiado"
|
|
511
|
+
|
|
512
|
+
if [ $? -eq 0 ]; then
|
|
513
|
+
echo ""
|
|
514
|
+
echo "✅ ¡Tu app está en internet!"
|
|
515
|
+
echo ""
|
|
516
|
+
# Leer URL del archivo de estado de Vercel
|
|
517
|
+
VERCEL_URL=$(grep "app_url" .sdd/.vercel-deploy.json 2>/dev/null | cut -d'"' -f4)
|
|
518
|
+
if [ -n "$VERCEL_URL" ]; then
|
|
519
|
+
echo " Acceso: $VERCEL_URL"
|
|
520
|
+
echo ""
|
|
521
|
+
echo "Puedes compartir este link con quien quieras."
|
|
522
|
+
fi
|
|
523
|
+
else
|
|
524
|
+
echo ""
|
|
525
|
+
echo "⚠️ Hubo un problema publicando."
|
|
526
|
+
echo ""
|
|
527
|
+
echo "Opciones:"
|
|
528
|
+
echo " 1. Reintentar: /sdd.desplegar"
|
|
529
|
+
echo " 2. Cambiar algo: edita y ejecuta /sdd.implementar continuar"
|
|
530
|
+
echo " 3. Dejar para después: los cambios están en GitHub"
|
|
531
|
+
fi
|
|
532
|
+
elif [ "$DEPLOY_CHOICE" = "cambio algo" ]; then
|
|
533
|
+
echo ""
|
|
534
|
+
echo "✅ Esos cambios se guardarán automáticamente."
|
|
535
|
+
echo "Cuando estés listo, ejecuta: /sdd.implementar continuar"
|
|
536
|
+
else
|
|
537
|
+
echo ""
|
|
538
|
+
echo "✅ Sin problema. Cuando quieras publicar, ejecuta: /sdd.desplegar"
|
|
539
|
+
fi
|
|
540
|
+
fi
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
## PASO 11 — Siguientes pasos
|
|
366
546
|
|
|
367
547
|
```
|
|
368
548
|
🎉 Implementación terminada
|
|
@@ -370,7 +550,7 @@ Cubre: {Lista de CAs}
|
|
|
370
550
|
SIGUIENTES PASOS RECOMENDADOS:
|
|
371
551
|
/sdd.verificar — verificación final contra spec original
|
|
372
552
|
/sdd.snapshot — actualizar SNAPSHOT.md del producto
|
|
373
|
-
|
|
553
|
+
/sdd.retro — retrospectiva: qué aprendimos
|
|
374
554
|
|
|
375
555
|
¿Quieres empezar otra feature?
|
|
376
556
|
/sdd.especificar [descripción]
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Punto de entrada de FORGE. Convierte una idea en texto libre a un IR JSON validado. Orquesta discovery + interpreter + validación. Primer comando para cualquier proyecto nuevo.
|
|
3
|
+
allowed-tools: Read, Write, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.interpretar — Entrada a FORGE
|
|
7
|
+
|
|
8
|
+
**Uso:**
|
|
9
|
+
```
|
|
10
|
+
/sdd.interpretar [idea en texto libre]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Ejemplos:**
|
|
14
|
+
```
|
|
15
|
+
/sdd.interpretar Quiero una app para que mis clientes reserven citas
|
|
16
|
+
/sdd.interpretar Necesito algo para organizar los pedidos de mi restaurante
|
|
17
|
+
/sdd.interpretar Plataforma de cursos online con pagos y certificados
|
|
18
|
+
/sdd.interpretar confirmar
|
|
19
|
+
/sdd.interpretar corregir "es para múltiples negocios, no solo uno"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## PASO 1 — Detectar modo de invocación
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
ARGS="$*"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Detecta el caso:
|
|
31
|
+
|
|
32
|
+
| Argumento | Modo |
|
|
33
|
+
|-----------|------|
|
|
34
|
+
| `confirmar` o `sí` | Confirmar IR pendiente → guardar |
|
|
35
|
+
| `corregir [qué]` | Corregir campo del IR pendiente |
|
|
36
|
+
| `ver` | Mostrar IR actual en `.sdd/ir.json` |
|
|
37
|
+
| `[texto libre]` | Nueva idea → flujo completo |
|
|
38
|
+
| *(vacío)* | Pedir que escriba su idea |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## PASO 2 — Si es texto libre: flujo completo
|
|
43
|
+
|
|
44
|
+
### 2.1 — Verificar si hay IR anterior
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
if [ -f ".sdd/ir.json" ]; then
|
|
48
|
+
echo "HAY_IR_ANTERIOR"
|
|
49
|
+
cat .sdd/ir.json | grep '"name"' | head -1
|
|
50
|
+
fi
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Si hay IR anterior, pregunta:
|
|
54
|
+
```
|
|
55
|
+
Ya tienes un proyecto en curso: [product.name]
|
|
56
|
+
|
|
57
|
+
¿Qué quieres hacer?
|
|
58
|
+
1) Continuar con ese proyecto → escribe /sdd.diseñar
|
|
59
|
+
2) Actualizar la idea de ese proyecto → escribe /sdd.interpretar corregir [qué]
|
|
60
|
+
3) Empezar un proyecto nuevo → escribe /sdd.interpretar nuevo [idea]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Si no hay IR anterior, continúa.
|
|
64
|
+
|
|
65
|
+
### 2.2 — Crear carpeta .sdd/
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
mkdir -p .sdd
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2.3 — Invocar skill `descubrir-idea`
|
|
72
|
+
|
|
73
|
+
Activa la skill de discovery. La skill hace las 5 preguntas y guarda `.sdd/descubrimiento.md`.
|
|
74
|
+
|
|
75
|
+
Después de que el usuario responda las 5 preguntas, continúa al paso 2.4.
|
|
76
|
+
|
|
77
|
+
### 2.4 — Invocar skill `interpretar-idea`
|
|
78
|
+
|
|
79
|
+
Activa la skill con la idea original del usuario + contexto de `.sdd/descubrimiento.md`.
|
|
80
|
+
|
|
81
|
+
La skill genera el IR JSON en 2 fases (razonamiento libre + extracción JSON) y lo muestra al usuario.
|
|
82
|
+
|
|
83
|
+
**Si la skill requiere clarificación** (`confidence < 0.7`): el usuario responde la pregunta, y la skill re-genera el IR. Luego continúa.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## PASO 3 — Si es `confirmar` o `sí`
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Verificar que hay un IR pendiente de confirmar
|
|
91
|
+
if [ ! -f ".sdd/ir-pendiente.json" ] && [ ! -f ".sdd/ir.json" ]; then
|
|
92
|
+
echo "No hay ningún IR pendiente. Escribe tu idea primero:"
|
|
93
|
+
echo " /sdd.interpretar [tu idea]"
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Guarda el IR:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cp .sdd/ir-pendiente.json .sdd/ir.json 2>/dev/null || true
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Actualiza `.sdd/estado.json`:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Leer estado actual o crear si no existe
|
|
108
|
+
if [ -f ".sdd/estado.json" ]; then
|
|
109
|
+
# Agregar campo ir_generado: true
|
|
110
|
+
node -e "
|
|
111
|
+
const fs = require('fs');
|
|
112
|
+
const estado = JSON.parse(fs.readFileSync('.sdd/estado.json', 'utf8'));
|
|
113
|
+
estado.ir_generado = true;
|
|
114
|
+
estado.ir_id = JSON.parse(fs.readFileSync('.sdd/ir.json', 'utf8')).id;
|
|
115
|
+
estado.ultima_actualizacion = new Date().toISOString();
|
|
116
|
+
fs.writeFileSync('.sdd/estado.json', JSON.stringify(estado, null, 2));
|
|
117
|
+
" 2>/dev/null || echo "{ \"ir_generado\": true, \"ultima_actualizacion\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" }" > .sdd/estado.json
|
|
118
|
+
fi
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Muestra confirmación y siguiente paso:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
✅ IR guardado en .sdd/ir.json
|
|
125
|
+
|
|
126
|
+
Siguiente paso → Diseño de pantallas y arquitectura:
|
|
127
|
+
/sdd.diseñar
|
|
128
|
+
|
|
129
|
+
O si quieres ir directo al código (diseño automático):
|
|
130
|
+
/sdd.construir
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## PASO 4 — Si es `corregir [qué]`
|
|
136
|
+
|
|
137
|
+
Extrae la corrección del argumento. Por ejemplo:
|
|
138
|
+
- `/sdd.interpretar corregir "es para múltiples negocios"` → actualizar `product.target_users` y/o `assumptions`
|
|
139
|
+
|
|
140
|
+
Lee el IR actual:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
cat .sdd/ir.json 2>/dev/null || cat .sdd/ir-pendiente.json 2>/dev/null
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Aplica la corrección al campo correspondiente del IR. Re-valida. Muestra el IR actualizado y pide confirmación de nuevo.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## PASO 5 — Si es `ver`
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
cat .sdd/ir.json 2>/dev/null || echo "No hay IR guardado todavía."
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Muestra el IR en formato legible (igual que la skill `interpretar-idea`).
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## PASO 6 — Si argumento vacío
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
¿Cuál es tu idea?
|
|
164
|
+
|
|
165
|
+
Cuéntamela en una frase o párrafo. No te preocupes por el formato.
|
|
166
|
+
|
|
167
|
+
Ejemplos:
|
|
168
|
+
/sdd.interpretar Quiero una app para gestionar turnos de mi peluquería
|
|
169
|
+
/sdd.interpretar Sistema para que mis empleados registren sus horas de trabajo
|
|
170
|
+
/sdd.interpretar Marketplace de servicios para freelancers
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Estructura de archivos generados
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
.sdd/
|
|
179
|
+
descubrimiento.md ← Respuestas del discovery (5 preguntas)
|
|
180
|
+
ir-analysis.md ← Análisis libre de la Fase A del Interpreter
|
|
181
|
+
ir-pendiente.json ← IR generado, esperando confirmación del usuario
|
|
182
|
+
ir.json ← IR confirmado (se crea solo tras "confirmar")
|
|
183
|
+
estado.json ← Estado global del proyecto (ir_generado: true)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Integración con el pipeline
|
|
189
|
+
|
|
190
|
+
Después de `/sdd.interpretar confirmar`:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
/sdd.diseñar → Diseña pantallas, elige dirección visual, genera wireframe
|
|
194
|
+
/sdd.construir → Pipeline completo: diseño + spec + plan + tareas + código
|
|
195
|
+
/sdd.estado → Ver estado actual del proyecto
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Opciones avanzadas
|
|
201
|
+
|
|
202
|
+
### Modo silencioso (sin discovery)
|
|
203
|
+
|
|
204
|
+
Si el usuario ya dio suficiente contexto en la idea:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
/sdd.interpretar --rapido [idea detallada]
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Salta el discovery y va directo al Interpreter.
|
|
211
|
+
|
|
212
|
+
### Actualizar proyecto existente
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
/sdd.interpretar actualizar "quiero agregar pagos en línea"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
1. Lee IR actual
|
|
219
|
+
2. Interpreta el cambio
|
|
220
|
+
3. Fusiona (agrega feature, actualiza assumptions)
|
|
221
|
+
4. Re-valida y pide confirmación
|
|
222
|
+
|
|
223
|
+
### Nuevo proyecto (ignorar IR anterior)
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
/sdd.interpretar nuevo [idea]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Archiva el IR anterior en `.sdd/ir-anterior-[timestamp].json` y empieza desde cero.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Notas de implementación
|
|
234
|
+
|
|
235
|
+
- Este comando es el **único punto de entrada** para usuarios no técnicos
|
|
236
|
+
- El IR es la **fuente de verdad** del proyecto — todo lo demás se deriva de él
|
|
237
|
+
- La skill `descubrir-idea` y la skill `interpretar-idea` son los módulos reales — este comando las orquesta
|
|
238
|
+
- Si el usuario dice "sí" o "confirmar" en cualquier momento durante el flujo, se guarda el IR actual
|
|
239
|
+
- El modelo **nunca inventa** datos del usuario — todo en `assumptions[]` debe ser explícito
|
package/commands/sdd.md
CHANGED
|
@@ -20,6 +20,24 @@ else
|
|
|
20
20
|
fi
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
## PASO 1.2 — Detectar modo de output
|
|
24
|
+
|
|
25
|
+
Si el argumento del comando contiene un modo de output (`pm`, `arq`, `dev`), actívalo globalmente para esta sesión:
|
|
26
|
+
|
|
27
|
+
| Argumento | Modo | Descripción |
|
|
28
|
+
|-----------|------|-------------|
|
|
29
|
+
| `pm` o `producto` | **Product Manager** | Lenguaje de negocio, sin código, bullets ejecutivos. Oculta detalles técnicos. |
|
|
30
|
+
| `arq` o `arquitectura` | **Arquitecto** | Diagramas, decisiones técnicas, trade-offs. Para revisiones de diseño. |
|
|
31
|
+
| `dev` o `desarrollo` | **Desarrollador** | Código, diffs, comandos. Modo por defecto. |
|
|
32
|
+
|
|
33
|
+
Ejemplos:
|
|
34
|
+
- `/sdd.estado pm` → dashboard en lenguaje de negocio
|
|
35
|
+
- `/sdd.verificar arq` → reporte técnico con diagramas
|
|
36
|
+
- `/sdd.analizar dev` → análisis con código y rutas de archivo
|
|
37
|
+
|
|
38
|
+
El modo se guarda en `MODO_OUTPUT` y lo usan todos los comandos que producen reportes.
|
|
39
|
+
Si no se especifica, usa `dev` (comportamiento actual).
|
|
40
|
+
|
|
23
41
|
## PASO 1.5 — Detectar el perfil y ajustar el modo de conducción
|
|
24
42
|
|
|
25
43
|
Lee el perfil desde el estado o la configuración:
|
|
@@ -48,6 +66,11 @@ El usuario invocó este comando con argumentos en lenguaje natural. Mapea su int
|
|
|
48
66
|
|
|
49
67
|
| Intención del usuario | Comando a ejecutar |
|
|
50
68
|
|----------------------|--------------------|
|
|
69
|
+
| "tengo una idea", "quiero crear", "quiero construir X desde cero", "dame una app de X" | `/sdd.interpretar [idea]` |
|
|
70
|
+
| "interpreta mi idea", "analiza lo que quiero hacer" | `/sdd.interpretar` |
|
|
71
|
+
| "diseña el producto", "elige el estilo", "quiero ver el wireframe" | `/sdd.diseñar` |
|
|
72
|
+
| "construye todo", "haz el código completo", "pipeline completo" | `/sdd.construir` |
|
|
73
|
+
| "exporta el bundle", "empaqueta el proyecto" | `/sdd.exportar` |
|
|
51
74
|
| "quiero inicializar", "configurar el proyecto", "empezar" | `/sdd.constitucion` |
|
|
52
75
|
| "quiero crear una feature", "nueva spec", "voy a hacer X" | `/sdd.especificar [resto]` |
|
|
53
76
|
| "quiero importar una spec externa" | `/sdd.importar [resto]` |
|
|
@@ -75,9 +98,45 @@ El usuario invocó este comando con argumentos en lenguaje natural. Mapea su int
|
|
|
75
98
|
| "crea un MCP", "quiero una herramienta para Claude", "genera un servidor MCP" | `/sdd.crear-mcp [resto]` |
|
|
76
99
|
| "ayuda", "qué puedes hacer" | `/sdd.ayuda` |
|
|
77
100
|
|
|
101
|
+
## PASO 2.5 — Detectar IR sin spec activa (FORGE)
|
|
102
|
+
|
|
103
|
+
Si hay `.sdd/ir.json` pero NO hay spec activa, sugiere el siguiente paso del pipeline de FORGE:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
HAS_IR=$([ -f ".sdd/ir.json" ] && echo "yes" || echo "no")
|
|
107
|
+
HAS_DESIGN=$([ -f ".sdd/product-design.json" ] && echo "yes" || echo "no")
|
|
108
|
+
SPEC_ACTIVA=$(cat .sdd/estado.json 2>/dev/null | grep -o '"spec_activa": *"[^"]*"' | cut -d'"' -f4)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Si `HAS_IR=yes` y sin spec activa:
|
|
112
|
+
|
|
113
|
+
> Ya tienes una idea interpretada: **[product.name]**.
|
|
114
|
+
>
|
|
115
|
+
> ¿Qué quieres hacer?
|
|
116
|
+
> - `/sdd.diseñar` → elegir estilo visual y generar wireframe
|
|
117
|
+
> - `/sdd.construir` → pipeline completo automático (diseño + código)
|
|
118
|
+
> - `/sdd.exportar` → empaquetar lo que hay ahora
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
78
122
|
## PASO 3 — Si no está inicializado
|
|
79
123
|
|
|
80
|
-
Si el proyecto NO está inicializado,
|
|
124
|
+
Si el proyecto NO está inicializado, primero verifica si la intención del usuario es FORGE (idea → MVP):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
TIENE_IDEA=$(echo "$ARGS" | grep -iE "tengo una idea|quiero crear|quiero construir|quiero una app|necesito|idea" && echo "yes" || echo "no")
|
|
128
|
+
TIENE_INTERPRETAR=$(echo "$ARGS" | grep -iE "interpreta|interpretar" && echo "yes" || echo "no")
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Si la intención es FORGE** (tiene idea, quiere crear algo desde cero):
|
|
132
|
+
|
|
133
|
+
> 👋 Empecemos. No necesitas inicializar nada primero.
|
|
134
|
+
>
|
|
135
|
+
> Cuéntame tu idea y FORGE la convierte en un producto.
|
|
136
|
+
|
|
137
|
+
Llama directamente a `/sdd.interpretar [idea del usuario]`. FORGE crea `.sdd/` automáticamente.
|
|
138
|
+
|
|
139
|
+
**Si la intención NO es FORGE** (quiere usar sdd-lite para una feature de código existente):
|
|
81
140
|
|
|
82
141
|
> 👋 Bienvenido a SDD-ES.
|
|
83
142
|
>
|
|
@@ -87,6 +146,16 @@ Si el proyecto NO está inicializado, no importa qué pidió el usuario — resp
|
|
|
87
146
|
|
|
88
147
|
Luego llama internamente a `/sdd.constitucion`.
|
|
89
148
|
|
|
149
|
+
**Si no hay argumentos** (usuario escribió solo `/sdd` en proyecto no inicializado):
|
|
150
|
+
|
|
151
|
+
> 👋 Bienvenido. ¿Qué quieres hacer?
|
|
152
|
+
>
|
|
153
|
+
> **Tengo una idea y quiero construirla**
|
|
154
|
+
> → `/sdd.interpretar [tu idea]`
|
|
155
|
+
>
|
|
156
|
+
> **Tengo un proyecto de código y quiero especificar features**
|
|
157
|
+
> → `/sdd.constitucion` (configura el proyecto primero)
|
|
158
|
+
|
|
90
159
|
## PASO 4 — Si ya está inicializado pero hay una spec activa incompleta
|
|
91
160
|
|
|
92
161
|
Lee `estado.json` y `.estado-tareas.json` de la spec activa.
|