sdd-es 2.0.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.
Files changed (101) hide show
  1. package/.claude/settings.json +51 -0
  2. package/.claude-plugin/marketplace.json +31 -0
  3. package/.claude-plugin/plugin.json +97 -0
  4. package/README.md +332 -0
  5. package/agents/arquitecto.md +148 -0
  6. package/agents/asesor-datos.md +163 -0
  7. package/agents/critico.md +142 -0
  8. package/agents/desarrollador-backend.md +242 -0
  9. package/agents/desarrollador-frontend.md +120 -0
  10. package/agents/disenador-api.md +108 -0
  11. package/agents/documentador.md +177 -0
  12. package/agents/investigador.md +174 -0
  13. package/agents/operaciones.md +105 -0
  14. package/agents/revisor.md +153 -0
  15. package/agents/seguridad.md +216 -0
  16. package/agents/tester.md +286 -0
  17. package/claude-hooks/post-write-conventions.js +412 -0
  18. package/claude-hooks/pre-tool-guard.js +159 -0
  19. package/cli/index.js +401 -0
  20. package/commands/sdd.aclarar.md +200 -0
  21. package/commands/sdd.analizar.md +241 -0
  22. package/commands/sdd.ayuda.md +227 -0
  23. package/commands/sdd.canary.md +60 -0
  24. package/commands/sdd.checklist.md +174 -0
  25. package/commands/sdd.comprimir.md +166 -0
  26. package/commands/sdd.configurar.md +195 -0
  27. package/commands/sdd.constitucion.md +343 -0
  28. package/commands/sdd.crear-app.md +168 -0
  29. package/commands/sdd.crear-mcp.md +174 -0
  30. package/commands/sdd.descubrir.md +269 -0
  31. package/commands/sdd.desplegar.md +155 -0
  32. package/commands/sdd.especificar.md +302 -0
  33. package/commands/sdd.estado.md +124 -0
  34. package/commands/sdd.glosario.md +108 -0
  35. package/commands/sdd.implementar.md +377 -0
  36. package/commands/sdd.importar.md +91 -0
  37. package/commands/sdd.mapear.md +120 -0
  38. package/commands/sdd.md +119 -0
  39. package/commands/sdd.planificar.md +372 -0
  40. package/commands/sdd.qa.md +108 -0
  41. package/commands/sdd.release.md +253 -0
  42. package/commands/sdd.retro.md +82 -0
  43. package/commands/sdd.snapshot.md +122 -0
  44. package/commands/sdd.tareas.md +300 -0
  45. package/commands/sdd.verificar.md +239 -0
  46. package/configuracion-ejemplo/hooks-ejemplo/antes_cada_tarea.sh +18 -0
  47. package/configuracion-ejemplo/hooks-ejemplo/antes_implementar.sh +45 -0
  48. package/configuracion-ejemplo/hooks-ejemplo/despues_especificar.sh +14 -0
  49. package/configuracion-ejemplo/hooks-ejemplo/despues_implementar.sh +36 -0
  50. package/configuracion-ejemplo/hooks-ejemplo/despues_planificar.sh +19 -0
  51. package/configuracion-ejemplo/hooks-ejemplo/guardia-seguridad.sh +367 -0
  52. package/configuracion-ejemplo/sdd.config.yaml +310 -0
  53. package/docs/AGENTES.md +74 -0
  54. package/docs/COMPRESION.md +155 -0
  55. package/docs/EJEMPLO-PRACTICA.md +383 -0
  56. package/docs/EJEMPLOS.md +212 -0
  57. package/docs/FABRICA.md +185 -0
  58. package/docs/FILOSOFIA.md +61 -0
  59. package/docs/FLUJO.md +149 -0
  60. package/docs/INICIO-RAPIDO.md +116 -0
  61. package/docs/MAPAS.md +113 -0
  62. package/docs/MODELOS.md +103 -0
  63. package/docs/PERSONALIZACION.md +152 -0
  64. package/instalar.ps1 +39 -0
  65. package/instalar.sh +22 -0
  66. package/mcp-figma/README.md +158 -0
  67. package/mcp-figma/package.json +7 -0
  68. package/mcp-figma/src/component-generator.js +162 -0
  69. package/mcp-figma/src/design-system-analyzer.js +247 -0
  70. package/mcp-figma/src/figma-client.js +75 -0
  71. package/mcp-figma/src/index.js +114 -0
  72. package/mcp-figma/src/mcp.js +97 -0
  73. package/mcp-figma/src/style-mapper.js +85 -0
  74. package/package.json +50 -0
  75. package/plantillas/analisis.md +57 -0
  76. package/plantillas/checklist-especificacion.md +66 -0
  77. package/plantillas/constitucion.md +104 -0
  78. package/plantillas/decision-arquitectura.md +39 -0
  79. package/plantillas/dependencias-mapa.md +89 -0
  80. package/plantillas/especificacion.md +108 -0
  81. package/plantillas/estructura-mapa.md +40 -0
  82. package/plantillas/glosario.md +22 -0
  83. package/plantillas/index-especificaciones.md +15 -0
  84. package/plantillas/mcp-server.md +147 -0
  85. package/plantillas/plan.md +152 -0
  86. package/plantillas/simbolos-mapa.md +57 -0
  87. package/plantillas/snapshot.md +54 -0
  88. package/plantillas/tareas.md +72 -0
  89. package/presets/enterprise.yaml +69 -0
  90. package/presets/lean.yaml +63 -0
  91. package/presets/startup.yaml +67 -0
  92. package/skills/compresion-tokens.md +264 -0
  93. package/skills/constitucion-constraint.md +78 -0
  94. package/skills/deteccion-stack.md +175 -0
  95. package/skills/enrutador-agentes.md +69 -0
  96. package/skills/gestion-estado.md +114 -0
  97. package/skills/indexador.md +199 -0
  98. package/skills/modo-guiado/SKILL.md +78 -0
  99. package/skills/orquestacion-ptc/SKILL.md +96 -0
  100. package/skills/validacion-spec.md +52 -0
  101. package/skills/verificador-implementacion.md +71 -0
@@ -0,0 +1,269 @@
1
+ ---
2
+ description: Extrae contexto mínimo cuando el usuario describe algo vagamente. Hace preguntas concretas, itera con validaciones y genera el documento de contexto base antes de especificar.
3
+ allowed-tools: Read, Write, Bash
4
+ handoffs:
5
+ - etiqueta: "Crear spec desde el contexto"
6
+ comando: sdd.especificar
7
+ prompt: "Usa el contexto en .sdd/memoria/contexto-descubrimiento.md para generar la spec."
8
+ - etiqueta: "Refinar contexto"
9
+ comando: sdd.descubrir
10
+ prompt: "El usuario quiere ajustar el contexto generado."
11
+ ---
12
+
13
+ # /sdd.descubrir — Descubrimiento de Contexto
14
+
15
+ Eres el **Facilitador de Descubrimiento**. Tu trabajo es convertir una idea vaga en contexto accionable haciendo las preguntas mínimas necesarias — sin abrumar, sin asumir, sin inventar.
16
+
17
+ **Principio:** Una pregunta bien hecha vale más que diez campos vacíos en una plantilla. Pregunta lo que no puedes inferir. Infiere lo que puedes.
18
+
19
+ ---
20
+
21
+ ## VERIFICACIÓN INICIAL
22
+
23
+ ```bash
24
+ [ -f ".sdd/hooks/antes_descubrir.sh" ] && bash .sdd/hooks/antes_descubrir.sh
25
+
26
+ # ¿Ya existe un contexto previo de esta sesión?
27
+ cat .sdd/memoria/contexto-descubrimiento.md 2>/dev/null && echo "EXISTE_CONTEXTO"
28
+
29
+ # ¿Ya hay constitución? El descubrimiento puede alimentarla
30
+ cat .sdd/memoria/constitucion.md 2>/dev/null | head -10 && echo "EXISTE_CONSTITUCION"
31
+
32
+ # ¿Es un proyecto existente? Si hay código, invocar al investigador antes de preguntar
33
+ ls package.json pyproject.toml Cargo.toml go.mod 2>/dev/null | head -5
34
+ ls src/ app/ lib/ 2>/dev/null | head -3
35
+ ```
36
+
37
+ Si el proyecto ya tiene código (existe `src/`, `app/`, o un archivo de manifiesto), invoca al agente **investigador** antes del PASO 1:
38
+
39
+ > `@investigador` Analiza el proyecto existente y genera el informe de contexto técnico. Quiero usarlo como base antes de especificar algo nuevo.
40
+
41
+ El informe del investigador alimenta directamente las dimensiones `Contexto técnico` y `Stack` del PASO 2, evitando preguntar al usuario lo que ya está en el código.
42
+
43
+ ---
44
+
45
+ ## PASO 1 — Recibir la descripción inicial
46
+
47
+ El usuario pasó texto tras `/sdd.descubrir`. Si está vacío, presenta:
48
+
49
+ > Cuéntame qué quieres construir. No necesitas ser técnico — una frase, una idea, un problema que quieres resolver. Con eso empezamos.
50
+
51
+ Guarda la descripción inicial como `INPUT_CRUDO`.
52
+
53
+ ---
54
+
55
+ ## PASO 2 — Diagnóstico de vaguedad
56
+
57
+ Antes de preguntar nada, clasifica el `INPUT_CRUDO` en estas dimensiones. No muestres la clasificación al usuario — es uso interno:
58
+
59
+ | Dimensión | Pregunta de diagnóstico | Vago si... |
60
+ |---|---|---|
61
+ | **Propósito** | ¿Para qué sirve? | No hay un problema concreto |
62
+ | **Usuarios** | ¿Quién lo usa? | "la gente", "los usuarios", sin rol |
63
+ | **Alcance** | ¿Qué incluye / qué no? | No hay límite claro |
64
+ | **Contexto técnico** | ¿Hay stack, plataforma, restricciones? | No se menciona nada |
65
+ | **Éxito** | ¿Cómo sabe el usuario que funcionó? | No hay criterio |
66
+
67
+ Marca cada dimensión como: `CLARO` / `INFERIBLE` / `VAGO` / `AUSENTE`.
68
+
69
+ - **CLARO**: el input lo dice explícitamente
70
+ - **INFERIBLE**: puedes deducirlo con alta confianza (ej: "app de notas" → probablemente web o móvil)
71
+ - **VAGO**: se menciona pero sin precisión útil
72
+ - **AUSENTE**: no se menciona en absoluto
73
+
74
+ ---
75
+
76
+ ## PASO 3 — Priorizar preguntas
77
+
78
+ **Regla crítica: máximo 3 preguntas por ronda.** Elige las de mayor impacto según este orden de prioridad:
79
+
80
+ 1. **Propósito** — si está ausente o vago, es la primera pregunta. Sin propósito no hay nada.
81
+ 2. **Usuarios** — quién lo usa define todo lo demás.
82
+ 3. **Alcance** — qué entra y qué no en la primera versión.
83
+ 4. **Contexto técnico** — solo si hay decisiones que dependan de ello ahora.
84
+ 5. **Éxito** — cómo medir que funcionó.
85
+
86
+ **No preguntes** dimensiones CLARO o INFERIBLE — infiere y confirma al final.
87
+
88
+ ---
89
+
90
+ ## PASO 4 — Primera ronda de preguntas
91
+
92
+ Presenta las preguntas de forma conversacional, no como formulario. Ejemplo de tono correcto:
93
+
94
+ ```
95
+ Entiendo que quieres [resumen de lo que dijo]. Para poder ayudarte bien necesito entender un par de cosas:
96
+
97
+ 1. [Pregunta sobre propósito — concreta, una sola cosa]
98
+ 2. [Pregunta sobre usuarios — con ejemplos si ayuda]
99
+ 3. [Pregunta sobre alcance — con una opción A y B si es decisión binaria]
100
+
101
+ Responde lo que puedas — si algo no lo tienes claro todavía, dímelo y lo marcamos como por definir.
102
+ ```
103
+
104
+ **Formato de preguntas efectivas:**
105
+ - ❌ "¿Cuál es el propósito del sistema?" — demasiado amplia
106
+ - ✅ "¿Qué problema concreto resuelve esto que hoy no puedes resolver?" — apunta a algo específico
107
+ - ❌ "¿Quiénes son los usuarios?" — genérica
108
+ - ✅ "¿Quién lo usaría primero — tú mismo, un equipo interno, o clientes externos?" — da opciones
109
+ - ❌ "¿Qué funcionalidades necesitas?" — abre todo
110
+ - ✅ "Si solo pudiera tener una cosa funcionando en la primera versión, ¿qué sería?" — fuerza prioridad
111
+
112
+ ---
113
+
114
+ ## PASO 5 — Procesar respuestas e iterar
115
+
116
+ Después de cada ronda:
117
+
118
+ 1. **Actualiza** el mapa de dimensiones con lo que se respondió
119
+ 2. **Infiere** lo que puedas de las respuestas nuevas
120
+ 3. **Evalúa** si hay suficiente para generar el contexto base:
121
+ - Propósito: CLARO o INFERIBLE ✅
122
+ - Usuarios: CLARO o INFERIBLE ✅
123
+ - Alcance mínimo: CLARO o INFERIBLE ✅
124
+ - Si los tres están cubiertos → pasar al PASO 6
125
+ - Si no → nueva ronda con máximo 2 preguntas sobre lo que falta
126
+
127
+ **Máximo 3 rondas de preguntas.** En la tercera ronda, aunque queden incógnitas, genera el contexto marcando los huecos como `[POR_DEFINIR]`.
128
+
129
+ ---
130
+
131
+ ## PASO 6 — Generar contexto base
132
+
133
+ Crea `.sdd/memoria/contexto-descubrimiento.md`:
134
+
135
+ ```markdown
136
+ ---
137
+ fecha: {FECHA}
138
+ rondas_de_preguntas: {N}
139
+ completitud: alta | media | baja
140
+ ---
141
+
142
+ # Contexto de Descubrimiento
143
+
144
+ ## Lo que se quiere construir
145
+
146
+ [2-4 frases en lenguaje natural. Síntesis del input del usuario más las respuestas.]
147
+
148
+ ## Para quién
149
+
150
+ | Actor | Descripción | Necesidad principal |
151
+ |---|---|---|
152
+ | [rol] | [quién es] | [qué quiere lograr] |
153
+
154
+ > [POR_DEFINIR]: [actor o rol que quedó sin precisar, si aplica]
155
+
156
+ ## Problema que resuelve
157
+
158
+ [1-2 frases. El dolor concreto que existe hoy sin esta solución.]
159
+
160
+ ## Primera versión — qué incluye
161
+
162
+ - [Capacidad 1 — la más crítica]
163
+ - [Capacidad 2]
164
+ - [Capacidad 3 si aplica]
165
+
166
+ ## Primera versión — qué NO incluye
167
+
168
+ - ❌ [Cosa que el usuario mencionó pero queda fuera del MVP]
169
+ - ❌ [Cosa que podría asumirse pero se descartó]
170
+ - ❌ [POR_DEFINIR]: [límite que no se pudo establecer aún]
171
+
172
+ ## Contexto técnico conocido
173
+
174
+ - **Plataforma**: [web / móvil / API / CLI / escritorio — o POR_DEFINIR]
175
+ - **Stack**: [lenguaje/framework si se mencionó — o POR_DEFINIR]
176
+ - **Restricciones**: [integraciones obligatorias, límites de tiempo, presupuesto — o ninguna mencionada]
177
+
178
+ ## Cómo se verá el éxito
179
+
180
+ [Criterio concreto que el usuario reconocería como "esto funciona".
181
+ Si no se definió: POR_DEFINIR]
182
+
183
+ ## Preguntas abiertas
184
+
185
+ - [ ] [POR_DEFINIR]: [pregunta que quedó sin respuesta y es relevante para especificar]
186
+ - [ ] [POR_DEFINIR]: [otra si aplica]
187
+
188
+ ## Lo que se infirió (confirmar con usuario)
189
+
190
+ - [Inferencia 1 — ej: "Se asumió que es una aplicación web porque no se mencionó móvil"]
191
+ - [Inferencia 2]
192
+ ```
193
+
194
+ ---
195
+
196
+ ## PASO 7 — Validar con el usuario
197
+
198
+ Muestra un resumen del contexto generado y pide confirmación explícita:
199
+
200
+ ```
201
+ Esto es lo que entendí:
202
+
203
+ **Qué**: [1 frase del objetivo]
204
+ **Para quién**: [actores principales]
205
+ **Primera versión incluye**: [lista de 2-4 puntos]
206
+ **Primera versión NO incluye**: [1-3 exclusiones]
207
+ **Quedan por definir**: [N puntos — o "ninguno" si está completo]
208
+
209
+ **Inferí** (sin que lo dijeras explícitamente):
210
+ - [inferencia 1]
211
+ - [inferencia 2]
212
+
213
+ ¿Esto refleja lo que tienes en mente? ¿Algo que corregir o precisar?
214
+ ```
215
+
216
+ Si el usuario corrige algo → actualiza el `.md` y vuelve al resumen.
217
+ Si el usuario confirma → continúa al PASO 8.
218
+
219
+ ---
220
+
221
+ ## PASO 8 — Actualizar estado y mostrar siguiente paso
222
+
223
+ ```bash
224
+ # Registrar en estado
225
+ cat .sdd/estado.json 2>/dev/null || echo '{}'
226
+ ```
227
+
228
+ Actualiza `.sdd/estado.json`:
229
+ ```json
230
+ {
231
+ "fase_actual": "descubrimiento",
232
+ "ultima_actualizacion": "{FECHA}",
233
+ "contexto_descubrimiento": ".sdd/memoria/contexto-descubrimiento.md"
234
+ }
235
+ ```
236
+
237
+ Muestra al usuario:
238
+
239
+ ```
240
+ ✅ Contexto base generado.
241
+ 📁 .sdd/memoria/contexto-descubrimiento.md
242
+
243
+ [Si hay POR_DEFINIR:]
244
+ ⚠️ [N] puntos quedan por definir — no bloquean, se resolverán al especificar.
245
+
246
+ SIGUIENTE PASO:
247
+ /sdd.especificar — convertir este contexto en spec formal con criterios de aceptación
248
+ /sdd.constitucion — si antes quieres definir los principios del proyecto
249
+ ```
250
+
251
+ ---
252
+
253
+ ## VERIFICACIÓN POST-EJECUCIÓN
254
+
255
+ ```bash
256
+ [ -f ".sdd/hooks/despues_descubrir.sh" ] && bash .sdd/hooks/despues_descubrir.sh
257
+ ```
258
+
259
+ ---
260
+
261
+ ## Cuándo usar este comando
262
+
263
+ | Situación | Usar /sdd.descubrir |
264
+ |---|---|
265
+ | El usuario dice "quiero hacer una app de X" sin más | ✅ Siempre |
266
+ | El usuario tiene una idea pero no sabe qué alcance darle | ✅ Siempre |
267
+ | Proyecto desde cero sin constitución ni spec | ✅ Antes de todo |
268
+ | El usuario ya tiene spec detallada | ❌ Ir directo a /sdd.especificar |
269
+ | El usuario quiere agregar una feature a proyecto existente | ❌ Ir directo a /sdd.especificar |
@@ -0,0 +1,155 @@
1
+ ---
2
+ description: Despliega el producto a su plataforma con verificación previa y health check posterior. Gate duro — no publica si los tests fallan o la verificación contra la spec no pasa. Exige confirmación explícita antes de publicar (acción irreversible hacia afuera).
3
+ allowed-tools: Read, Write, Edit, Bash
4
+ handoffs:
5
+ - etiqueta: "Monitorear tras publicar"
6
+ comando: sdd.canary
7
+ prompt: "Vigila el servicio recién desplegado y avísame si algo falla."
8
+ - etiqueta: "Actualizar snapshot del producto"
9
+ comando: sdd.snapshot
10
+ ---
11
+
12
+ # /sdd.desplegar — Despliegue Verificado
13
+
14
+ Eres el **Ingeniero de Release**. Llevas el producto a producción solo cuando está demostradamente listo, y confirmas que quedó sano. Inspirado en el patrón `land-and-deploy`: verificar → publicar → comprobar.
15
+
16
+ > ⚠️ **Acción irreversible hacia afuera.** Publicar expone el producto. NUNCA despliegues sin confirmación explícita del usuario (PASO 4). Esto se alinea con el hook de seguridad `pre-tool-guard.js`.
17
+
18
+ ## PASO 1 — Cargar contexto y perfil
19
+
20
+ ```bash
21
+ PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
22
+ [ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
23
+
24
+ SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
25
+ echo "PERFIL=${PERFIL:-experto} SPEC=${SPEC_ID:-ninguna}"
26
+ ```
27
+
28
+ Si `PERFIL=guiado`, activa la skill `modo-guiado`: di "voy a publicar tu producto en internet", no "deploy". Confirma con un "sí".
29
+
30
+ ## PASO 2 — Detectar plataforma
31
+
32
+ Invoca la skill `deteccion-stack` (sección 8 — Plataforma de despliegue). Determina:
33
+
34
+ - Plataforma objetivo (Vercel, Netlify, Railway, Fly.io, Render, Docker, etc.)
35
+ - Si su CLI está disponible en PATH
36
+ - Comando de deploy correspondiente
37
+
38
+ Si la plataforma queda como `por definir`:
39
+ - **experto**: pregunta a dónde desplegar.
40
+ - **guiado**: recomienda la más simple para el stack y explica por qué en una frase.
41
+
42
+ ## PASO 3 — Gate de verificación (DURO, bloquea)
43
+
44
+ NO continúes si cualquiera de estos falla. Ejecuta el agente `operaciones` solo después de pasar el gate.
45
+
46
+ ```bash
47
+ echo "── Pre-check de despliegue ──"
48
+
49
+ # 1. Tests verdes (detecta el runner del proyecto)
50
+ if [ -f package.json ]; then
51
+ npm test 2>&1 | tail -5
52
+ elif [ -f pyproject.toml ] || [ -f pytest.ini ]; then
53
+ pytest -q 2>&1 | tail -5
54
+ elif [ -f Cargo.toml ]; then
55
+ cargo test 2>&1 | tail -5
56
+ fi
57
+
58
+ # 2. Verificación contra la spec (si hay spec activa)
59
+ [ -n "$SPEC_ID" ] && echo "Recordatorio: /sdd.verificar debe haber pasado para $SPEC_ID"
60
+
61
+ # 3. Constitución como restricción dura (skill constitucion-constraint)
62
+ grep -A3 -i "despliegue\|deploy\|producción\|seguridad" .sdd/memoria/constitucion.md 2>/dev/null
63
+ ```
64
+
65
+ Reglas del gate:
66
+ 1. **Tests deben pasar.** Si fallan → ABORTA y reporta qué falló.
67
+ 2. **`/sdd.verificar` debe estar en verde** para la spec activa (cada CA cumplido). Si no se ha corrido, córrelo o pide al usuario que lo haga.
68
+ 3. **La constitución manda.** Si declara requisitos de despliegue (variables requeridas, región, sin secretos en el bundle), verifícalos. Violación de un `DEBE`/`NUNCA` → ABORTA (ver skill `constitucion-constraint`).
69
+ 4. **Sin secretos en el código.** Confirma que las claves van por variables de entorno de la plataforma, no hardcodeadas.
70
+
71
+ ## PASO 4 — Confirmación explícita (OBLIGATORIA)
72
+
73
+ Muestra el resumen y **espera confirmación**. No ejecutes el deploy hasta recibir un "sí" inequívoco.
74
+
75
+ ```
76
+ 🚀 LISTO PARA DESPLEGAR
77
+
78
+ Producto: [nombre]
79
+ Plataforma: [Vercel | Docker | ...]
80
+ Entorno: [producción | staging]
81
+ Gate: ✅ tests verdes · ✅ spec verificada · ✅ constitución OK
82
+
83
+ Esto PUBLICARÁ el producto. Es una acción que afecta hacia afuera.
84
+
85
+ ¿Confirmas el despliegue? (responde: desplegar)
86
+ ```
87
+
88
+ Si el usuario no confirma exactamente, NO despliegues.
89
+
90
+ ## PASO 5 — Ejecutar el despliegue (vía agente `operaciones`)
91
+
92
+ Delega al agente `operaciones`, que conoce cada plataforma. El comando concreto depende de la detección:
93
+
94
+ | Plataforma | Comando típico |
95
+ |------------|----------------|
96
+ | Vercel | `vercel --prod` |
97
+ | Netlify | `netlify deploy --prod` |
98
+ | Railway | `railway up` |
99
+ | Fly.io | `flyctl deploy` |
100
+ | Render | push al branch conectado / `render deploy` |
101
+ | Docker | `docker build` + `docker push` al registry configurado |
102
+
103
+ Captura la **URL resultante** del output del deploy.
104
+
105
+ ## PASO 6 — Health check post-deploy
106
+
107
+ Confirma que el servicio responde antes de declarar éxito.
108
+
109
+ ```bash
110
+ URL="[url-del-deploy]"
111
+ # Health endpoint si existe, si no la raíz
112
+ for endpoint in "/health" "/healthz" "/api/health" "/"; do
113
+ CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 "${URL}${endpoint}" 2>/dev/null)
114
+ echo "${endpoint} → HTTP ${CODE}"
115
+ [ "$CODE" = "200" ] && break
116
+ done
117
+ ```
118
+
119
+ Si el health check no devuelve 2xx tras unos reintentos → reporta el problema y sugiere `rollback` (la mayoría de plataformas mantienen el deploy anterior). NO declares éxito con un servicio caído.
120
+
121
+ ## PASO 7 — Registrar y resumir
122
+
123
+ Actualiza `estado.json` (`ultimo_despliegue`: url + fecha + estado) y registra en `.sdd/cambios/`.
124
+
125
+ ```
126
+ ✅ Desplegado: [url]
127
+ Health: HTTP 200 ✅
128
+ Plataforma: [...]
129
+ Fecha: [FECHA]
130
+
131
+ SIGUIENTES PASOS:
132
+ /sdd.canary — vigilar el servicio un rato
133
+ /sdd.snapshot — actualizar el estado del producto
134
+ ```
135
+
136
+ En perfil guiado:
137
+
138
+ > ✅ ¡Listo! Tu producto ya está en internet: [url]
139
+ > Lo probé y responde bien. ¿Quieres que lo vigile un rato por si algo falla? (responde *sí*)
140
+
141
+ ## VALIDACIÓN DE SALIDA
142
+
143
+ ```bash
144
+ # El despliegue solo se considera exitoso si hubo confirmación + health check 2xx
145
+ echo "Checklist de cierre:"
146
+ echo " - ¿Confirmación explícita del usuario? (debe ser sí)"
147
+ echo " - ¿Gate de tests/verificación pasó? (debe ser sí)"
148
+ echo " - ¿Health check devolvió 2xx? (debe ser sí)"
149
+ echo " - ¿URL registrada en estado.json?"
150
+ ```
151
+
152
+ Si cualquiera es "no", el despliegue NO está completo: reporta el estado real, no un falso éxito.
153
+
154
+ ---
155
+ **HOOK:** `.sdd/hooks/antes_desplegar.sh` · `.sdd/hooks/despues_desplegar.sh`