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
|
@@ -71,28 +71,81 @@ find . -maxdepth 3 -type d \
|
|
|
71
71
|
ls test/ tests/ __tests__/ spec/ 2>/dev/null
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
## PASO 3 — Detectar el perfil del usuario
|
|
74
|
+
## PASO 3 — Detectar el perfil del usuario (AUTO-DETECCIÓN)
|
|
75
75
|
|
|
76
76
|
Antes de recopilar valores, determina el **perfil** con el que se conducirá todo el flujo. Esto cambia el tono y cuánto se le pide al usuario, pero NO cambia el rigor del producto generado.
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
**Lógica de detección automática:**
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
```bash
|
|
81
|
+
# Capturar descripción del usuario (si viene en parámetros o preguntarla)
|
|
82
|
+
USER_INPUT="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
|
|
83
|
+
|
|
84
|
+
# Palabras clave = "guiado" (usuario describe funcionalidad)
|
|
85
|
+
GUIADO_KEYWORDS="app|web|sitio|herramienta|bot|automatización|tienda|lista|formulario|chat|galería|blog|carrito|perfil|dashboard"
|
|
86
|
+
|
|
87
|
+
# Palabras clave = "experto" (usuario menciona tecnología)
|
|
88
|
+
EXPERTO_KEYWORDS="react|vue|angular|typescript|node|python|rust|go|java|fastapi|django|postgres|mysql|mongodb|docker|kubernetes|nextjs|nestjs|express"
|
|
89
|
+
|
|
90
|
+
# Contar coincidencias
|
|
91
|
+
GUIADO_COUNT=$(echo "$USER_INPUT" | grep -io "\(${GUIADO_KEYWORDS}\)" | wc -l)
|
|
92
|
+
EXPERTO_COUNT=$(echo "$USER_INPUT" | grep -io "\(${EXPERTO_KEYWORDS}\)" | wc -l)
|
|
93
|
+
|
|
94
|
+
# Decisión
|
|
95
|
+
if [ $GUIADO_COUNT -gt 0 ] && [ $EXPERTO_COUNT -eq 0 ]; then
|
|
96
|
+
PERFIL="guiado"
|
|
97
|
+
elif [ $EXPERTO_COUNT -gt 0 ] && [ $GUIADO_COUNT -le 1 ]; then
|
|
98
|
+
PERFIL="experto"
|
|
99
|
+
elif [ $EXPERTO_COUNT -gt 0 ] && [ $GUIADO_COUNT -gt 0 ]; then
|
|
100
|
+
# Perfil mixto: preguntar explícitamente
|
|
101
|
+
PERFIL="mixto"
|
|
102
|
+
echo "📋 Veo que tienes ideas técnicas además de funcionales."
|
|
103
|
+
echo "¿Prefieres modo EXPERTO (controlas las decisiones técnicas)"
|
|
104
|
+
echo "o modo GUIADO (yo las decido por ti, solo confirmas pasos)?"
|
|
105
|
+
read PERFIL_CHOICE
|
|
106
|
+
[ "$PERFIL_CHOICE" = "experto" ] && PERFIL="experto" || PERFIL="guiado"
|
|
107
|
+
else
|
|
108
|
+
# Default ante la duda
|
|
109
|
+
PERFIL="guiado"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
echo "✅ PERFIL DETECTADO: $PERFIL"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Ejemplos de detección:**
|
|
83
116
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
117
|
+
| Input usuario | Palabras clave | Perfil |
|
|
118
|
+
|---------------|----------------|--------|
|
|
119
|
+
| "una tienda donde vendo productos" | app, tienda (guiado) | **guiado** |
|
|
120
|
+
| "React + Node + MongoDB" | react, node, mongodb (experto) | **experto** |
|
|
121
|
+
| "app de chat con Python" | app (guiado) + python (experto) | **mixto** → preguntar |
|
|
122
|
+
| "necesito un bot que alertas" | bot (guiado) | **guiado** |
|
|
123
|
+
| "un formulario en Next.js" | formulario (guiado) + nextjs (experto) | **mixto** → preguntar |
|
|
88
124
|
|
|
89
125
|
**En perfil `guiado`:**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
126
|
+
|
|
127
|
+
El stack se **elige automáticamente** según lo que el usuario quiere construir. Aquí está el proceso:
|
|
128
|
+
|
|
129
|
+
1. El usuario describe su idea EN PALABRAS SIMPLES:
|
|
130
|
+
- Ejemplos válidos:
|
|
131
|
+
- "una tienda online donde vendo mis productos artesanales"
|
|
132
|
+
- "una app para que mi equipo de 5 personas coordine tareas diarias"
|
|
133
|
+
- "un bot que me avise cuando alguien menciona mi marca en redes sociales"
|
|
134
|
+
- "una comunidad online donde mis clientes comparten fotos de sus compras"
|
|
135
|
+
|
|
136
|
+
2. Recomendarás el stack AUTOMÁTICAMENTE sin que el usuario tenga que elegir. Usa estos defaults sensatos:
|
|
137
|
+
- "app web" / "página" / "sitio" → Node + Vite + SQLite
|
|
138
|
+
- "API" / "backend" / "servicio" → Node + Express + SQLite
|
|
139
|
+
- "bot" / "automatización" / "script" → Python
|
|
140
|
+
- "herramienta para Claude / asistente / integración" → servidor MCP en Node (ver `/sdd.crear-mcp`)
|
|
141
|
+
- Si no encaja exactamente, elige el más simple que cumpla.
|
|
142
|
+
|
|
143
|
+
3. **Explicar la recomendación en lenguaje simple**, no técnico. Ejemplo:
|
|
144
|
+
- ❌ "Detectado: Node.js + Express + PostgreSQL"
|
|
145
|
+
- ✅ "Para tu tienda online, recomiendo: JavaScript (es el lenguaje más accesible para empezar), SQLite para guardar productos y pedidos (es gratis, confiable y no necesita instalar nada extra), y Node.js en el servidor (es lo más rápido para tener algo funcionando)."
|
|
146
|
+
|
|
147
|
+
4. Preguntar de forma amigable: "¿Te parece bien? ¿Hay algo que quieras cambiar?"
|
|
148
|
+
|
|
96
149
|
- Activa la skill `modo-guiado` para el resto de la conversación (lenguaje sin jerga, confirmar antes de actuar, nunca pedir que edite archivos a mano).
|
|
97
150
|
|
|
98
151
|
**En perfil `experto`:** sigue el flujo técnico normal (el usuario define o confirma el stack).
|
|
@@ -106,11 +159,11 @@ Si la constitución **NO existe**, conduce una conversación corta y eficiente.
|
|
|
106
159
|
Preguntas obligatorias (haz una a la vez, o agrupadas):
|
|
107
160
|
|
|
108
161
|
1. **Propósito**: ¿Cuál es el propósito del proyecto en 1-2 frases?
|
|
109
|
-
2. **Audiencia**: ¿Quién
|
|
162
|
+
2. **Audiencia**: ¿Quién usa esto? (equipo interno, clientes, otros desarrolladores, etc.)
|
|
110
163
|
3. **No-negociables**: ¿Qué estándares son innegociables? (tests obligatorios, sin warnings, tipado estricto, etc.)
|
|
111
164
|
4. **Restricciones**: ¿Hay algo que NUNCA hay que hacer en este proyecto? (no agregar dependencias sin justificación, no romper API pública, etc.)
|
|
112
165
|
|
|
113
|
-
> **En perfil `guiado`**, NO hagas las preguntas 3 y 4 con jerga técnica. En su lugar fija defaults profesionales por debajo (tests obligatorios, lint estricto, sin secretos en el código) y solo confirma el propósito y para quién es. Aplicas los estándares altos sin cargarle la decisión al usuario.
|
|
166
|
+
> **En perfil `guiado`**, NO hagas las preguntas 3 y 4 con jerga técnica. En su lugar fija defaults profesionales por debajo (tests obligatorios, lint estricto, sin secretos en el código) y solo confirma el propósito y para quién es. Aplicas los estándares altos sin cargarle la decisión al usuario. Si dice algo como "no entiendo", "explícame", o "no sé qué significa eso", **pausa inmediatamente**, explica con una analogía simple del mundo real (ve la Regla 7 en `skills/modo-guiado/SKILL.md`), y continúa.
|
|
114
167
|
|
|
115
168
|
Si la constitución **YA existe**, lee los placeholders pendientes y pregunta solo por esos. Determina el tipo de cambio para el versionado:
|
|
116
169
|
|
|
@@ -120,7 +173,129 @@ Si la constitución **YA existe**, lee los placeholders pendientes y pregunta so
|
|
|
120
173
|
|
|
121
174
|
Propón el incremento de versión y muestra el razonamiento.
|
|
122
175
|
|
|
123
|
-
## PASO 4 —
|
|
176
|
+
## PASO 4 — GitHub (solo si perfil == guiado)
|
|
177
|
+
|
|
178
|
+
**Solo en perfil `guiado`**, ofrecer de forma amigable guardar el proyecto en GitHub:
|
|
179
|
+
|
|
180
|
+
> ¿Quieres guardar tu proyecto en GitHub? Es como una nube para el código: gratis, seguro, y todos los desarrolladores lo usan. Si no ahora, puedes hacerlo después.
|
|
181
|
+
|
|
182
|
+
**Si el usuario responde que sí:**
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# PASO 4.1: Explicar token de forma amigable
|
|
186
|
+
echo "✅ Perfecto. Necesito un token de GitHub."
|
|
187
|
+
echo ""
|
|
188
|
+
echo "Es como una contraseña especial que te da permisos sin usar tu contraseña real."
|
|
189
|
+
echo "Te muestro cómo generarlo en 2 pasos muy rápidos:"
|
|
190
|
+
echo ""
|
|
191
|
+
echo "1. Ve a: https://github.com/settings/tokens?type=pat"
|
|
192
|
+
echo "2. Haz clic en 'Generate new token' → escoge 'Fine-grained tokens'"
|
|
193
|
+
echo "3. Dale permiso: 'repo' (acceso completo a repositorio)"
|
|
194
|
+
echo "4. Copia el token y pégalo aquí"
|
|
195
|
+
echo ""
|
|
196
|
+
read -p "Pega tu token: " GITHUB_TOKEN
|
|
197
|
+
|
|
198
|
+
# PASO 4.2: Invocar skill github-connect
|
|
199
|
+
echo "⏳ Creando repositorio en GitHub..."
|
|
200
|
+
|
|
201
|
+
# Guardar token en variable de entorno para la skill
|
|
202
|
+
export GITHUB_TOKEN="$GITHUB_TOKEN"
|
|
203
|
+
|
|
204
|
+
# Invocar skill github-connect (que maneja toda la creación + push)
|
|
205
|
+
bash "$(dirname "$0")/../skills/github-connect/github-connect.sh" \
|
|
206
|
+
--repo-name "$(basename "$(pwd)")" \
|
|
207
|
+
--repo-description "Proyecto SDD-ES: $(cat .sdd/memoria/constitucion.md | head -1)" \
|
|
208
|
+
--profile "guiado"
|
|
209
|
+
|
|
210
|
+
if [ $? -eq 0 ]; then
|
|
211
|
+
# Guardar URL en config
|
|
212
|
+
REPO_URL=$(gh repo view --json url -q .url 2>/dev/null)
|
|
213
|
+
echo "git.remote_url: $REPO_URL" >> .sdd/sdd.config.yaml
|
|
214
|
+
|
|
215
|
+
echo ""
|
|
216
|
+
echo "✅ Tu proyecto está guardado en GitHub:"
|
|
217
|
+
echo " $REPO_URL"
|
|
218
|
+
echo ""
|
|
219
|
+
echo "Desde ahora, cada cambio que hagas se guarda automáticamente allí."
|
|
220
|
+
else
|
|
221
|
+
echo "⚠️ Hubo un problema creando el repositorio."
|
|
222
|
+
echo "Puedes hacerlo después ejecutando:"
|
|
223
|
+
echo " /sdd.github-connect"
|
|
224
|
+
fi
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Si el usuario responde que no:**
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
echo "✅ No hay problema. Podemos hacerlo más tarde cuando lo necesites."
|
|
231
|
+
echo ""
|
|
232
|
+
echo "Si cambias de idea, ejecuta: /sdd.github-connect"
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## PASO 4.5 — Vercel Deploy (solo si perfil == guiado)
|
|
238
|
+
|
|
239
|
+
**Solo en perfil `guiado`**, ofrecer de forma amigable desplegar en Vercel:
|
|
240
|
+
|
|
241
|
+
> ¿Quieres que tu app esté en internet cuando esté lista?
|
|
242
|
+
> Vercel es como un servidor en la nube: gratis hasta cierto límite, y tu app estará accesible desde cualquier lugar.
|
|
243
|
+
|
|
244
|
+
**Si el usuario responde que sí:**
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
echo "✅ Perfecto. Configuraré Vercel para ti."
|
|
248
|
+
echo ""
|
|
249
|
+
echo "Necesito un token de Vercel — es una contraseña especial (igual que GitHub)."
|
|
250
|
+
echo ""
|
|
251
|
+
echo "1. Ve a: https://vercel.com/account/tokens"
|
|
252
|
+
echo "2. Crea un 'Token' nuevo"
|
|
253
|
+
echo "3. Copia y pégalo aquí:"
|
|
254
|
+
echo ""
|
|
255
|
+
read -p "Pega tu token de Vercel: " VERCEL_TOKEN
|
|
256
|
+
|
|
257
|
+
# Guardar configuración
|
|
258
|
+
echo "deploy.platform: vercel" >> .sdd/sdd.config.yaml
|
|
259
|
+
echo "deploy.vercel_token_provided: true" >> .sdd/sdd.config.yaml
|
|
260
|
+
|
|
261
|
+
echo ""
|
|
262
|
+
echo "✅ Vercel está configurado."
|
|
263
|
+
echo "Cuando tu app esté lista, te preguntaré antes de publicarla en internet."
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Si el usuario responde que no:**
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
echo "✅ No hay problema. Puedes publicarla después si quieres."
|
|
270
|
+
echo ""
|
|
271
|
+
echo "Si cambias de idea, ejecuta: /sdd.configurar"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## PASO 5 — Guardar perfil y configuración persistente
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Guardar el perfil detectado en .sdd/sdd.config.yaml
|
|
280
|
+
# para que comandos posteriores lo respeten
|
|
281
|
+
|
|
282
|
+
echo "perfil: $PERFIL" >> .sdd/sdd.config.yaml
|
|
283
|
+
|
|
284
|
+
# Guardar en estado.json también
|
|
285
|
+
cat >> .sdd/estado.json << EOF
|
|
286
|
+
{
|
|
287
|
+
"perfil_detectado": "$PERFIL",
|
|
288
|
+
"constitucion_completada_timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
289
|
+
"constitucion_versión": "1.0.0"
|
|
290
|
+
}
|
|
291
|
+
EOF
|
|
292
|
+
|
|
293
|
+
echo "✅ Configuración guardada."
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## PASO 6 — Generar la constitución
|
|
124
299
|
|
|
125
300
|
Lee la plantilla `plantillas/constitucion.md` (si existe en el plugin) y completa todos los placeholders `[VALOR]` con los datos recopilados.
|
|
126
301
|
|
|
@@ -228,7 +403,7 @@ TODOs diferidos:
|
|
|
228
403
|
- Las decisiones técnicas no triviales se documentan como ADR en `.sdd/arquitectura/`
|
|
229
404
|
```
|
|
230
405
|
|
|
231
|
-
## PASO
|
|
406
|
+
## PASO 6 — Propagación de consistencia
|
|
232
407
|
|
|
233
408
|
Después de actualizar la constitución, revisa estos archivos y actualiza si hay desalineación:
|
|
234
409
|
|
|
@@ -242,7 +417,7 @@ grep -l "[principio_modificado]" commands/*.md 2>/dev/null
|
|
|
242
417
|
|
|
243
418
|
Genera el **Informe de Impacto de Sincronización** y lo prepende a la constitución como comentario HTML (ver plantilla arriba).
|
|
244
419
|
|
|
245
|
-
## PASO
|
|
420
|
+
## PASO 7 — Inicializar resto de estructura SDD
|
|
246
421
|
|
|
247
422
|
```bash
|
|
248
423
|
# Crear archivos índice si no existen
|
|
@@ -277,7 +452,7 @@ EOF
|
|
|
277
452
|
EOF
|
|
278
453
|
```
|
|
279
454
|
|
|
280
|
-
## PASO
|
|
455
|
+
## PASO 7.5 — Persistir el perfil en la configuración
|
|
281
456
|
|
|
282
457
|
Escribe el perfil elegido en `.sdd/sdd.config.yaml`. Si la clave `perfil:` no existe, añádela cerca del inicio del archivo; si existe, actualízala.
|
|
283
458
|
|
|
@@ -292,7 +467,7 @@ fi
|
|
|
292
467
|
|
|
293
468
|
(Reemplaza `[PERFIL]` por `guiado` o `experto`.)
|
|
294
469
|
|
|
295
|
-
## PASO
|
|
470
|
+
## PASO 8 — Actualizar estado global
|
|
296
471
|
|
|
297
472
|
Crea o actualiza `.sdd/estado.json`:
|
|
298
473
|
|
|
@@ -321,7 +496,7 @@ if [ -f ".sdd/hooks/despues_constitucion.sh" ]; then
|
|
|
321
496
|
fi
|
|
322
497
|
```
|
|
323
498
|
|
|
324
|
-
## PASO
|
|
499
|
+
## PASO 9 — Resumen y siguiente paso
|
|
325
500
|
|
|
326
501
|
Muestra:
|
|
327
502
|
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Pipeline completo de FORGE. Si no hay IR, interpreta primero. Si no hay diseño, diseña. Luego mapea spec → planifica → tareas → implementa. Punto de entrada único para convertir una idea en código.
|
|
3
|
+
allowed-tools: Read, Write, Bash, Agent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.construir — Pipeline Completo
|
|
7
|
+
|
|
8
|
+
**Uso:**
|
|
9
|
+
```
|
|
10
|
+
/sdd.construir
|
|
11
|
+
/sdd.construir --desde-spec ← salta directo a planificar (si ya hay spec)
|
|
12
|
+
/sdd.construir --solo-spec ← genera solo la spec, no continúa
|
|
13
|
+
/sdd.construir --forzar ← ignora checkpoints y vuelve a ejecutar todo
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## LÓGICA DE ENTRADA
|
|
19
|
+
|
|
20
|
+
### Verificar estado del proyecto
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
node -e "
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const estado = JSON.parse(fs.existsSync('.sdd/estado.json') ? fs.readFileSync('.sdd/estado.json', 'utf8') : '{}');
|
|
26
|
+
console.log(JSON.stringify({
|
|
27
|
+
tiene_ir: !!estado.ir_generado && fs.existsSync('.sdd/ir.json'),
|
|
28
|
+
tiene_design: !!estado.product_design_aprobado && fs.existsSync('.sdd/product-design.json'),
|
|
29
|
+
tiene_spec: !!estado.spec_activa,
|
|
30
|
+
pipeline_step: estado.pipeline_step || 'inicio'
|
|
31
|
+
}));
|
|
32
|
+
"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Árbol de decisión:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
¿Tiene IR?
|
|
39
|
+
NO → invocar /sdd.interpretar
|
|
40
|
+
[esperar input del usuario]
|
|
41
|
+
[volver a /sdd.construir después]
|
|
42
|
+
|
|
43
|
+
SÍ → ¿Tiene ProductDesign aprobado?
|
|
44
|
+
NO → invocar /sdd.diseñar
|
|
45
|
+
[después continúa automáticamente]
|
|
46
|
+
|
|
47
|
+
SÍ → PASO 1: Mapear IR + Design → Spec draft
|
|
48
|
+
PASO 2: /sdd.especificar (con spec draft como base)
|
|
49
|
+
PASO 3: /sdd.planificar
|
|
50
|
+
PASO 4: /sdd.tareas
|
|
51
|
+
PASO 5: /sdd.implementar
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## PASO 1 — Mapear IR + ProductDesign → Spec Draft
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Verificar que tenemos los inputs
|
|
60
|
+
if [ ! -f ".sdd/ir.json" ] || [ ! -f ".sdd/product-design.json" ]; then
|
|
61
|
+
echo "Error: Falta IR o ProductDesign"
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Ejecutar el mapper
|
|
66
|
+
node sdd-lite/core/ir-to-spec-mapper.js
|
|
67
|
+
|
|
68
|
+
# El mapper genera .sdd/spec-draft.json con:
|
|
69
|
+
# - user_stories[] ← de features.core del IR
|
|
70
|
+
# - functional_requirements[] ← de core_screens del ProductDesign
|
|
71
|
+
# - actors[] ← del IR
|
|
72
|
+
# - non_functional_requirements[]
|
|
73
|
+
# - out_of_scope[]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Mostrar al usuario:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
📋 SPEC DRAFT GENERADA
|
|
80
|
+
─────────────────────────────
|
|
81
|
+
[N] historias de usuario (US-001 a US-00N)
|
|
82
|
+
[M] requerimientos funcionales (RF-001 a RF-00M)
|
|
83
|
+
Actores: [lista]
|
|
84
|
+
|
|
85
|
+
¿Continuar al plan de implementación?
|
|
86
|
+
↵ Enter → continuar
|
|
87
|
+
m → ver spec completa primero
|
|
88
|
+
e → editar spec antes de continuar
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Si `--solo-spec`, terminar aquí y sugerir `/sdd.especificar`.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## PASO 2 — Especificación
|
|
96
|
+
|
|
97
|
+
Invocar `/sdd.especificar` con la spec-draft como base:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# El comando especificar lee .sdd/spec-draft.json si existe
|
|
101
|
+
# y lo usa como punto de partida en lugar de empezar de cero
|
|
102
|
+
/sdd.especificar
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Después de especificar, la spec queda en `.sdd/` en el formato de sdd-lite.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## PASO 3 — Planificar
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
/sdd.planificar
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Genera el plan de implementación basado en la spec.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## PASO 4 — Crear Tareas
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
/sdd.tareas
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Descompone el plan en tareas atómicas implementables.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## PASO 5 — Implementar
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
/sdd.implementar
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Genera el código base según las tareas.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Progreso visual
|
|
140
|
+
|
|
141
|
+
Durante la ejecución, muestra el progreso del pipeline:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
FORGE PIPELINE — [product.name]
|
|
145
|
+
═══════════════════════════════════════
|
|
146
|
+
✅ Idea interpretada (IR v1)
|
|
147
|
+
✅ Diseño aprobado (3 pantallas, stack: React + Node.js + SQLite)
|
|
148
|
+
🔄 Generando spec...
|
|
149
|
+
⭕ Plan pendiente
|
|
150
|
+
⭕ Tareas pendientes
|
|
151
|
+
⭕ Implementación pendiente
|
|
152
|
+
═══════════════════════════════════════
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Actualizar `.sdd/estado.json` después de cada paso:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
node -e "
|
|
159
|
+
const fs = require('fs');
|
|
160
|
+
const e = JSON.parse(fs.readFileSync('.sdd/estado.json', 'utf8') || '{}');
|
|
161
|
+
e.pipeline_step = 'spec'; // o 'plan', 'tasks', 'code', 'done'
|
|
162
|
+
e.ultima_actualizacion = new Date().toISOString();
|
|
163
|
+
fs.writeFileSync('.sdd/estado.json', JSON.stringify(e, null, 2));
|
|
164
|
+
"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Al terminar
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
═══════════════════════════════════════════
|
|
173
|
+
✅ PROYECTO CONSTRUIDO
|
|
174
|
+
═══════════════════════════════════════════
|
|
175
|
+
|
|
176
|
+
[product.name] está listo.
|
|
177
|
+
|
|
178
|
+
Lo que se generó:
|
|
179
|
+
✅ IR → .sdd/ir.json
|
|
180
|
+
✅ Diseño → .sdd/product-design.json
|
|
181
|
+
✅ Wireframe → .sdd/diseño/wireframe-pantalla-principal.html
|
|
182
|
+
✅ Spec → .sdd/[spec].md
|
|
183
|
+
✅ Plan → .sdd/[plan].md
|
|
184
|
+
✅ Tareas → .sdd/[tareas].md
|
|
185
|
+
✅ Código base → [carpeta del proyecto]
|
|
186
|
+
|
|
187
|
+
¿Qué sigue?
|
|
188
|
+
/sdd.implementar → implementar las tareas pendientes
|
|
189
|
+
/sdd.exportar → empaquetar para compartir o desplegar
|
|
190
|
+
/sdd.estado → ver el estado completo del proyecto
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Manejo de errores
|
|
196
|
+
|
|
197
|
+
Si un paso falla:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
⚠️ El paso [nombre] encontró un problema:
|
|
201
|
+
[descripción del error]
|
|
202
|
+
|
|
203
|
+
Opciones:
|
|
204
|
+
r → reintentar el paso
|
|
205
|
+
s → saltar y continuar
|
|
206
|
+
i → inspeccionar manualmente
|
|
207
|
+
q → salir (el progreso está guardado)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
El estado guardado en `estado.json` permite retomar donde se quedó.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Fase de diseño de FORGE. Orquesta direction picker → product-designer → architecture-designer → wireframe-mvp → critica-diseno. Requiere IR previo en .sdd/ir.json.
|
|
3
|
+
allowed-tools: Read, Write, Bash, Agent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.diseñar — Diseño de Producto
|
|
7
|
+
|
|
8
|
+
**Uso:**
|
|
9
|
+
```
|
|
10
|
+
/sdd.diseñar
|
|
11
|
+
/sdd.diseñar confirmar
|
|
12
|
+
/sdd.diseñar cambiar-direccion
|
|
13
|
+
/sdd.diseñar --sin-critica
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## PASO 1 — Verificar IR
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
if [ ! -f ".sdd/ir.json" ]; then
|
|
22
|
+
echo "No hay IR todavía. Primero interpreta tu idea:"
|
|
23
|
+
echo " /sdd.interpretar [tu idea]"
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
cat .sdd/ir.json | node -e "
|
|
28
|
+
const ir = JSON.parse(require('fs').readFileSync('/dev/stdin', 'utf8'));
|
|
29
|
+
console.log('Producto:', ir.product.name);
|
|
30
|
+
console.log('Tipo:', ir.product.type);
|
|
31
|
+
"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Si ya hay un `product-design.json`, pregunta:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
Ya tienes un diseño para [product.name].
|
|
38
|
+
¿Qué quieres hacer?
|
|
39
|
+
1) Ver el diseño actual → /sdd.diseñar ver
|
|
40
|
+
2) Rediseñar (conservar el IR) → /sdd.diseñar rediseñar
|
|
41
|
+
3) Continuar al código → /sdd.construir
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## PASO 2 — Direction Picker
|
|
47
|
+
|
|
48
|
+
Si no hay `design_direction` en `.sdd/estado.json`, invocar la skill `elegir-direccion`:
|
|
49
|
+
|
|
50
|
+
La skill muestra 3 opciones visuales y espera la elección del usuario.
|
|
51
|
+
|
|
52
|
+
Después de elegida, guarda en `.sdd/estado.json`:
|
|
53
|
+
```json
|
|
54
|
+
{ "design_direction": "[direction]", "design_system_path": "{PLUGIN_DIR}/design-systems/[direction]/DESIGN.md" }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Si ya hay dirección elegida, saltarla (a menos que sea `cambiar-direccion`).
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## PASO 3 — Invocar Product Designer
|
|
62
|
+
|
|
63
|
+
Activa el agente `product-designer`.
|
|
64
|
+
|
|
65
|
+
El agente:
|
|
66
|
+
1. Lee `.sdd/ir.json`
|
|
67
|
+
2. Lee `.sdd/estado.json` (dirección y DESIGN.md)
|
|
68
|
+
3. Lee `{PLUGIN_DIR}/craft/anti-ai-slop.md`
|
|
69
|
+
4. Genera el `ProductDesign` JSON
|
|
70
|
+
5. Muestra resumen al usuario
|
|
71
|
+
6. Guarda en `.sdd/product-design.json`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## PASO 4 — Invocar Architecture Designer
|
|
76
|
+
|
|
77
|
+
Activa el agente `architecture-designer`.
|
|
78
|
+
|
|
79
|
+
El agente:
|
|
80
|
+
1. Lee `.sdd/ir.json` + `.sdd/product-design.json`
|
|
81
|
+
2. Propone el stack más simple viable
|
|
82
|
+
3. Muestra resumen en lenguaje natural
|
|
83
|
+
4. Agrega el campo `architecture` a `.sdd/product-design.json`
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## PASO 5 — Generar Wireframe (pantalla P0)
|
|
88
|
+
|
|
89
|
+
Invocar la skill `wireframe-mvp`.
|
|
90
|
+
|
|
91
|
+
La skill:
|
|
92
|
+
1. Lee `.sdd/product-design.json` (pantalla P0)
|
|
93
|
+
2. Lee el DESIGN.md activo
|
|
94
|
+
3. Lee `{PLUGIN_DIR}/craft/anti-ai-slop.md`
|
|
95
|
+
4. Genera el HTML de la pantalla P0
|
|
96
|
+
5. Guarda en `.sdd/diseño/wireframe-pantalla-principal.html` con la tool `Write`
|
|
97
|
+
6. Abre el archivo en el navegador del sistema (`start`/`open`/`xdg-open`)
|
|
98
|
+
|
|
99
|
+
Si se pasa `--sin-critica`, saltar el PASO 6.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## PASO 6 — Crítica y Refinamiento
|
|
104
|
+
|
|
105
|
+
Invocar la skill `critica-diseno`.
|
|
106
|
+
|
|
107
|
+
La skill:
|
|
108
|
+
1. Lee el wireframe generado
|
|
109
|
+
2. Evalúa en 5 dimensiones (score 1–5 cada una)
|
|
110
|
+
3. Si score < 4 y iteraciones < 3: refina el wireframe y re-evalúa
|
|
111
|
+
4. Si score ≥ 4: aprueba y termina
|
|
112
|
+
5. Muestra el resultado de la crítica al usuario
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## PASO 7 — Confirmar y guardar
|
|
117
|
+
|
|
118
|
+
Muestra resumen final del diseño:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
═══════════════════════════════════════════
|
|
122
|
+
✅ DISEÑO COMPLETADO
|
|
123
|
+
═══════════════════════════════════════════
|
|
124
|
+
|
|
125
|
+
Producto: [product.name]
|
|
126
|
+
Dirección visual: [design_direction]
|
|
127
|
+
Pantallas: [N] pantallas ([nombres P0, P1, P2])
|
|
128
|
+
Stack: [frontend] + [backend] + [database]
|
|
129
|
+
Wireframe: .sdd/diseño/wireframe-pantalla-principal.html
|
|
130
|
+
Score del diseño: [X]/5
|
|
131
|
+
|
|
132
|
+
¿Listo para generar el código?
|
|
133
|
+
/sdd.construir → Pipeline completo automático
|
|
134
|
+
/sdd.diseñar ver → Ver el diseño en detalle
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Actualizar `.sdd/estado.json`:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
node -e "
|
|
141
|
+
const fs = require('fs');
|
|
142
|
+
const estado = JSON.parse(fs.readFileSync('.sdd/estado.json', 'utf8') || '{}');
|
|
143
|
+
estado.product_design_aprobado = true;
|
|
144
|
+
estado.ultima_actualizacion = new Date().toISOString();
|
|
145
|
+
fs.writeFileSync('.sdd/estado.json', JSON.stringify(estado, null, 2));
|
|
146
|
+
"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Sub-comandos
|
|
152
|
+
|
|
153
|
+
### `/sdd.diseñar ver`
|
|
154
|
+
Muestra el ProductDesign actual en formato legible (pantallas, stack, wireframe path).
|
|
155
|
+
|
|
156
|
+
### `/sdd.diseñar confirmar`
|
|
157
|
+
Si el diseño ya fue generado pero esperaba confirmación explícita, lo confirma y continúa.
|
|
158
|
+
|
|
159
|
+
### `/sdd.diseñar cambiar-direccion`
|
|
160
|
+
Vuelve al PASO 2 (direction picker) sin borrar el IR. Regenera todo lo demás.
|
|
161
|
+
|
|
162
|
+
### `/sdd.diseñar rediseñar`
|
|
163
|
+
Borra el ProductDesign actual y vuelve a empezar desde el PASO 2, conservando el IR.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Archivos generados
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
.sdd/
|
|
171
|
+
product-design.json ← ProductDesign + ArchitectureDesign
|
|
172
|
+
estado.json ← product_design_aprobado: true
|
|
173
|
+
diseño/
|
|
174
|
+
wireframe-pantalla-principal.html ← Wireframe de P0
|
|
175
|
+
critica-wireframe.md ← Resultado de la crítica
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Integración con el pipeline
|
|
181
|
+
|
|
182
|
+
Después de `/sdd.diseñar`:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
/sdd.construir → Pipeline completo: spec + plan + tareas + código
|
|
186
|
+
/sdd.exportar → Exportar bundle del proyecto
|
|
187
|
+
/sdd.estado → Ver estado del proyecto
|
|
188
|
+
```
|