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,280 @@
|
|
|
1
|
+
# 🔐 Seguridad para No-Técnicos
|
|
2
|
+
|
|
3
|
+
> SDD-ES maneja tokens de GitHub y Vercel. Esta guía te explica qué son, cómo protegerlos, y qué hacer si cometes un error.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ¿Qué es un "token"?
|
|
8
|
+
|
|
9
|
+
Un **token** es como una **contraseña especial** que funciona solo para una cosa.
|
|
10
|
+
|
|
11
|
+
### Comparación
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Contraseña normal:
|
|
15
|
+
├─ Acceso a: email, redes sociales, archivos, TODO
|
|
16
|
+
└─ Riesgo: si alguien la roba, controla tu cuenta
|
|
17
|
+
|
|
18
|
+
Token:
|
|
19
|
+
├─ Acceso a: SOLO GitHub (o SOLO Vercel)
|
|
20
|
+
├─ Duración: puedes ponerle límite de tiempo
|
|
21
|
+
└─ Riesgo: si alguien lo roba, SOLO puede hacer lo que le diste permiso
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Ejemplo real:**
|
|
25
|
+
```
|
|
26
|
+
Token de GitHub para SDD-ES:
|
|
27
|
+
├─ ✅ PUEDE: crear repositorio, hacer commits, pushear código
|
|
28
|
+
├─ ✅ PUEDE: leer público el repositorio
|
|
29
|
+
└─ ❌ NO PUEDE: ver tus emails privados, cambiar contraseña, acceder a otros proyectos
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## ¿Por qué SDD-ES pide tokens?
|
|
35
|
+
|
|
36
|
+
SDD-ES necesita tokens para:
|
|
37
|
+
|
|
38
|
+
1. **GitHub:** Crear tu repositorio automáticamente (sin que escribas `git init`)
|
|
39
|
+
2. **Vercel:** Publicar tu app en internet (sin que escribas `vercel deploy`)
|
|
40
|
+
|
|
41
|
+
Sin tokens, tendrías que hacer todo manualmente (comandos, CLI, etc.).
|
|
42
|
+
|
|
43
|
+
**Con tokens:** SDD-ES lo hace automáticamente por ti.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 🚨 NUNCA hagas ESTO con tokens
|
|
48
|
+
|
|
49
|
+
### ❌ NO 1: No compartas tu token
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
❌ MALO:
|
|
53
|
+
- Enviar token por Whatsapp a un amigo
|
|
54
|
+
- Pegar token en Slack o Discord
|
|
55
|
+
- Guardar token en Notas o Google Docs
|
|
56
|
+
- Decirle a alguien tu token
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**¿Por qué?** Si alguien tiene tu token, puede:
|
|
60
|
+
- Acceder a tu GitHub/Vercel
|
|
61
|
+
- Hacer commits en tu nombre
|
|
62
|
+
- Borrar repositorios
|
|
63
|
+
- Cambiar configuración de apps
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### ❌ NO 2: No guardes token en archivos
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
❌ MALO (SDD-ES NO hace esto):
|
|
71
|
+
- No guardes token en .env
|
|
72
|
+
- No lo guardes en un archivo de texto
|
|
73
|
+
- No lo commitess a GitHub
|
|
74
|
+
|
|
75
|
+
✅ BIEN (SDD-ES SÍ hace esto):
|
|
76
|
+
- Token se usa en memoria mientras se necesita
|
|
77
|
+
- Cuando termina, se borra automáticamente
|
|
78
|
+
- Nunca se escribe en archivos persistentes
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### ❌ NO 3: No commitess archivos sensibles
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
❌ MALO:
|
|
87
|
+
git add .
|
|
88
|
+
git commit -m "Mi proyecto"
|
|
89
|
+
[Si accidentalmente commiteas .env o credenciales]
|
|
90
|
+
|
|
91
|
+
✅ BIEN:
|
|
92
|
+
SDD-ES usa .gitignore para proteger:
|
|
93
|
+
- .sdd/.vercel-deploy.json (metadata de deploy)
|
|
94
|
+
- .env (variables de entorno)
|
|
95
|
+
- Cualquier archivo con secretos
|
|
96
|
+
|
|
97
|
+
[Git automáticamente ignora estos archivos]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 📋 ¿Cómo generar un token SEGURO?
|
|
103
|
+
|
|
104
|
+
### Token de GitHub (para SDD-ES)
|
|
105
|
+
|
|
106
|
+
**Paso 1:** Abre https://github.com/settings/tokens?type=pat
|
|
107
|
+
|
|
108
|
+
**Paso 2:** Click "Generate new token" → "Fine-grained tokens"
|
|
109
|
+
|
|
110
|
+
**Paso 3:** Configura permisos **MÍNIMOS**:
|
|
111
|
+
```
|
|
112
|
+
Repository access:
|
|
113
|
+
✅ All repositories (SDD-ES creará uno nuevo)
|
|
114
|
+
|
|
115
|
+
Permissions:
|
|
116
|
+
✅ Repository: READ + WRITE (crear repo, hacer commits)
|
|
117
|
+
✅ Administration: NONE (no cambiar settings)
|
|
118
|
+
✅ Secrets: NONE (no leer otros secrets)
|
|
119
|
+
❌ User: NONE (no acceder emails)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Paso 4:** Expiration:
|
|
123
|
+
```
|
|
124
|
+
⚠️ IMPORTANTE: Pon un límite de 90 días
|
|
125
|
+
(No "No expiration" — riesgo si token se roba)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Paso 5:** Click "Generate token", copia y **úsalo INMEDIATAMENTE**
|
|
129
|
+
|
|
130
|
+
**Paso 6:** En SDD-ES, pega el token cuando pida
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
### Token de Vercel (para SDD-ES)
|
|
135
|
+
|
|
136
|
+
**Paso 1:** Abre https://vercel.com/account/tokens
|
|
137
|
+
|
|
138
|
+
**Paso 2:** Click "Create Token"
|
|
139
|
+
|
|
140
|
+
**Paso 3:** Configura:
|
|
141
|
+
```
|
|
142
|
+
Token Name: "SDD-ES [nombre-proyecto]" (ej: SDD-ES Mi Tienda)
|
|
143
|
+
Scope: Todos los equipos (o tu equipo)
|
|
144
|
+
Expiration: 90 días (NO "No expiration")
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Paso 4:** Click "Create", copia y **úsalo INMEDIATAMENTE**
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## ✅ Si generaste token correctamente
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
Después de pegar el token en SDD-ES:
|
|
155
|
+
|
|
156
|
+
Sistema: "✅ Token válido"
|
|
157
|
+
Sistema: "[invoca skill de GitHub/Vercel]"
|
|
158
|
+
Sistema: "✅ Tu proyecto está en GitHub/Vercel"
|
|
159
|
+
|
|
160
|
+
El token se BORRA de la memoria automáticamente.
|
|
161
|
+
Ya NO lo necesitas más.
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 🚨 Si cometiste un error (compartiste token accidentalmente)
|
|
167
|
+
|
|
168
|
+
### Escenario 1: Compartiste token por Whatsapp/Slack
|
|
169
|
+
|
|
170
|
+
**¿Qué hacer?**
|
|
171
|
+
|
|
172
|
+
1. **IMMEDIATO — Revoca el token:**
|
|
173
|
+
- GitHub: https://github.com/settings/tokens
|
|
174
|
+
- Busca el token
|
|
175
|
+
- Click "Delete"
|
|
176
|
+
|
|
177
|
+
2. **Genera uno NUEVO:**
|
|
178
|
+
- Sigue los pasos de arriba
|
|
179
|
+
- USA el nuevo en SDD-ES
|
|
180
|
+
|
|
181
|
+
3. **Chequea que no pasó nada malo:**
|
|
182
|
+
- GitHub: Mira el repositorio, ¿alguien cambió código?
|
|
183
|
+
- Vercel: ¿Apps raras desplegadas?
|
|
184
|
+
|
|
185
|
+
4. **Si sospechas actividad extraña:**
|
|
186
|
+
- Cambia contraseña de GitHub/Vercel
|
|
187
|
+
- Activa 2FA (autenticación de dos factores)
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
### Escenario 2: Accidentalmente commitease token a GitHub
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
(SDD-ES NO hace esto, pero si ocurre por error)
|
|
195
|
+
|
|
196
|
+
❌ MALO: El token está en GitHub público
|
|
197
|
+
Cualquiera puede verlo en git log
|
|
198
|
+
|
|
199
|
+
✅ RECUPERACIÓN:
|
|
200
|
+
1. Revoca el token INMEDIATAMENTE (arriba)
|
|
201
|
+
2. Borra el archivo de histórico de git:
|
|
202
|
+
git filter-branch --tree-filter 'rm -f .env' HEAD
|
|
203
|
+
3. Force push: git push --force
|
|
204
|
+
4. Avisa a GitHub (https://github.com/security/advisories)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 🔒 SDD-ES protege tu seguridad
|
|
210
|
+
|
|
211
|
+
### Cómo SDD-ES cuida los tokens
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
✅ TOKENS EN VARIABLES DE ENTORNO (memoria)
|
|
215
|
+
└─ No se escriben en archivos
|
|
216
|
+
└─ Se borran cuando termina el script
|
|
217
|
+
|
|
218
|
+
✅ VALIDACIÓN INMEDIATA
|
|
219
|
+
└─ Si token es inválido, sale rápido
|
|
220
|
+
└─ No continúa si hay problema
|
|
221
|
+
|
|
222
|
+
✅ .gitignore AUTOMÁTICO
|
|
223
|
+
└─ Protege archivos sensibles
|
|
224
|
+
└─ Aunque hagas "git add .", no se commitean
|
|
225
|
+
|
|
226
|
+
✅ SIN GUARDAR CREDENTIALS
|
|
227
|
+
└─ sdd.config.yaml SOLO guarda URLs, no tokens
|
|
228
|
+
└─ Tokens se usan ONCE y desaparecen
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 📋 Checklist de Seguridad
|
|
234
|
+
|
|
235
|
+
Antes de usar SDD-ES, asegúrate de:
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
[ ] Generé un token NUEVO (no uno viejo)
|
|
239
|
+
[ ] Token tiene expiración 90 días (no "No expiration")
|
|
240
|
+
[ ] Token tiene permisos MÍNIMOS (solo repo, no everything)
|
|
241
|
+
[ ] Guardé el token en un lugar SEGURO temporalmente (1Password, Bitwarden)
|
|
242
|
+
[ ] Voy a pegar el token INMEDIATAMENTE en SDD-ES
|
|
243
|
+
[ ] NO voy a guardar el token en archivos
|
|
244
|
+
[ ] NO voy a compartir el token en mensajes
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 🆘 Emergencia: Creo que mi token fue robado
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
ACCIÓN: REVOCA INMEDIATAMENTE
|
|
253
|
+
|
|
254
|
+
1. GitHub: https://github.com/settings/tokens
|
|
255
|
+
→ Busca token → Click "Delete"
|
|
256
|
+
|
|
257
|
+
2. Vercel: https://vercel.com/account/tokens
|
|
258
|
+
→ Click "Delete"
|
|
259
|
+
|
|
260
|
+
3. Genera NUEVOS tokens
|
|
261
|
+
|
|
262
|
+
4. IMPORTANTE: Cambia contraseña GitHub/Vercel
|
|
263
|
+
(por si alguien también robó contraseña)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 📚 Más información
|
|
269
|
+
|
|
270
|
+
- **GitHub Security:** https://docs.github.com/en/authentication/keeping-your-account-and-data-secure
|
|
271
|
+
- **Vercel Security:** https://vercel.com/docs/security
|
|
272
|
+
- **OWASP (Seguridad general):** https://owasp.org/
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 💬 ¿Preguntas?
|
|
277
|
+
|
|
278
|
+
Si no estás seguro sobre algo de seguridad, **mejor pregunta que arreglar después.**
|
|
279
|
+
|
|
280
|
+
Abre un issue en GitHub: https://github.com/carlos060798/sdd-lite/issues
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sdd-es",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "Spec-Driven Development en español para Claude Code. Fábrica de software: de la idea al despliegue, agnóstica al stack.
|
|
3
|
+
"version": "2.6.0",
|
|
4
|
+
"description": "Spec-Driven Development en español para Claude Code. Fábrica de software: de la idea al despliegue, agnóstica al stack. v2.6.0: auto-compresión de memoria, ADR Indexer, Defect Rate tracking.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"sdd-es": "cli/index.js"
|
|
@@ -9,28 +9,33 @@
|
|
|
9
9
|
"scripts": {
|
|
10
10
|
"test": "node --test tests/*.test.js",
|
|
11
11
|
"test:verbose": "node --test --reporter=spec tests/*.test.js",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
12
|
+
"lint": "echo 'Linter coming in v2.6.0'",
|
|
13
|
+
"lint:fix": "echo 'Auto-fix coming in v2.6.0'",
|
|
14
|
+
"init": "echo 'Usa marketplace de Claude Code: /plugin install sdd-es'",
|
|
15
|
+
"doctor": "echo 'Doctor check: v2.6.0 lista para producción'"
|
|
14
16
|
},
|
|
15
17
|
"engines": {
|
|
16
18
|
"node": ">=18.0.0"
|
|
17
19
|
},
|
|
18
20
|
"files": [
|
|
19
|
-
"cli/",
|
|
20
21
|
"commands/",
|
|
21
22
|
"agents/",
|
|
22
23
|
"skills/",
|
|
24
|
+
"craft/",
|
|
25
|
+
"design-systems/",
|
|
23
26
|
"plantillas/",
|
|
24
27
|
"presets/",
|
|
25
28
|
"claude-hooks/",
|
|
26
29
|
"configuracion-ejemplo/",
|
|
27
30
|
"docs/",
|
|
28
|
-
"mcp-figma/",
|
|
29
31
|
".claude-plugin/",
|
|
30
|
-
".claude/
|
|
32
|
+
".claude/",
|
|
33
|
+
".gitignore",
|
|
34
|
+
".mcp.json",
|
|
31
35
|
"instalar.sh",
|
|
32
36
|
"instalar.ps1",
|
|
33
|
-
"README.md"
|
|
37
|
+
"README.md",
|
|
38
|
+
"LICENSE"
|
|
34
39
|
],
|
|
35
40
|
"keywords": [
|
|
36
41
|
"claude-code",
|
|
@@ -42,9 +47,9 @@
|
|
|
42
47
|
"plugin"
|
|
43
48
|
],
|
|
44
49
|
"license": "MIT",
|
|
45
|
-
"homepage": "https://github.com/carlos060798/
|
|
50
|
+
"homepage": "https://github.com/carlos060798/FORGE",
|
|
46
51
|
"repository": {
|
|
47
52
|
"type": "git",
|
|
48
|
-
"url": "https://github.com/carlos060798/
|
|
53
|
+
"url": "https://github.com/carlos060798/FORGE.git"
|
|
49
54
|
}
|
|
50
55
|
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: JS-PROMPT-001
|
|
3
|
+
tipo: job-story
|
|
4
|
+
estado: aprobada
|
|
5
|
+
fecha: 2026-06-14
|
|
6
|
+
versión: 1.0.0
|
|
7
|
+
autor: SDD-ES
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Job Story — Mejorar Prompts con Claude Code
|
|
11
|
+
|
|
12
|
+
## Historia principal
|
|
13
|
+
|
|
14
|
+
**Cuando** estoy a punto de pedirle algo a Claude Code y no sé cómo formularlo con precisión,
|
|
15
|
+
**quiero** una guía que transforme mi intención vaga en un prompt profesional paso a paso,
|
|
16
|
+
**para** obtener resultados predecibles, manteniendo el trabajo dentro del plan de la spec activa.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Contexto del problema
|
|
21
|
+
|
|
22
|
+
Un prompt vago produce resultados impredecibles porque Claude toma decisiones discrecionales
|
|
23
|
+
sobre el alcance, el enfoque y las dependencias. El mismo prompt puede generar desde un
|
|
24
|
+
try-catch de 3 líneas hasta un sistema de logging con Winston, rotación de archivos y niveles
|
|
25
|
+
de severidad — dependiendo del momento y el contexto de la sesión.
|
|
26
|
+
|
|
27
|
+
La diferencia entre un resultado útil y uno que hay que descartar no está en Claude Code,
|
|
28
|
+
está en la calidad de las instrucciones. Esta job story captura la necesidad de cerrar esa
|
|
29
|
+
brecha de forma sistemática, sin depender de la experiencia del usuario.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Criterios de Aceptación
|
|
34
|
+
|
|
35
|
+
- **CA-001:** dado un prompt vago de 1-2 frases, la skill produce una versión profesional
|
|
36
|
+
con los 5 componentes (Contexto, Tarea, Restricciones, Formato, Verificación) cuando aplican
|
|
37
|
+
- **CA-002:** la versión mejorada incluye siempre una restricción explícita sobre el alcance
|
|
38
|
+
de la spec activa (`No salgas de lo definido en .sdd/especificaciones/`)
|
|
39
|
+
- **CA-003:** si el prompt solicita algo fuera de la fase o feature actual (según
|
|
40
|
+
`.sdd/estado.json`), la skill lo detecta y advierte antes de reescribir
|
|
41
|
+
- **CA-004:** el output muestra la justificación de cada componente añadido, no solo el
|
|
42
|
+
prompt mejorado
|
|
43
|
+
- **CA-005:** la skill se puede invocar con `/mejorar-prompt "texto del prompt vago"`
|
|
44
|
+
- **CA-006:** si el prompt ya es profesional (tiene ≥4 de los 5 componentes), la skill lo
|
|
45
|
+
confirma y no reescribe innecesariamente
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Escenarios BDD
|
|
50
|
+
|
|
51
|
+
### Escenario 1 — Prompt de implementación vago
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Dado: el usuario escribe "añade autenticación"
|
|
55
|
+
Cuando: invoca /mejorar-prompt "añade autenticación"
|
|
56
|
+
Entonces: obtiene una versión profesional con:
|
|
57
|
+
- Contexto del stack actual (Express + TypeScript, endpoints existentes)
|
|
58
|
+
- Tarea acotada (qué tipo de autenticación, qué endpoints proteger)
|
|
59
|
+
- Restricciones (no romper endpoints existentes, no instalar dependencias no aprobadas)
|
|
60
|
+
- Verificación con tests que cubran el happy path y el rechazo de tokens inválidos
|
|
61
|
+
Y: cada componente va acompañado de una línea explicando por qué se añadió
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Escenario 2 — Prompt fuera de spec
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Dado: la spec activa en .sdd/estado.json es "login con email"
|
|
68
|
+
Y: el usuario escribe "añade un sistema de pagos con Stripe"
|
|
69
|
+
Cuando: invoca /mejorar-prompt
|
|
70
|
+
Entonces: la skill emite una advertencia:
|
|
71
|
+
"⚠️ 'pagos con Stripe' parece estar fuera de la spec activa (login con email).
|
|
72
|
+
Para continuar tienes dos opciones:
|
|
73
|
+
1. Escribe /sdd.especificar para abrir una nueva spec de pagos
|
|
74
|
+
2. Confirma que este cambio sí forma parte de la feature actual"
|
|
75
|
+
Y: no reescribe el prompt hasta recibir confirmación
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Escenario 3 — Prompt de debug vago
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Dado: el usuario escribe "no funciona el login"
|
|
82
|
+
Cuando: invoca /mejorar-prompt
|
|
83
|
+
Entonces: la skill detecta el patrón "depurar problema" y produce:
|
|
84
|
+
- Contexto: qué estaba haciendo cuando falló
|
|
85
|
+
- Tarea: el error exacto (pegar stack trace) y el archivo/línea
|
|
86
|
+
- Formato: "antes de corregir: (1) causa raíz (2) por qué ocurre (3) fix propuesto"
|
|
87
|
+
- Verificación: test que reproduce el bug antes del fix y pasa después
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Escenario 4 — Prompt ya profesional
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Dado: el usuario escribe un prompt con contexto, tarea, restricciones y verificación
|
|
94
|
+
Cuando: invoca /mejorar-prompt
|
|
95
|
+
Entonces: la skill responde "Este prompt ya tiene 4/5 componentes. Está bien estructurado."
|
|
96
|
+
Y opcionalmente sugiere el único componente que falta (si hay alguno)
|
|
97
|
+
Y no reescribe el prompt
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Notas de implementación
|
|
103
|
+
|
|
104
|
+
- La skill vive en `skills/mejorar-prompt/SKILL.md`
|
|
105
|
+
- El agente que la ejecuta es `sonnet` (balance razonamiento / coste)
|
|
106
|
+
- Lee `.sdd/estado.json` antes de reescribir para detectar el scope de la spec activa
|
|
107
|
+
- Los 7 patrones de referencia están documentados en `docs-site/` bajo la sección Prompts
|
package/presets/enterprise.yaml
CHANGED
|
@@ -50,6 +50,12 @@ agentes:
|
|
|
50
50
|
investigador:
|
|
51
51
|
activo: true
|
|
52
52
|
modelo: sonnet
|
|
53
|
+
product-designer:
|
|
54
|
+
activo: true
|
|
55
|
+
modelo: opus # diseño de producto riguroso
|
|
56
|
+
architecture-designer:
|
|
57
|
+
activo: true
|
|
58
|
+
modelo: opus # arquitectura crítica → opus siempre
|
|
53
59
|
|
|
54
60
|
comportamiento:
|
|
55
61
|
deteccion_tamano_automatica: true
|
package/presets/lean.yaml
CHANGED
|
@@ -46,6 +46,10 @@ agentes:
|
|
|
46
46
|
activo: false
|
|
47
47
|
investigador:
|
|
48
48
|
activo: false # no hay equipo que necesite el contexto documentado
|
|
49
|
+
product-designer:
|
|
50
|
+
activo: false # sin diseño formal de producto
|
|
51
|
+
architecture-designer:
|
|
52
|
+
activo: false # tú diseñas la arquitectura
|
|
49
53
|
|
|
50
54
|
comportamiento:
|
|
51
55
|
deteccion_tamano_automatica: true
|
package/presets/startup.yaml
CHANGED
|
@@ -50,6 +50,12 @@ agentes:
|
|
|
50
50
|
investigador:
|
|
51
51
|
activo: true
|
|
52
52
|
modelo: sonnet
|
|
53
|
+
product-designer:
|
|
54
|
+
activo: true
|
|
55
|
+
modelo: sonnet
|
|
56
|
+
architecture-designer:
|
|
57
|
+
activo: true
|
|
58
|
+
modelo: opus # decisiones de arquitectura → opus
|
|
53
59
|
|
|
54
60
|
comportamiento:
|
|
55
61
|
deteccion_tamano_automatica: true
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-indexer
|
|
3
|
+
model: claude-haiku-4-5
|
|
4
|
+
description: Indexa decisiones arquitectónicas (ADR) desde comentarios en código
|
|
5
|
+
allowed-tools: Read, Write, Bash
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Skill: ADR Indexer
|
|
9
|
+
|
|
10
|
+
**Propósito:** Capturar automáticamente decisiones arquitectónicas de comentarios en código y mantener un índice buscable.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Cómo Funciona
|
|
15
|
+
|
|
16
|
+
### Patrón ADR en Comentarios
|
|
17
|
+
|
|
18
|
+
El desarrollador (agente) deja una nota en el código:
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
# ADR: {"decision": "Use PostgreSQL", "context": "ACID needed", "status": "accepted"}
|
|
22
|
+
class Database:
|
|
23
|
+
pass
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Hook Captura Automáticamente
|
|
27
|
+
|
|
28
|
+
Hook `agent-memory.js` detecta comentarios con patrón `ADR: {...}` y:
|
|
29
|
+
1. Extrae JSON
|
|
30
|
+
2. Valida estructura
|
|
31
|
+
3. Guarda en `.sdd/arquitectura/ADRs.jsonl`
|
|
32
|
+
|
|
33
|
+
### Usuario Consulta
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
/sdd.adr list
|
|
37
|
+
→ Tabla de decisiones
|
|
38
|
+
|
|
39
|
+
/sdd.adr search "database"
|
|
40
|
+
→ Solo ADRs que mencionan "database"
|
|
41
|
+
|
|
42
|
+
/sdd.adr new
|
|
43
|
+
→ Captura interactiva de nueva decisión
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Estructura de ADR
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"ts": "2026-06-14T10:30:00Z",
|
|
53
|
+
"decision": "Use PostgreSQL for relational data",
|
|
54
|
+
"context": "ACID transactions required, multi-tenant",
|
|
55
|
+
"alternatives": ["MongoDB", "Firebase"],
|
|
56
|
+
"status": "accepted",
|
|
57
|
+
"archivo": "src/database.ts",
|
|
58
|
+
"linea": 42
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Campos:**
|
|
63
|
+
- `ts` — timestamp (automático)
|
|
64
|
+
- `decision` — qué se decidió
|
|
65
|
+
- `context` — por qué
|
|
66
|
+
- `alternatives` — opciones consideradas
|
|
67
|
+
- `status` — accepted | rejected | deprecated | superseded
|
|
68
|
+
- `archivo` — dónde está el código
|
|
69
|
+
- `linea` — número de línea
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Ledger: `.sdd/arquitectura/ADRs.jsonl`
|
|
74
|
+
|
|
75
|
+
Append-only JSONL:
|
|
76
|
+
```
|
|
77
|
+
{"ts":"2026-06-14T10:30:00Z","decision":"Use PostgreSQL","status":"accepted",...}
|
|
78
|
+
{"ts":"2026-06-14T10:31:00Z","decision":"Use Redis for cache","status":"accepted",...}
|
|
79
|
+
{"ts":"2026-06-14T10:32:00Z","decision":"JWT for auth","status":"accepted",...}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Ventajas:**
|
|
83
|
+
- Histórico completo
|
|
84
|
+
- Búsqueda rápida (grep)
|
|
85
|
+
- Estadísticas fáciles (contar, agrupar por status)
|
|
86
|
+
- Reversible (append-only, nunca sobrescrito)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Uso Interactivo
|
|
91
|
+
|
|
92
|
+
### `/sdd.adr list`
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
ID | DECISION | CONTEXT | STATUS
|
|
96
|
+
───┼───────────────────────────┼──────────────────────┼──────────
|
|
97
|
+
1 | Use PostgreSQL | ACID needed | accepted
|
|
98
|
+
2 | Cache with Redis | Performance req | accepted
|
|
99
|
+
3 | JWT instead of sessions | Stateless API | accepted
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### `/sdd.adr search "security"`
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
ID | DECISION | STATUS
|
|
106
|
+
───┼───────────────────────────┼──────────
|
|
107
|
+
1 | HTTPS only | accepted
|
|
108
|
+
2 | Validate all user input | accepted
|
|
109
|
+
3 | Encrypt passwords | accepted
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### `/sdd.adr new`
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
Nuevo ADR — responde las preguntas:
|
|
116
|
+
1. Decisión: "Use DynamoDB para analytics"
|
|
117
|
+
2. Contexto: "Scale infinitamente, baja latencia"
|
|
118
|
+
3. Alternativas: "PostgreSQL partitioning, BigQuery"
|
|
119
|
+
4. Status: "accepted" (o "rejected", "deprecated")
|
|
120
|
+
|
|
121
|
+
✅ Guardado en ADRs.jsonl
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Implementación Técnica
|
|
127
|
+
|
|
128
|
+
### En Hook: `agent-memory.js`
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
function extraerADRsDelContenido(contenido) {
|
|
132
|
+
// Regex multilenguaje: //, /*, #, --, etc.
|
|
133
|
+
const regex = /(?:\/\/|\/\*|#|--|<!--|REM)\s*ADR:\s*({[^}]*})/g;
|
|
134
|
+
const adrs = [];
|
|
135
|
+
let match;
|
|
136
|
+
while ((match = regex.exec(contenido)) !== null) {
|
|
137
|
+
try {
|
|
138
|
+
const json = JSON.parse(match[1]);
|
|
139
|
+
adrs.push(json);
|
|
140
|
+
} catch {
|
|
141
|
+
// Ignorar JSON inválido
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return adrs;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function registrarADR(cwd, agente, archivo, adrs) {
|
|
148
|
+
const ledgerFile = join(cwd, ".sdd/arquitectura/ADRs.jsonl");
|
|
149
|
+
for (const adr of adrs) {
|
|
150
|
+
const linea = JSON.stringify({
|
|
151
|
+
ts: new Date().toISOString(),
|
|
152
|
+
...adr,
|
|
153
|
+
archivo: archivo,
|
|
154
|
+
agente: agente
|
|
155
|
+
});
|
|
156
|
+
appendFileSync(ledgerFile, linea + "\n", "utf8");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## CLI: `adr-parser.js`
|
|
164
|
+
|
|
165
|
+
Batch scan del codebase:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
node utils/adr-parser.js . src/**/*.ts --update-ledger
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Encuentra todos los ADRs en archivos existentes y los añade al ledger.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Notas
|
|
176
|
+
|
|
177
|
+
- **Multilenguaje:** Soporta comentarios en Python, JS, Go, Java, Rust, etc.
|
|
178
|
+
- **Idempotente:** Escanear 2 veces = mismos resultados (sin duplicados)
|
|
179
|
+
- **Seguro:** JSON validado antes de guardar, error silencioso si es inválido
|
|
180
|
+
- **Performante:** Regex simple, <100ms para archivo de 100KB
|
|
181
|
+
|