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,367 @@
1
+ #!/bin/bash
2
+ # ============================================================
3
+ # guardia-seguridad.sh — Hook de seguridad SDD-ES
4
+ # ============================================================
5
+ # Bloquea operaciones destructivas, protege .env y archivos
6
+ # sensibles, y requiere confirmación explícita antes de
7
+ # cualquier acción irreversible.
8
+ #
9
+ # USO: cópialo a .sdd/hooks/ y hazlo ejecutable:
10
+ # cp guardia-seguridad.sh .sdd/hooks/
11
+ # chmod +x .sdd/hooks/guardia-seguridad.sh
12
+ #
13
+ # Se invoca desde los hooks antes_implementar.sh o como
14
+ # wrapper de cualquier comando que el agente proponga ejecutar.
15
+ #
16
+ # Variables de entorno esperadas (opcionales):
17
+ # SDD_COMANDO — el comando que está a punto de ejecutarse
18
+ # SDD_ARCHIVOS — archivos que el agente quiere tocar
19
+ # SDD_TAREA_ID — ID de la tarea actual (para el log)
20
+ # ============================================================
21
+
22
+ set -euo pipefail
23
+
24
+ # ── Colores ─────────────────────────────────────────────────
25
+ RED='\033[0;31m'
26
+ YELLOW='\033[1;33m'
27
+ GREEN='\033[0;32m'
28
+ BOLD='\033[1m'
29
+ NC='\033[0m'
30
+
31
+ # ── Rutas ───────────────────────────────────────────────────
32
+ CONFIG=".sdd/sdd.config.yaml"
33
+ LOG=".sdd/guardia.log"
34
+
35
+ log() {
36
+ local NIVEL="$1"
37
+ local MSG="$2"
38
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$NIVEL] ${SDD_TAREA_ID:-?} — $MSG" >> "$LOG" 2>/dev/null || true
39
+ }
40
+
41
+ bloquear() {
42
+ local RAZON="$1"
43
+ echo -e "${RED}${BOLD}🚫 BLOQUEADO${NC}: $RAZON"
44
+ log "BLOQUEO" "$RAZON"
45
+ exit 1
46
+ }
47
+
48
+ advertir() {
49
+ local RAZON="$1"
50
+ echo -e "${YELLOW}${BOLD}⚠️ ADVERTENCIA${NC}: $RAZON"
51
+ log "ADVERTENCIA" "$RAZON"
52
+ }
53
+
54
+ confirmar() {
55
+ local PREGUNTA="$1"
56
+ local ACCION="$2"
57
+ echo -e "${YELLOW}${BOLD}⚠️ REQUIERE CONFIRMACIÓN${NC}"
58
+ echo -e " Acción: ${BOLD}${ACCION}${NC}"
59
+ echo -e " $PREGUNTA"
60
+ echo -e " Escribe ${BOLD}SI${NC} (en mayúsculas) para continuar, cualquier otra cosa cancela:"
61
+ read -r RESP
62
+ if [ "$RESP" != "SI" ]; then
63
+ bloquear "Acción cancelada por el usuario: $ACCION"
64
+ fi
65
+ log "CONFIRMADO" "$ACCION"
66
+ }
67
+
68
+ # ============================================================
69
+ # BLOQUE 1 — Protección de archivos sensibles
70
+ # ============================================================
71
+ # Lee patrones de protecciones.no_tocar_archivos en config
72
+ # Si el agente propone tocar alguno, bloquea.
73
+
74
+ proteger_archivos_sensibles() {
75
+ # Patrones protegidos por defecto (sin config)
76
+ local PATRONES_DEFAULT=(
77
+ ".env"
78
+ ".env.*"
79
+ ".env.local"
80
+ ".env.production"
81
+ ".env.staging"
82
+ "*.pem"
83
+ "*.key"
84
+ "*.p12"
85
+ "*.pfx"
86
+ "id_rsa"
87
+ "id_ed25519"
88
+ "*credentials*"
89
+ "*secrets*"
90
+ "*secret*"
91
+ "*.secret"
92
+ ".netrc"
93
+ "*.kubeconfig"
94
+ "kubeconfig"
95
+ ".aws/credentials"
96
+ ".ssh/*"
97
+ "serviceAccountKey.json"
98
+ "firebase-adminsdk*.json"
99
+ "google-services.json"
100
+ "GoogleService-Info.plist"
101
+ )
102
+
103
+ # Si no hay archivos propuestos, saltar
104
+ [ -z "${SDD_ARCHIVOS:-}" ] && return 0
105
+
106
+ for PATRON in "${PATRONES_DEFAULT[@]}"; do
107
+ # shellcheck disable=SC2254
108
+ case "$SDD_ARCHIVOS" in
109
+ *$PATRON*)
110
+ bloquear "Intento de acceso a archivo sensible: '$SDD_ARCHIVOS' coincide con patrón protegido '$PATRON'. Los archivos de credenciales NUNCA deben ser leídos ni escritos por agentes."
111
+ ;;
112
+ esac
113
+ done
114
+
115
+ # También verificar contra archivos reales en el repo
116
+ # Detectar .env files que no estén en .gitignore y alertar
117
+ local ENV_FILES
118
+ ENV_FILES=$(find . -maxdepth 3 -name ".env*" ! -name ".env.example" ! -name ".env.template" \
119
+ ! -path "*/.git/*" ! -path "*/.sdd/*" ! -path "*/node_modules/*" 2>/dev/null)
120
+
121
+ if [ -n "$ENV_FILES" ]; then
122
+ # Verificar si están en .gitignore
123
+ for ENV_FILE in $ENV_FILES; do
124
+ local NOMBRE
125
+ NOMBRE=$(basename "$ENV_FILE")
126
+ if ! grep -q "$NOMBRE" .gitignore 2>/dev/null && ! grep -q ".env" .gitignore 2>/dev/null; then
127
+ advertir "Archivo '$ENV_FILE' existe pero NO está en .gitignore. Riesgo de exposición de credenciales."
128
+ fi
129
+ done
130
+ fi
131
+ }
132
+
133
+ # ============================================================
134
+ # BLOQUE 2 — Comandos destructivos prohibidos
135
+ # ============================================================
136
+
137
+ COMANDOS_PROHIBIDOS=(
138
+ # Eliminación masiva
139
+ "rm -rf /"
140
+ "rm -rf ~"
141
+ "rm -rf \$HOME"
142
+ "rm -rf ."
143
+ "rm -rf .."
144
+ "rmdir /s" # Windows
145
+ "rd /s" # Windows
146
+ "del /f /s /q" # Windows
147
+
148
+ # Base de datos destructiva
149
+ "DROP DATABASE"
150
+ "DROP SCHEMA"
151
+ "TRUNCATE DATABASE"
152
+
153
+ # Git irreversible en remoto
154
+ "git push --force"
155
+ "git push -f"
156
+ "git push --force-with-lease" # requiere confirmación también
157
+ "git push origin :main"
158
+ "git push origin :master"
159
+
160
+ # Git destructivo local
161
+ "git reset --hard"
162
+ "git clean -fd"
163
+ "git clean -fxd"
164
+ "git reflog expire"
165
+ "git gc --prune=now"
166
+
167
+ # Credenciales y tokens en git
168
+ "git config --global credential"
169
+ "git config --global user.password"
170
+ )
171
+
172
+ COMANDOS_CONFIRMAR=(
173
+ # Eliminación de archivos (no masiva)
174
+ "rm -rf"
175
+ "rm -r"
176
+ "Remove-Item -Recurse" # PowerShell
177
+
178
+ # Base de datos
179
+ "DROP TABLE"
180
+ "DROP INDEX"
181
+ "DELETE FROM"
182
+ "TRUNCATE TABLE"
183
+
184
+ # Git local reversible
185
+ "git reset"
186
+ "git stash drop"
187
+ "git branch -D"
188
+ "git tag -d"
189
+
190
+ # Publicación / deploy
191
+ "npm publish"
192
+ "pnpm publish"
193
+ "yarn publish"
194
+ "pip publish"
195
+ "cargo publish"
196
+ "docker push"
197
+ "terraform apply"
198
+ "terraform destroy"
199
+ "kubectl delete"
200
+ "helm uninstall"
201
+
202
+ # Otros
203
+ "pip uninstall"
204
+ "npm uninstall"
205
+ )
206
+
207
+ verificar_comandos() {
208
+ local CMD="${SDD_COMANDO:-}"
209
+ [ -z "$CMD" ] && return 0
210
+
211
+ # Prohibidos absolutos
212
+ for PROHIBIDO in "${COMANDOS_PROHIBIDOS[@]}"; do
213
+ if echo "$CMD" | grep -qi "$PROHIBIDO"; then
214
+ bloquear "Comando prohibido detectado: '$CMD' contiene '$PROHIBIDO'. Este comando puede causar daño irreversible y nunca debe ejecutarse automáticamente."
215
+ fi
216
+ done
217
+
218
+ # Requieren confirmación explícita
219
+ for PELIGROSO in "${COMANDOS_CONFIRMAR[@]}"; do
220
+ if echo "$CMD" | grep -qi "$PELIGROSO"; then
221
+ confirmar \
222
+ "El agente quiere ejecutar un comando potencialmente destructivo." \
223
+ "$CMD"
224
+ break
225
+ fi
226
+ done
227
+ }
228
+
229
+ # ============================================================
230
+ # BLOQUE 3 — Protección de rama git
231
+ # ============================================================
232
+
233
+ RAMAS_PROTEGIDAS=("main" "master" "develop" "release" "production" "prod" "staging")
234
+
235
+ verificar_rama_git() {
236
+ [ ! -d .git ] && return 0
237
+ [ "${SDD_SKIP_RAMA_CHECK:-}" = "true" ] && return 0
238
+
239
+ local RAMA
240
+ RAMA=$(git branch --show-current 2>/dev/null || echo "")
241
+ [ -z "$RAMA" ] && return 0
242
+
243
+ for PROTEGIDA in "${RAMAS_PROTEGIDAS[@]}"; do
244
+ if [ "$RAMA" = "$PROTEGIDA" ]; then
245
+ advertir "Estás en la rama protegida '${RAMA}'. Las implementaciones deberían hacerse en ramas de feature."
246
+ echo -e " ¿Continuar implementando directamente en ${BOLD}${RAMA}${NC}? (s/N)"
247
+ read -r RESP
248
+ if [ "$RESP" != "s" ] && [ "$RESP" != "S" ]; then
249
+ bloquear "Implementación cancelada — rama protegida '$RAMA'. Crea una rama de feature primero."
250
+ fi
251
+ log "ADVERTENCIA" "Usuario eligió implementar en rama protegida: $RAMA"
252
+ break
253
+ fi
254
+ done
255
+ }
256
+
257
+ # ============================================================
258
+ # BLOQUE 4 — Push automático bloqueado
259
+ # ============================================================
260
+ # SDD-ES nunca hace git push sin confirmación explícita.
261
+ # Si el agente intenta un push, se intercepta aquí.
262
+
263
+ verificar_push() {
264
+ local CMD="${SDD_COMANDO:-}"
265
+ [ -z "$CMD" ] && return 0
266
+
267
+ if echo "$CMD" | grep -q "git push"; then
268
+ # ¿Es un push sin --force?
269
+ if ! echo "$CMD" | grep -qE "\-\-force|\-f\b"; then
270
+ confirmar \
271
+ "El agente quiere hacer git push. ¿Confirmás que el código está listo para subir al remoto?" \
272
+ "$CMD"
273
+ fi
274
+ # Si tiene --force ya fue bloqueado en BLOQUE 2
275
+ fi
276
+ }
277
+
278
+ # ============================================================
279
+ # BLOQUE 5 — Detección de secrets hardcodeados
280
+ # ============================================================
281
+ # Escaneo rápido de archivos que el agente generó/modificó.
282
+
283
+ escanear_secrets() {
284
+ [ -z "${SDD_ARCHIVOS:-}" ] && return 0
285
+
286
+ local PATRONES_SECRET=(
287
+ "password\s*=\s*['\"][^'\"]{4,}"
288
+ "secret\s*=\s*['\"][^'\"]{4,}"
289
+ "api_key\s*=\s*['\"][^'\"]{4,}"
290
+ "apikey\s*=\s*['\"][^'\"]{4,}"
291
+ "token\s*=\s*['\"][^'\"]{10,}"
292
+ "private_key\s*=\s*['\"][^'\"]{10,}"
293
+ "BEGIN RSA PRIVATE KEY"
294
+ "BEGIN EC PRIVATE KEY"
295
+ "BEGIN OPENSSH PRIVATE KEY"
296
+ "AWS_SECRET_ACCESS_KEY"
297
+ "GITHUB_TOKEN\s*=\s*['\"][^'\"]"
298
+ "sk-[a-zA-Z0-9]{20,}" # OpenAI key pattern
299
+ "xox[baprs]-[0-9]" # Slack token pattern
300
+ )
301
+
302
+ for ARCHIVO in $SDD_ARCHIVOS; do
303
+ [ ! -f "$ARCHIVO" ] && continue
304
+ for PATRON in "${PATRONES_SECRET[@]}"; do
305
+ if grep -qiP "$PATRON" "$ARCHIVO" 2>/dev/null; then
306
+ bloquear "Secret hardcodeado detectado en '$ARCHIVO' (patrón: $PATRON). Usa variables de entorno o un secret manager — NUNCA valores reales en código."
307
+ fi
308
+ done
309
+ done
310
+ }
311
+
312
+ # ============================================================
313
+ # BLOQUE 6 — Verificación de .gitignore para archivos nuevos
314
+ # ============================================================
315
+ # Si el agente crea un archivo que debería estar en .gitignore, advierte.
316
+
317
+ verificar_gitignore() {
318
+ [ ! -d .git ] && return 0
319
+ [ -z "${SDD_ARCHIVOS:-}" ] && return 0
320
+
321
+ local DEBERIAN_IGNORARSE=(
322
+ ".env"
323
+ "*.key"
324
+ "*.pem"
325
+ "node_modules"
326
+ "dist"
327
+ "build"
328
+ "__pycache__"
329
+ "*.pyc"
330
+ "*.log"
331
+ ".DS_Store"
332
+ "Thumbs.db"
333
+ )
334
+
335
+ for ARCHIVO in $SDD_ARCHIVOS; do
336
+ local NOMBRE
337
+ NOMBRE=$(basename "$ARCHIVO")
338
+ for PATRON in "${DEBERIAN_IGNORARSE[@]}"; do
339
+ # shellcheck disable=SC2254
340
+ case "$NOMBRE" in
341
+ $PATRON)
342
+ if ! git check-ignore -q "$ARCHIVO" 2>/dev/null; then
343
+ advertir "'$ARCHIVO' debería estar en .gitignore pero no lo está."
344
+ fi
345
+ ;;
346
+ esac
347
+ done
348
+ done
349
+ }
350
+
351
+ # ============================================================
352
+ # EJECUCIÓN EN ORDEN
353
+ # ============================================================
354
+
355
+ echo -e "${GREEN}🛡️ Guardia de seguridad SDD-ES${NC}"
356
+
357
+ proteger_archivos_sensibles
358
+ verificar_comandos
359
+ verificar_rama_git
360
+ verificar_push
361
+ escanear_secrets
362
+ verificar_gitignore
363
+
364
+ echo -e "${GREEN}✅ Verificaciones de seguridad pasadas${NC}"
365
+ log "OK" "Todas las verificaciones pasaron — ${SDD_COMANDO:-sin comando}"
366
+
367
+ exit 0
@@ -0,0 +1,310 @@
1
+ # ============================================================
2
+ # SDD-ES — Configuración del Plugin
3
+ # ============================================================
4
+ # Este archivo se copia a `.sdd/sdd.config.yaml` al inicializar.
5
+ # Edítalo para personalizar el comportamiento del plugin.
6
+ # ============================================================
7
+
8
+ # IDIOMA — todos los artefactos generados estarán en este idioma
9
+ idioma: español
10
+
11
+ # PERFIL — cómo se conduce el flujo con el usuario
12
+ # experto → controla el stack y las decisiones técnicas (flujo normal)
13
+ # guiado → no programa: el sistema decide lo técnico, explica sin jerga,
14
+ # confirma antes de actuar y encadena los pasos automáticamente.
15
+ # Lo establece /sdd.constitucion. El rigor del producto NO cambia.
16
+ perfil: experto
17
+
18
+ # ============================================================
19
+ # AGENTES — activa/desactiva y asigna modelo a cada agente
20
+ # ============================================================
21
+ # Modelos recomendados (al momento, 2026):
22
+ # - opus → Tareas complejas: razonamiento profundo, revisión, BD, arquitectura
23
+ # - sonnet → Implementación: código, tests, docs, operaciones (uso general)
24
+ # - haiku → Tareas simples: estados, verificaciones rápidas, formateo
25
+ #
26
+ # Recomendación de Anthropic: usa el modelo MÁS PEQUEÑO que resuelva el problema
27
+ # bien. Subir de tier solo si el agente falla repetidamente.
28
+ # ============================================================
29
+
30
+ agentes:
31
+ # ---------- Diseño y arquitectura ----------
32
+ arquitecto:
33
+ activo: true
34
+ modelo: opus # Recomendado: opus (decisiones difíciles de revertir)
35
+ descripcion: "Toma decisiones de arquitectura del sistema y diseño técnico de alto nivel."
36
+
37
+ disenador-api:
38
+ activo: true
39
+ modelo: sonnet # Recomendado: sonnet (contratos estructurados)
40
+ descripcion: "Diseña contratos de API (OpenAPI, GraphQL, gRPC, eventos)."
41
+
42
+ asesor-datos:
43
+ activo: true
44
+ modelo: opus # Recomendado: opus (errores en BD son costosos de revertir)
45
+ descripcion: "Diseño de esquemas, queries, índices, migraciones, performance de BD."
46
+
47
+ # ---------- Implementación ----------
48
+ desarrollador-backend:
49
+ activo: true
50
+ modelo: sonnet # Recomendado: sonnet (codificación)
51
+ descripcion: "Implementa lógica de servidor: servicios, APIs, manejo de datos."
52
+
53
+ desarrollador-frontend:
54
+ activo: true
55
+ modelo: sonnet # Recomendado: sonnet (codificación)
56
+ descripcion: "Implementa UI: componentes, vistas, estado del cliente."
57
+ # Desactívalo si tu proyecto es backend-only:
58
+ # activo: false
59
+
60
+ operaciones:
61
+ activo: true
62
+ modelo: sonnet # Recomendado: sonnet
63
+ descripcion: "CI/CD, despliegues, infraestructura, configuración."
64
+
65
+ # ---------- Calidad ----------
66
+ tester:
67
+ activo: true
68
+ modelo: sonnet # Recomendado: sonnet (genera tests útiles)
69
+ descripcion: "Genera y ejecuta tests unitarios, integración y E2E."
70
+
71
+ revisor:
72
+ activo: true
73
+ modelo: opus # Recomendado: opus (revisión profunda atrapa más bugs)
74
+ descripcion: "Revisa código contra spec, calidad y constitución."
75
+
76
+ critico:
77
+ activo: true
78
+ modelo: opus # Recomendado: opus (encontrar puntos ciegos requiere abstracción)
79
+ descripcion: "Identifica riesgos, puntos ciegos y asunciones del plan."
80
+
81
+ seguridad:
82
+ activo: true
83
+ modelo: opus # Recomendado: opus (auditoría de seguridad seria)
84
+ descripcion: "Audita vulnerabilidades en cambios sensibles."
85
+
86
+ documentador:
87
+ activo: false # Desactivado por defecto — actívalo si tu proyecto requiere docs formales
88
+ modelo: sonnet
89
+ descripcion: "Genera documentación técnica útil (no obvia)."
90
+
91
+ investigador:
92
+ activo: true # Recopila contexto técnico antes de especificar
93
+ modelo: sonnet
94
+ descripcion: "Analiza el proyecto existente — stack, patrones, deuda técnica — antes de especificar."
95
+
96
+ # ============================================================
97
+ # RUTAS — dónde se generan los artefactos SDD
98
+ # ============================================================
99
+ rutas:
100
+ raiz_sdd: ".sdd" # Raíz del estado SDD
101
+ constitucion: ".sdd/memoria/constitucion.md"
102
+ estado_global: ".sdd/estado.json"
103
+ especificaciones: ".sdd/especificaciones" # specs/YYYY-MM-DD-slug/
104
+ cambios: ".sdd/cambios" # Registro cronológico
105
+ arquitectura: ".sdd/arquitectura" # ADRs (Decisiones)
106
+ dominio: ".sdd/dominio" # Glosario y definiciones
107
+ indice: ".sdd/INDICE.md"
108
+ snapshot: ".sdd/SNAPSHOT.md"
109
+
110
+ # ============================================================
111
+ # COMPORTAMIENTO — cómo opera el flujo
112
+ # ============================================================
113
+ comportamiento:
114
+ # Detección automática del tamaño del cambio
115
+ deteccion_tamano_automatica: true
116
+
117
+ # Para cambios micro (≤3 archivos, <10 líneas), generar spec+plan+tareas en un paso
118
+ ruta_rapida_micro: true
119
+
120
+ # Marcadores que se insertan cuando la información es ambigua
121
+ marcador_clarificacion: "[NECESITA_ACLARACION]"
122
+ marcador_pendiente: "[PENDIENTE]"
123
+ marcador_decidir: "[POR_DECIDIR]"
124
+
125
+ # Numeración automática de especificaciones
126
+ numeracion_especificaciones: "fecha" # "fecha" | "secuencial" | "ambos"
127
+ # fecha: YYYY-MM-DD-nombre-slug
128
+ # secuencial: 001-nombre-slug
129
+ # ambos: 2026-06-08-001-nombre-slug
130
+
131
+ # Confirmación antes de implementar
132
+ requerir_aprobacion_plan: true
133
+ requerir_aprobacion_tareas: false
134
+
135
+ # Versionado semántico de la constitución
136
+ versionado_constitucion: true
137
+
138
+ # ============================================================
139
+ # CONTROL DE VERSIONES — completamente opcional
140
+ # ============================================================
141
+ # SDD-ES NO se acopla a Git, GitLab, ni ningún VCS.
142
+ # Esta sección es solo para que TUS hooks personalizados
143
+ # puedan leer la preferencia.
144
+ control_versiones:
145
+ sistema: "git" # "git" | "mercurial" | "ninguno" | "otro"
146
+ crear_ramas: false # Si tu flujo usa una rama por feature, escribe tu propio hook
147
+ hacer_commits: false
148
+
149
+ # ============================================================
150
+ # CALIDAD — umbrales que el agente revisor aplica
151
+ # ============================================================
152
+ calidad:
153
+ cobertura_tests_minima: 80
154
+ permitir_warnings_lint: false
155
+ permitir_codigo_comentado: false
156
+ longitud_funcion_maxima: 50
157
+ longitud_archivo_maxima: 400
158
+
159
+ # ============================================================
160
+ # PROTECCIONES — archivos/comandos que SDD no toca
161
+ # ============================================================
162
+ # Esta sección es DECLARATIVA — los valores son leídos por
163
+ # guardia-seguridad.sh (hooks-ejemplo/guardia-seguridad.sh).
164
+ # Para activar las protecciones, copia ese hook a .sdd/hooks/.
165
+ # ============================================================
166
+ protecciones:
167
+ # Archivos que los agentes NUNCA deben leer ni escribir
168
+ no_tocar_archivos:
169
+ - ".env*"
170
+ - "*.pem"
171
+ - "*.key"
172
+ - "*.p12"
173
+ - "secrets/**"
174
+ - "**/credentials*"
175
+ - "**/*secret*"
176
+ - ".aws/credentials"
177
+ - ".ssh/*"
178
+ - ".sdd/memoria/constitucion.md" # solo /sdd.constitucion lo edita
179
+
180
+ # Comandos que se bloquean sin excepción (nunca se ejecutan)
181
+ comandos_prohibidos:
182
+ - "rm -rf /"
183
+ - "rm -rf ~"
184
+ - "rm -rf ."
185
+ - "DROP DATABASE"
186
+ - "DROP SCHEMA"
187
+ - "git push --force"
188
+ - "git push -f"
189
+ - "git reset --hard"
190
+ - "git clean -fxd"
191
+
192
+ # Comandos que requieren confirmación explícita del usuario (escribir "SI")
193
+ requerir_confirmacion:
194
+ - "rm -rf"
195
+ - "DROP TABLE"
196
+ - "DELETE FROM"
197
+ - "TRUNCATE"
198
+ - "git reset"
199
+ - "git branch -D"
200
+ - "git push"
201
+ - "npm publish"
202
+ - "pip uninstall"
203
+ - "terraform apply"
204
+ - "terraform destroy"
205
+ - "kubectl delete"
206
+ - "helm uninstall"
207
+ - "docker push"
208
+
209
+ # Ramas protegidas — requieren confirmación para implementar directamente
210
+ ramas_protegidas:
211
+ - main
212
+ - master
213
+ - develop
214
+ - release
215
+ - production
216
+ - staging
217
+
218
+ # ============================================================
219
+ # FIGMA — integración con el MCP sdd-figma-mcp
220
+ # ============================================================
221
+ # Si tu proyecto tiene diseños en Figma, define aquí el file_key.
222
+ # El orquestador de /sdd.implementar lo usa automáticamente
223
+ # cuando detecta tareas de tipo UI/frontend.
224
+ #
225
+ # Para obtener el file_key: abre el archivo en Figma → URL:
226
+ # figma.com/file/ESTE_ES_EL_FILE_KEY/nombre-del-archivo
227
+ # ============================================================
228
+ figma:
229
+ # Activa la integración con Figma en tareas de frontend
230
+ # Requiere: FIGMA_PAT en variables de entorno
231
+ enabled: false
232
+
233
+ # Clave del archivo principal de diseño del proyecto
234
+ # file_key: "REEMPLAZA_CON_TU_FILE_KEY"
235
+
236
+ # Si quieres un archivo diferente por sección (opcional)
237
+ # archivos:
238
+ # componentes: "KEY_DEL_ARCHIVO_DE_COMPONENTES"
239
+ # pantallas: "KEY_DEL_ARCHIVO_DE_PANTALLAS"
240
+
241
+ # Comportamiento automático en /sdd.implementar
242
+ auto_analizar_sistema_diseño: true # Siempre analiza antes de implementar UI
243
+ auto_mapear_si_file_key: true # Mapea estilos si file_key está definido
244
+ bloquear_si_tokens_sin_mapear: false # Si true, pide confirmación antes de continuar
245
+
246
+ # ============ MAPAS Y INDEXACIÓN ============
247
+ mapeos:
248
+ enabled: true
249
+ # Modo de actualización: "manual" | "perezoso" | "automático"
250
+ modo_actualizacion: perezoso
251
+
252
+ # Detecta archivos nuevos automáticamente
253
+ validacion_perezosa: true
254
+
255
+ # Lenguajes a indexar
256
+ lenguajes:
257
+ - typescript
258
+ - javascript
259
+ - python
260
+ - rust
261
+ - go
262
+ - java
263
+ - csharp
264
+ - ruby
265
+ - php
266
+
267
+ # Directorios a ignorar (como .gitignore)
268
+ ignorar:
269
+ - node_modules
270
+ - dist
271
+ - build
272
+ - target
273
+ - vendor
274
+ - __pycache__
275
+ - .git
276
+ - .sdd
277
+
278
+ # ============ COMPRESIÓN DE TOKENS ============
279
+ compresion:
280
+ # Activar compresión
281
+ enabled: true
282
+
283
+ # Modo global de salida
284
+ # "normal" | "lite" | "full" | "ultra"
285
+ modo_salida_usuario: lite
286
+
287
+ # Modo de comunicación entre agentes (usuario no ve)
288
+ # "normal" | "lite" | "full" | "ultra"
289
+ modo_agentes_internos: ultra
290
+
291
+ # Comprimir archivos internos del plugin (commands, agents, skills)
292
+ # CUIDADO: hace menos legibles para editar
293
+ comprimir_plugin: false
294
+
295
+ # Términos técnicos que NUNCA se abrevian
296
+ preservar_terminos:
297
+ - autenticación
298
+ - autorización
299
+ - verificación
300
+ - base de datos
301
+ - algoritmo
302
+
303
+ # Patrones que NUNCA se comprimen (regex)
304
+ patrones_protegidos:
305
+ - PELIGRO
306
+ - CUIDADO
307
+ - "NO USAR EN PRODUCCIÓN"
308
+ - ELIMINAR
309
+ - BORRAR
310
+ - irreversible