sdd-es 2.0.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +29 -29
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +10 -7
- package/.claude-plugin/plugin.json +59 -37
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +77 -40
- package/agents/architecture-designer.md +211 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +11 -16
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +268 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +288 -0
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/cli/index.js +1 -2
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +521 -0
- package/commands/sdd.configurar.md +34 -1
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.crear-mcp.md +2 -0
- package/commands/sdd.defect-report.md +134 -0
- package/commands/sdd.descubrir.md +19 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +120 -3
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +272 -52
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +93 -4
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +81 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +61 -185
- package/docs/FABRICA.md +163 -115
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +15 -10
- package/plantillas/job-story-mejorar-prompt.md +107 -0
- package/presets/enterprise.yaml +6 -0
- package/presets/lean.yaml +4 -0
- package/presets/startup.yaml +6 -0
- package/skills/adr-indexer/SKILL.md +181 -0
- package/skills/cache-audit/SKILL.md +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +68 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +177 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/mcp-figma/README.md +0 -158
- package/mcp-figma/package.json +0 -7
- package/mcp-figma/src/component-generator.js +0 -162
- package/mcp-figma/src/design-system-analyzer.js +0 -247
- package/mcp-figma/src/figma-client.js +0 -75
- package/mcp-figma/src/index.js +0 -114
- package/mcp-figma/src/mcp.js +0 -97
- package/mcp-figma/src/style-mapper.js +0 -85
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Fase de diseño de FORGE. Orquesta direction picker → product-designer → architecture-designer → wireframe-mvp → critica-diseno. Requiere IR previo en .sdd/ir.json.
|
|
3
|
+
allowed-tools: Read, Write, Bash, Agent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.diseñar — Diseño de Producto
|
|
7
|
+
|
|
8
|
+
**Uso:**
|
|
9
|
+
```
|
|
10
|
+
/sdd.diseñar
|
|
11
|
+
/sdd.diseñar confirmar
|
|
12
|
+
/sdd.diseñar cambiar-direccion
|
|
13
|
+
/sdd.diseñar --sin-critica
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## PASO 1 — Verificar IR
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
if [ ! -f ".sdd/ir.json" ]; then
|
|
22
|
+
echo "No hay IR todavía. Primero interpreta tu idea:"
|
|
23
|
+
echo " /sdd.interpretar [tu idea]"
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
cat .sdd/ir.json | node -e "
|
|
28
|
+
const ir = JSON.parse(require('fs').readFileSync('/dev/stdin', 'utf8'));
|
|
29
|
+
console.log('Producto:', ir.product.name);
|
|
30
|
+
console.log('Tipo:', ir.product.type);
|
|
31
|
+
"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Si ya hay un `product-design.json`, pregunta:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
Ya tienes un diseño para [product.name].
|
|
38
|
+
¿Qué quieres hacer?
|
|
39
|
+
1) Ver el diseño actual → /sdd.diseñar ver
|
|
40
|
+
2) Rediseñar (conservar el IR) → /sdd.diseñar rediseñar
|
|
41
|
+
3) Continuar al código → /sdd.construir
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## PASO 2 — Direction Picker
|
|
47
|
+
|
|
48
|
+
Si no hay `design_direction` en `.sdd/estado.json`, invocar la skill `elegir-direccion`:
|
|
49
|
+
|
|
50
|
+
La skill muestra 3 opciones visuales y espera la elección del usuario.
|
|
51
|
+
|
|
52
|
+
Después de elegida, guarda en `.sdd/estado.json`:
|
|
53
|
+
```json
|
|
54
|
+
{ "design_direction": "[direction]", "design_system_path": "{PLUGIN_DIR}/design-systems/[direction]/DESIGN.md" }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Si ya hay dirección elegida, saltarla (a menos que sea `cambiar-direccion`).
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## PASO 3 — Invocar Product Designer
|
|
62
|
+
|
|
63
|
+
Activa el agente `product-designer`.
|
|
64
|
+
|
|
65
|
+
El agente:
|
|
66
|
+
1. Lee `.sdd/ir.json`
|
|
67
|
+
2. Lee `.sdd/estado.json` (dirección y DESIGN.md)
|
|
68
|
+
3. Lee `{PLUGIN_DIR}/craft/anti-ai-slop.md`
|
|
69
|
+
4. Genera el `ProductDesign` JSON
|
|
70
|
+
5. Muestra resumen al usuario
|
|
71
|
+
6. Guarda en `.sdd/product-design.json`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## PASO 4 — Invocar Architecture Designer
|
|
76
|
+
|
|
77
|
+
Activa el agente `architecture-designer`.
|
|
78
|
+
|
|
79
|
+
El agente:
|
|
80
|
+
1. Lee `.sdd/ir.json` + `.sdd/product-design.json`
|
|
81
|
+
2. Propone el stack más simple viable
|
|
82
|
+
3. Muestra resumen en lenguaje natural
|
|
83
|
+
4. Agrega el campo `architecture` a `.sdd/product-design.json`
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## PASO 5 — Generar Wireframe (pantalla P0)
|
|
88
|
+
|
|
89
|
+
Invocar la skill `wireframe-mvp`.
|
|
90
|
+
|
|
91
|
+
La skill:
|
|
92
|
+
1. Lee `.sdd/product-design.json` (pantalla P0)
|
|
93
|
+
2. Lee el DESIGN.md activo
|
|
94
|
+
3. Lee `{PLUGIN_DIR}/craft/anti-ai-slop.md`
|
|
95
|
+
4. Genera el HTML de la pantalla P0
|
|
96
|
+
5. Guarda en `.sdd/diseño/wireframe-pantalla-principal.html` con la tool `Write`
|
|
97
|
+
6. Abre el archivo en el navegador del sistema (`start`/`open`/`xdg-open`)
|
|
98
|
+
|
|
99
|
+
Si se pasa `--sin-critica`, saltar el PASO 6.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## PASO 6 — Crítica y Refinamiento
|
|
104
|
+
|
|
105
|
+
Invocar la skill `critica-diseno`.
|
|
106
|
+
|
|
107
|
+
La skill:
|
|
108
|
+
1. Lee el wireframe generado
|
|
109
|
+
2. Evalúa en 5 dimensiones (score 1–5 cada una)
|
|
110
|
+
3. Si score < 4 y iteraciones < 3: refina el wireframe y re-evalúa
|
|
111
|
+
4. Si score ≥ 4: aprueba y termina
|
|
112
|
+
5. Muestra el resultado de la crítica al usuario
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## PASO 7 — Confirmar y guardar
|
|
117
|
+
|
|
118
|
+
Muestra resumen final del diseño:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
═══════════════════════════════════════════
|
|
122
|
+
✅ DISEÑO COMPLETADO
|
|
123
|
+
═══════════════════════════════════════════
|
|
124
|
+
|
|
125
|
+
Producto: [product.name]
|
|
126
|
+
Dirección visual: [design_direction]
|
|
127
|
+
Pantallas: [N] pantallas ([nombres P0, P1, P2])
|
|
128
|
+
Stack: [frontend] + [backend] + [database]
|
|
129
|
+
Wireframe: .sdd/diseño/wireframe-pantalla-principal.html
|
|
130
|
+
Score del diseño: [X]/5
|
|
131
|
+
|
|
132
|
+
¿Listo para generar el código?
|
|
133
|
+
/sdd.construir → Pipeline completo automático
|
|
134
|
+
/sdd.diseñar ver → Ver el diseño en detalle
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Actualizar `.sdd/estado.json`:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
node -e "
|
|
141
|
+
const fs = require('fs');
|
|
142
|
+
const estado = JSON.parse(fs.readFileSync('.sdd/estado.json', 'utf8') || '{}');
|
|
143
|
+
estado.product_design_aprobado = true;
|
|
144
|
+
estado.ultima_actualizacion = new Date().toISOString();
|
|
145
|
+
fs.writeFileSync('.sdd/estado.json', JSON.stringify(estado, null, 2));
|
|
146
|
+
"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Sub-comandos
|
|
152
|
+
|
|
153
|
+
### `/sdd.diseñar ver`
|
|
154
|
+
Muestra el ProductDesign actual en formato legible (pantallas, stack, wireframe path).
|
|
155
|
+
|
|
156
|
+
### `/sdd.diseñar confirmar`
|
|
157
|
+
Si el diseño ya fue generado pero esperaba confirmación explícita, lo confirma y continúa.
|
|
158
|
+
|
|
159
|
+
### `/sdd.diseñar cambiar-direccion`
|
|
160
|
+
Vuelve al PASO 2 (direction picker) sin borrar el IR. Regenera todo lo demás.
|
|
161
|
+
|
|
162
|
+
### `/sdd.diseñar rediseñar`
|
|
163
|
+
Borra el ProductDesign actual y vuelve a empezar desde el PASO 2, conservando el IR.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Archivos generados
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
.sdd/
|
|
171
|
+
product-design.json ← ProductDesign + ArchitectureDesign
|
|
172
|
+
estado.json ← product_design_aprobado: true
|
|
173
|
+
diseño/
|
|
174
|
+
wireframe-pantalla-principal.html ← Wireframe de P0
|
|
175
|
+
critica-wireframe.md ← Resultado de la crítica
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Integración con el pipeline
|
|
181
|
+
|
|
182
|
+
Después de `/sdd.diseñar`:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
/sdd.construir → Pipeline completo: spec + plan + tareas + código
|
|
186
|
+
/sdd.exportar → Exportar bundle del proyecto
|
|
187
|
+
/sdd.estado → Ver estado del proyecto
|
|
188
|
+
```
|
package/commands/sdd.estado.md
CHANGED
|
@@ -28,7 +28,57 @@ fi
|
|
|
28
28
|
Ejecuta: /sdd.constitucion
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
## PASO
|
|
31
|
+
## PASO 2.5 — Detectar perfil y elegir formato de dashboard
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
35
|
+
[ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
|
|
36
|
+
echo "PERFIL=${PERFIL:-guiado}"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- Si `PERFIL=guiado` (o no hay perfil): mostrar **dashboard de producto** (PASO 3A).
|
|
40
|
+
- Si `PERFIL=experto` y no hay modo explícito `pm`/`arq`/`dev`: mostrar **dashboard técnico** (PASO 3B).
|
|
41
|
+
|
|
42
|
+
## PASO 3A — Dashboard de producto (modo guiado, por defecto)
|
|
43
|
+
|
|
44
|
+
Muestra el estado en lenguaje natural, sin jerga técnica:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Tu proyecto: [Nombre del proyecto]
|
|
48
|
+
|
|
49
|
+
[Si hay feature activa:]
|
|
50
|
+
Estás trabajando en: [título de la spec en lenguaje natural]
|
|
51
|
+
Progreso: [N]% listo ([N] de [M] pasos completados)
|
|
52
|
+
[████████████░░░░░░░░]
|
|
53
|
+
|
|
54
|
+
¿Qué queda por hacer?
|
|
55
|
+
✅ [descripción natural del paso completado más reciente]
|
|
56
|
+
→ Próximo paso: [descripción natural de lo que sigue]
|
|
57
|
+
|
|
58
|
+
[Si hay bloqueos:]
|
|
59
|
+
⚠️ Hay un problema que necesita tu atención: [descripción natural del bloqueo]
|
|
60
|
+
|
|
61
|
+
[Si no hay feature activa:]
|
|
62
|
+
¡Listo para empezar! ¿Qué quieres construir ahora?
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Reglas para el dashboard de producto:
|
|
66
|
+
- Nunca mostrar IDs internos (`2026-06-14-auth`, `pipeline_step`, `T003`).
|
|
67
|
+
- Nunca mencionar nombres de comandos a menos que el usuario los pida.
|
|
68
|
+
- Usar "feature", "funcionalidad" o "lo que estás construyendo" en vez de "spec" o "especificación".
|
|
69
|
+
- Traducir las fases del pipeline a lenguaje natural:
|
|
70
|
+
| Fase interna | Texto para usuario |
|
|
71
|
+
|---|---|
|
|
72
|
+
| `especificacion` | "Definiendo los detalles" |
|
|
73
|
+
| `plan` | "Planificando cómo construirlo" |
|
|
74
|
+
| `plan_aprobado` | "Plan listo, preparando tareas" |
|
|
75
|
+
| `tareas_generadas` | "Tareas listas, empezando a construir" |
|
|
76
|
+
| `implementacion` | "Construyendo..." |
|
|
77
|
+
| `implementacion_completa` | "Construcción lista, verificando" |
|
|
78
|
+
| `verificada` | "Verificado y funcionando" |
|
|
79
|
+
| `completado` | "¡Listo! Feature entregada" |
|
|
80
|
+
|
|
81
|
+
## PASO 3B — Dashboard técnico (modo experto o modo `dev`)
|
|
32
82
|
|
|
33
83
|
```
|
|
34
84
|
╔════════════════════════════════════════════════════════════════╗
|
|
@@ -100,7 +150,7 @@ fi
|
|
|
100
150
|
╚════════════════════════════════════════════════════════════════╝
|
|
101
151
|
```
|
|
102
152
|
|
|
103
|
-
## PASO 4 — Determinar próximo paso según fase
|
|
153
|
+
## PASO 4 — Determinar próximo paso según fase (para ambos modos)
|
|
104
154
|
|
|
105
155
|
| Fase actual | Próximo paso |
|
|
106
156
|
|-------------|--------------|
|
|
@@ -116,9 +166,76 @@ fi
|
|
|
116
166
|
| `verificada` (sin snapshot) | `/sdd.snapshot` |
|
|
117
167
|
| `completado` | `/sdd.especificar [nueva feature]` |
|
|
118
168
|
|
|
119
|
-
## PASO 5 —
|
|
169
|
+
## PASO 5 — Consumo de agentes (observabilidad)
|
|
170
|
+
|
|
171
|
+
Si existe `.sdd/observabilidad/consumo.jsonl`, invocar la skill `observabilidad-consumo` y añadir una sección al dashboard:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
[ -f .sdd/observabilidad/consumo.jsonl ] && wc -l .sdd/observabilidad/consumo.jsonl
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Si hay datos, mostrar al final del dashboard:
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
╠════════════════════════════════════════════════════════════════╣
|
|
181
|
+
║ 📊 CONSUMO DE AGENTES (sesión actual) ║
|
|
182
|
+
║ ║
|
|
183
|
+
║ [resumen de invocaciones por agente] ║
|
|
184
|
+
║ [alertas de fan-out si las hay] ║
|
|
185
|
+
║ ║
|
|
186
|
+
║ Ver detalle completo: /sdd.estado consumo ║
|
|
187
|
+
╚════════════════════════════════════════════════════════════════╝
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
`/sdd.estado consumo` — invoca `observabilidad-consumo` y muestra el reporte completo.
|
|
191
|
+
|
|
192
|
+
## PASO 6 — Modos adicionales
|
|
120
193
|
|
|
121
194
|
`/sdd.estado historial` — muestra solo el historial completo de specs
|
|
122
195
|
`/sdd.estado tareas` — muestra solo el detalle de tareas de la spec activa
|
|
123
196
|
`/sdd.estado agentes` — muestra solo la config de agentes
|
|
197
|
+
`/sdd.estado consumo` — muestra el reporte de observabilidad de agentes
|
|
124
198
|
`/sdd.estado todo` — muestra TODO lo de arriba más detalles extendidos
|
|
199
|
+
|
|
200
|
+
## PASO 7 — Output styles (modos de presentación)
|
|
201
|
+
|
|
202
|
+
Si el argumento contiene `pm`, `arq` o `dev`, adapta el output del dashboard:
|
|
203
|
+
|
|
204
|
+
**Modo `pm` (Product Manager):**
|
|
205
|
+
```
|
|
206
|
+
📊 ESTADO DEL PROYECTO — [Nombre]
|
|
207
|
+
|
|
208
|
+
✅ Feature en curso: [título de la spec activa en lenguaje natural]
|
|
209
|
+
📈 Progreso: [N]% completado ([N] de [M] tareas listas)
|
|
210
|
+
🎯 Próximo hito: [descripción en lenguaje natural del siguiente paso]
|
|
211
|
+
🚦 Estado general: [Verde / Amarillo / Rojo]
|
|
212
|
+
|
|
213
|
+
¿Qué necesitas saber?
|
|
214
|
+
- Avance → responde "avance"
|
|
215
|
+
- Bloqueos → responde "problemas"
|
|
216
|
+
- Cuándo termina → responde "estimado"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Modo `arq` (Arquitecto):**
|
|
220
|
+
```
|
|
221
|
+
📐 ESTADO TÉCNICO — [Nombre]
|
|
222
|
+
|
|
223
|
+
Stack: [lenguaje/framework]
|
|
224
|
+
Spec activa: [ID] — [título]
|
|
225
|
+
Fase: [fase actual]
|
|
226
|
+
|
|
227
|
+
Artefactos:
|
|
228
|
+
spec.md → [✅/⏸/❌]
|
|
229
|
+
plan.md → [✅/⏸/❌] — [versión/fecha]
|
|
230
|
+
tareas.md → [N] tareas ([distribución por agente])
|
|
231
|
+
analisis.md → [veredicto]
|
|
232
|
+
|
|
233
|
+
Decisiones de arquitectura pendientes: [N ADRs sin cerrar]
|
|
234
|
+
Riesgos abiertos: [N del último análisis]
|
|
235
|
+
Deuda técnica registrada: [N items]
|
|
236
|
+
|
|
237
|
+
Próxima decisión técnica requerida: [descripción]
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Modo `dev` (Desarrollador) — default:**
|
|
241
|
+
El dashboard completo con la barra de progreso de tareas (formato actual del PASO 3).
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Exporta el proyecto como bundle portable. Detecta qué agentes/skills/comandos se usaron desde estado.json y genera {nombre}-forge-bundle/ con solo esas piezas + el proyecto + INSTALL.md.
|
|
3
|
+
allowed-tools: Read, Write, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.exportar — Exportar Bundle
|
|
7
|
+
|
|
8
|
+
**Uso:**
|
|
9
|
+
```
|
|
10
|
+
/sdd.exportar
|
|
11
|
+
/sdd.exportar --completo ← incluye todos los componentes de FORGE, no solo los usados
|
|
12
|
+
/sdd.exportar --solo-codigo ← solo el código del proyecto (sin los archivos .sdd/)
|
|
13
|
+
/sdd.exportar --zip ← genera un archivo ZIP del bundle
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## PASO 1 — Detectar qué se usó
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
node -e "
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
|
|
24
|
+
// Leer estado
|
|
25
|
+
const estado = JSON.parse(fs.existsSync('.sdd/estado.json')
|
|
26
|
+
? fs.readFileSync('.sdd/estado.json', 'utf8') : '{}');
|
|
27
|
+
|
|
28
|
+
const usados = {
|
|
29
|
+
ir: !!estado.ir_generado,
|
|
30
|
+
product_design: !!estado.product_design_generado,
|
|
31
|
+
design_direction: estado.design_direction || null,
|
|
32
|
+
tiene_wireframe: fs.existsSync('.sdd/diseño/wireframe-pantalla-principal.html'),
|
|
33
|
+
tiene_spec: !!estado.spec_activa,
|
|
34
|
+
tiene_plan: !!estado.plan_activo,
|
|
35
|
+
pipeline_completado: estado.pipeline_step === 'done',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
console.log(JSON.stringify(usados, null, 2));
|
|
39
|
+
"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## PASO 2 — Determinar componentes del bundle
|
|
45
|
+
|
|
46
|
+
Según lo que se usó, incluir solo los archivos relevantes:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
SIEMPRE incluir:
|
|
50
|
+
sdd-lite/commands/sdd.md ← hub principal
|
|
51
|
+
sdd-lite/commands/sdd.interpretar.md
|
|
52
|
+
sdd-lite/skills/descubrir-idea/SKILL.md
|
|
53
|
+
sdd-lite/skills/interpretar-idea/SKILL.md
|
|
54
|
+
sdd-lite/core/ir.types.ts
|
|
55
|
+
.sdd/ir.json ← el IR del proyecto
|
|
56
|
+
INSTALL.md ← generado por este comando
|
|
57
|
+
|
|
58
|
+
SI se usó el diseño:
|
|
59
|
+
sdd-lite/commands/sdd.diseñar.md
|
|
60
|
+
sdd-lite/skills/elegir-direccion/SKILL.md
|
|
61
|
+
sdd-lite/agents/product-designer.md
|
|
62
|
+
sdd-lite/agents/architecture-designer.md
|
|
63
|
+
sdd-lite/skills/wireframe-mvp/SKILL.md
|
|
64
|
+
sdd-lite/skills/critica-diseno/SKILL.md
|
|
65
|
+
design-systems/{direction}/DESIGN.md ← solo la dirección usada
|
|
66
|
+
craft/anti-ai-slop.md
|
|
67
|
+
.sdd/product-design.json
|
|
68
|
+
.sdd/diseño/ ← wireframe + crítica
|
|
69
|
+
|
|
70
|
+
SI se completó el pipeline:
|
|
71
|
+
sdd-lite/commands/sdd.construir.md
|
|
72
|
+
sdd-lite/core/ir-to-spec-mapper.ts
|
|
73
|
+
sdd-lite/core/project-memory.ts
|
|
74
|
+
sdd-lite/commands/sdd.exportar.md
|
|
75
|
+
.sdd/spec-draft.json
|
|
76
|
+
[código generado del proyecto]
|
|
77
|
+
|
|
78
|
+
SIEMPRE excluir:
|
|
79
|
+
node_modules/
|
|
80
|
+
.git/
|
|
81
|
+
*.log
|
|
82
|
+
forge.config.json ← contiene API keys
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## PASO 3 — Crear el bundle
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
node -e "
|
|
91
|
+
const fs = require('fs');
|
|
92
|
+
const path = require('path');
|
|
93
|
+
|
|
94
|
+
// ── Leer estado ────────────────────────────────────────────────────────────
|
|
95
|
+
const estado = JSON.parse(fs.existsSync('.sdd/estado.json')
|
|
96
|
+
? fs.readFileSync('.sdd/estado.json', 'utf8') : '{}');
|
|
97
|
+
const ir = fs.existsSync('.sdd/ir.json')
|
|
98
|
+
? JSON.parse(fs.readFileSync('.sdd/ir.json', 'utf8')) : null;
|
|
99
|
+
|
|
100
|
+
if (!ir) {
|
|
101
|
+
console.error('Error: no hay IR todavía. Ejecuta /sdd.interpretar primero.');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const productName = ir.product.name.toLowerCase().replace(/\s+/g, '-');
|
|
106
|
+
const timestamp = new Date().toISOString().slice(0, 10);
|
|
107
|
+
const BUNDLE = \`\${productName}-forge-bundle\`;
|
|
108
|
+
const FORGE_ROOT = path.resolve(__dirname, '..'); // raíz del repo FORGE
|
|
109
|
+
|
|
110
|
+
// ── Helper: copiar archivo con creación de directorios ─────────────────────
|
|
111
|
+
function cp(src, dest) {
|
|
112
|
+
const absS = path.join(FORGE_ROOT, src);
|
|
113
|
+
const absD = path.join(BUNDLE, dest || src);
|
|
114
|
+
if (!fs.existsSync(absS)) return;
|
|
115
|
+
fs.mkdirSync(path.dirname(absD), { recursive: true });
|
|
116
|
+
fs.copyFileSync(absS, absD);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function cpDir(src, dest) {
|
|
120
|
+
const absS = path.join(FORGE_ROOT, src);
|
|
121
|
+
const absD = path.join(BUNDLE, dest || src);
|
|
122
|
+
if (!fs.existsSync(absS)) return;
|
|
123
|
+
copyDirSync(absS, absD);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function copyDirSync(src, dest) {
|
|
127
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
128
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
129
|
+
const s = path.join(src, entry.name);
|
|
130
|
+
const d = path.join(dest, entry.name);
|
|
131
|
+
if (entry.isDirectory()) copyDirSync(s, d);
|
|
132
|
+
else fs.copyFileSync(s, d);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ── Crear directorio del bundle ────────────────────────────────────────────
|
|
137
|
+
if (fs.existsSync(BUNDLE)) fs.rmSync(BUNDLE, { recursive: true });
|
|
138
|
+
fs.mkdirSync(BUNDLE, { recursive: true });
|
|
139
|
+
|
|
140
|
+
const incluidos = [];
|
|
141
|
+
|
|
142
|
+
// ── SIEMPRE: componentes base del Interpreter ──────────────────────────────
|
|
143
|
+
const base = [
|
|
144
|
+
['sdd-lite/commands/sdd.md', 'sdd-lite/commands/sdd.md'],
|
|
145
|
+
['sdd-lite/commands/sdd.interpretar.md', 'sdd-lite/commands/sdd.interpretar.md'],
|
|
146
|
+
['sdd-lite/skills/descubrir-idea/SKILL.md', 'sdd-lite/skills/descubrir-idea/SKILL.md'],
|
|
147
|
+
['sdd-lite/skills/interpretar-idea/SKILL.md', 'sdd-lite/skills/interpretar-idea/SKILL.md'],
|
|
148
|
+
['sdd-lite/core/ir.types.ts', 'sdd-lite/core/ir.types.ts'],
|
|
149
|
+
];
|
|
150
|
+
for (const [s, d] of base) { cp(s, d); incluidos.push(d); }
|
|
151
|
+
|
|
152
|
+
// .sdd/ir.json
|
|
153
|
+
fs.mkdirSync(path.join(BUNDLE, '.sdd'), { recursive: true });
|
|
154
|
+
fs.copyFileSync('.sdd/ir.json', path.join(BUNDLE, '.sdd', 'ir.json'));
|
|
155
|
+
incluidos.push('.sdd/ir.json');
|
|
156
|
+
|
|
157
|
+
// ── SI se usó diseño ───────────────────────────────────────────────────────
|
|
158
|
+
const hasDesign = estado.product_design_generado && fs.existsSync('.sdd/product-design.json');
|
|
159
|
+
if (hasDesign) {
|
|
160
|
+
const designFiles = [
|
|
161
|
+
['sdd-lite/commands/sdd.diseñar.md', null],
|
|
162
|
+
['sdd-lite/skills/elegir-direccion/SKILL.md', null],
|
|
163
|
+
['sdd-lite/agents/product-designer.md', null],
|
|
164
|
+
['sdd-lite/agents/architecture-designer.md', null],
|
|
165
|
+
['sdd-lite/skills/wireframe-mvp/SKILL.md', null],
|
|
166
|
+
['sdd-lite/skills/critica-diseno/SKILL.md', null],
|
|
167
|
+
['{PLUGIN_DIR}/craft/anti-ai-slop.md', 'craft/anti-ai-slop.md'],
|
|
168
|
+
];
|
|
169
|
+
for (const [s] of designFiles) { cp(s, s); incluidos.push(s); }
|
|
170
|
+
|
|
171
|
+
// Design system activo
|
|
172
|
+
const dir = estado.design_direction || 'neutral-modern';
|
|
173
|
+
// fuente en {PLUGIN_DIR}, destino relativo en el bundle (portable)
|
|
174
|
+
cpDir(\`{PLUGIN_DIR}/design-systems/\${dir}\`, \`design-systems/\${dir}\`);
|
|
175
|
+
incluidos.push(\`design-systems/\${dir}/DESIGN.md\`);
|
|
176
|
+
|
|
177
|
+
// Archivos .sdd de diseño
|
|
178
|
+
fs.copyFileSync('.sdd/product-design.json', path.join(BUNDLE, '.sdd', 'product-design.json'));
|
|
179
|
+
incluidos.push('.sdd/product-design.json');
|
|
180
|
+
|
|
181
|
+
if (fs.existsSync('.sdd/diseño')) {
|
|
182
|
+
copyDirSync('.sdd/diseño', path.join(BUNDLE, '.sdd', 'diseño'));
|
|
183
|
+
incluidos.push('.sdd/diseño/');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── SI se completó el pipeline ─────────────────────────────────────────────
|
|
188
|
+
const pipelineDone = estado.pipeline_step === 'done' || !!estado.spec_activa;
|
|
189
|
+
if (pipelineDone) {
|
|
190
|
+
const pipeFiles = [
|
|
191
|
+
['sdd-lite/commands/sdd.construir.md', null],
|
|
192
|
+
['sdd-lite/core/ir-to-spec-mapper.ts', null],
|
|
193
|
+
['sdd-lite/core/project-memory.ts', null],
|
|
194
|
+
];
|
|
195
|
+
for (const [s] of pipeFiles) { cp(s, s); incluidos.push(s); }
|
|
196
|
+
|
|
197
|
+
if (fs.existsSync('.sdd/spec-draft.json')) {
|
|
198
|
+
fs.copyFileSync('.sdd/spec-draft.json', path.join(BUNDLE, '.sdd', 'spec-draft.json'));
|
|
199
|
+
incluidos.push('.sdd/spec-draft.json');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ── estado.json (sin API keys) ─────────────────────────────────────────────
|
|
204
|
+
const estadoClean = { ...estado };
|
|
205
|
+
delete estadoClean.api_key;
|
|
206
|
+
delete estadoClean.api_key_encrypted;
|
|
207
|
+
fs.writeFileSync(path.join(BUNDLE, '.sdd', 'estado.json'), JSON.stringify(estadoClean, null, 2));
|
|
208
|
+
incluidos.push('.sdd/estado.json');
|
|
209
|
+
|
|
210
|
+
// ── Generar INSTALL.md ─────────────────────────────────────────────────────
|
|
211
|
+
const install = [
|
|
212
|
+
'# ' + ir.product.name + ' — Forge Bundle',
|
|
213
|
+
'',
|
|
214
|
+
'Generado el ' + timestamp + ' con FORGE.',
|
|
215
|
+
'',
|
|
216
|
+
'## Qué contiene este bundle',
|
|
217
|
+
'',
|
|
218
|
+
incluidos.map(f => '- \`' + f + '\`').join('\n'),
|
|
219
|
+
'',
|
|
220
|
+
'## Cómo usarlo',
|
|
221
|
+
'',
|
|
222
|
+
'### Con Claude Code',
|
|
223
|
+
'',
|
|
224
|
+
'1. Copia este bundle a tu proyecto',
|
|
225
|
+
'2. Abre el proyecto en Claude Code',
|
|
226
|
+
'3. Usa los comandos:',
|
|
227
|
+
' - \`/sdd.diseñar\` → continuar con el diseño',
|
|
228
|
+
' - \`/sdd.construir\` → generar el código',
|
|
229
|
+
'',
|
|
230
|
+
'### Ver el wireframe',
|
|
231
|
+
'',
|
|
232
|
+
hasDesign && fs.existsSync('.sdd/diseño/wireframe-pantalla-principal.html')
|
|
233
|
+
? 'Abre \`.sdd/diseño/wireframe-pantalla-principal.html\` en cualquier navegador.'
|
|
234
|
+
: '(Sin wireframe en este bundle)',
|
|
235
|
+
'',
|
|
236
|
+
'---',
|
|
237
|
+
'Generado por FORGE — From idea to product, forged locally.',
|
|
238
|
+
].join('\n');
|
|
239
|
+
|
|
240
|
+
fs.writeFileSync(path.join(BUNDLE, 'INSTALL.md'), install);
|
|
241
|
+
|
|
242
|
+
console.log('');
|
|
243
|
+
console.log('✅ Bundle generado: ' + BUNDLE + '/');
|
|
244
|
+
console.log(' Archivos incluidos: ' + incluidos.length);
|
|
245
|
+
console.log(' (forge.config.json y .git excluidos por seguridad)');
|
|
246
|
+
console.log('');
|
|
247
|
+
"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## PASO 4 — Generar INSTALL.md
|
|
253
|
+
|
|
254
|
+
Crear `{bundle}/INSTALL.md` con instrucciones para el destinatario:
|
|
255
|
+
|
|
256
|
+
```markdown
|
|
257
|
+
# {product.name} — Forge Bundle
|
|
258
|
+
|
|
259
|
+
Generado el {fecha} con FORGE v{version}.
|
|
260
|
+
|
|
261
|
+
## Qué contiene este bundle
|
|
262
|
+
|
|
263
|
+
- `sdd-lite/` — Comandos y agentes de FORGE para Claude Code
|
|
264
|
+
- `.sdd/` — Contexto del proyecto (IR, diseño, wireframes)
|
|
265
|
+
- `craft/` — Reglas de diseño
|
|
266
|
+
- `design-systems/` — Sistema visual {direction}
|
|
267
|
+
{si hay código: - `src/` — Código base generado}
|
|
268
|
+
|
|
269
|
+
## Cómo usarlo
|
|
270
|
+
|
|
271
|
+
### Opción A: En un proyecto nuevo con Claude Code
|
|
272
|
+
|
|
273
|
+
1. Copia este bundle a la raíz de tu proyecto
|
|
274
|
+
2. Abre el proyecto con Claude Code
|
|
275
|
+
3. Usa los comandos disponibles:
|
|
276
|
+
- `/sdd.diseñar` — continuar el diseño
|
|
277
|
+
- `/sdd.construir` — generar el código
|
|
278
|
+
- `/sdd.estado` — ver el estado del proyecto
|
|
279
|
+
|
|
280
|
+
### Opción B: Revisar el diseño
|
|
281
|
+
|
|
282
|
+
El wireframe de la pantalla principal está en:
|
|
283
|
+
`.sdd/diseño/wireframe-pantalla-principal.html`
|
|
284
|
+
|
|
285
|
+
Ábrelo en cualquier navegador para ver el diseño visual.
|
|
286
|
+
|
|
287
|
+
## Componentes incluidos
|
|
288
|
+
|
|
289
|
+
{lista generada automáticamente de lo que está en el bundle}
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
Generado por FORGE — From idea to product, forged locally.
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## PASO 5 — Comprimir (si `--zip`)
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
if [ "$ZIP_MODE" = "true" ]; then
|
|
301
|
+
ZIP_NAME="${PRODUCT_NAME}-forge-bundle-${TIMESTAMP}.zip"
|
|
302
|
+
zip -r "$ZIP_NAME" "$BUNDLE_DIR"
|
|
303
|
+
rm -rf "$BUNDLE_DIR"
|
|
304
|
+
echo "✅ Bundle comprimido: $ZIP_NAME"
|
|
305
|
+
else
|
|
306
|
+
echo "✅ Bundle en: $BUNDLE_DIR/"
|
|
307
|
+
fi
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Resumen final
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
═══════════════════════════════════════════
|
|
316
|
+
📦 BUNDLE EXPORTADO
|
|
317
|
+
═══════════════════════════════════════════
|
|
318
|
+
|
|
319
|
+
Producto: [product.name]
|
|
320
|
+
Bundle: [nombre]-forge-bundle/
|
|
321
|
+
Tamaño estimado: [N] archivos, [X] KB
|
|
322
|
+
|
|
323
|
+
Contenido:
|
|
324
|
+
✅ IR y análisis (.sdd/ir.json)
|
|
325
|
+
✅ Diseño de producto (.sdd/product-design.json)
|
|
326
|
+
✅ Wireframe (.sdd/diseño/)
|
|
327
|
+
[✅ Spec y código si está completo]
|
|
328
|
+
✅ Instrucciones (INSTALL.md)
|
|
329
|
+
|
|
330
|
+
Componentes FORGE incluidos:
|
|
331
|
+
[lista de comandos/skills/agentes copiados]
|
|
332
|
+
|
|
333
|
+
¿Qué sigue?
|
|
334
|
+
Comparte la carpeta [nombre]-forge-bundle/ con tu equipo
|
|
335
|
+
o abre el proyecto con Claude Code en otro equipo.
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Notas de seguridad
|
|
341
|
+
|
|
342
|
+
- El archivo `.sdd/forge.config.json` (con API keys) **nunca** se incluye en el bundle
|
|
343
|
+
- Los archivos `.env` y credenciales se excluyen automáticamente
|
|
344
|
+
- El bundle no contiene datos de la conversación, solo el output del pipeline
|