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
@@ -14,6 +14,8 @@
14
14
  */
15
15
 
16
16
  import { createInterface } from "node:readline";
17
+ import { existsSync, mkdirSync, appendFileSync } from "node:fs";
18
+ import { join } from "node:path";
17
19
 
18
20
  const rl = createInterface({ input: process.stdin, terminal: false });
19
21
  let raw = "";
@@ -116,14 +118,36 @@ function main(raw) {
116
118
  const cmd = String(toolInput?.command ?? "").trim();
117
119
  if (!cmd) process.exit(0);
118
120
 
121
+ // ── 0. NUEVO: Verificar permisos por agente ─────────────────────────────
122
+ const agentName = process.env.CLAUDE_AGENT_NAME;
123
+ if (agentName) {
124
+ // Agentes read-only que NO pueden usar Write/Edit
125
+ const readOnlyAgents = [
126
+ 'arquitecto', 'asesor-datos', 'critico', 'seguridad',
127
+ 'investigador', 'revisor', 'disenador-api'
128
+ ];
129
+
130
+ // Si es agente read-only e intenta usar Write/Edit, bloquea
131
+ if (readOnlyAgents.includes(agentName) &&
132
+ (toolName === 'Write' || toolName === 'Edit')) {
133
+ process.stderr.write(
134
+ `FORGE detuvo esta acción: el agente "${agentName}" solo puede leer, no modificar archivos.\n` +
135
+ `Si necesitas que este agente escriba código, cambia su rol en la configuración.\n`
136
+ );
137
+ process.exit(2);
138
+ }
139
+
140
+ // Auditoría de intentos de tool por agente (log a .sdd/observabilidad/)
141
+ logAgentToolAttempt(agentName, toolName, cmd);
142
+ }
143
+
119
144
  // ── 1. Verificar prohibidos ─────────────────────────────────────────────
120
145
  for (const re of PROHIBIDOS) {
121
146
  if (re.test(cmd)) {
122
147
  process.stderr.write(
123
- `🚫 BLOQUEADO por guardia de seguridad SDD-ES\n` +
124
- ` Comando: ${cmd.slice(0, 120)}\n` +
125
- ` Razón: coincide con patrón prohibido (${re.source.slice(0, 60)})\n` +
126
- ` Esta operación nunca debe ejecutarse automáticamente.\n`
148
+ `FORGE evitó esta acción porque podría borrar o dañar archivos importantes de forma irreversible.\n` +
149
+ `Si estás completamente seguro de lo que haces, ejecuta el comando manualmente en tu terminal.\n` +
150
+ `Comando bloqueado: ${cmd.slice(0, 120)}\n`
127
151
  );
128
152
  process.exit(2);
129
153
  }
@@ -133,9 +157,9 @@ function main(raw) {
133
157
  for (const re of SECRET_PATTERNS) {
134
158
  if (re.test(cmd)) {
135
159
  process.stderr.write(
136
- `🚫 BLOQUEADO secret hardcodeado detectado en el comando\n` +
137
- ` Patrón: ${re.source.slice(0, 60)}\n` +
138
- ` Usa variables de entorno o un secret manager.\n`
160
+ `FORGE detectó que este comando incluye una contraseña o clave secreta escrita directamente.\n` +
161
+ `Para proteger tu seguridad, usa variables de entorno en lugar de escribir credenciales en el código.\n` +
162
+ `Ejemplo: usa process.env.MI_CLAVE en vez de escribir el valor directamente.\n`
139
163
  );
140
164
  process.exit(2);
141
165
  }
@@ -146,8 +170,8 @@ function main(raw) {
146
170
  if (re.test(cmd)) {
147
171
  // Escribir a stderr — Claude Code lo muestra como contexto antes de pedir permiso
148
172
  process.stderr.write(
149
- `⚠️ Operación sensible detectada: ${msg}\n` +
150
- ` Comando: ${cmd.slice(0, 120)}\n`
173
+ `Atención: esto va a realizar una acción que no se puede deshacer fácilmente (${msg}).\n` +
174
+ `Revisa el comando antes de confirmar: ${cmd.slice(0, 120)}\n`
151
175
  );
152
176
  // Exit 0 — dejamos que el flujo normal de permisos de Claude Code actúe
153
177
  process.exit(0);
@@ -157,3 +181,31 @@ function main(raw) {
157
181
  // Todo bien
158
182
  process.exit(0);
159
183
  }
184
+
185
+ /**
186
+ * Registra intentos de tool por agente para auditoría
187
+ */
188
+ function logAgentToolAttempt(agentName, toolName, cmd) {
189
+ try {
190
+ // Intenta grabar en .sdd/observabilidad/ en formato JSONL (append-only)
191
+ const auditDir = '.sdd/observabilidad';
192
+ const auditFile = join(auditDir, 'agent-tool-audit.jsonl');
193
+
194
+ // Crea dir si no existe
195
+ if (!existsSync(auditDir)) {
196
+ mkdirSync(auditDir, { recursive: true });
197
+ }
198
+
199
+ const record = {
200
+ timestamp: new Date().toISOString(),
201
+ agent: agentName,
202
+ tool: toolName,
203
+ cmd_preview: cmd.slice(0, 120),
204
+ pid: process.pid
205
+ };
206
+
207
+ appendFileSync(auditFile, JSON.stringify(record) + '\n', 'utf8');
208
+ } catch {
209
+ // Silenciosamente ignorar fallos de auditoría (no bloquear ejecución)
210
+ }
211
+ }
@@ -0,0 +1,196 @@
1
+ ---
2
+ description: Indexar, listar y gestionar decisiones arquitectónicas (ADRs)
3
+ allowed-tools: Read, Write, Bash
4
+ ---
5
+
6
+ # /sdd.adr
7
+
8
+ Gestiona Architecture Decision Records (ADRs) — registro de decisiones arquitectónicas.
9
+
10
+ ## Modos
11
+
12
+ ### `/sdd.adr list`
13
+
14
+ Lista todas las decisiones registradas.
15
+
16
+ ```
17
+ ID | DECISION | CONTEXT | STATUS
18
+ ───┼───────────────────────────┼────────────────────┼──────────
19
+ 1 | Use PostgreSQL | ACID needed | accepted
20
+ 2 | Cache with Redis | Performance | accepted
21
+ 3 | JWT for auth | Stateless API | accepted
22
+ 4 | Validate user input | Security | accepted
23
+ 5 | HTTPS only | Compliance | accepted
24
+ ```
25
+
26
+ **Opciones:**
27
+ ```
28
+ /sdd.adr list --status=accepted # Solo aceptadas
29
+ /sdd.adr list --status=rejected # Solo rechazadas
30
+ /sdd.adr list --status=deprecated # Obsoletas
31
+ ```
32
+
33
+ ---
34
+
35
+ ### `/sdd.adr new`
36
+
37
+ Captura una nueva decisión de forma interactiva.
38
+
39
+ ```
40
+ Pregunta 1: ¿Cuál es la decisión?
41
+ > Use DynamoDB para analytics
42
+
43
+ Pregunta 2: ¿Por qué? (contexto)
44
+ > Scale infinitamente, baja latencia de queries
45
+
46
+ Pregunta 3: ¿Qué alternativas consideraste?
47
+ > PostgreSQL partitioning, BigQuery, Redshift
48
+
49
+ Pregunta 4: ¿Status? (accepted/rejected/deprecated/superseded)
50
+ > accepted
51
+
52
+ ✅ ADR guardado en .sdd/arquitectura/ADRs.jsonl
53
+ ```
54
+
55
+ ---
56
+
57
+ ### `/sdd.adr search "patrón"`
58
+
59
+ Busca ADRs por palabra clave.
60
+
61
+ ```
62
+ /sdd.adr search "database"
63
+
64
+ RESULTADO:
65
+ ID | DECISION | CONTEXT
66
+ ───┼───────────────────────┼────────────────
67
+ 1 | Use PostgreSQL | ACID needed
68
+ 2 | Use Redis cache | Performance
69
+
70
+ /sdd.adr search "security"
71
+
72
+ RESULTADO:
73
+ ID | DECISION | CONTEXT
74
+ ───┼───────────────────────────┼──────────────────
75
+ 3 | Validate user input | Prevent injection
76
+ 4 | HTTPS only | Compliance
77
+ ```
78
+
79
+ ---
80
+
81
+ ### `/sdd.adr edit [ID]`
82
+
83
+ Editar una decisión existente.
84
+
85
+ ```
86
+ /sdd.adr edit 1
87
+
88
+ ADR #1: Use PostgreSQL
89
+ Context: ACID needed
90
+ Alternatives: MongoDB, Firebase
91
+ Status: accepted
92
+
93
+ ¿Modificar? (y/n) > y
94
+ Nuevo status: deprecated
95
+
96
+ ✅ ADR #1 actualizado
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Ficheros
102
+
103
+ **Ledger:** `.sdd/arquitectura/ADRs.jsonl` (append-only)
104
+
105
+ Cada línea es un ADR en JSON:
106
+ ```json
107
+ {
108
+ "ts": "2026-06-14T10:30:00Z",
109
+ "decision": "Use PostgreSQL",
110
+ "context": "ACID transactions required",
111
+ "alternatives": ["MongoDB", "Firebase"],
112
+ "status": "accepted",
113
+ "archivo": "src/database.ts",
114
+ "linea": 42,
115
+ "agente": "arquitecto"
116
+ }
117
+ ```
118
+
119
+ ---
120
+
121
+ ## Uso en Auditoría
122
+
123
+ **Para auditor externo:**
124
+
125
+ ```bash
126
+ /sdd.adr list --status=accepted
127
+ → Todas las decisiones aceptadas documentadas
128
+
129
+ /sdd.adr search "security"
130
+ → Todas las decisiones de seguridad con contexto
131
+
132
+ /sdd.adr search "compliance"
133
+ → Todas las decisiones de compliance (GDPR, PCI-DSS, etc.)
134
+ ```
135
+
136
+ **Resultado:** Auditor confía porque ve trazabilidad completa.
137
+
138
+ ---
139
+
140
+ ## Batch Scan
141
+
142
+ Para proyectos existentes, scan automático:
143
+
144
+ ```bash
145
+ node utils/adr-parser.js . src/**/*.ts --update-ledger
146
+ → Encuentra todos los ADRs en codebase
147
+ → Añade al ledger si no existen
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Ejemplo Real
153
+
154
+ ### Código con ADR Incrustado
155
+
156
+ ```typescript
157
+ // ADR: {"decision": "Use TypeScript", "context": "Type safety, IDE support", "status": "accepted"}
158
+ import * as express from "express";
159
+
160
+ // ADR: {"decision": "Use dependency injection", "context": "Testability", "status": "accepted"}
161
+ class Database {
162
+ constructor(private config: Config) {}
163
+ }
164
+
165
+ // ADR: {"decision": "Validate all inputs with Zod", "context": "Security", "status": "accepted"}
166
+ const userSchema = z.object({
167
+ email: z.string().email(),
168
+ password: z.string().min(8)
169
+ });
170
+ ```
171
+
172
+ ### Ejecutar Scan
173
+
174
+ ```bash
175
+ /sdd.adr new (o node utils/adr-parser.js . src/**/*.ts)
176
+
177
+ ✅ 3 ADRs encontrados y registrados
178
+ ```
179
+
180
+ ### Verificar
181
+
182
+ ```bash
183
+ /sdd.adr list
184
+ → Ver todas las decisiones documentadas
185
+ ```
186
+
187
+ ---
188
+
189
+ ## Notas
190
+
191
+ - **Automático:** Hook captura ADRs al escribir código
192
+ - **Manual:** `/sdd.adr new` para decisiones no en código
193
+ - **Buscable:** `/sdd.adr search` por palabra clave
194
+ - **Auditables:** Cada ADR tiene timestamp, autor, contexto
195
+ - **Seguro:** JSON validado, error silencioso si inválido
196
+
@@ -61,12 +61,23 @@ Muestra esta guía formateada:
61
61
  /sdd.release --preview Ver qué entraría sin modificar nada
62
62
 
63
63
  🏭 FÁBRICA (idea → producto instalable)
64
+ /sdd.interpretar [idea] Interpretar idea en bruto y generar IR (Interpreted Requirement)
65
+ /sdd.diseñar Elegir dirección visual y generar ProductDesign
66
+ /sdd.construir Pipeline completo automático: diseño + código + deploy
67
+ /sdd.exportar Empaquetar el proyecto actual como bundle descargable
64
68
  /sdd.crear-app [idea] Generar app web o CLI desde una descripción en lenguaje natural
65
69
  /sdd.crear-mcp [descripción] Generar servidor MCP empaquetado (.mcpb) desde una descripción
66
70
 
71
+ 🏛️ CALIDAD Y COMPLIANCE
72
+ /sdd.compliance Reporte de cumplimiento regulatorio (GDPR, SOC2, ISO 27001, HIPAA)
73
+ /sdd.adr Registrar decisión de arquitectura (Architecture Decision Record)
74
+ /sdd.defect-report Reporte de defectos y tasa de bugs del proyecto
75
+
67
76
  ⚙️ UTILIDADES
68
77
  /sdd.mapear Indexar estructura, símbolos y dependencias del proyecto
69
78
  /sdd.comprimir Comprimir archivos de memoria para ahorrar tokens
79
+ /sdd.optimizar Optimizar artefactos SDD para reducir uso de contexto
80
+ /sdd.optimizar-memoria Compactar la memoria del agente activo
70
81
 
71
82
  ═══════════════════════════════════════════════════════════════════════
72
83
  🔄 FLUJOS RECOMENDADOS
@@ -110,6 +121,8 @@ FLUJO CALIDAD MÁXIMA (features grandes, producto enterprise)
110
121
 
111
122
  DISEÑO Y ARQUITECTURA
112
123
  arquitecto Decisiones técnicas, diseño de alto nivel
124
+ product-designer Diseño de producto: pantallas, user flow, MVP
125
+ architecture-designer Stack técnico: frontend, backend, BD, deploy
113
126
  disenador-api Contratos: OpenAPI, GraphQL, gRPC, eventos
114
127
  asesor-datos Esquemas, queries, índices, migraciones
115
128
 
@@ -1,3 +1,8 @@
1
+ ---
2
+ description: Genera reporte de cumplimiento regulatorio (GDPR, SOC2, ISO 27001, HIPAA) contra el estado actual del proyecto.
3
+ allowed-tools: Read, Bash
4
+ ---
5
+
1
6
  # /sdd.compliance — Reporte de Cumplimiento Regulatorio
2
7
 
3
8
  ## Descripción
@@ -60,7 +60,7 @@ Calidad: cobertura 75% · warnings: no · funciones ≤50 líneas
60
60
  ¿Aplicar este preset? Los valores que hayas personalizado se sobreescribirán.
61
61
  ```
62
62
 
63
- Si el usuario confirma, mezcla los valores del preset sobre el `sdd.config.yaml` existente (preserva secciones como `figma:`, `mapeos:`, `compresion:` que el preset no toca).
63
+ Si el usuario confirma, mezcla los valores del preset sobre el `sdd.config.yaml` existente (preserva secciones como `mapeos:`, `compresion:` que el preset no toca).
64
64
 
65
65
  ## PASO 3 — Modo: Mostrar
66
66
 
@@ -12,6 +12,8 @@ handoffs:
12
12
 
13
13
  Eres el **Generador de MCP**. Tomas una descripción en lenguaje natural y produces un servidor MCP completo: tools definidas, empaquetado, instrucciones de instalación de una línea. El resultado lo puede instalar alguien que no sabe programar.
14
14
 
15
+ > **MCP integrado en v2.6.0:** Playwright (navegación y QA automatizado).
16
+
15
17
  ## PASO 1 — Entender qué capacidades se quieren publicar
16
18
 
17
19
  Lee el argumento del comando. Si el usuario escribió algo como:
@@ -0,0 +1,134 @@
1
+ ---
2
+ description: Generar reporte de calidad con escape rate y mutaciones
3
+ allowed-tools: Read, Bash
4
+ ---
5
+
6
+ # /sdd.defect-report
7
+
8
+ Genera un reporte de calidad basado en mutaciones (cambios) de archivos encontrados por QA.
9
+
10
+ ## Uso
11
+
12
+ ```
13
+ /sdd.defect-report
14
+ ```
15
+
16
+ ## Qué Muestra
17
+
18
+ ### Resumen Ejecutivo
19
+
20
+ ```
21
+ ╔═══════════════════════════════════════════════════════════╗
22
+ ║ DEFECT ESCAPE RATE REPORT — 2026-06-14 ║
23
+ ╠═══════════════════════════════════════════════════════════╣
24
+ ║ ║
25
+ ║ Archivos modificados: 12 ║
26
+ ║ Bugs encontrados (QA): 4 ║
27
+ ║ Bugs en producción: 1 ║
28
+ ║ ───────────────────────────────────── ║
29
+ ║ Global Escape Rate: 20% (1 de 5) ║
30
+ ║ ║
31
+ ║ Interpretación: ║
32
+ ║ ✅ Muy bien (1-10%): Calidad excelente ║
33
+ ║ ⚠️ OK (11-30%): Calidad buena ║
34
+ ║ 🔴 Malo (31%+): Calidad baja ║
35
+ ║ ║
36
+ ╚═══════════════════════════════════════════════════════════╝
37
+ ```
38
+
39
+ ### Por Agente
40
+
41
+ ```
42
+ AGENTE | ARCHIVOS | MUTACIONES | BUGS ENCONTRADOS | QUALITY
43
+ ───────────────┼──────────┼────────────┼──────────────────┼─────────
44
+ backend-dev | 12 | 15 | 3 | 75%
45
+ frontend-dev | 8 | 12 | 1 | 88%
46
+ tester-qa | 5 | 8 | 4 (encontrados) | QA
47
+ revisor | 3 | 4 | 2 | 67%
48
+ ```
49
+
50
+ ### Archivos Inestables
51
+
52
+ ```
53
+ 🚨 CRÍTICOS (>5 mutaciones):
54
+ - src/auth.ts (7 mutaciones en 2 días)
55
+ - src/database.ts (6 mutaciones en 3 días)
56
+
57
+ ⚠️ INESTABLES (2-5 mutaciones):
58
+ - src/validators.ts (3 mutaciones)
59
+ - src/payments.ts (4 mutaciones)
60
+ ```
61
+
62
+ ### Agentes con Mejora Necesaria
63
+
64
+ ```
65
+ 📊 ESCALA DE CALIDAD:
66
+ backend-dev: ████████░ 75% — Aumentar coverage de tests
67
+ frontend-dev: █████████ 88% — Excelente
68
+ revisor: ██████░░░ 67% — Revisar proceso de verificación
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Interpretación de Resultados
74
+
75
+ ### Escape Rate Bajo (1-10%)
76
+ ```
77
+ ✅ QA es efectivo, código es estable
78
+ → Confiable para producción
79
+ → Clientes confían en calidad
80
+ ```
81
+
82
+ ### Escape Rate Medio (11-30%)
83
+ ```
84
+ ⚠️ QA encuentra mayoría de bugs, pero algunos escapan
85
+ → Aumentar cobertura de tests
86
+ → Mejorar criterios de aceptación
87
+ ```
88
+
89
+ ### Escape Rate Alto (31%+)
90
+ ```
91
+ 🔴 Problemas serios de calidad
92
+ → Tests insuficientes
93
+ → Falta validación
94
+ → Riesgo de producción
95
+ ```
96
+
97
+ ---
98
+
99
+ ## Ejemplo Real
100
+
101
+ **Sesión 1 (2026-06-10):**
102
+ - Backend Dev escribe src/auth.ts (Write)
103
+ - Frontend Dev modifica src/ui.tsx (Edit)
104
+ - Tester QA ejecuta tests, encuentra 2 bugs en auth.ts
105
+
106
+ **Sesión 2 (2026-06-11):**
107
+ - Backend Dev reescribe src/auth.ts (Write) — 2 bugs solucionados + 1 nuevo
108
+ - Tester QA ejecuta tests, encuentra 2 bugs (1 viejo, 1 nuevo)
109
+ - 1 bug anterior escapó a producción
110
+
111
+ **Reporte Final:**
112
+ ```
113
+ Archivos: 2
114
+ Bugs encontrados: 4
115
+ Bugs en prod: 1
116
+ ─────────────────
117
+ Escape Rate: 25%
118
+
119
+ Por agente:
120
+ backend-dev: 6 mutaciones, 3 bugs encontrados → 50% quality
121
+ frontend-dev: 1 mutación, 0 bugs → 100% quality
122
+ tester-qa: 100% accuracy (encontró todos excepto 1 que escapó)
123
+ ```
124
+
125
+ ---
126
+
127
+ ## Datos Fuente
128
+
129
+ Utiliza:
130
+ - `.sdd/observabilidad/mutaciones.jsonl` — cambios a archivos
131
+ - `.sdd/observabilidad/consumo.jsonl` — timestamps de eventos
132
+
133
+ **Nota:** En v2.6.1 se agregará integración con resultados reales de QA (Playwright).
134
+
@@ -32,8 +32,27 @@ cat .sdd/memoria/constitucion.md 2>/dev/null | head -10 && echo "EXISTE_CONSTITU
32
32
  # ¿Es un proyecto existente? Si hay código, invocar al investigador antes de preguntar
33
33
  ls package.json pyproject.toml Cargo.toml go.mod 2>/dev/null | head -5
34
34
  ls src/ app/ lib/ 2>/dev/null | head -3
35
+
36
+ # ¿Hay perfil configurado?
37
+ PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
38
+ [ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
39
+ echo "PERFIL=${PERFIL:-guiado}"
35
40
  ```
36
41
 
42
+ ### Detección de usuario nuevo
43
+
44
+ Si NO existe `.sdd/estado.json` ni `.sdd/sdd.config.yaml` y no hay código previo en el proyecto:
45
+
46
+ **→ Usuario nuevo detectado. Usa modo guiado.**
47
+
48
+ No pidas que editen archivos ni que ejecuten comandos. Saluda en lenguaje natural:
49
+
50
+ > ¡Hola! Cuéntame qué quieres construir — una frase es suficiente. No necesitas saber nada técnico para empezar.
51
+
52
+ Si existe `.sdd/sdd.config.yaml` con `perfil: experto` explícito:
53
+
54
+ **→ Usuario avanzado. Usa modo experto** (muestra comandos, rutas, estado técnico).
55
+
37
56
  Si el proyecto ya tiene código (existe `src/`, `app/`, o un archivo de manifiesto), invoca al agente **investigador** antes del PASO 1:
38
57
 
39
58
  > `@investigador` Analiza el proyecto existente y genera el informe de contexto técnico. Quiero usarlo como base antes de especificar algo nuevo.
@@ -28,7 +28,57 @@ fi
28
28
  Ejecuta: /sdd.constitucion
29
29
  ```
30
30
 
31
- ## PASO 3Generar dashboard completo
31
+ ## PASO 2.5Detectar perfil y elegir formato de dashboard
32
+
33
+ ```bash
34
+ PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
35
+ [ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
36
+ echo "PERFIL=${PERFIL:-guiado}"
37
+ ```
38
+
39
+ - Si `PERFIL=guiado` (o no hay perfil): mostrar **dashboard de producto** (PASO 3A).
40
+ - Si `PERFIL=experto` y no hay modo explícito `pm`/`arq`/`dev`: mostrar **dashboard técnico** (PASO 3B).
41
+
42
+ ## PASO 3A — Dashboard de producto (modo guiado, por defecto)
43
+
44
+ Muestra el estado en lenguaje natural, sin jerga técnica:
45
+
46
+ ```
47
+ Tu proyecto: [Nombre del proyecto]
48
+
49
+ [Si hay feature activa:]
50
+ Estás trabajando en: [título de la spec en lenguaje natural]
51
+ Progreso: [N]% listo ([N] de [M] pasos completados)
52
+ [████████████░░░░░░░░]
53
+
54
+ ¿Qué queda por hacer?
55
+ ✅ [descripción natural del paso completado más reciente]
56
+ → Próximo paso: [descripción natural de lo que sigue]
57
+
58
+ [Si hay bloqueos:]
59
+ ⚠️ Hay un problema que necesita tu atención: [descripción natural del bloqueo]
60
+
61
+ [Si no hay feature activa:]
62
+ ¡Listo para empezar! ¿Qué quieres construir ahora?
63
+ ```
64
+
65
+ Reglas para el dashboard de producto:
66
+ - Nunca mostrar IDs internos (`2026-06-14-auth`, `pipeline_step`, `T003`).
67
+ - Nunca mencionar nombres de comandos a menos que el usuario los pida.
68
+ - Usar "feature", "funcionalidad" o "lo que estás construyendo" en vez de "spec" o "especificación".
69
+ - Traducir las fases del pipeline a lenguaje natural:
70
+ | Fase interna | Texto para usuario |
71
+ |---|---|
72
+ | `especificacion` | "Definiendo los detalles" |
73
+ | `plan` | "Planificando cómo construirlo" |
74
+ | `plan_aprobado` | "Plan listo, preparando tareas" |
75
+ | `tareas_generadas` | "Tareas listas, empezando a construir" |
76
+ | `implementacion` | "Construyendo..." |
77
+ | `implementacion_completa` | "Construcción lista, verificando" |
78
+ | `verificada` | "Verificado y funcionando" |
79
+ | `completado` | "¡Listo! Feature entregada" |
80
+
81
+ ## PASO 3B — Dashboard técnico (modo experto o modo `dev`)
32
82
 
33
83
  ```
34
84
  ╔════════════════════════════════════════════════════════════════╗
@@ -100,7 +150,7 @@ fi
100
150
  ╚════════════════════════════════════════════════════════════════╝
101
151
  ```
102
152
 
103
- ## PASO 4 — Determinar próximo paso según fase
153
+ ## PASO 4 — Determinar próximo paso según fase (para ambos modos)
104
154
 
105
155
  | Fase actual | Próximo paso |
106
156
  |-------------|--------------|