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.
- package/.claude/settings.json +51 -0
- package/.claude-plugin/marketplace.json +31 -0
- package/.claude-plugin/plugin.json +97 -0
- package/README.md +332 -0
- package/agents/arquitecto.md +148 -0
- package/agents/asesor-datos.md +163 -0
- package/agents/critico.md +142 -0
- package/agents/desarrollador-backend.md +242 -0
- package/agents/desarrollador-frontend.md +120 -0
- package/agents/disenador-api.md +108 -0
- package/agents/documentador.md +177 -0
- package/agents/investigador.md +174 -0
- package/agents/operaciones.md +105 -0
- package/agents/revisor.md +153 -0
- package/agents/seguridad.md +216 -0
- package/agents/tester.md +286 -0
- package/claude-hooks/post-write-conventions.js +412 -0
- package/claude-hooks/pre-tool-guard.js +159 -0
- package/cli/index.js +401 -0
- package/commands/sdd.aclarar.md +200 -0
- package/commands/sdd.analizar.md +241 -0
- package/commands/sdd.ayuda.md +227 -0
- package/commands/sdd.canary.md +60 -0
- package/commands/sdd.checklist.md +174 -0
- package/commands/sdd.comprimir.md +166 -0
- package/commands/sdd.configurar.md +195 -0
- package/commands/sdd.constitucion.md +343 -0
- package/commands/sdd.crear-app.md +168 -0
- package/commands/sdd.crear-mcp.md +174 -0
- package/commands/sdd.descubrir.md +269 -0
- package/commands/sdd.desplegar.md +155 -0
- package/commands/sdd.especificar.md +302 -0
- package/commands/sdd.estado.md +124 -0
- package/commands/sdd.glosario.md +108 -0
- package/commands/sdd.implementar.md +377 -0
- package/commands/sdd.importar.md +91 -0
- package/commands/sdd.mapear.md +120 -0
- package/commands/sdd.md +119 -0
- package/commands/sdd.planificar.md +372 -0
- package/commands/sdd.qa.md +108 -0
- package/commands/sdd.release.md +253 -0
- package/commands/sdd.retro.md +82 -0
- package/commands/sdd.snapshot.md +122 -0
- package/commands/sdd.tareas.md +300 -0
- package/commands/sdd.verificar.md +239 -0
- package/configuracion-ejemplo/hooks-ejemplo/antes_cada_tarea.sh +18 -0
- package/configuracion-ejemplo/hooks-ejemplo/antes_implementar.sh +45 -0
- package/configuracion-ejemplo/hooks-ejemplo/despues_especificar.sh +14 -0
- package/configuracion-ejemplo/hooks-ejemplo/despues_implementar.sh +36 -0
- package/configuracion-ejemplo/hooks-ejemplo/despues_planificar.sh +19 -0
- package/configuracion-ejemplo/hooks-ejemplo/guardia-seguridad.sh +367 -0
- package/configuracion-ejemplo/sdd.config.yaml +310 -0
- package/docs/AGENTES.md +74 -0
- package/docs/COMPRESION.md +155 -0
- package/docs/EJEMPLO-PRACTICA.md +383 -0
- package/docs/EJEMPLOS.md +212 -0
- package/docs/FABRICA.md +185 -0
- package/docs/FILOSOFIA.md +61 -0
- package/docs/FLUJO.md +149 -0
- package/docs/INICIO-RAPIDO.md +116 -0
- package/docs/MAPAS.md +113 -0
- package/docs/MODELOS.md +103 -0
- package/docs/PERSONALIZACION.md +152 -0
- package/instalar.ps1 +39 -0
- package/instalar.sh +22 -0
- package/mcp-figma/README.md +158 -0
- package/mcp-figma/package.json +7 -0
- package/mcp-figma/src/component-generator.js +162 -0
- package/mcp-figma/src/design-system-analyzer.js +247 -0
- package/mcp-figma/src/figma-client.js +75 -0
- package/mcp-figma/src/index.js +114 -0
- package/mcp-figma/src/mcp.js +97 -0
- package/mcp-figma/src/style-mapper.js +85 -0
- package/package.json +50 -0
- package/plantillas/analisis.md +57 -0
- package/plantillas/checklist-especificacion.md +66 -0
- package/plantillas/constitucion.md +104 -0
- package/plantillas/decision-arquitectura.md +39 -0
- package/plantillas/dependencias-mapa.md +89 -0
- package/plantillas/especificacion.md +108 -0
- package/plantillas/estructura-mapa.md +40 -0
- package/plantillas/glosario.md +22 -0
- package/plantillas/index-especificaciones.md +15 -0
- package/plantillas/mcp-server.md +147 -0
- package/plantillas/plan.md +152 -0
- package/plantillas/simbolos-mapa.md +57 -0
- package/plantillas/snapshot.md +54 -0
- package/plantillas/tareas.md +72 -0
- package/presets/enterprise.yaml +69 -0
- package/presets/lean.yaml +63 -0
- package/presets/startup.yaml +67 -0
- package/skills/compresion-tokens.md +264 -0
- package/skills/constitucion-constraint.md +78 -0
- package/skills/deteccion-stack.md +175 -0
- package/skills/enrutador-agentes.md +69 -0
- package/skills/gestion-estado.md +114 -0
- package/skills/indexador.md +199 -0
- package/skills/modo-guiado/SKILL.md +78 -0
- package/skills/orquestacion-ptc/SKILL.md +96 -0
- package/skills/validacion-spec.md +52 -0
- 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
|