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.
Files changed (60) hide show
  1. package/.claude/settings.json +24 -0
  2. package/.claude/settings.local.json +10 -0
  3. package/.claude-plugin/marketplace.json +34 -0
  4. package/.claude-plugin/plugin.json +119 -0
  5. package/.gitignore +20 -0
  6. package/.mcp.json +8 -0
  7. package/README.md +27 -20
  8. package/agents/architecture-designer.md +37 -0
  9. package/agents/desarrollador-frontend.md +8 -15
  10. package/agents/product-designer.md +36 -0
  11. package/claude-hooks/agent-memory.js +137 -3
  12. package/claude-hooks/pre-tool-guard.js +61 -9
  13. package/commands/sdd.adr.md +196 -0
  14. package/commands/sdd.ayuda.md +13 -0
  15. package/commands/sdd.compliance.md +5 -0
  16. package/commands/sdd.configurar.md +1 -1
  17. package/commands/sdd.crear-mcp.md +2 -0
  18. package/commands/sdd.defect-report.md +134 -0
  19. package/commands/sdd.descubrir.md +19 -0
  20. package/commands/sdd.estado.md +52 -2
  21. package/commands/sdd.implementar.md +71 -31
  22. package/commands/sdd.md +23 -3
  23. package/commands/sdd.optimizar-memoria.md +47 -0
  24. package/commands/sdd.retro.md +74 -0
  25. package/commands/sdd.verificar.md +71 -0
  26. package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
  27. package/configuracion-ejemplo/sdd.config.yaml +10 -0
  28. package/docs/CASO-COMPLETO.md +206 -0
  29. package/docs/EJEMPLOS.md +88 -0
  30. package/docs/FABRICA.md +5 -6
  31. package/docs/INICIO-RAPIDO.md +27 -79
  32. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +12 -10
  33. package/docs/README.md +43 -0
  34. package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
  35. package/package.json +11 -8
  36. package/plantillas/job-story-mejorar-prompt.md +107 -0
  37. package/presets/enterprise.yaml +6 -0
  38. package/presets/lean.yaml +4 -0
  39. package/presets/startup.yaml +6 -0
  40. package/skills/adr-indexer/SKILL.md +181 -0
  41. package/skills/cache-audit/SKILL.md +1 -1
  42. package/skills/critica-diseno/SKILL.md +1 -1
  43. package/skills/descubrir-idea/SKILL.md +1 -1
  44. package/skills/effort-router/SKILL.md +1 -1
  45. package/skills/elegir-direccion/SKILL.md +1 -1
  46. package/skills/interpretar-idea/SKILL.md +1 -1
  47. package/skills/mejorar-prompt/SKILL.md +237 -0
  48. package/skills/memory-compactor/SKILL.md +34 -80
  49. package/skills/mutation-detector/SKILL.md +134 -0
  50. package/skills/observabilidad-consumo/SKILL.md +1 -1
  51. package/skills/token-budget/SKILL.md +24 -1
  52. package/skills/wireframe-mvp/SKILL.md +1 -1
  53. package/mcp-figma/README.md +0 -158
  54. package/mcp-figma/package.json +0 -7
  55. package/mcp-figma/src/component-generator.js +0 -162
  56. package/mcp-figma/src/design-system-analyzer.js +0 -247
  57. package/mcp-figma/src/figma-client.js +0 -75
  58. package/mcp-figma/src/index.js +0 -114
  59. package/mcp-figma/src/mcp.js +0 -97
  60. package/mcp-figma/src/style-mapper.js +0 -85
@@ -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,10 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "WebFetch(domain:claude.com)",
5
+ "Bash(npm install *)",
6
+ "Bash(node src/index.js)"
7
+ ],
8
+ "additionalDirectories": []
9
+ }
10
+ }
@@ -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
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "playwright": {
4
+ "command": "npx",
5
+ "args": ["-y", "@playwright/mcp@latest"]
6
+ }
7
+ }
8
+ }
package/README.md CHANGED
@@ -1,12 +1,16 @@
1
1
  # SDD-ES
2
2
 
3
- > **Fábrica de software en español para Claude Code**
4
- > De la idea al despliegue, agnóstica al stack, con estándares de ingeniería altos.
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
  [![npm](https://img.shields.io/npm/v/sdd-es)](https://www.npmjs.com/package/sdd-es)
7
9
  [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
8
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](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:** 12 especialistas trabajan en paralelo (sin que hagas nada)
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 26 comandos
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 12 agentes especializados
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 10 skills
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, −85% tokens |
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, aggregando solo PASA/FALLA + diff mínimo. Ahorro esperado: −70 a −85% de tokens en orquestación multi-agente.
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 ← 26 comandos
269
- │ ├── agents/*.md ← 12 agentes
270
- │ ├── skills/ ← 10 skills (flat .md + carpetas SKILL.md)
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 dos servidores MCP en `plugin.json`:
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
- ## Ahorro de tokens
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 | Ahorro estimado |
322
- |---------|----------------|
323
- | Mapas estáticos (`/sdd.mapear`) | −50 a −65k tokens por sesión |
324
- | Compresión caveman (`/sdd.comprimir`) | −60 a −70% en archivos de memoria |
325
- | RAG en 3 capas (estado.json → spec activa → constitución) | Carga solo lo necesario por fase |
326
- | PTC paralelo (`orquestacion-ptc`) | −70 a −85% en orquestación multi-agente |
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
- ## Herramienta MCP: sdd-figma-mcp
31
+ ## Sistema de diseño local
32
32
 
33
- Si el proyecto tiene Figma conectado (variable `FIGMA_PAT` disponible), usa estas herramientas **antes** de escribir código:
33
+ Antes de escribir cualquier componente UI, lee el sistema de diseño del proyecto:
34
34
 
35
- ```
36
- # Flujo estándar con Figma:
37
- analizar_sistema_diseño(project_root) → perfil del sistema de diseño local
38
- conectar_figma(file_key) → verifica acceso y metadata del archivo
39
- listar_componentes(file_key, filter?) → componentes disponibles en Figma
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 de Figma sin ejecutar primero `analizar_sistema_diseño` y `mapear_estilos`. El MCP detecta tokens existentes para que el código generado no rompa el sistema de diseño.
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 no bloquea el flujo, solo informa
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 — considera ejecutar /sdd.optimizar memoria\n`
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
+ }