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
|
@@ -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ó.
|
|
@@ -12,6 +12,8 @@ handoffs:
|
|
|
12
12
|
|
|
13
13
|
Eres el **Generador de MCP**. Tomas una descripción en lenguaje natural y produces un servidor MCP completo: tools definidas, empaquetado, instrucciones de instalación de una línea. El resultado lo puede instalar alguien que no sabe programar.
|
|
14
14
|
|
|
15
|
+
> **MCP integrado en v2.6.0:** Playwright (navegación y QA automatizado).
|
|
16
|
+
|
|
15
17
|
## PASO 1 — Entender qué capacidades se quieren publicar
|
|
16
18
|
|
|
17
19
|
Lee el argumento del comando. Si el usuario escribió algo como:
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Generar reporte de calidad con escape rate y mutaciones
|
|
3
|
+
allowed-tools: Read, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.defect-report
|
|
7
|
+
|
|
8
|
+
Genera un reporte de calidad basado en mutaciones (cambios) de archivos encontrados por QA.
|
|
9
|
+
|
|
10
|
+
## Uso
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/sdd.defect-report
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Qué Muestra
|
|
17
|
+
|
|
18
|
+
### Resumen Ejecutivo
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
╔═══════════════════════════════════════════════════════════╗
|
|
22
|
+
║ DEFECT ESCAPE RATE REPORT — 2026-06-14 ║
|
|
23
|
+
╠═══════════════════════════════════════════════════════════╣
|
|
24
|
+
║ ║
|
|
25
|
+
║ Archivos modificados: 12 ║
|
|
26
|
+
║ Bugs encontrados (QA): 4 ║
|
|
27
|
+
║ Bugs en producción: 1 ║
|
|
28
|
+
║ ───────────────────────────────────── ║
|
|
29
|
+
║ Global Escape Rate: 20% (1 de 5) ║
|
|
30
|
+
║ ║
|
|
31
|
+
║ Interpretación: ║
|
|
32
|
+
║ ✅ Muy bien (1-10%): Calidad excelente ║
|
|
33
|
+
║ ⚠️ OK (11-30%): Calidad buena ║
|
|
34
|
+
║ 🔴 Malo (31%+): Calidad baja ║
|
|
35
|
+
║ ║
|
|
36
|
+
╚═══════════════════════════════════════════════════════════╝
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Por Agente
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
AGENTE | ARCHIVOS | MUTACIONES | BUGS ENCONTRADOS | QUALITY
|
|
43
|
+
───────────────┼──────────┼────────────┼──────────────────┼─────────
|
|
44
|
+
backend-dev | 12 | 15 | 3 | 75%
|
|
45
|
+
frontend-dev | 8 | 12 | 1 | 88%
|
|
46
|
+
tester-qa | 5 | 8 | 4 (encontrados) | QA
|
|
47
|
+
revisor | 3 | 4 | 2 | 67%
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Archivos Inestables
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
🚨 CRÍTICOS (>5 mutaciones):
|
|
54
|
+
- src/auth.ts (7 mutaciones en 2 días)
|
|
55
|
+
- src/database.ts (6 mutaciones en 3 días)
|
|
56
|
+
|
|
57
|
+
⚠️ INESTABLES (2-5 mutaciones):
|
|
58
|
+
- src/validators.ts (3 mutaciones)
|
|
59
|
+
- src/payments.ts (4 mutaciones)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Agentes con Mejora Necesaria
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
📊 ESCALA DE CALIDAD:
|
|
66
|
+
backend-dev: ████████░ 75% — Aumentar coverage de tests
|
|
67
|
+
frontend-dev: █████████ 88% — Excelente
|
|
68
|
+
revisor: ██████░░░ 67% — Revisar proceso de verificación
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Interpretación de Resultados
|
|
74
|
+
|
|
75
|
+
### Escape Rate Bajo (1-10%)
|
|
76
|
+
```
|
|
77
|
+
✅ QA es efectivo, código es estable
|
|
78
|
+
→ Confiable para producción
|
|
79
|
+
→ Clientes confían en calidad
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Escape Rate Medio (11-30%)
|
|
83
|
+
```
|
|
84
|
+
⚠️ QA encuentra mayoría de bugs, pero algunos escapan
|
|
85
|
+
→ Aumentar cobertura de tests
|
|
86
|
+
→ Mejorar criterios de aceptación
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Escape Rate Alto (31%+)
|
|
90
|
+
```
|
|
91
|
+
🔴 Problemas serios de calidad
|
|
92
|
+
→ Tests insuficientes
|
|
93
|
+
→ Falta validación
|
|
94
|
+
→ Riesgo de producción
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Ejemplo Real
|
|
100
|
+
|
|
101
|
+
**Sesión 1 (2026-06-10):**
|
|
102
|
+
- Backend Dev escribe src/auth.ts (Write)
|
|
103
|
+
- Frontend Dev modifica src/ui.tsx (Edit)
|
|
104
|
+
- Tester QA ejecuta tests, encuentra 2 bugs en auth.ts
|
|
105
|
+
|
|
106
|
+
**Sesión 2 (2026-06-11):**
|
|
107
|
+
- Backend Dev reescribe src/auth.ts (Write) — 2 bugs solucionados + 1 nuevo
|
|
108
|
+
- Tester QA ejecuta tests, encuentra 2 bugs (1 viejo, 1 nuevo)
|
|
109
|
+
- 1 bug anterior escapó a producción
|
|
110
|
+
|
|
111
|
+
**Reporte Final:**
|
|
112
|
+
```
|
|
113
|
+
Archivos: 2
|
|
114
|
+
Bugs encontrados: 4
|
|
115
|
+
Bugs en prod: 1
|
|
116
|
+
─────────────────
|
|
117
|
+
Escape Rate: 25%
|
|
118
|
+
|
|
119
|
+
Por agente:
|
|
120
|
+
backend-dev: 6 mutaciones, 3 bugs encontrados → 50% quality
|
|
121
|
+
frontend-dev: 1 mutación, 0 bugs → 100% quality
|
|
122
|
+
tester-qa: 100% accuracy (encontró todos excepto 1 que escapó)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Datos Fuente
|
|
128
|
+
|
|
129
|
+
Utiliza:
|
|
130
|
+
- `.sdd/observabilidad/mutaciones.jsonl` — cambios a archivos
|
|
131
|
+
- `.sdd/observabilidad/consumo.jsonl` — timestamps de eventos
|
|
132
|
+
|
|
133
|
+
**Nota:** En v2.6.1 se agregará integración con resultados reales de QA (Playwright).
|
|
134
|
+
|
|
@@ -32,8 +32,27 @@ cat .sdd/memoria/constitucion.md 2>/dev/null | head -10 && echo "EXISTE_CONSTITU
|
|
|
32
32
|
# ¿Es un proyecto existente? Si hay código, invocar al investigador antes de preguntar
|
|
33
33
|
ls package.json pyproject.toml Cargo.toml go.mod 2>/dev/null | head -5
|
|
34
34
|
ls src/ app/ lib/ 2>/dev/null | head -3
|
|
35
|
+
|
|
36
|
+
# ¿Hay perfil configurado?
|
|
37
|
+
PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
38
|
+
[ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
|
|
39
|
+
echo "PERFIL=${PERFIL:-guiado}"
|
|
35
40
|
```
|
|
36
41
|
|
|
42
|
+
### Detección de usuario nuevo
|
|
43
|
+
|
|
44
|
+
Si NO existe `.sdd/estado.json` ni `.sdd/sdd.config.yaml` y no hay código previo en el proyecto:
|
|
45
|
+
|
|
46
|
+
**→ Usuario nuevo detectado. Usa modo guiado.**
|
|
47
|
+
|
|
48
|
+
No pidas que editen archivos ni que ejecuten comandos. Saluda en lenguaje natural:
|
|
49
|
+
|
|
50
|
+
> ¡Hola! Cuéntame qué quieres construir — una frase es suficiente. No necesitas saber nada técnico para empezar.
|
|
51
|
+
|
|
52
|
+
Si existe `.sdd/sdd.config.yaml` con `perfil: experto` explícito:
|
|
53
|
+
|
|
54
|
+
**→ Usuario avanzado. Usa modo experto** (muestra comandos, rutas, estado técnico).
|
|
55
|
+
|
|
37
56
|
Si el proyecto ya tiene código (existe `src/`, `app/`, o un archivo de manifiesto), invoca al agente **investigador** antes del PASO 1:
|
|
38
57
|
|
|
39
58
|
> `@investigador` Analiza el proyecto existente y genera el informe de contexto técnico. Quiero usarlo como base antes de especificar algo nuevo.
|