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.
Files changed (127) hide show
  1. package/.claude/settings.json +29 -29
  2. package/.claude/settings.local.json +10 -0
  3. package/.claude-plugin/marketplace.json +10 -7
  4. package/.claude-plugin/plugin.json +59 -37
  5. package/.gitignore +20 -0
  6. package/.mcp.json +8 -0
  7. package/LICENSE +21 -0
  8. package/README.md +77 -40
  9. package/agents/architecture-designer.md +211 -0
  10. package/agents/arquitecto.md +16 -1
  11. package/agents/asesor-datos.md +15 -1
  12. package/agents/critico.md +37 -1
  13. package/agents/desarrollador-backend.md +3 -1
  14. package/agents/desarrollador-frontend.md +11 -16
  15. package/agents/disenador-api.md +13 -1
  16. package/agents/documentador.md +3 -1
  17. package/agents/investigador.md +3 -1
  18. package/agents/operaciones.md +3 -1
  19. package/agents/product-designer.md +268 -0
  20. package/agents/revisor.md +25 -1
  21. package/agents/seguridad.md +5 -1
  22. package/agents/tester.md +3 -1
  23. package/claude-hooks/agent-memory.js +288 -0
  24. package/claude-hooks/pre-tool-guard.js +61 -9
  25. package/cli/index.js +1 -2
  26. package/commands/sdd.adr.md +196 -0
  27. package/commands/sdd.analizar.md +23 -2
  28. package/commands/sdd.ayuda.md +13 -0
  29. package/commands/sdd.compliance.md +521 -0
  30. package/commands/sdd.configurar.md +34 -1
  31. package/commands/sdd.constitucion.md +198 -23
  32. package/commands/sdd.construir.md +210 -0
  33. package/commands/sdd.crear-mcp.md +2 -0
  34. package/commands/sdd.defect-report.md +134 -0
  35. package/commands/sdd.descubrir.md +19 -0
  36. package/commands/sdd.dise/303/261ar.md +188 -0
  37. package/commands/sdd.estado.md +120 -3
  38. package/commands/sdd.exportar.md +344 -0
  39. package/commands/sdd.implementar.md +272 -52
  40. package/commands/sdd.interpretar.md +239 -0
  41. package/commands/sdd.md +93 -4
  42. package/commands/sdd.optimizar-memoria.md +47 -0
  43. package/commands/sdd.optimizar.md +164 -0
  44. package/commands/sdd.planificar.md +64 -0
  45. package/commands/sdd.retro.md +74 -0
  46. package/commands/sdd.verificar.md +81 -0
  47. package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
  48. package/configuracion-ejemplo/sdd.config.yaml +10 -0
  49. package/craft/accessibility-baseline.md +216 -0
  50. package/craft/anti-ai-slop.md +158 -0
  51. package/craft/color.md +160 -0
  52. package/craft/typography.md +121 -0
  53. package/design-systems/bold-brutalist/DESIGN.md +239 -0
  54. package/design-systems/editorial-minimal/DESIGN.md +205 -0
  55. package/design-systems/neutral-modern/DESIGN.md +227 -0
  56. package/design-systems/vibrant-consumer/DESIGN.md +257 -0
  57. package/design-systems/warm-editorial/DESIGN.md +221 -0
  58. package/docs/AGENTES.md +4 -1
  59. package/docs/CASO-COMPLETO.md +206 -0
  60. package/docs/EJEMPLOS.md +61 -185
  61. package/docs/FABRICA.md +163 -115
  62. package/docs/INICIO-RAPIDO.md +27 -79
  63. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
  64. package/docs/MODELOS.md +3 -0
  65. package/docs/QUE-PASA-SI-FALLA.md +404 -0
  66. package/docs/README.md +43 -0
  67. package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
  68. package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
  69. package/package.json +15 -10
  70. package/plantillas/job-story-mejorar-prompt.md +107 -0
  71. package/presets/enterprise.yaml +6 -0
  72. package/presets/lean.yaml +4 -0
  73. package/presets/startup.yaml +6 -0
  74. package/skills/adr-indexer/SKILL.md +181 -0
  75. package/skills/cache-audit/SKILL.md +163 -0
  76. package/skills/critica-diseno/SKILL.md +193 -0
  77. package/skills/descubrir-idea/SKILL.md +133 -0
  78. package/skills/effort-router/SKILL.md +128 -0
  79. package/skills/elegir-direccion/SKILL.md +184 -0
  80. package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
  81. package/skills/github-connect/INDEX.md +223 -0
  82. package/skills/github-connect/INTEGRATION.md +361 -0
  83. package/skills/github-connect/QUICK-START.md +168 -0
  84. package/skills/github-connect/README.md +414 -0
  85. package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
  86. package/skills/github-connect/SKILL.md +343 -0
  87. package/skills/github-connect/STRUCTURE.txt +252 -0
  88. package/skills/github-connect/example-config.yaml +41 -0
  89. package/skills/github-connect/github-connect.sh +419 -0
  90. package/skills/interpretar-idea/SKILL.md +254 -0
  91. package/skills/mejorar-prompt/SKILL.md +237 -0
  92. package/skills/memory-compactor/SKILL.md +68 -0
  93. package/skills/modo-guiado/SKILL.md +12 -2
  94. package/skills/mutation-detector/SKILL.md +134 -0
  95. package/skills/observabilidad-consumo/SKILL.md +164 -0
  96. package/skills/token-budget/SKILL.md +177 -0
  97. package/skills/vercel-deploy/00-START-HERE.txt +364 -0
  98. package/skills/vercel-deploy/CHECKLIST.md +205 -0
  99. package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
  100. package/skills/vercel-deploy/FLOW.txt +334 -0
  101. package/skills/vercel-deploy/INDEX.md +276 -0
  102. package/skills/vercel-deploy/INTEGRATION.md +328 -0
  103. package/skills/vercel-deploy/MANIFEST.md +310 -0
  104. package/skills/vercel-deploy/README.md +65 -0
  105. package/skills/vercel-deploy/SKILL.md +356 -0
  106. package/skills/vercel-deploy/deploy.sh +298 -0
  107. package/skills/vercel-deploy/estado.json.example +205 -0
  108. package/skills/vercel-deploy/skill.yaml +323 -0
  109. package/skills/vercel-deploy/vercel-deploy.sh +216 -0
  110. package/skills/wireframe-mvp/SKILL.md +157 -0
  111. package/docs/EJEMPLO-PRACTICA.md +0 -383
  112. package/mcp-figma/README.md +0 -158
  113. package/mcp-figma/package.json +0 -7
  114. package/mcp-figma/src/component-generator.js +0 -162
  115. package/mcp-figma/src/design-system-analyzer.js +0 -247
  116. package/mcp-figma/src/figma-client.js +0 -75
  117. package/mcp-figma/src/index.js +0 -114
  118. package/mcp-figma/src/mcp.js +0 -97
  119. package/mcp-figma/src/style-mapper.js +0 -85
  120. /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
  121. /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
  122. /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
  123. /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
  124. /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
  125. /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
  126. /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
  127. /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
+ ```
@@ -28,7 +28,57 @@ fi
28
28
  Ejecuta: /sdd.constitucion
29
29
  ```
30
30
 
31
- ## PASO 3Generar dashboard completo
31
+ ## PASO 2.5Detectar 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 — Modos adicionales
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