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
|
@@ -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
|
-
|
|
124
|
-
`
|
|
125
|
-
`
|
|
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
|
-
|
|
137
|
-
`
|
|
138
|
-
`
|
|
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
|
-
|
|
150
|
-
`
|
|
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
|
+
|
package/commands/sdd.ayuda.md
CHANGED
|
@@ -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
|
|
|
@@ -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 `
|
|
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.
|
package/commands/sdd.estado.md
CHANGED
|
@@ -28,7 +28,57 @@ fi
|
|
|
28
28
|
Ejecuta: /sdd.constitucion
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
## PASO
|
|
31
|
+
## PASO 2.5 — Detectar 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
|
|-------------|--------------|
|