sdd-es 2.5.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 +24 -0
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +34 -0
- package/.claude-plugin/plugin.json +119 -0
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/README.md +27 -20
- package/agents/architecture-designer.md +37 -0
- package/agents/desarrollador-frontend.md +8 -15
- package/agents/product-designer.md +36 -0
- package/claude-hooks/agent-memory.js +137 -3
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +5 -0
- package/commands/sdd.configurar.md +1 -1
- 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.estado.md +52 -2
- package/commands/sdd.implementar.md +71 -31
- package/commands/sdd.md +23 -3
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +71 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +88 -0
- package/docs/FABRICA.md +5 -6
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +12 -10
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/package.json +11 -8
- 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 +1 -1
- package/skills/critica-diseno/SKILL.md +1 -1
- package/skills/descubrir-idea/SKILL.md +1 -1
- package/skills/effort-router/SKILL.md +1 -1
- package/skills/elegir-direccion/SKILL.md +1 -1
- package/skills/interpretar-idea/SKILL.md +1 -1
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +34 -80
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +1 -1
- package/skills/token-budget/SKILL.md +24 -1
- package/skills/wireframe-mvp/SKILL.md +1 -1
- 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/.claude/settings.json
CHANGED
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PreToolUse": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "node claude-hooks/pre-tool-guard.js"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"PostToolUse": [
|
|
15
|
+
{
|
|
16
|
+
"matcher": "Write|Edit",
|
|
17
|
+
"hooks": [
|
|
18
|
+
{
|
|
19
|
+
"type": "command",
|
|
20
|
+
"command": "node claude-hooks/agent-memory.js"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
},
|
|
2
26
|
"permissions": {
|
|
3
27
|
"allow": [
|
|
4
28
|
"PowerShell(New-Item -ItemType Directory -Path \"C:\\\\Users\\\\usuario\\\\sdd-lite\\\\sdd-lite\\\\tests\" -Force)",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sdd-es-marketplace",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "SDD-ES",
|
|
5
|
+
"url": "https://github.com/carlos060798/FORGE"
|
|
6
|
+
},
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "Marketplace de SDD-ES — Spec-Driven Development en español para Claude Code.",
|
|
9
|
+
"version": "2.5.0"
|
|
10
|
+
},
|
|
11
|
+
"plugins": [
|
|
12
|
+
{
|
|
13
|
+
"name": "sdd-es",
|
|
14
|
+
"source": "./",
|
|
15
|
+
"description": "Fábrica de software agnóstica al stack: de la idea al despliegue. 14 agentes especializados, mapas estáticos, compresión de tokens, routing inteligente de modelos (Haiku/Sonnet/Opus), memory persistente entre sesiones, observabilidad integrada, técnicas avanzadas de optimización (v2.5.0). Pipeline completo: Idea → IR → Spec → Plan → Tareas → Implementación → Verificación → Deploy.",
|
|
16
|
+
"version": "2.5.0",
|
|
17
|
+
"author": {
|
|
18
|
+
"name": "Danilo Angarita",
|
|
19
|
+
"email": "daniloangaritagarcia@gmail.com"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/carlos060798/FORGE",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"keywords": [
|
|
24
|
+
"spec-driven-development",
|
|
25
|
+
"español",
|
|
26
|
+
"agentes",
|
|
27
|
+
"mcp",
|
|
28
|
+
"agnóstico-al-stack",
|
|
29
|
+
"tokens-optimization",
|
|
30
|
+
"memory-persistence"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://claude.ai/schemas/plugin/v1.json",
|
|
3
|
+
"name": "sdd-es",
|
|
4
|
+
"version": "2.5.0",
|
|
5
|
+
"description": "Spec-Driven Development en español. Fábrica de software agnóstica al stack: de la idea al despliegue. Con 14 agentes especializados, mapas, compresión de tokens y técnicas avanzadas de optimización (v2.5.0).",
|
|
6
|
+
"homepage": "https://github.com/carlos060798/FORGE",
|
|
7
|
+
"repository": "https://github.com/carlos060798/FORGE",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"author": {
|
|
10
|
+
"name": "Danilo Angarita",
|
|
11
|
+
"email": "daniloangaritagarcia@gmail.com",
|
|
12
|
+
"url": "https://github.com/carlos060798/FORGE"
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
"userConfig": {
|
|
16
|
+
"modelo_principal": {
|
|
17
|
+
"type": "select",
|
|
18
|
+
"label": "Modelo para agentes de decisión (arquitecto, crítico, seguridad, asesor-datos, revisor)",
|
|
19
|
+
"options": ["claude-opus-4-8", "claude-sonnet-4-6", "claude-haiku-4-5-20251001"],
|
|
20
|
+
"default": "claude-opus-4-8"
|
|
21
|
+
},
|
|
22
|
+
"perfil_default": {
|
|
23
|
+
"type": "select",
|
|
24
|
+
"label": "Perfil de interacción por defecto",
|
|
25
|
+
"options": ["experto", "guiado"],
|
|
26
|
+
"default": "experto"
|
|
27
|
+
},
|
|
28
|
+
"verbosidad": {
|
|
29
|
+
"type": "select",
|
|
30
|
+
"label": "Nivel de detalle en reportes de implementación",
|
|
31
|
+
"options": ["minimo", "normal", "detallado"],
|
|
32
|
+
"default": "normal"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
"commands": [
|
|
37
|
+
"sdd",
|
|
38
|
+
"sdd.constitucion",
|
|
39
|
+
"sdd.configurar",
|
|
40
|
+
"sdd.descubrir",
|
|
41
|
+
"sdd.interpretar",
|
|
42
|
+
"sdd.diseñar",
|
|
43
|
+
"sdd.construir",
|
|
44
|
+
"sdd.exportar",
|
|
45
|
+
"sdd.compliance",
|
|
46
|
+
"sdd.especificar",
|
|
47
|
+
"sdd.importar",
|
|
48
|
+
"sdd.aclarar",
|
|
49
|
+
"sdd.checklist",
|
|
50
|
+
"sdd.planificar",
|
|
51
|
+
"sdd.tareas",
|
|
52
|
+
"sdd.analizar",
|
|
53
|
+
"sdd.implementar",
|
|
54
|
+
"sdd.qa",
|
|
55
|
+
"sdd.verificar",
|
|
56
|
+
"sdd.desplegar",
|
|
57
|
+
"sdd.canary",
|
|
58
|
+
"sdd.snapshot",
|
|
59
|
+
"sdd.retro",
|
|
60
|
+
"sdd.release",
|
|
61
|
+
"sdd.glosario",
|
|
62
|
+
"sdd.estado",
|
|
63
|
+
"sdd.mapear",
|
|
64
|
+
"sdd.comprimir",
|
|
65
|
+
"sdd.optimizar",
|
|
66
|
+
"sdd.optimizar-memoria",
|
|
67
|
+
"sdd.adr",
|
|
68
|
+
"sdd.defect-report",
|
|
69
|
+
"sdd.ayuda",
|
|
70
|
+
"sdd.crear-mcp",
|
|
71
|
+
"sdd.crear-app"
|
|
72
|
+
],
|
|
73
|
+
|
|
74
|
+
"agents": [
|
|
75
|
+
"arquitecto",
|
|
76
|
+
"disenador-api",
|
|
77
|
+
"asesor-datos",
|
|
78
|
+
"desarrollador-backend",
|
|
79
|
+
"desarrollador-frontend",
|
|
80
|
+
"operaciones",
|
|
81
|
+
"tester",
|
|
82
|
+
"revisor",
|
|
83
|
+
"critico",
|
|
84
|
+
"seguridad",
|
|
85
|
+
"investigador",
|
|
86
|
+
"documentador",
|
|
87
|
+
"product-designer",
|
|
88
|
+
"architecture-designer"
|
|
89
|
+
],
|
|
90
|
+
|
|
91
|
+
"skills": [
|
|
92
|
+
"deteccion-stack",
|
|
93
|
+
"gestion-estado",
|
|
94
|
+
"validacion-spec",
|
|
95
|
+
"enrutador-agentes",
|
|
96
|
+
"verificador-implementacion",
|
|
97
|
+
"indexador",
|
|
98
|
+
"compresion-tokens",
|
|
99
|
+
"constitucion-constraint",
|
|
100
|
+
"modo-guiado",
|
|
101
|
+
"orquestacion-ptc",
|
|
102
|
+
"descubrir-idea",
|
|
103
|
+
"interpretar-idea",
|
|
104
|
+
"elegir-direccion",
|
|
105
|
+
"wireframe-mvp",
|
|
106
|
+
"critica-diseno",
|
|
107
|
+
"github-connect",
|
|
108
|
+
"vercel-deploy",
|
|
109
|
+
"observabilidad-consumo",
|
|
110
|
+
"effort-router",
|
|
111
|
+
"memory-compactor",
|
|
112
|
+
"cache-audit",
|
|
113
|
+
"token-budget",
|
|
114
|
+
"adr-indexer",
|
|
115
|
+
"mutation-detector"
|
|
116
|
+
],
|
|
117
|
+
|
|
118
|
+
"mcpServers": "./.mcp.json"
|
|
119
|
+
}
|
package/.gitignore
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# MCP — dependencias y compilado (no se versionan)
|
|
2
|
+
sdd-lite/mcp-figma/node_modules/
|
|
3
|
+
sdd-lite/mcp-figma/dist/
|
|
4
|
+
|
|
5
|
+
# Estado local del proyecto (generado en cada repo donde se instala SDD-ES)
|
|
6
|
+
.sdd/
|
|
7
|
+
|
|
8
|
+
# Variables de entorno
|
|
9
|
+
.env
|
|
10
|
+
.env.local
|
|
11
|
+
|
|
12
|
+
# Reportes internos de desarrollo (borradores, no documentación de usuario)
|
|
13
|
+
# Se mantienen en disco pero no se publican en el repo.
|
|
14
|
+
REPORTE-ESTADO-PROBLEMAS.md
|
|
15
|
+
RESUMEN-v2.6.0-MVP-COMPLETADO.md
|
|
16
|
+
SPRINT-1-COMPLETADO.md
|
|
17
|
+
CHANGELOG-v2.6.0.md
|
|
18
|
+
|
|
19
|
+
# Archivos de contenido temporal del sitio de docs (se ensamblan en assets/data.js)
|
|
20
|
+
docs-site/_content-*.js
|
package/.mcp.json
ADDED
package/README.md
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
# SDD-ES
|
|
2
2
|
|
|
3
|
-
> **
|
|
4
|
-
>
|
|
3
|
+
> **Una capa de opinión en español sobre las primitivas oficiales de Claude Code**
|
|
4
|
+
> Skills, subagentes, hooks y slash commands orquestados en un flujo idea→deploy, agnóstico al stack.
|
|
5
|
+
>
|
|
6
|
+
> **Para quién:** no-técnicos que quieren construir sin programar (modo guiado) y developers que quieren estándares de ingeniería altos sin boilerplate (modo experto).
|
|
5
7
|
|
|
6
8
|
[](https://www.npmjs.com/package/sdd-es)
|
|
7
9
|
[](https://nodejs.org)
|
|
8
10
|
[](LICENSE)
|
|
9
11
|
|
|
12
|
+
📚 **[Documentación completa →](docs-site/)** · sitio navegable bilingüe (ES/EN) con buscador, para no-técnicos y developers. También disponible como Markdown en [`docs/`](docs/README.md).
|
|
13
|
+
|
|
10
14
|
---
|
|
11
15
|
|
|
12
16
|
## Instalación
|
|
@@ -100,7 +104,7 @@ Flujo simplificado (sin jerga técnica):
|
|
|
100
104
|
|
|
101
105
|
1. **Describe tu idea:** "Una tienda donde vendo artesanías" (como hablarías con un amigo)
|
|
102
106
|
2. **SDD-ES entiende:** Crea un plan que tú apruebas
|
|
103
|
-
3. **Se construye:**
|
|
107
|
+
3. **Se construye:** 14 especialistas trabajan en paralelo (sin que hagas nada)
|
|
104
108
|
4. **Se verifica:** Pruebas automáticas comprueban que todo funciona
|
|
105
109
|
5. **Está en internet:** Tu app está viva en 15-20 minutos
|
|
106
110
|
|
|
@@ -125,7 +129,7 @@ Flujo simplificado (sin jerga técnica):
|
|
|
125
129
|
|
|
126
130
|
---
|
|
127
131
|
|
|
128
|
-
## Los
|
|
132
|
+
## Los 35 comandos
|
|
129
133
|
|
|
130
134
|
### Inicialización
|
|
131
135
|
|
|
@@ -190,7 +194,7 @@ Flujo simplificado (sin jerga técnica):
|
|
|
190
194
|
|
|
191
195
|
---
|
|
192
196
|
|
|
193
|
-
## Los
|
|
197
|
+
## Los 14 agentes especializados
|
|
194
198
|
|
|
195
199
|
| Agente | Rol | Modelo recomendado |
|
|
196
200
|
|--------|-----|--------------------|
|
|
@@ -206,12 +210,14 @@ Flujo simplificado (sin jerga técnica):
|
|
|
206
210
|
| `seguridad` | Auditoría de vulnerabilidades | opus |
|
|
207
211
|
| `investigador` | Stack existente, deuda técnica, patrones | sonnet |
|
|
208
212
|
| `documentador` | Documentación técnica útil | sonnet |
|
|
213
|
+
| `product-designer` | Wireframes, UX, validación de diseño | opus |
|
|
214
|
+
| `architecture-designer` | Blueprints técnicos, diagramas de arquitectura | sonnet |
|
|
209
215
|
|
|
210
216
|
Cambia modelos y activa/desactiva agentes con `/sdd.configurar` o editando `.sdd/sdd.config.yaml`.
|
|
211
217
|
|
|
212
218
|
---
|
|
213
219
|
|
|
214
|
-
## Las
|
|
220
|
+
## Las 25 skills
|
|
215
221
|
|
|
216
222
|
| Skill | Formato | Qué hace |
|
|
217
223
|
|-------|---------|----------|
|
|
@@ -224,7 +230,7 @@ Cambia modelos y activa/desactiva agentes con `/sdd.configurar` o editando `.sdd
|
|
|
224
230
|
| `compresion-tokens` | `.md` | Reglas de compresión estilo caveman para Markdown |
|
|
225
231
|
| `constitucion-constraint` | `.md` | Aplica DEBE/NUNCA de la constitución como hard constraint |
|
|
226
232
|
| `modo-guiado` | `📁 SKILL.md` | Conduce el flujo sin jerga para no-programadores |
|
|
227
|
-
| `orquestacion-ptc` | `📁 SKILL.md` | Patrón PTC: despacha agentes en paralelo,
|
|
233
|
+
| `orquestacion-ptc` | `📁 SKILL.md` | Patrón PTC: despacha agentes en paralelo, reduce tokens de orquestación |
|
|
228
234
|
|
|
229
235
|
---
|
|
230
236
|
|
|
@@ -242,7 +248,7 @@ Cambia modelos y activa/desactiva agentes con `/sdd.configurar` o editando `.sdd
|
|
|
242
248
|
`/sdd.qa` genera casos E2E desde cada Criterio de Aceptación y los ejecuta en un navegador real vía Playwright MCP — no solo unitarios.
|
|
243
249
|
|
|
244
250
|
### Orquestación PTC
|
|
245
|
-
`/sdd.implementar` y `/sdd.analizar` usan Programmatic Tool Calling para despachar agentes independientes en paralelo,
|
|
251
|
+
`/sdd.implementar` y `/sdd.analizar` usan Programmatic Tool Calling para despachar agentes independientes en paralelo, agregando solo PASA/FALLA + diff mínimo. El patrón reduce el contexto de orquestación multi-agente al enviar solo resúmenes de resultado en vez del output completo de cada agente.
|
|
246
252
|
|
|
247
253
|
### Sprint estructurado
|
|
248
254
|
|
|
@@ -265,9 +271,9 @@ Cada flecha tiene un control. No se construye sin spec; no se publica sin tests
|
|
|
265
271
|
```
|
|
266
272
|
tu-proyecto/
|
|
267
273
|
├── .claude/
|
|
268
|
-
│ ├── commands/sdd.*.md ←
|
|
269
|
-
│ ├── agents/*.md ←
|
|
270
|
-
│ ├── skills/ ←
|
|
274
|
+
│ ├── commands/sdd.*.md ← 35 comandos
|
|
275
|
+
│ ├── agents/*.md ← 14 agentes
|
|
276
|
+
│ ├── skills/ ← 25 skills (flat .md + carpetas SKILL.md)
|
|
271
277
|
│ └── hooks/ ← hooks de seguridad pre-instalados
|
|
272
278
|
└── .sdd/
|
|
273
279
|
├── sdd.config.yaml ← configuración personalizable
|
|
@@ -307,23 +313,24 @@ Todo el plugin es Markdown plano. Personaliza editando archivos:
|
|
|
307
313
|
|
|
308
314
|
## MCP integrado
|
|
309
315
|
|
|
310
|
-
SDD-ES declara
|
|
316
|
+
SDD-ES declara un servidor MCP en `plugin.json`:
|
|
311
317
|
|
|
312
318
|
| MCP | Cuándo se activa | Para qué |
|
|
313
319
|
|-----|-----------------|----------|
|
|
314
|
-
| `sdd-figma` | Tareas de UI con `figma_file_key` configurado | Extrae diseños de Figma y genera código adaptado al design system local |
|
|
315
320
|
| `navegador` (Playwright) | `/sdd.qa`, palabras clave `e2e`, `prueba` | QA en navegador real sin mantener un navegador propio |
|
|
316
321
|
|
|
317
322
|
---
|
|
318
323
|
|
|
319
|
-
##
|
|
324
|
+
## Reducción de contexto
|
|
325
|
+
|
|
326
|
+
Las siguientes técnicas reducen el volumen de artefactos que Claude lee por sesión. Los números son estimaciones de bytes de artefactos generados, **no tokens de facturación medidos**.
|
|
320
327
|
|
|
321
|
-
| Técnica |
|
|
322
|
-
|
|
323
|
-
| Mapas estáticos (`/sdd.mapear`) |
|
|
324
|
-
| Compresión caveman (`/sdd.comprimir`) |
|
|
325
|
-
| RAG en 3 capas (estado.json → spec activa → constitución) | Carga solo lo necesario por fase |
|
|
326
|
-
| PTC paralelo (`orquestacion-ptc`) |
|
|
328
|
+
| Técnica | Reducción de artefactos |
|
|
329
|
+
|---------|------------------------|
|
|
330
|
+
| Mapas estáticos (`/sdd.mapear`) | Reemplaza indexación completa en cada turno por un índice precalculado |
|
|
331
|
+
| Compresión caveman (`/sdd.comprimir`) | Reduce tamaño de archivos de memoria eliminando redundancias |
|
|
332
|
+
| RAG en 3 capas (estado.json → spec activa → constitución) | Carga solo lo necesario por fase en lugar del proyecto completo |
|
|
333
|
+
| PTC paralelo (`orquestacion-ptc`) | Agrega solo PASA/FALLA por agente en vez de output completo |
|
|
327
334
|
|
|
328
335
|
---
|
|
329
336
|
|
|
@@ -165,6 +165,43 @@ node -e "
|
|
|
165
165
|
|
|
166
166
|
---
|
|
167
167
|
|
|
168
|
+
## Skills obligatorios — leer antes de diseñar
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# CAPA 0 — siempre (~200 tokens)
|
|
172
|
+
cat .sdd/estado.json 2>/dev/null
|
|
173
|
+
cat .sdd/sdd.config.yaml 2>/dev/null | head -30
|
|
174
|
+
|
|
175
|
+
# CAPA 1 — si hay spec activa (~400 tokens)
|
|
176
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
177
|
+
[ -n "$SPEC_ID" ] && cat ".sdd/especificaciones/${SPEC_ID}/spec.md" 2>/dev/null
|
|
178
|
+
|
|
179
|
+
# CAPA 2 — contexto de producto
|
|
180
|
+
cat .sdd/ir.json 2>/dev/null
|
|
181
|
+
cat .sdd/product-design.json 2>/dev/null
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Habilidades requeridas
|
|
185
|
+
|
|
186
|
+
- **Simplicity-First Thinking** — la solución más simple que funcione
|
|
187
|
+
- **Tech Stack Knowledge** — conocer opciones reales para cada capa
|
|
188
|
+
- **Trade-off Analysis** — explicar el costo/beneficio de cada decisión
|
|
189
|
+
- **Plain Language Communication** — no usar jerga técnica innecesaria
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Lo que NO haces
|
|
194
|
+
|
|
195
|
+
- ❌ No generas código
|
|
196
|
+
- ❌ No inventas stacks complejos sin justificación
|
|
197
|
+
- ❌ No sugeries microservicios para un MVP (usa monolito)
|
|
198
|
+
- ❌ No obligas a cloud premium (Vercel gratis, Railway gratis, etc. están bien)
|
|
199
|
+
- ❌ No ignoras `tech_preference` del IR — respeita las preferencias del usuario
|
|
200
|
+
- ❌ No usas jerga técnica ("schema relacional con ORM")
|
|
201
|
+
- ❌ No recomiendas más de 5 dependencias principales
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
168
205
|
## Restricciones
|
|
169
206
|
|
|
170
207
|
- **No generas código** — solo decides qué stack usar
|
|
@@ -28,25 +28,18 @@ Implementas UI de producción: componentes, vistas, estado del cliente, navegaci
|
|
|
28
28
|
- **Componentes pequeños y composables**: <150 líneas, una responsabilidad visual
|
|
29
29
|
- **Performance medible**: no asumes, mides (re-renders, bundle size, latencia)
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## Sistema de diseño local
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Antes de escribir cualquier componente UI, lee el sistema de diseño del proyecto:
|
|
34
34
|
|
|
35
|
-
```
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
traer_componente(file_key, node_id) → detalle del componente a implementar
|
|
41
|
-
mapear_estilos(file_key, node_id, root) → cruza estilos Figma con tokens locales
|
|
42
|
-
generar_componente(file_key, node_id, root) → genera código adaptado al proyecto
|
|
43
|
-
|
|
44
|
-
# Si solo quieres mejorar el proyecto sin Figma:
|
|
45
|
-
evaluar_ui_existente(project_root) → score + problemas + sugerencias
|
|
46
|
-
sugerir_mejoras(project_root) → lista priorizada de mejoras
|
|
35
|
+
```bash
|
|
36
|
+
# Tokens de diseño (colores, tipografía, espaciado)
|
|
37
|
+
find . -name "tokens.json" -o -name "design-tokens*" -o -name "theme*" 2>/dev/null | head -5
|
|
38
|
+
# Variables CSS o JS de estilos globales
|
|
39
|
+
find . -name "variables.css" -o -name "globals.css" -o -name "tailwind.config*" 2>/dev/null | head -3
|
|
47
40
|
```
|
|
48
41
|
|
|
49
|
-
**Regla:** NO generes componentes
|
|
42
|
+
**Regla:** NO generes componentes sin leer primero los tokens y patrones existentes. El código generado debe ser coherente con el sistema de diseño del proyecto.
|
|
50
43
|
|
|
51
44
|
## Skills obligatorios — leer antes de implementar
|
|
52
45
|
|
|
@@ -223,6 +223,42 @@ node -e "
|
|
|
223
223
|
|
|
224
224
|
---
|
|
225
225
|
|
|
226
|
+
## Skills obligatorios — leer antes de diseñar
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# CAPA 0 — siempre (~200 tokens)
|
|
230
|
+
cat .sdd/estado.json 2>/dev/null
|
|
231
|
+
cat .sdd/sdd.config.yaml 2>/dev/null | head -30
|
|
232
|
+
|
|
233
|
+
# CAPA 1 — si hay spec activa (~400 tokens)
|
|
234
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
235
|
+
[ -n "$SPEC_ID" ] && cat ".sdd/especificaciones/${SPEC_ID}/spec.md" 2>/dev/null
|
|
236
|
+
|
|
237
|
+
# CAPA 2 — contexto de producto
|
|
238
|
+
cat .sdd/ir.json 2>/dev/null
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Habilidades requeridas
|
|
242
|
+
|
|
243
|
+
- **Product Thinking** — tomar una necesidad y convertirla en producto
|
|
244
|
+
- **User Empathy** — entender quién usa qué y por qué
|
|
245
|
+
- **Scope Definition** — decir qué entra en V1 y qué no
|
|
246
|
+
- **Design System Usage** — aplicar coherencia visual según DESIGN.md
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Lo que NO haces
|
|
251
|
+
|
|
252
|
+
- ❌ No escribes código ni HTML
|
|
253
|
+
- ❌ No propones arquitectura técnica ni stack
|
|
254
|
+
- ❌ No especificas campos de base de datos ni APIs
|
|
255
|
+
- ❌ No generás wireframes visuales (solo descripciones en JSON)
|
|
256
|
+
- ❌ No tomas decisiones técnicas (p.ej., "usar React" → es rol de `architecture-designer`)
|
|
257
|
+
- ❌ No inventas métricas de producto ("10x más rápido")
|
|
258
|
+
- ❌ No usas jerga técnica al describir pantallas
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
226
262
|
## Restricciones
|
|
227
263
|
|
|
228
264
|
- **No generas código HTML** — eso es la skill `wireframe-mvp`
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { createInterface } from "node:readline";
|
|
20
|
-
import { existsSync, mkdirSync, appendFileSync, statSync } from "node:fs";
|
|
20
|
+
import { existsSync, mkdirSync, appendFileSync, statSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
21
|
import { join } from "node:path";
|
|
22
22
|
|
|
23
23
|
const MEMORIA_UMBRAL_BYTES = 50_000; // 50KB — alerta cuando se supera
|
|
@@ -33,6 +33,11 @@ const AGENTES_CON_MEMORIA = new Set([
|
|
|
33
33
|
"asesor-datos",
|
|
34
34
|
"disenador-api",
|
|
35
35
|
"critico",
|
|
36
|
+
"desarrollador-backend",
|
|
37
|
+
"desarrollador-frontend",
|
|
38
|
+
"tester",
|
|
39
|
+
"documentador",
|
|
40
|
+
"operaciones",
|
|
36
41
|
]);
|
|
37
42
|
|
|
38
43
|
function detectarAgente() {
|
|
@@ -47,6 +52,102 @@ function extraerResumen(contenido) {
|
|
|
47
52
|
return primera.slice(0, 120).trim();
|
|
48
53
|
}
|
|
49
54
|
|
|
55
|
+
function extraerADRsDelContenido(contenido) {
|
|
56
|
+
// Captura comentarios con patrón ADR: {...} en multilenguaje
|
|
57
|
+
// Soporta: //, /*, #, --, <!-- REM
|
|
58
|
+
const regex = /(?:\/\/|\/\*|#|--|<!--|REM)\s*ADR:\s*({[^}]*})/g;
|
|
59
|
+
const adrs = [];
|
|
60
|
+
let match;
|
|
61
|
+
while ((match = regex.exec(contenido)) !== null) {
|
|
62
|
+
try {
|
|
63
|
+
const json = JSON.parse(match[1]);
|
|
64
|
+
// Validar campos mínimos
|
|
65
|
+
if (json.decision && typeof json.decision === "string") {
|
|
66
|
+
adrs.push(json);
|
|
67
|
+
}
|
|
68
|
+
} catch {
|
|
69
|
+
// Ignorar JSON inválido silenciosamente
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return adrs;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function registrarADRs(cwd, agente, archivo, adrs) {
|
|
76
|
+
if (adrs.length === 0) return;
|
|
77
|
+
const adrDir = join(cwd, ".sdd", "arquitectura");
|
|
78
|
+
const ledgerFile = join(adrDir, "ADRs.jsonl");
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
if (!existsSync(adrDir)) {
|
|
82
|
+
mkdirSync(adrDir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const adr of adrs) {
|
|
86
|
+
const linea = JSON.stringify({
|
|
87
|
+
ts: new Date().toISOString(),
|
|
88
|
+
decision: adr.decision,
|
|
89
|
+
context: adr.context ?? "",
|
|
90
|
+
alternatives: adr.alternatives ?? [],
|
|
91
|
+
status: adr.status ?? "accepted",
|
|
92
|
+
archivo: archivo,
|
|
93
|
+
agente: agente || "main",
|
|
94
|
+
});
|
|
95
|
+
appendFileSync(ledgerFile, linea + "\n", "utf8");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (adrs.length > 0) {
|
|
99
|
+
process.stderr.write(
|
|
100
|
+
`📋 [adr-indexer] ${agente}: ${adrs.length} ADR(s) capturado(s) en ${archivo}\n`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
// Silencioso — nunca interrumpir
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function triggerAutoCompresion(cwd, agente, memoriaFile) {
|
|
109
|
+
// Extrae entradas duplicadas y deduplica por filepath
|
|
110
|
+
try {
|
|
111
|
+
const contenido = readFileSync(memoriaFile, "utf8");
|
|
112
|
+
const lineas = contenido.split("\n");
|
|
113
|
+
const header = lineas
|
|
114
|
+
.slice(0, 6)
|
|
115
|
+
.join("\n")
|
|
116
|
+
.concat("\n\n");
|
|
117
|
+
|
|
118
|
+
// Regex para extraer entradas: "## YYYY-MM-DD — filepath"
|
|
119
|
+
const entradas = new Map(); // clave: filepath, valor: {fecha, resumen, linea}
|
|
120
|
+
const regex = /^## (\d{4}-\d{2}-\d{2}) — (.+?)\n> (.+?)(?=\n##|\n$)/gms;
|
|
121
|
+
let match;
|
|
122
|
+
while ((match = regex.exec(contenido)) !== null) {
|
|
123
|
+
const [, fecha, filepath, resumen] = match;
|
|
124
|
+
// Guarda solo la entrada más reciente por filepath
|
|
125
|
+
entradas.set(filepath, { fecha, resumen });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Reconstruye archivo con deduplica
|
|
129
|
+
let comprimido = header;
|
|
130
|
+
for (const [filepath, { fecha, resumen }] of entradas) {
|
|
131
|
+
comprimido += `## ${fecha} — ${filepath}\n> ${resumen}\n\n`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Backup antes de sobrescribir
|
|
135
|
+
const backupFile = memoriaFile.replace(".md", ".original.md");
|
|
136
|
+
writeFileSync(backupFile, contenido, "utf8");
|
|
137
|
+
|
|
138
|
+
// Sobrescribe archivo deduplicado
|
|
139
|
+
writeFileSync(memoriaFile, comprimido, "utf8");
|
|
140
|
+
const tamanioOriginal = Buffer.byteLength(contenido, "utf8");
|
|
141
|
+
const tamanioComprimido = Buffer.byteLength(comprimido, "utf8");
|
|
142
|
+
const ratio = Math.round((tamanioComprimido / tamanioOriginal) * 100);
|
|
143
|
+
process.stderr.write(
|
|
144
|
+
`✨ [auto-compress] ${agente}: ${Math.round(tamanioOriginal / 1024)}KB → ${Math.round(tamanioComprimido / 1024)}KB (${ratio}%), backup en .original.md\n`
|
|
145
|
+
);
|
|
146
|
+
} catch {
|
|
147
|
+
// Silencioso — no interrumpir
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
50
151
|
function registrarLedger(cwd, agente, toolName, archivoModificado, contenido) {
|
|
51
152
|
const obsDir = join(cwd, ".sdd", "observabilidad");
|
|
52
153
|
const ledgerFile = join(obsDir, "consumo.jsonl");
|
|
@@ -95,6 +196,13 @@ function main(raw) {
|
|
|
95
196
|
// ── Ledger JSONL (aplica a TODOS los agentes) ──────────────────────────────
|
|
96
197
|
registrarLedger(cwd, agente, toolName, archivoModificado, contenido);
|
|
97
198
|
|
|
199
|
+
// ── Indexar ADRs (aplica a TODOS los agentes) ──────────────────────────────
|
|
200
|
+
const adrs = extraerADRsDelContenido(contenido);
|
|
201
|
+
registrarADRs(cwd, agente, archivoModificado, adrs);
|
|
202
|
+
|
|
203
|
+
// ── Registrar mutaciones (aplica a TODOS los agentes) ──────────────────────
|
|
204
|
+
registrarMutacion(cwd, agente, archivoModificado, toolName);
|
|
205
|
+
|
|
98
206
|
// ── Memoria persistente (solo agentes del grupo OPUS) ──────────────────────
|
|
99
207
|
if (!agente || !AGENTES_CON_MEMORIA.has(agente)) {
|
|
100
208
|
process.exit(0);
|
|
@@ -135,13 +243,15 @@ function main(raw) {
|
|
|
135
243
|
`🧠 [agent-memory] Registrado en memoria de ${agente}: ${archivoModificado}\n`
|
|
136
244
|
);
|
|
137
245
|
|
|
138
|
-
// Alerta de tamaño
|
|
246
|
+
// Alerta de tamaño + trigger auto-compresión
|
|
139
247
|
try {
|
|
140
248
|
const { size } = statSync(memoriaFile);
|
|
141
249
|
if (size > MEMORIA_UMBRAL_BYTES) {
|
|
142
250
|
process.stderr.write(
|
|
143
|
-
`⚠️ [agent-memory] Memoria de ${agente} supera ${Math.round(size / 1024)}KB
|
|
251
|
+
`⚠️ [agent-memory] Memoria de ${agente} supera ${Math.round(size / 1024)}KB\n`
|
|
144
252
|
);
|
|
253
|
+
// Trigger automático de compresión (silencioso, no bloquea)
|
|
254
|
+
triggerAutoCompresion(cwd, agente, memoriaFile);
|
|
145
255
|
}
|
|
146
256
|
} catch {
|
|
147
257
|
// Silencioso
|
|
@@ -152,3 +262,27 @@ function main(raw) {
|
|
|
152
262
|
|
|
153
263
|
process.exit(0);
|
|
154
264
|
}
|
|
265
|
+
|
|
266
|
+
function registrarMutacion(cwd, agente, archivoModificado, toolName) {
|
|
267
|
+
// Registra cada cambio (mutation) de archivo para tracking de calidad
|
|
268
|
+
// Permite medir: "¿este archivo fue reescrito 5 veces? ¿problemas de estabilidad?"
|
|
269
|
+
const mutDir = join(cwd, ".sdd", "observabilidad");
|
|
270
|
+
const mutFile = join(mutDir, "mutaciones.jsonl");
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
if (!existsSync(mutDir)) {
|
|
274
|
+
mkdirSync(mutDir, { recursive: true });
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const linea = JSON.stringify({
|
|
278
|
+
ts: new Date().toISOString(),
|
|
279
|
+
agente: agente || "main",
|
|
280
|
+
archivo: archivoModificado,
|
|
281
|
+
tool: toolName,
|
|
282
|
+
tipo: toolName === "Edit" ? "partial" : "full",
|
|
283
|
+
});
|
|
284
|
+
appendFileSync(mutFile, linea + "\n", "utf8");
|
|
285
|
+
} catch {
|
|
286
|
+
// Silencioso
|
|
287
|
+
}
|
|
288
|
+
}
|