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,343 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Crea o actualiza la constitución del proyecto — el documento fundacional con los principios que guían toda generación posterior. Versionado semántico.
|
|
3
|
+
allowed-tools: Read, Write, Edit, Bash
|
|
4
|
+
handoffs:
|
|
5
|
+
- etiqueta: "Especificar una feature"
|
|
6
|
+
comando: sdd.especificar
|
|
7
|
+
prompt: "Implementa una feature basada en la constitución actualizada. Quiero construir..."
|
|
8
|
+
- etiqueta: "Configurar agentes y modelos"
|
|
9
|
+
comando: sdd.configurar
|
|
10
|
+
prompt: "Ajusta qué agentes están activos y qué modelo usa cada uno."
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# /sdd.constitucion — Constitución del Proyecto
|
|
14
|
+
|
|
15
|
+
Eres el **Arquitecto de Principios**. Estableces el documento fundacional que toda generación posterior debe respetar.
|
|
16
|
+
|
|
17
|
+
## VERIFICACIONES PRE-EJECUCIÓN
|
|
18
|
+
|
|
19
|
+
**Verificar hooks personalizados:**
|
|
20
|
+
```bash
|
|
21
|
+
if [ -f ".sdd/hooks/antes_constitucion.sh" ]; then
|
|
22
|
+
echo "Ejecutando hook antes_constitucion..."
|
|
23
|
+
bash .sdd/hooks/antes_constitucion.sh
|
|
24
|
+
fi
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## PASO 1 — Detectar estado actual
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Estado del proyecto
|
|
31
|
+
mkdir -p .sdd/memoria .sdd/especificaciones .sdd/cambios .sdd/arquitectura .sdd/dominio .sdd/hooks
|
|
32
|
+
|
|
33
|
+
if [ -f ".sdd/memoria/constitucion.md" ]; then
|
|
34
|
+
echo "CONSTITUCION_EXISTE"
|
|
35
|
+
cat .sdd/memoria/constitucion.md | head -10
|
|
36
|
+
else
|
|
37
|
+
echo "CONSTITUCION_NUEVA"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# Detectar configuración
|
|
41
|
+
if [ -f ".sdd/sdd.config.yaml" ]; then
|
|
42
|
+
echo "CONFIG_EXISTE"
|
|
43
|
+
else
|
|
44
|
+
echo "CONFIG_NUEVA — copiando defaults"
|
|
45
|
+
# Aquí se copia configuracion-ejemplo/sdd.config.yaml a .sdd/sdd.config.yaml
|
|
46
|
+
fi
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## PASO 2 — Detectar stack automáticamente
|
|
50
|
+
|
|
51
|
+
Invoca la skill `deteccion-stack`. NO preguntes al usuario lo que se puede detectar:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Lenguaje y framework
|
|
55
|
+
ls package.json pyproject.toml Cargo.toml go.mod pom.xml build.gradle composer.json mix.exs Gemfile *.csproj 2>/dev/null
|
|
56
|
+
[ -f package.json ] && cat package.json | head -40
|
|
57
|
+
[ -f pyproject.toml ] && cat pyproject.toml | head -30
|
|
58
|
+
[ -f Cargo.toml ] && cat Cargo.toml | head -20
|
|
59
|
+
|
|
60
|
+
# Estructura de carpetas relevante
|
|
61
|
+
find . -maxdepth 3 -type d \
|
|
62
|
+
-not -path '*/node_modules*' \
|
|
63
|
+
-not -path '*/.git*' \
|
|
64
|
+
-not -path '*/target*' \
|
|
65
|
+
-not -path '*/__pycache__*' \
|
|
66
|
+
-not -path '*/dist*' \
|
|
67
|
+
-not -path '*/build*' \
|
|
68
|
+
-not -path '*/.sdd*' | head -30
|
|
69
|
+
|
|
70
|
+
# Tests existentes
|
|
71
|
+
ls test/ tests/ __tests__/ spec/ 2>/dev/null
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## PASO 3 — Detectar el perfil del usuario
|
|
75
|
+
|
|
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
|
+
|
|
78
|
+
Pregunta una sola vez (o infiérelo de cómo escribe el usuario):
|
|
79
|
+
|
|
80
|
+
> ¿Cómo prefieres trabajar?
|
|
81
|
+
> **a) Guiado** — no programo (o muy poco). Quiero que tú decidas lo técnico y me expliques en palabras simples. Tú eliges el stack.
|
|
82
|
+
> **b) Experto** — sé programar. Quiero control del stack y de las decisiones técnicas.
|
|
83
|
+
|
|
84
|
+
Reglas de inferencia (si el usuario no responde explícitamente):
|
|
85
|
+
- Señales de **guiado**: "no sé programar", "quiero una app/herramienta que…", describe el producto por su función y no por su tecnología, pide que "lo hagas tú".
|
|
86
|
+
- Señales de **experto**: menciona lenguajes/frameworks/BD concretos, pide control de arquitectura, usa jerga técnica.
|
|
87
|
+
- Ante la duda → **guiado** (es el modo más seguro: explica más y confirma antes de actuar).
|
|
88
|
+
|
|
89
|
+
**En perfil `guiado`:**
|
|
90
|
+
- El stack se **recomienda automáticamente** según el tipo de producto. NO obligues al usuario a elegir tecnología. Defaults sensatos:
|
|
91
|
+
- "app web" / "página" / "sitio" → Node + Vite + SQLite
|
|
92
|
+
- "API" / "backend" / "servicio" → Node + Express + SQLite
|
|
93
|
+
- "bot" / "automatización" / "script" → Python
|
|
94
|
+
- "herramienta para Claude / asistente / integración" → servidor MCP en Node (ver `/sdd.crear-mcp`)
|
|
95
|
+
- Si no encaja, elige el más simple que cumpla y **explica en una frase por qué**.
|
|
96
|
+
- 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
|
+
|
|
98
|
+
**En perfil `experto`:** sigue el flujo técnico normal (el usuario define o confirma el stack).
|
|
99
|
+
|
|
100
|
+
Guarda el perfil elegido — se persiste en `.sdd/sdd.config.yaml` (`perfil: guiado|experto`) en el PASO 6.5 y en `estado.json` en el PASO 7.
|
|
101
|
+
|
|
102
|
+
## PASO 3.5 — Recopilar valores
|
|
103
|
+
|
|
104
|
+
Si la constitución **NO existe**, conduce una conversación corta y eficiente. NO uses formulario rígido — adapta las preguntas al stack detectado y al **perfil**.
|
|
105
|
+
|
|
106
|
+
Preguntas obligatorias (haz una a la vez, o agrupadas):
|
|
107
|
+
|
|
108
|
+
1. **Propósito**: ¿Cuál es el propósito del proyecto en 1-2 frases?
|
|
109
|
+
2. **Audiencia**: ¿Quién consume esto? (equipo interno, usuarios externos, otro servicio)
|
|
110
|
+
3. **No-negociables**: ¿Qué estándares son innegociables? (tests obligatorios, sin warnings, tipado estricto, etc.)
|
|
111
|
+
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
|
+
|
|
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.
|
|
114
|
+
|
|
115
|
+
Si la constitución **YA existe**, lee los placeholders pendientes y pregunta solo por esos. Determina el tipo de cambio para el versionado:
|
|
116
|
+
|
|
117
|
+
- **MAYOR**: principios removidos o redefinidos de forma incompatible
|
|
118
|
+
- **MENOR**: principios o secciones nuevos
|
|
119
|
+
- **PARCHE**: aclaraciones, errores tipográficos, refinamientos no semánticos
|
|
120
|
+
|
|
121
|
+
Propón el incremento de versión y muestra el razonamiento.
|
|
122
|
+
|
|
123
|
+
## PASO 4 — Generar la constitución
|
|
124
|
+
|
|
125
|
+
Lee la plantilla `plantillas/constitucion.md` (si existe en el plugin) y completa todos los placeholders `[VALOR]` con los datos recopilados.
|
|
126
|
+
|
|
127
|
+
Si no hay plantilla, usa esta estructura:
|
|
128
|
+
|
|
129
|
+
```markdown
|
|
130
|
+
<!--
|
|
131
|
+
INFORME DE IMPACTO DE SINCRONIZACIÓN
|
|
132
|
+
====================================
|
|
133
|
+
Cambio de versión: [ANTERIOR] → [NUEVA]
|
|
134
|
+
Tipo de cambio: [MAYOR | MENOR | PARCHE]
|
|
135
|
+
|
|
136
|
+
Principios modificados:
|
|
137
|
+
- [Lista de principios añadidos/removidos/renombrados]
|
|
138
|
+
|
|
139
|
+
Plantillas que requieren actualización:
|
|
140
|
+
- plantillas/especificacion.md [✅ alineada | ⚠ pendiente]
|
|
141
|
+
- plantillas/plan.md [✅ | ⚠]
|
|
142
|
+
- plantillas/tareas.md [✅ | ⚠]
|
|
143
|
+
- commands/*.md [✅ | ⚠]
|
|
144
|
+
|
|
145
|
+
TODOs diferidos:
|
|
146
|
+
- [Lista]
|
|
147
|
+
-->
|
|
148
|
+
|
|
149
|
+
# Constitución del Proyecto: [NOMBRE_PROYECTO]
|
|
150
|
+
|
|
151
|
+
> Versión: **[X.Y.Z]** | Ratificada: [FECHA_RATIFICACIÓN] | Última enmienda: [FECHA_HOY]
|
|
152
|
+
|
|
153
|
+
## Propósito y Misión
|
|
154
|
+
|
|
155
|
+
[Descripción del propósito en 2-3 frases. DEBE explicar qué problema resuelve y para quién.]
|
|
156
|
+
|
|
157
|
+
## Stack Técnico
|
|
158
|
+
|
|
159
|
+
| Aspecto | Valor |
|
|
160
|
+
|---------|-------|
|
|
161
|
+
| Lenguaje principal | [LENGUAJE] |
|
|
162
|
+
| Framework | [FRAMEWORK o "ninguno"] |
|
|
163
|
+
| Almacenamiento | [BD/STORAGE o "por definir"] |
|
|
164
|
+
| Tests | [FRAMEWORK_TESTS o "por definir"] |
|
|
165
|
+
| Build/Bundler | [HERRAMIENTA] |
|
|
166
|
+
| Despliegue | [DESTINO] |
|
|
167
|
+
|
|
168
|
+
> Cualquier cambio de stack requiere un ADR (Architecture Decision Record) en `.sdd/arquitectura/`.
|
|
169
|
+
|
|
170
|
+
## Principios Fundamentales
|
|
171
|
+
|
|
172
|
+
### Principio I: [NOMBRE_PRINCIPIO_1]
|
|
173
|
+
[Descripción declarativa y testeable. Usa MUST/MUST NOT/SHOULD/MAY explícitamente.]
|
|
174
|
+
|
|
175
|
+
**Razón:** [Por qué este principio existe]
|
|
176
|
+
|
|
177
|
+
### Principio II: [NOMBRE_PRINCIPIO_2]
|
|
178
|
+
[Descripción]
|
|
179
|
+
|
|
180
|
+
**Razón:** [Por qué]
|
|
181
|
+
|
|
182
|
+
[... continuar con todos los principios ...]
|
|
183
|
+
|
|
184
|
+
## Estándares de Calidad
|
|
185
|
+
|
|
186
|
+
- **Tests**: cobertura mínima [X]%. Tests obligatorios para [áreas].
|
|
187
|
+
- **Linting**: [HERRAMIENTA] con configuración estricta. Sin warnings en CI.
|
|
188
|
+
- **Tipos**: [Estricto/Opcional]. [Detalles del checker].
|
|
189
|
+
- **Formato**: [HERRAMIENTA]. Aplicado automáticamente.
|
|
190
|
+
- **Revisión**: cada cambio pasa por el agente `revisor` antes de marcar tareas como completas.
|
|
191
|
+
|
|
192
|
+
## Restricciones Arquitectónicas
|
|
193
|
+
|
|
194
|
+
[Lista de cosas que NUNCA hay que hacer. Ejemplos:]
|
|
195
|
+
|
|
196
|
+
- NO agregar dependencias nuevas sin ADR
|
|
197
|
+
- NO romper la API pública sin bump de versión MAYOR
|
|
198
|
+
- NO mezclar lógica de presentación con dominio
|
|
199
|
+
- NO consultar BD directamente desde controladores
|
|
200
|
+
- [...]
|
|
201
|
+
|
|
202
|
+
## Convenciones
|
|
203
|
+
|
|
204
|
+
### Nomenclatura
|
|
205
|
+
- Archivos: [convención específica al lenguaje]
|
|
206
|
+
- Variables: [convención]
|
|
207
|
+
- Constantes: [convención]
|
|
208
|
+
- Tipos/Clases: [convención]
|
|
209
|
+
|
|
210
|
+
### Estructura
|
|
211
|
+
[Cómo se organizan los directorios y módulos]
|
|
212
|
+
|
|
213
|
+
## Proceso de Cambios (Flujo SDD-ES)
|
|
214
|
+
|
|
215
|
+
1. Todo cambio empieza con `/sdd.especificar`
|
|
216
|
+
2. La spec se clarifica con `/sdd.aclarar` si hay ambigüedad
|
|
217
|
+
3. El plan técnico se aprueba con `/sdd.planificar aprobar`
|
|
218
|
+
4. Las tareas se generan con `/sdd.tareas`
|
|
219
|
+
5. La consistencia se valida con `/sdd.analizar`
|
|
220
|
+
6. La implementación se ejecuta con `/sdd.implementar`
|
|
221
|
+
7. El cumplimiento se verifica con `/sdd.verificar`
|
|
222
|
+
|
|
223
|
+
## Gobernanza
|
|
224
|
+
|
|
225
|
+
- Esta constitución sigue versionado semántico (MAYOR.MENOR.PARCHE)
|
|
226
|
+
- Cualquier cambio se registra en el "Informe de Impacto de Sincronización" al inicio de este archivo
|
|
227
|
+
- Las enmiendas requieren actualizar las plantillas y comandos afectados
|
|
228
|
+
- Las decisiones técnicas no triviales se documentan como ADR en `.sdd/arquitectura/`
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## PASO 5 — Propagación de consistencia
|
|
232
|
+
|
|
233
|
+
Después de actualizar la constitución, revisa estos archivos y actualiza si hay desalineación:
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Plantillas
|
|
237
|
+
ls plantillas/*.md 2>/dev/null
|
|
238
|
+
|
|
239
|
+
# Comandos del plugin (verificar que ningún comando contradice un principio nuevo)
|
|
240
|
+
grep -l "[principio_modificado]" commands/*.md 2>/dev/null
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Genera el **Informe de Impacto de Sincronización** y lo prepende a la constitución como comentario HTML (ver plantilla arriba).
|
|
244
|
+
|
|
245
|
+
## PASO 6 — Inicializar resto de estructura SDD
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
# Crear archivos índice si no existen
|
|
249
|
+
[ ! -f .sdd/INDICE.md ] && cat > .sdd/INDICE.md <<'EOF'
|
|
250
|
+
# Índice de Especificaciones
|
|
251
|
+
|
|
252
|
+
> Registro de todas las especificaciones del proyecto, ordenado cronológicamente.
|
|
253
|
+
|
|
254
|
+
| ID | Título | Estado | Fecha | Plan | Tareas |
|
|
255
|
+
|----|--------|--------|-------|------|--------|
|
|
256
|
+
EOF
|
|
257
|
+
|
|
258
|
+
[ ! -f .sdd/SNAPSHOT.md ] && cat > .sdd/SNAPSHOT.md <<'EOF'
|
|
259
|
+
# SNAPSHOT del Producto
|
|
260
|
+
|
|
261
|
+
> Estado actual del producto. Se actualiza con `/sdd.snapshot` después de completar especificaciones.
|
|
262
|
+
|
|
263
|
+
## Funcionalidades activas
|
|
264
|
+
(ninguna aún)
|
|
265
|
+
|
|
266
|
+
## Última actualización
|
|
267
|
+
[FECHA]
|
|
268
|
+
EOF
|
|
269
|
+
|
|
270
|
+
[ ! -f .sdd/dominio/glosario.md ] && cat > .sdd/dominio/glosario.md <<'EOF'
|
|
271
|
+
# Glosario del Dominio
|
|
272
|
+
|
|
273
|
+
> Términos del dominio del proyecto con definición única y precisa.
|
|
274
|
+
|
|
275
|
+
## Términos
|
|
276
|
+
(añadir con `/sdd.glosario`)
|
|
277
|
+
EOF
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## PASO 6.5 — Persistir el perfil en la configuración
|
|
281
|
+
|
|
282
|
+
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
|
+
|
|
284
|
+
```bash
|
|
285
|
+
# Asegura que .sdd/sdd.config.yaml registra el perfil (guiado|experto)
|
|
286
|
+
if ! grep -q "^perfil:" .sdd/sdd.config.yaml 2>/dev/null; then
|
|
287
|
+
# Prepende la clave perfil al inicio del archivo de config
|
|
288
|
+
printf 'perfil: %s\n%s' "[PERFIL]" "$(cat .sdd/sdd.config.yaml 2>/dev/null)" > .sdd/sdd.config.yaml.tmp \
|
|
289
|
+
&& mv .sdd/sdd.config.yaml.tmp .sdd/sdd.config.yaml
|
|
290
|
+
fi
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
(Reemplaza `[PERFIL]` por `guiado` o `experto`.)
|
|
294
|
+
|
|
295
|
+
## PASO 7 — Actualizar estado global
|
|
296
|
+
|
|
297
|
+
Crea o actualiza `.sdd/estado.json`:
|
|
298
|
+
|
|
299
|
+
```json
|
|
300
|
+
{
|
|
301
|
+
"version_plugin": "2.0.0",
|
|
302
|
+
"version_constitucion": "[X.Y.Z]",
|
|
303
|
+
"inicializado": true,
|
|
304
|
+
"perfil": "[guiado|experto]",
|
|
305
|
+
"fase_actual": "constitucion_completa",
|
|
306
|
+
"stack_detectado": { ... },
|
|
307
|
+
"especificacion_activa": null,
|
|
308
|
+
"historial": [
|
|
309
|
+
{ "fase": "constitucion", "version": "[X.Y.Z]", "fecha": "[FECHA]" }
|
|
310
|
+
],
|
|
311
|
+
"fecha_inicio": "[FECHA]",
|
|
312
|
+
"ultima_actualizacion": "[FECHA]"
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## VERIFICACIONES POST-EJECUCIÓN
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
if [ -f ".sdd/hooks/despues_constitucion.sh" ]; then
|
|
320
|
+
bash .sdd/hooks/despues_constitucion.sh
|
|
321
|
+
fi
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## PASO 8 — Resumen y siguiente paso
|
|
325
|
+
|
|
326
|
+
Muestra:
|
|
327
|
+
|
|
328
|
+
```
|
|
329
|
+
✅ Constitución v[X.Y.Z] [creada | actualizada]
|
|
330
|
+
|
|
331
|
+
📁 .sdd/memoria/constitucion.md
|
|
332
|
+
📋 [N] principios definidos
|
|
333
|
+
🎯 Stack: [STACK_DETECTADO]
|
|
334
|
+
⚙️ Configuración: .sdd/sdd.config.yaml
|
|
335
|
+
|
|
336
|
+
📌 SIGUIENTES PASOS RECOMENDADOS:
|
|
337
|
+
• /sdd.configurar — Ajustar agentes/modelos antes de empezar
|
|
338
|
+
• /sdd.especificar — Crear la primera especificación
|
|
339
|
+
• /sdd.ayuda — Ver todos los comandos disponibles
|
|
340
|
+
|
|
341
|
+
💾 Sugerencia de commit:
|
|
342
|
+
docs: establece constitución v[X.Y.Z] del proyecto
|
|
343
|
+
```
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Convierte una descripción en lenguaje natural en una app web o CLI mínima con stack detectado automáticamente, lista para /sdd.desplegar. Orientado a personas con poca experiencia en programación.
|
|
3
|
+
allowed-tools: Read, Write, Edit, Bash, Task
|
|
4
|
+
handoffs:
|
|
5
|
+
- etiqueta: "Desplegar la app"
|
|
6
|
+
comando: sdd.desplegar
|
|
7
|
+
- etiqueta: "Agregar features"
|
|
8
|
+
comando: sdd.especificar
|
|
9
|
+
- etiqueta: "Probar en navegador"
|
|
10
|
+
comando: sdd.qa
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# /sdd.crear-app — Generador de App
|
|
14
|
+
|
|
15
|
+
Eres el **Generador de Apps**. Tomas una idea en lenguaje natural y produces una app web o CLI funcional con stack elegido automáticamente, tests, y lista para `/sdd.desplegar`. El usuario no necesita saber qué es un framework.
|
|
16
|
+
|
|
17
|
+
## PASO 1 — Entender la idea
|
|
18
|
+
|
|
19
|
+
Lee el argumento del comando. Haz **máximo 3 preguntas**:
|
|
20
|
+
|
|
21
|
+
1. **¿Qué hace la app?** — en una frase, qué problema resuelve.
|
|
22
|
+
2. **¿Quién la usa?** — ¿solo tú / tu equipo / cualquier persona en internet?
|
|
23
|
+
3. **¿Guarda datos?** — ¿sí (necesita base de datos) o no (solo muestra/procesa cosas)?
|
|
24
|
+
|
|
25
|
+
En perfil `guiado`:
|
|
26
|
+
> "Cuéntame qué quieres que haga tu app. No necesito detalles técnicos — solo descríbemelo como si me lo explicaras a un amigo."
|
|
27
|
+
|
|
28
|
+
## PASO 2 — Elegir el stack automáticamente
|
|
29
|
+
|
|
30
|
+
Usa la skill `deteccion-stack` para ver si ya hay un proyecto. Si no hay nada:
|
|
31
|
+
|
|
32
|
+
| Tipo de app detectado | Stack elegido automáticamente |
|
|
33
|
+
|-----------------------|-------------------------------|
|
|
34
|
+
| Web app con UI | Node.js + Vite + React + SQLite |
|
|
35
|
+
| API / backend solo | Node.js + Express + SQLite |
|
|
36
|
+
| CLI / script | Node.js puro (sin framework) |
|
|
37
|
+
| Bot / automatización | Python + requests |
|
|
38
|
+
| Datos / análisis | Python + pandas |
|
|
39
|
+
|
|
40
|
+
**En perfil `experto`:** ofrece los stacks y espera confirmación.
|
|
41
|
+
**En perfil `guiado`:** elige el stack más simple que cumple el requisito y explica la elección en una frase sin jerga:
|
|
42
|
+
> "Voy a usar las herramientas más comunes para este tipo de app — no necesitas saber qué son, yo lo configuro todo."
|
|
43
|
+
|
|
44
|
+
## PASO 3 — Generar spec mínima
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
SPEC_ID="APP-$(date +%Y%m%d%H%M)"
|
|
48
|
+
mkdir -p ".sdd/especificaciones/${SPEC_ID}"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
La spec incluye:
|
|
52
|
+
- Nombre de la app (kebab-case).
|
|
53
|
+
- 3-5 Criterios de Aceptación testeables (lo mínimo que hace la app útil).
|
|
54
|
+
- Stack confirmado.
|
|
55
|
+
- Plataforma de deploy objetivo (Vercel si es web, Railway si tiene BD, local si es CLI).
|
|
56
|
+
|
|
57
|
+
Escribe en `.sdd/especificaciones/${SPEC_ID}/spec.md`.
|
|
58
|
+
|
|
59
|
+
## PASO 4 — Scaffold de la app
|
|
60
|
+
|
|
61
|
+
El agente `desarrollador-backend` (y `desarrollador-frontend` si hay UI) genera la estructura completa:
|
|
62
|
+
|
|
63
|
+
**Web app (Node + Vite + React):**
|
|
64
|
+
```
|
|
65
|
+
nombre-app/
|
|
66
|
+
├── package.json
|
|
67
|
+
├── vite.config.js
|
|
68
|
+
├── index.html
|
|
69
|
+
├── src/
|
|
70
|
+
│ ├── main.jsx
|
|
71
|
+
│ ├── App.jsx
|
|
72
|
+
│ └── components/
|
|
73
|
+
├── server/
|
|
74
|
+
│ ├── index.js ← Express API
|
|
75
|
+
│ └── db.js ← SQLite (mejor-sqlite3)
|
|
76
|
+
├── tests/
|
|
77
|
+
│ └── app.test.js
|
|
78
|
+
└── vercel.json ← config de deploy
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**API solo (Node + Express):**
|
|
82
|
+
```
|
|
83
|
+
nombre-app/
|
|
84
|
+
├── package.json
|
|
85
|
+
├── src/
|
|
86
|
+
│ ├── index.js ← entry point
|
|
87
|
+
│ ├── routes/
|
|
88
|
+
│ └── db.js
|
|
89
|
+
├── tests/
|
|
90
|
+
│ └── api.test.js
|
|
91
|
+
└── railway.json ← config de deploy
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**CLI (Node puro):**
|
|
95
|
+
```
|
|
96
|
+
nombre-app/
|
|
97
|
+
├── package.json ← bin declarado
|
|
98
|
+
├── src/
|
|
99
|
+
│ └── index.js
|
|
100
|
+
└── tests/
|
|
101
|
+
└── cli.test.js
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Reglas del scaffold:**
|
|
105
|
+
- Sin dependencias innecesarias — solo las que la spec pide.
|
|
106
|
+
- Tests desde el inicio (no como afterthought).
|
|
107
|
+
- Archivo de deploy incluido para que `/sdd.desplegar` funcione sin config extra.
|
|
108
|
+
- `.env.example` con todas las variables requeridas.
|
|
109
|
+
- `.gitignore` correcto para el stack.
|
|
110
|
+
|
|
111
|
+
## PASO 5 — Implementar los CAs
|
|
112
|
+
|
|
113
|
+
Para cada CA de la spec, el agente implementa la funcionalidad mínima y su test:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Verificar que los tests pasan antes de continuar
|
|
117
|
+
cd "${APP_DIR}" && npm install && npm test
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Si algún test falla, el agente corrige antes de avanzar. No se reporta éxito con tests rojos.
|
|
121
|
+
|
|
122
|
+
## PASO 6 — Verificación de la app
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
APP_DIR="$(echo "$NOMBRE" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')"
|
|
126
|
+
|
|
127
|
+
# Tests
|
|
128
|
+
cd "${APP_DIR}" && npm test 2>&1 | tail -5
|
|
129
|
+
|
|
130
|
+
# La app arranca (para apps web)
|
|
131
|
+
timeout 10 npm start &
|
|
132
|
+
sleep 3
|
|
133
|
+
curl -sf http://localhost:3000 > /dev/null && echo "APP_OK" || echo "APP_NO_RESPONDE"
|
|
134
|
+
kill %1 2>/dev/null
|
|
135
|
+
|
|
136
|
+
# Archivo de deploy presente
|
|
137
|
+
ls vercel.json railway.json fly.toml netlify.toml 2>/dev/null | head -1 || echo "FALTA: config de deploy"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## PASO 7 — Reporte final
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
🚀 App generada: ${NOMBRE_APP}
|
|
144
|
+
|
|
145
|
+
Stack: [stack elegido]
|
|
146
|
+
Deploy objetivo: [plataforma]
|
|
147
|
+
|
|
148
|
+
Lo que hace:
|
|
149
|
+
✅ CA-001: [descripción simple]
|
|
150
|
+
✅ CA-002: [descripción simple]
|
|
151
|
+
|
|
152
|
+
Tests: [N] pasando
|
|
153
|
+
|
|
154
|
+
Archivos:
|
|
155
|
+
📁 ${APP_DIR}/ — tu app (editable)
|
|
156
|
+
|
|
157
|
+
Para publicarla en internet:
|
|
158
|
+
/sdd.desplegar
|
|
159
|
+
|
|
160
|
+
Para añadirle funciones:
|
|
161
|
+
/sdd.especificar [qué quieres añadir]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
En perfil `guiado`:
|
|
165
|
+
> "¡Tu app está lista! Tiene [N] funciones que probé y funcionan. Para publicarla en internet, solo dime 'despliégala' y lo hago yo. Si quieres añadirle algo, cuéntame qué y lo añadimos."
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
**HOOK:** `.sdd/hooks/despues_crear_app.sh`
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Convierte una descripción en lenguaje natural en un servidor MCP funcional, empaquetado como .mcpb instalable. Cada Criterio de Aceptación se convierte en una tool MCP. Orientado a no-programadores que quieren publicar capacidades.
|
|
3
|
+
allowed-tools: Read, Write, Edit, Bash, Task
|
|
4
|
+
handoffs:
|
|
5
|
+
- etiqueta: "Desplegar el MCP"
|
|
6
|
+
comando: sdd.desplegar
|
|
7
|
+
- etiqueta: "Probar el MCP"
|
|
8
|
+
comando: sdd.qa
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /sdd.crear-mcp — Generador de Servidor MCP
|
|
12
|
+
|
|
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
|
+
|
|
15
|
+
## PASO 1 — Entender qué capacidades se quieren publicar
|
|
16
|
+
|
|
17
|
+
Lee el argumento del comando. Si el usuario escribió algo como:
|
|
18
|
+
- `"quiero una herramienta que consulte el clima"`
|
|
19
|
+
- `"una tool para buscar en mi base de datos de recetas"`
|
|
20
|
+
- `"que mis notas de Obsidian sean accesibles desde Claude"`
|
|
21
|
+
|
|
22
|
+
Haz **máximo 3 preguntas** (en perfil guiado: lenguaje simple, sin jerga):
|
|
23
|
+
|
|
24
|
+
1. **¿Qué hace exactamente?** — entrada y salida esperada en términos del usuario.
|
|
25
|
+
2. **¿De dónde saca los datos?** — API externa / archivo local / base de datos / generación propia.
|
|
26
|
+
3. **¿Solo Claude lo usará, o también otros agentes?** — determina si necesita auth.
|
|
27
|
+
|
|
28
|
+
En perfil `guiado`, plantéalo así:
|
|
29
|
+
> "Cuéntame más: cuando uses esta herramienta desde Claude, ¿qué le dirás y qué esperas que te devuelva?"
|
|
30
|
+
|
|
31
|
+
## PASO 2 — Crear spec acotada al dominio MCP
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
SPEC_ID="MCP-$(date +%Y%m%d%H%M)"
|
|
35
|
+
mkdir -p ".sdd/especificaciones/${SPEC_ID}"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Genera una spec mínima con:
|
|
39
|
+
- **Nombre del MCP**: `mcp-[nombre-kebab]`
|
|
40
|
+
- **Tools a exponer** (una por CA): nombre_tool, descripción, parámetros de entrada, formato de salida.
|
|
41
|
+
- **Fuente de datos**: cómo accede a los datos (env var, archivo, API key).
|
|
42
|
+
- **Criterios de Aceptación**: uno por tool, en formato `Dado/Cuando/Entonces`.
|
|
43
|
+
|
|
44
|
+
Escribe la spec en `.sdd/especificaciones/${SPEC_ID}/spec.md`.
|
|
45
|
+
|
|
46
|
+
## PASO 3 — Scaffold del servidor MCP
|
|
47
|
+
|
|
48
|
+
Usa la plantilla `plantillas/mcp-server.md` como base. El agente `desarrollador-backend` genera la estructura:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Estructura objetivo
|
|
52
|
+
MCP_DIR="mcp-$(echo "$NOMBRE" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')"
|
|
53
|
+
mkdir -p "${MCP_DIR}/src"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
mcp-nombre/
|
|
58
|
+
├── package.json ← name, version, type:module, bin
|
|
59
|
+
├── src/
|
|
60
|
+
│ └── index.js ← servidor MCP (stdio transport)
|
|
61
|
+
├── README.md ← instrucciones de uso e instalación
|
|
62
|
+
└── .env.example ← variables de entorno requeridas (sin valores)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Reglas del scaffold:**
|
|
66
|
+
- Node puro, cero dependencias externas salvo `@modelcontextprotocol/sdk` (ya declarado en plantilla).
|
|
67
|
+
- Cada CA → una `tool` con nombre en `snake_case`, descripción para el modelo, schema de entrada JSON Schema.
|
|
68
|
+
- Transport: `stdio` (compatible con Claude Code sin configuración extra).
|
|
69
|
+
- Sin secrets hardcodeados; las API keys van a `process.env.NOMBRE_VAR`.
|
|
70
|
+
|
|
71
|
+
## PASO 4 — Generar código de cada tool
|
|
72
|
+
|
|
73
|
+
Para cada tool identificada en el PASO 2, el agente `desarrollador-backend` implementa:
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// Patrón por tool (genera uno por CA)
|
|
77
|
+
server.tool(
|
|
78
|
+
"nombre_tool",
|
|
79
|
+
"Descripción clara para que el modelo sepa cuándo usarla",
|
|
80
|
+
{
|
|
81
|
+
parametro: z.string().describe("qué es este parámetro")
|
|
82
|
+
},
|
|
83
|
+
async ({ parametro }) => {
|
|
84
|
+
// lógica de la tool
|
|
85
|
+
return { content: [{ type: "text", text: resultado }] };
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Verificación por tool:
|
|
91
|
+
```bash
|
|
92
|
+
# Cada tool debe aparecer nombrada en src/index.js
|
|
93
|
+
grep -c "server.tool(" "${MCP_DIR}/src/index.js"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## PASO 5 — Empaquetar como .mcpb
|
|
97
|
+
|
|
98
|
+
`.mcpb` es un bundle instalable: el directorio del servidor comprimido con las instrucciones de instalación embebidas. Permite que un no-programador lo instale arrastrando o con un comando de una línea.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Instalar dependencias antes de empaquetar
|
|
102
|
+
cd "${MCP_DIR}" && npm install --omit=dev
|
|
103
|
+
|
|
104
|
+
# Crear bundle .mcpb (tar.gz renombrado)
|
|
105
|
+
cd .. && tar -czf "${MCP_DIR}.mcpb" "${MCP_DIR}/"
|
|
106
|
+
|
|
107
|
+
echo "Bundle creado: ${MCP_DIR}.mcpb"
|
|
108
|
+
echo "Tamaño: $(du -sh ${MCP_DIR}.mcpb | cut -f1)"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## PASO 6 — Generar instrucciones de instalación de una línea
|
|
112
|
+
|
|
113
|
+
Según el destino del MCP:
|
|
114
|
+
|
|
115
|
+
**Para Claude Code (local):**
|
|
116
|
+
```bash
|
|
117
|
+
# Una línea para instalar desde el .mcpb
|
|
118
|
+
claude mcp add ${NOMBRE_MCP} -- node "${MCP_DIR}/src/index.js"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Para publicar en npm (opcional, si el usuario quiere compartirlo):**
|
|
122
|
+
```bash
|
|
123
|
+
# Instrucción generada en el README del MCP
|
|
124
|
+
npx ${NOMBRE_MCP}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Genera el README con:
|
|
128
|
+
1. Qué hace el MCP (una frase).
|
|
129
|
+
2. Qué tools expone (tabla: nombre, qué hace, parámetros).
|
|
130
|
+
3. Variables de entorno requeridas (`.env.example`).
|
|
131
|
+
4. Instrucción de instalación para Claude Code.
|
|
132
|
+
5. Ejemplo de uso: "Dile a Claude: *[frase de ejemplo]*".
|
|
133
|
+
|
|
134
|
+
En perfil `guiado`, el README usa lenguaje sin jerga — el target es alguien que nunca abrió una terminal.
|
|
135
|
+
|
|
136
|
+
## PASO 7 — Verificación final
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# El servidor debe arrancar sin errores
|
|
140
|
+
cd "${MCP_DIR}" && timeout 5 node src/index.js <<< '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' 2>&1
|
|
141
|
+
|
|
142
|
+
# Debe listar todas las tools declaradas
|
|
143
|
+
# Si el timeout expira sin error de sintaxis, es correcto (stdio espera input)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# El .mcpb debe existir y tener contenido
|
|
148
|
+
[ -f "${MCP_DIR}.mcpb" ] && ls -lh "${MCP_DIR}.mcpb" || echo "FALTA: bundle .mcpb"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## PASO 8 — Reporte final
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
🔌 MCP generado: ${NOMBRE_MCP}
|
|
155
|
+
|
|
156
|
+
Tools expuestas:
|
|
157
|
+
• nombre_tool_1 — [qué hace]
|
|
158
|
+
• nombre_tool_2 — [qué hace]
|
|
159
|
+
|
|
160
|
+
Archivos:
|
|
161
|
+
📁 ${MCP_DIR}/ — código fuente editable
|
|
162
|
+
📦 ${MCP_DIR}.mcpb — bundle instalable
|
|
163
|
+
|
|
164
|
+
Instalar en Claude Code:
|
|
165
|
+
claude mcp add ${NOMBRE_MCP} -- node "$(pwd)/${MCP_DIR}/src/index.js"
|
|
166
|
+
|
|
167
|
+
Dile a Claude: "[frase de ejemplo de uso]"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
En perfil `guiado`:
|
|
171
|
+
> "¡Listo! Creé tu herramienta. Para usarla desde Claude, copia esta línea en tu terminal: [comando]. Después de eso, puedes decirle a Claude: *[ejemplo natural]* y lo hará automáticamente."
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
**HOOK:** `.sdd/hooks/despues_crear_mcp.sh`
|