sdd-es 2.0.0 → 2.5.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 (95) hide show
  1. package/.claude/settings.json +21 -45
  2. package/LICENSE +21 -0
  3. package/README.md +51 -21
  4. package/agents/architecture-designer.md +174 -0
  5. package/agents/arquitecto.md +16 -1
  6. package/agents/asesor-datos.md +15 -1
  7. package/agents/critico.md +37 -1
  8. package/agents/desarrollador-backend.md +3 -1
  9. package/agents/desarrollador-frontend.md +3 -1
  10. package/agents/disenador-api.md +13 -1
  11. package/agents/documentador.md +3 -1
  12. package/agents/investigador.md +3 -1
  13. package/agents/operaciones.md +3 -1
  14. package/agents/product-designer.md +232 -0
  15. package/agents/revisor.md +25 -1
  16. package/agents/seguridad.md +5 -1
  17. package/agents/tester.md +3 -1
  18. package/claude-hooks/agent-memory.js +154 -0
  19. package/cli/index.js +1 -2
  20. package/commands/sdd.analizar.md +23 -2
  21. package/commands/sdd.compliance.md +516 -0
  22. package/commands/sdd.configurar.md +33 -0
  23. package/commands/sdd.constitucion.md +198 -23
  24. package/commands/sdd.construir.md +210 -0
  25. package/commands/sdd.dise/303/261ar.md +188 -0
  26. package/commands/sdd.estado.md +68 -1
  27. package/commands/sdd.exportar.md +344 -0
  28. package/commands/sdd.implementar.md +203 -23
  29. package/commands/sdd.interpretar.md +239 -0
  30. package/commands/sdd.md +70 -1
  31. package/commands/sdd.optimizar.md +164 -0
  32. package/commands/sdd.planificar.md +64 -0
  33. package/commands/sdd.verificar.md +10 -0
  34. package/craft/accessibility-baseline.md +216 -0
  35. package/craft/anti-ai-slop.md +158 -0
  36. package/craft/color.md +160 -0
  37. package/craft/typography.md +121 -0
  38. package/design-systems/bold-brutalist/DESIGN.md +239 -0
  39. package/design-systems/editorial-minimal/DESIGN.md +205 -0
  40. package/design-systems/neutral-modern/DESIGN.md +227 -0
  41. package/design-systems/vibrant-consumer/DESIGN.md +257 -0
  42. package/design-systems/warm-editorial/DESIGN.md +221 -0
  43. package/docs/AGENTES.md +4 -1
  44. package/docs/FABRICA.md +164 -115
  45. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +237 -0
  46. package/docs/MODELOS.md +3 -0
  47. package/docs/QUE-PASA-SI-FALLA.md +404 -0
  48. package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
  49. package/package.json +5 -3
  50. package/skills/cache-audit/SKILL.md +163 -0
  51. package/skills/critica-diseno/SKILL.md +193 -0
  52. package/skills/descubrir-idea/SKILL.md +133 -0
  53. package/skills/effort-router/SKILL.md +128 -0
  54. package/skills/elegir-direccion/SKILL.md +184 -0
  55. package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
  56. package/skills/github-connect/INDEX.md +223 -0
  57. package/skills/github-connect/INTEGRATION.md +361 -0
  58. package/skills/github-connect/QUICK-START.md +168 -0
  59. package/skills/github-connect/README.md +414 -0
  60. package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
  61. package/skills/github-connect/SKILL.md +343 -0
  62. package/skills/github-connect/STRUCTURE.txt +252 -0
  63. package/skills/github-connect/example-config.yaml +41 -0
  64. package/skills/github-connect/github-connect.sh +419 -0
  65. package/skills/interpretar-idea/SKILL.md +254 -0
  66. package/skills/memory-compactor/SKILL.md +114 -0
  67. package/skills/modo-guiado/SKILL.md +12 -2
  68. package/skills/observabilidad-consumo/SKILL.md +164 -0
  69. package/skills/token-budget/SKILL.md +154 -0
  70. package/skills/vercel-deploy/00-START-HERE.txt +364 -0
  71. package/skills/vercel-deploy/CHECKLIST.md +205 -0
  72. package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
  73. package/skills/vercel-deploy/FLOW.txt +334 -0
  74. package/skills/vercel-deploy/INDEX.md +276 -0
  75. package/skills/vercel-deploy/INTEGRATION.md +328 -0
  76. package/skills/vercel-deploy/MANIFEST.md +310 -0
  77. package/skills/vercel-deploy/README.md +65 -0
  78. package/skills/vercel-deploy/SKILL.md +356 -0
  79. package/skills/vercel-deploy/deploy.sh +298 -0
  80. package/skills/vercel-deploy/estado.json.example +205 -0
  81. package/skills/vercel-deploy/skill.yaml +323 -0
  82. package/skills/vercel-deploy/vercel-deploy.sh +216 -0
  83. package/skills/wireframe-mvp/SKILL.md +157 -0
  84. package/.claude-plugin/marketplace.json +0 -31
  85. package/.claude-plugin/plugin.json +0 -97
  86. package/docs/EJEMPLO-PRACTICA.md +0 -383
  87. package/docs/EJEMPLOS.md +0 -212
  88. /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
  89. /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
  90. /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
  91. /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
  92. /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
  93. /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
  94. /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
  95. /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
@@ -116,9 +116,76 @@ fi
116
116
  | `verificada` (sin snapshot) | `/sdd.snapshot` |
117
117
  | `completado` | `/sdd.especificar [nueva feature]` |
118
118
 
119
- ## PASO 5 — Modos adicionales
119
+ ## PASO 5 — Consumo de agentes (observabilidad)
120
+
121
+ Si existe `.sdd/observabilidad/consumo.jsonl`, invocar la skill `observabilidad-consumo` y añadir una sección al dashboard:
122
+
123
+ ```bash
124
+ [ -f .sdd/observabilidad/consumo.jsonl ] && wc -l .sdd/observabilidad/consumo.jsonl
125
+ ```
126
+
127
+ Si hay datos, mostrar al final del dashboard:
128
+
129
+ ```
130
+ ╠════════════════════════════════════════════════════════════════╣
131
+ ║ 📊 CONSUMO DE AGENTES (sesión actual) ║
132
+ ║ ║
133
+ ║ [resumen de invocaciones por agente] ║
134
+ ║ [alertas de fan-out si las hay] ║
135
+ ║ ║
136
+ ║ Ver detalle completo: /sdd.estado consumo ║
137
+ ╚════════════════════════════════════════════════════════════════╝
138
+ ```
139
+
140
+ `/sdd.estado consumo` — invoca `observabilidad-consumo` y muestra el reporte completo.
141
+
142
+ ## PASO 6 — Modos adicionales
120
143
 
121
144
  `/sdd.estado historial` — muestra solo el historial completo de specs
122
145
  `/sdd.estado tareas` — muestra solo el detalle de tareas de la spec activa
123
146
  `/sdd.estado agentes` — muestra solo la config de agentes
147
+ `/sdd.estado consumo` — muestra el reporte de observabilidad de agentes
124
148
  `/sdd.estado todo` — muestra TODO lo de arriba más detalles extendidos
149
+
150
+ ## PASO 7 — Output styles (modos de presentación)
151
+
152
+ Si el argumento contiene `pm`, `arq` o `dev`, adapta el output del dashboard:
153
+
154
+ **Modo `pm` (Product Manager):**
155
+ ```
156
+ 📊 ESTADO DEL PROYECTO — [Nombre]
157
+
158
+ ✅ Feature en curso: [título de la spec activa en lenguaje natural]
159
+ 📈 Progreso: [N]% completado ([N] de [M] tareas listas)
160
+ 🎯 Próximo hito: [descripción en lenguaje natural del siguiente paso]
161
+ 🚦 Estado general: [Verde / Amarillo / Rojo]
162
+
163
+ ¿Qué necesitas saber?
164
+ - Avance → responde "avance"
165
+ - Bloqueos → responde "problemas"
166
+ - Cuándo termina → responde "estimado"
167
+ ```
168
+
169
+ **Modo `arq` (Arquitecto):**
170
+ ```
171
+ 📐 ESTADO TÉCNICO — [Nombre]
172
+
173
+ Stack: [lenguaje/framework]
174
+ Spec activa: [ID] — [título]
175
+ Fase: [fase actual]
176
+
177
+ Artefactos:
178
+ spec.md → [✅/⏸/❌]
179
+ plan.md → [✅/⏸/❌] — [versión/fecha]
180
+ tareas.md → [N] tareas ([distribución por agente])
181
+ analisis.md → [veredicto]
182
+
183
+ Decisiones de arquitectura pendientes: [N ADRs sin cerrar]
184
+ Riesgos abiertos: [N del último análisis]
185
+ Deuda técnica registrada: [N items]
186
+
187
+ Próxima decisión técnica requerida: [descripción]
188
+ ```
189
+
190
+ **Modo `dev` (Desarrollador) — default:**
191
+ 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