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.
- package/.claude/settings.json +21 -45
- package/LICENSE +21 -0
- package/README.md +51 -21
- package/agents/architecture-designer.md +174 -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 +3 -1
- 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 +232 -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 +154 -0
- package/cli/index.js +1 -2
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.compliance.md +516 -0
- package/commands/sdd.configurar.md +33 -0
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +68 -1
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +203 -23
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +70 -1
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.verificar.md +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/FABRICA.md +164 -115
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +237 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +5 -3
- 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/memory-compactor/SKILL.md +114 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +154 -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/.claude-plugin/marketplace.json +0 -31
- package/.claude-plugin/plugin.json +0 -97
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/docs/EJEMPLOS.md +0 -212
- /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
package/commands/sdd.estado.md
CHANGED
|
@@ -116,9 +116,76 @@ fi
|
|
|
116
116
|
| `verificada` (sin snapshot) | `/sdd.snapshot` |
|
|
117
117
|
| `completado` | `/sdd.especificar [nueva feature]` |
|
|
118
118
|
|
|
119
|
-
## PASO 5 —
|
|
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
|