sdd-es 2.0.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +29 -29
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +10 -7
- package/.claude-plugin/plugin.json +59 -37
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +77 -40
- package/agents/architecture-designer.md +211 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +11 -16
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +268 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +288 -0
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/cli/index.js +1 -2
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +521 -0
- package/commands/sdd.configurar.md +34 -1
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.crear-mcp.md +2 -0
- package/commands/sdd.defect-report.md +134 -0
- package/commands/sdd.descubrir.md +19 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +120 -3
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +272 -52
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +93 -4
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +81 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +61 -185
- package/docs/FABRICA.md +163 -115
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +15 -10
- package/plantillas/job-story-mejorar-prompt.md +107 -0
- package/presets/enterprise.yaml +6 -0
- package/presets/lean.yaml +4 -0
- package/presets/startup.yaml +6 -0
- package/skills/adr-indexer/SKILL.md +181 -0
- package/skills/cache-audit/SKILL.md +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +68 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +177 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/mcp-figma/README.md +0 -158
- package/mcp-figma/package.json +0 -7
- package/mcp-figma/src/component-generator.js +0 -162
- package/mcp-figma/src/design-system-analyzer.js +0 -247
- package/mcp-figma/src/figma-client.js +0 -75
- package/mcp-figma/src/index.js +0 -114
- package/mcp-figma/src/mcp.js +0 -97
- package/mcp-figma/src/style-mapper.js +0 -85
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Punto de entrada de FORGE. Convierte una idea en texto libre a un IR JSON validado. Orquesta discovery + interpreter + validación. Primer comando para cualquier proyecto nuevo.
|
|
3
|
+
allowed-tools: Read, Write, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.interpretar — Entrada a FORGE
|
|
7
|
+
|
|
8
|
+
**Uso:**
|
|
9
|
+
```
|
|
10
|
+
/sdd.interpretar [idea en texto libre]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Ejemplos:**
|
|
14
|
+
```
|
|
15
|
+
/sdd.interpretar Quiero una app para que mis clientes reserven citas
|
|
16
|
+
/sdd.interpretar Necesito algo para organizar los pedidos de mi restaurante
|
|
17
|
+
/sdd.interpretar Plataforma de cursos online con pagos y certificados
|
|
18
|
+
/sdd.interpretar confirmar
|
|
19
|
+
/sdd.interpretar corregir "es para múltiples negocios, no solo uno"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## PASO 1 — Detectar modo de invocación
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
ARGS="$*"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Detecta el caso:
|
|
31
|
+
|
|
32
|
+
| Argumento | Modo |
|
|
33
|
+
|-----------|------|
|
|
34
|
+
| `confirmar` o `sí` | Confirmar IR pendiente → guardar |
|
|
35
|
+
| `corregir [qué]` | Corregir campo del IR pendiente |
|
|
36
|
+
| `ver` | Mostrar IR actual en `.sdd/ir.json` |
|
|
37
|
+
| `[texto libre]` | Nueva idea → flujo completo |
|
|
38
|
+
| *(vacío)* | Pedir que escriba su idea |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## PASO 2 — Si es texto libre: flujo completo
|
|
43
|
+
|
|
44
|
+
### 2.1 — Verificar si hay IR anterior
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
if [ -f ".sdd/ir.json" ]; then
|
|
48
|
+
echo "HAY_IR_ANTERIOR"
|
|
49
|
+
cat .sdd/ir.json | grep '"name"' | head -1
|
|
50
|
+
fi
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Si hay IR anterior, pregunta:
|
|
54
|
+
```
|
|
55
|
+
Ya tienes un proyecto en curso: [product.name]
|
|
56
|
+
|
|
57
|
+
¿Qué quieres hacer?
|
|
58
|
+
1) Continuar con ese proyecto → escribe /sdd.diseñar
|
|
59
|
+
2) Actualizar la idea de ese proyecto → escribe /sdd.interpretar corregir [qué]
|
|
60
|
+
3) Empezar un proyecto nuevo → escribe /sdd.interpretar nuevo [idea]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Si no hay IR anterior, continúa.
|
|
64
|
+
|
|
65
|
+
### 2.2 — Crear carpeta .sdd/
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
mkdir -p .sdd
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2.3 — Invocar skill `descubrir-idea`
|
|
72
|
+
|
|
73
|
+
Activa la skill de discovery. La skill hace las 5 preguntas y guarda `.sdd/descubrimiento.md`.
|
|
74
|
+
|
|
75
|
+
Después de que el usuario responda las 5 preguntas, continúa al paso 2.4.
|
|
76
|
+
|
|
77
|
+
### 2.4 — Invocar skill `interpretar-idea`
|
|
78
|
+
|
|
79
|
+
Activa la skill con la idea original del usuario + contexto de `.sdd/descubrimiento.md`.
|
|
80
|
+
|
|
81
|
+
La skill genera el IR JSON en 2 fases (razonamiento libre + extracción JSON) y lo muestra al usuario.
|
|
82
|
+
|
|
83
|
+
**Si la skill requiere clarificación** (`confidence < 0.7`): el usuario responde la pregunta, y la skill re-genera el IR. Luego continúa.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## PASO 3 — Si es `confirmar` o `sí`
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Verificar que hay un IR pendiente de confirmar
|
|
91
|
+
if [ ! -f ".sdd/ir-pendiente.json" ] && [ ! -f ".sdd/ir.json" ]; then
|
|
92
|
+
echo "No hay ningún IR pendiente. Escribe tu idea primero:"
|
|
93
|
+
echo " /sdd.interpretar [tu idea]"
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Guarda el IR:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cp .sdd/ir-pendiente.json .sdd/ir.json 2>/dev/null || true
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Actualiza `.sdd/estado.json`:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Leer estado actual o crear si no existe
|
|
108
|
+
if [ -f ".sdd/estado.json" ]; then
|
|
109
|
+
# Agregar campo ir_generado: true
|
|
110
|
+
node -e "
|
|
111
|
+
const fs = require('fs');
|
|
112
|
+
const estado = JSON.parse(fs.readFileSync('.sdd/estado.json', 'utf8'));
|
|
113
|
+
estado.ir_generado = true;
|
|
114
|
+
estado.ir_id = JSON.parse(fs.readFileSync('.sdd/ir.json', 'utf8')).id;
|
|
115
|
+
estado.ultima_actualizacion = new Date().toISOString();
|
|
116
|
+
fs.writeFileSync('.sdd/estado.json', JSON.stringify(estado, null, 2));
|
|
117
|
+
" 2>/dev/null || echo "{ \"ir_generado\": true, \"ultima_actualizacion\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" }" > .sdd/estado.json
|
|
118
|
+
fi
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Muestra confirmación y siguiente paso:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
✅ IR guardado en .sdd/ir.json
|
|
125
|
+
|
|
126
|
+
Siguiente paso → Diseño de pantallas y arquitectura:
|
|
127
|
+
/sdd.diseñar
|
|
128
|
+
|
|
129
|
+
O si quieres ir directo al código (diseño automático):
|
|
130
|
+
/sdd.construir
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## PASO 4 — Si es `corregir [qué]`
|
|
136
|
+
|
|
137
|
+
Extrae la corrección del argumento. Por ejemplo:
|
|
138
|
+
- `/sdd.interpretar corregir "es para múltiples negocios"` → actualizar `product.target_users` y/o `assumptions`
|
|
139
|
+
|
|
140
|
+
Lee el IR actual:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
cat .sdd/ir.json 2>/dev/null || cat .sdd/ir-pendiente.json 2>/dev/null
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Aplica la corrección al campo correspondiente del IR. Re-valida. Muestra el IR actualizado y pide confirmación de nuevo.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## PASO 5 — Si es `ver`
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
cat .sdd/ir.json 2>/dev/null || echo "No hay IR guardado todavía."
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Muestra el IR en formato legible (igual que la skill `interpretar-idea`).
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## PASO 6 — Si argumento vacío
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
¿Cuál es tu idea?
|
|
164
|
+
|
|
165
|
+
Cuéntamela en una frase o párrafo. No te preocupes por el formato.
|
|
166
|
+
|
|
167
|
+
Ejemplos:
|
|
168
|
+
/sdd.interpretar Quiero una app para gestionar turnos de mi peluquería
|
|
169
|
+
/sdd.interpretar Sistema para que mis empleados registren sus horas de trabajo
|
|
170
|
+
/sdd.interpretar Marketplace de servicios para freelancers
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Estructura de archivos generados
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
.sdd/
|
|
179
|
+
descubrimiento.md ← Respuestas del discovery (5 preguntas)
|
|
180
|
+
ir-analysis.md ← Análisis libre de la Fase A del Interpreter
|
|
181
|
+
ir-pendiente.json ← IR generado, esperando confirmación del usuario
|
|
182
|
+
ir.json ← IR confirmado (se crea solo tras "confirmar")
|
|
183
|
+
estado.json ← Estado global del proyecto (ir_generado: true)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Integración con el pipeline
|
|
189
|
+
|
|
190
|
+
Después de `/sdd.interpretar confirmar`:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
/sdd.diseñar → Diseña pantallas, elige dirección visual, genera wireframe
|
|
194
|
+
/sdd.construir → Pipeline completo: diseño + spec + plan + tareas + código
|
|
195
|
+
/sdd.estado → Ver estado actual del proyecto
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Opciones avanzadas
|
|
201
|
+
|
|
202
|
+
### Modo silencioso (sin discovery)
|
|
203
|
+
|
|
204
|
+
Si el usuario ya dio suficiente contexto en la idea:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
/sdd.interpretar --rapido [idea detallada]
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Salta el discovery y va directo al Interpreter.
|
|
211
|
+
|
|
212
|
+
### Actualizar proyecto existente
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
/sdd.interpretar actualizar "quiero agregar pagos en línea"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
1. Lee IR actual
|
|
219
|
+
2. Interpreta el cambio
|
|
220
|
+
3. Fusiona (agrega feature, actualiza assumptions)
|
|
221
|
+
4. Re-valida y pide confirmación
|
|
222
|
+
|
|
223
|
+
### Nuevo proyecto (ignorar IR anterior)
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
/sdd.interpretar nuevo [idea]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Archiva el IR anterior en `.sdd/ir-anterior-[timestamp].json` y empieza desde cero.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Notas de implementación
|
|
234
|
+
|
|
235
|
+
- Este comando es el **único punto de entrada** para usuarios no técnicos
|
|
236
|
+
- El IR es la **fuente de verdad** del proyecto — todo lo demás se deriva de él
|
|
237
|
+
- La skill `descubrir-idea` y la skill `interpretar-idea` son los módulos reales — este comando las orquesta
|
|
238
|
+
- Si el usuario dice "sí" o "confirmar" en cualquier momento durante el flujo, se guarda el IR actual
|
|
239
|
+
- El modelo **nunca inventa** datos del usuario — todo en `assumptions[]` debe ser explícito
|
package/commands/sdd.md
CHANGED
|
@@ -20,6 +20,38 @@ else
|
|
|
20
20
|
fi
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
**Recuperación de contexto automática:** Si existe `.sdd/estado.json`, antes de pedir nada al usuario muestra un resumen de **exactamente 3 líneas** con:
|
|
24
|
+
|
|
25
|
+
1. `pipeline_step` actual (campo `pipeline_step` del estado).
|
|
26
|
+
2. Spec activa (campo `spec_activa` o equivalente).
|
|
27
|
+
3. Número de tareas pendientes.
|
|
28
|
+
|
|
29
|
+
Ejemplo:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Paso del pipeline: implementar
|
|
33
|
+
Spec activa: 2026-06-14-auth
|
|
34
|
+
Tareas pendientes: 3
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## PASO 1.2 — Detectar modo de output
|
|
38
|
+
|
|
39
|
+
Si el argumento del comando contiene un modo de output (`pm`, `arq`, `dev`), actívalo globalmente para esta sesión:
|
|
40
|
+
|
|
41
|
+
| Argumento | Modo | Descripción |
|
|
42
|
+
|-----------|------|-------------|
|
|
43
|
+
| `pm` o `producto` | **Product Manager** | Lenguaje de negocio, sin código, bullets ejecutivos. Oculta detalles técnicos. |
|
|
44
|
+
| `arq` o `arquitectura` | **Arquitecto** | Diagramas, decisiones técnicas, trade-offs. Para revisiones de diseño. |
|
|
45
|
+
| `dev` o `desarrollo` | **Desarrollador** | Código, diffs, comandos. Modo por defecto. |
|
|
46
|
+
|
|
47
|
+
Ejemplos:
|
|
48
|
+
- `/sdd.estado pm` → dashboard en lenguaje de negocio
|
|
49
|
+
- `/sdd.verificar arq` → reporte técnico con diagramas
|
|
50
|
+
- `/sdd.analizar dev` → análisis con código y rutas de archivo
|
|
51
|
+
|
|
52
|
+
El modo se guarda en `MODO_OUTPUT` y lo usan todos los comandos que producen reportes.
|
|
53
|
+
Si no se especifica, usa `dev` (comportamiento actual).
|
|
54
|
+
|
|
23
55
|
## PASO 1.5 — Detectar el perfil y ajustar el modo de conducción
|
|
24
56
|
|
|
25
57
|
Lee el perfil desde el estado o la configuración:
|
|
@@ -27,10 +59,11 @@ Lee el perfil desde el estado o la configuración:
|
|
|
27
59
|
```bash
|
|
28
60
|
PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
29
61
|
[ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
|
|
30
|
-
|
|
62
|
+
# Por defecto: modo guiado (sin jerga) — si sdd.config.yaml declara explícitamente "perfil: experto", se respeta
|
|
63
|
+
echo "PERFIL=${PERFIL:-guiado}"
|
|
31
64
|
```
|
|
32
65
|
|
|
33
|
-
**Si `PERFIL=guiado
|
|
66
|
+
**Si `PERFIL=guiado` (o no hay perfil configurado):** activa la skill `modo-guiado` y conduce TODO el resto de la interacción según sus 6 reglas (sin jerga, confirmar antes de actuar, una pregunta a la vez, nunca pedir que edite archivos). En este modo:
|
|
34
67
|
|
|
35
68
|
- **Encadenas automáticamente** los pasos del flujo (especificar → planificar → tareas → implementar) pidiendo solo una confirmación simple entre fases, sin exponer los nombres de los comandos. El usuario dice "sí" y tú avanzas.
|
|
36
69
|
- Traduces cada fase a lenguaje natural (ver tabla en la skill `modo-guiado`).
|
|
@@ -40,7 +73,7 @@ Ejemplo de conducción en modo guiado:
|
|
|
40
73
|
|
|
41
74
|
> Entendido, quieres una lista de tareas. Primero voy a entender bien los detalles, luego lo construyo y lo pruebo. ¿Arrancamos? (responde *sí*)
|
|
42
75
|
|
|
43
|
-
**Si `PERFIL=experto
|
|
76
|
+
**Si `PERFIL=experto`:** sigue el enrutamiento normal del PASO 2, exponiendo comandos técnicos. Este modo se activa SOLO cuando el archivo `sdd.config.yaml` incluye explícitamente `perfil: experto`.
|
|
44
77
|
|
|
45
78
|
## PASO 2 — Interpretar la intención del usuario
|
|
46
79
|
|
|
@@ -48,6 +81,11 @@ El usuario invocó este comando con argumentos en lenguaje natural. Mapea su int
|
|
|
48
81
|
|
|
49
82
|
| Intención del usuario | Comando a ejecutar |
|
|
50
83
|
|----------------------|--------------------|
|
|
84
|
+
| "tengo una idea", "quiero crear", "quiero construir X desde cero", "dame una app de X" | `/sdd.interpretar [idea]` |
|
|
85
|
+
| "interpreta mi idea", "analiza lo que quiero hacer" | `/sdd.interpretar` |
|
|
86
|
+
| "diseña el producto", "elige el estilo", "quiero ver el wireframe" | `/sdd.diseñar` |
|
|
87
|
+
| "construye todo", "haz el código completo", "pipeline completo" | `/sdd.construir` |
|
|
88
|
+
| "exporta el bundle", "empaqueta el proyecto" | `/sdd.exportar` |
|
|
51
89
|
| "quiero inicializar", "configurar el proyecto", "empezar" | `/sdd.constitucion` |
|
|
52
90
|
| "quiero crear una feature", "nueva spec", "voy a hacer X" | `/sdd.especificar [resto]` |
|
|
53
91
|
| "quiero importar una spec externa" | `/sdd.importar [resto]` |
|
|
@@ -69,15 +107,56 @@ El usuario invocó este comando con argumentos en lenguaje natural. Mapea su int
|
|
|
69
107
|
| "cambia configuración", "ajusta agentes/modelos" | `/sdd.configurar` |
|
|
70
108
|
| "indexa el proyecto", "genera mapa de símbolos" | `/sdd.mapear` |
|
|
71
109
|
| "comprime", "ahorra tokens", "compacta memoria" | `/sdd.comprimir` |
|
|
110
|
+
| "optimiza artefactos", "reduce contexto" | `/sdd.optimizar` |
|
|
111
|
+
| "optimiza memoria", "compacta agente" | `/sdd.optimizar-memoria` |
|
|
112
|
+
| "compliance", "reporte regulatorio", "GDPR", "SOC2" | `/sdd.compliance` |
|
|
113
|
+
| "registra decisión", "ADR", "architecture decision" | `/sdd.adr` |
|
|
114
|
+
| "reporte de bugs", "defect rate", "tasa de defectos" | `/sdd.defect-report` |
|
|
72
115
|
| "haz un release", "nueva versión", "changelog" | `/sdd.release` |
|
|
73
116
|
| "descubre el proyecto", "tengo una idea vaga" | `/sdd.descubrir` |
|
|
74
117
|
| "crea una app", "construye una app", "quiero una app de X" | `/sdd.crear-app [resto]` |
|
|
75
118
|
| "crea un MCP", "quiero una herramienta para Claude", "genera un servidor MCP" | `/sdd.crear-mcp [resto]` |
|
|
76
119
|
| "ayuda", "qué puedes hacer" | `/sdd.ayuda` |
|
|
77
120
|
|
|
121
|
+
## PASO 2.5 — Detectar IR sin spec activa (FORGE)
|
|
122
|
+
|
|
123
|
+
Si hay `.sdd/ir.json` pero NO hay spec activa, sugiere el siguiente paso del pipeline de FORGE:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
HAS_IR=$([ -f ".sdd/ir.json" ] && echo "yes" || echo "no")
|
|
127
|
+
HAS_DESIGN=$([ -f ".sdd/product-design.json" ] && echo "yes" || echo "no")
|
|
128
|
+
SPEC_ACTIVA=$(cat .sdd/estado.json 2>/dev/null | grep -o '"spec_activa": *"[^"]*"' | cut -d'"' -f4)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Si `HAS_IR=yes` y sin spec activa:
|
|
132
|
+
|
|
133
|
+
> Ya tienes una idea interpretada: **[product.name]**.
|
|
134
|
+
>
|
|
135
|
+
> ¿Qué quieres hacer?
|
|
136
|
+
> - `/sdd.diseñar` → elegir estilo visual y generar wireframe
|
|
137
|
+
> - `/sdd.construir` → pipeline completo automático (diseño + código)
|
|
138
|
+
> - `/sdd.exportar` → empaquetar lo que hay ahora
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
78
142
|
## PASO 3 — Si no está inicializado
|
|
79
143
|
|
|
80
|
-
Si el proyecto NO está inicializado,
|
|
144
|
+
Si el proyecto NO está inicializado, primero verifica si la intención del usuario es FORGE (idea → MVP):
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
TIENE_IDEA=$(echo "$ARGS" | grep -iE "tengo una idea|quiero crear|quiero construir|quiero una app|necesito|idea" && echo "yes" || echo "no")
|
|
148
|
+
TIENE_INTERPRETAR=$(echo "$ARGS" | grep -iE "interpreta|interpretar" && echo "yes" || echo "no")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Si la intención es FORGE** (tiene idea, quiere crear algo desde cero):
|
|
152
|
+
|
|
153
|
+
> 👋 Empecemos. No necesitas inicializar nada primero.
|
|
154
|
+
>
|
|
155
|
+
> Cuéntame tu idea y FORGE la convierte en un producto.
|
|
156
|
+
|
|
157
|
+
Llama directamente a `/sdd.interpretar [idea del usuario]`. FORGE crea `.sdd/` automáticamente.
|
|
158
|
+
|
|
159
|
+
**Si la intención NO es FORGE** (quiere usar sdd-lite para una feature de código existente):
|
|
81
160
|
|
|
82
161
|
> 👋 Bienvenido a SDD-ES.
|
|
83
162
|
>
|
|
@@ -87,6 +166,16 @@ Si el proyecto NO está inicializado, no importa qué pidió el usuario — resp
|
|
|
87
166
|
|
|
88
167
|
Luego llama internamente a `/sdd.constitucion`.
|
|
89
168
|
|
|
169
|
+
**Si no hay argumentos** (usuario escribió solo `/sdd` en proyecto no inicializado):
|
|
170
|
+
|
|
171
|
+
> 👋 Bienvenido. ¿Qué quieres hacer?
|
|
172
|
+
>
|
|
173
|
+
> **Tengo una idea y quiero construirla**
|
|
174
|
+
> → `/sdd.interpretar [tu idea]`
|
|
175
|
+
>
|
|
176
|
+
> **Tengo un proyecto de código y quiero especificar features**
|
|
177
|
+
> → `/sdd.constitucion` (configura el proyecto primero)
|
|
178
|
+
|
|
90
179
|
## PASO 4 — Si ya está inicializado pero hay una spec activa incompleta
|
|
91
180
|
|
|
92
181
|
Lee `estado.json` y `.estado-tareas.json` de la spec activa.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Comprimir manualmente la memoria de agentes (deduplicación + compresión)
|
|
3
|
+
allowed-tools: Read, Write, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.optimizar memoria
|
|
7
|
+
|
|
8
|
+
Comprime automáticamente los archivos de memoria de agentes (`.sdd/memoria/agente-*.md`) cuando superan 50KB.
|
|
9
|
+
|
|
10
|
+
## Uso
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/sdd.optimizar memoria
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Qué Hace
|
|
17
|
+
|
|
18
|
+
1. **Lee** archivos en `.sdd/memoria/`
|
|
19
|
+
2. **Deduplica** entradas por filepath (guarda solo la más reciente)
|
|
20
|
+
3. **Comprime** aplicando diccionario Caveman Level Full
|
|
21
|
+
4. **Crea backup** `.original.md` antes de sobrescribir
|
|
22
|
+
5. **Reporta** bytes salvados
|
|
23
|
+
|
|
24
|
+
## Ejemplo
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
ANTES: agente-arquitecto.md = 150KB (80 entradas)
|
|
28
|
+
|
|
29
|
+
/sdd.optimizar memoria
|
|
30
|
+
|
|
31
|
+
✨ [compress] arquitecto: 150KB → 15KB (10%), backup en .original.md
|
|
32
|
+
✨ [compress] critico: 87KB → 8.7KB (10%)
|
|
33
|
+
|
|
34
|
+
DESPUÉS: memoria total = 24KB
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Seguridad
|
|
38
|
+
|
|
39
|
+
- Nunca pierdes datos (backup siempre)
|
|
40
|
+
- Idempotente (ejecutar 2 veces = mismo resultado)
|
|
41
|
+
- Reversible: `.original.md` contiene datos originales
|
|
42
|
+
|
|
43
|
+
## Notas
|
|
44
|
+
|
|
45
|
+
- Se ejecuta automáticamente vía hook cuando memoria > 50KB
|
|
46
|
+
- Puedes ejecutarla manualmente cuando quieras
|
|
47
|
+
- Segura para ejecutar frecuentemente (sin riesgos)
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Ciclo completo de optimización de tokens para la sesión actual — detecta fan-out, recomienda modelos por fase, comprime memoria si supera umbral, audita oportunidades de caché y proyecta presupuesto. Punto de entrada unificado para uso eficiente de tokens en FORGE.
|
|
3
|
+
allowed-tools: Read, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.optimizar — Optimización de Tokens
|
|
7
|
+
|
|
8
|
+
## Subcomandos disponibles
|
|
9
|
+
|
|
10
|
+
| Subcomando | Qué ejecuta |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `/sdd.optimizar` | Ciclo completo (PASOes 1-6) |
|
|
13
|
+
| `/sdd.optimizar tokens` | Solo effort-router + cache-audit |
|
|
14
|
+
| `/sdd.optimizar memoria` | Solo memory-compactor |
|
|
15
|
+
| `/sdd.optimizar presupuesto` | Solo token-budget |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## PASO 1 — Verificar que el proyecto está inicializado
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
[ ! -d .sdd ] && echo "NO_INICIALIZADO" && exit 0
|
|
23
|
+
[ ! -f .sdd/estado.json ] && echo "SIN_ESTADO" && exit 0
|
|
24
|
+
cat .sdd/estado.json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Si no está inicializado: mostrar `🚫 SDD-ES no inicializado. Ejecuta: /sdd.constitucion` y terminar.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## PASO 2 — Leer ledger de consumo (observabilidad)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
if [ -f .sdd/observabilidad/consumo.jsonl ]; then
|
|
35
|
+
wc -l .sdd/observabilidad/consumo.jsonl
|
|
36
|
+
cat .sdd/observabilidad/consumo.jsonl
|
|
37
|
+
else
|
|
38
|
+
echo "SIN_LEDGER"
|
|
39
|
+
fi
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Si `SIN_LEDGER`: marcar PASO 2 como "Sin datos de sesión — ledger vacío" y continuar.
|
|
43
|
+
|
|
44
|
+
Si hay datos: invocar la skill `observabilidad-consumo` para obtener:
|
|
45
|
+
- Tabla por agente (invocaciones, bytes, archivos únicos)
|
|
46
|
+
- Alertas de fan-out (>5 agentes distintos, >20 invocaciones de un agente, >500KB total)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## PASO 3 — Routing de effort (si hay fase activa o alertas de fan-out)
|
|
51
|
+
|
|
52
|
+
Invocar la skill `effort-router` con la fase del `estado.json`.
|
|
53
|
+
|
|
54
|
+
Si el subcomando es `/sdd.optimizar presupuesto` o `/sdd.optimizar memoria`, saltar este paso.
|
|
55
|
+
|
|
56
|
+
Mostrar la tabla de modelos recomendados y el ahorro estimado.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## PASO 4 — Comprimir memoria si supera umbral
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Verificar tamaño de archivos de memoria
|
|
64
|
+
for f in .sdd/memoria/agente-*.md; do
|
|
65
|
+
[ -f "$f" ] || continue
|
|
66
|
+
entradas=$(grep -c "^## " "$f" 2>/dev/null || echo 0)
|
|
67
|
+
bytes=$(wc -c < "$f" 2>/dev/null || echo 0)
|
|
68
|
+
echo "MEMORIA:$f:$entradas:$bytes"
|
|
69
|
+
done
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Si algún archivo supera **80 entradas** o **50 000 bytes**: invocar la skill `memory-compactor`.
|
|
73
|
+
|
|
74
|
+
Si el subcomando es `/sdd.optimizar tokens` o `/sdd.optimizar presupuesto`, saltar este paso.
|
|
75
|
+
|
|
76
|
+
Si ningún archivo supera el umbral: marcar "✅ Memoria dentro del umbral".
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## PASO 5 — Auditar oportunidades de caché
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Detectar agentes instalados en el proyecto
|
|
84
|
+
ls .claude/agents/ 2>/dev/null || echo "SIN_AGENTES_LOCALES"
|
|
85
|
+
|
|
86
|
+
# Detectar patterns que invalidan caché silenciosamente
|
|
87
|
+
grep -rn "$(date +%Y-%m-%d)\|[0-9a-f]\{8\}-[0-9a-f]\{4\}\|consumo\.jsonl" .claude/agents/ 2>/dev/null || echo "SIN_INVALIDADORES"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Invocar la skill `cache-audit` con los resultados.
|
|
91
|
+
|
|
92
|
+
Si el subcomando es `/sdd.optimizar memoria` o `/sdd.optimizar presupuesto`, saltar este paso.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## PASO 6 — Proyectar presupuesto de fases restantes
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Tareas pendientes de la spec activa
|
|
100
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
101
|
+
if [ -n "$SPEC_ID" ]; then
|
|
102
|
+
cat ".sdd/especificaciones/${SPEC_ID}/.estado-tareas.json" 2>/dev/null || echo "SIN_TAREAS"
|
|
103
|
+
fi
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Invocar la skill `token-budget` con el estado, tareas pendientes y datos del ledger.
|
|
107
|
+
|
|
108
|
+
Si el subcomando es `/sdd.optimizar tokens` o `/sdd.optimizar memoria`, saltar este paso.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## PASO 7 — Reporte unificado
|
|
113
|
+
|
|
114
|
+
Generar el reporte final ordenando las acciones por impacto decreciente:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
118
|
+
║ ⚡ SDD.OPTIMIZAR — Reporte de Eficiencia ║
|
|
119
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
120
|
+
║ Proyecto: {nombre} | Fase: {fase} | {fecha} ║
|
|
121
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
122
|
+
║ 📊 CONSUMO DE SESIÓN ║
|
|
123
|
+
║ ║
|
|
124
|
+
║ {tabla por agente o "Sin datos de sesión"} ║
|
|
125
|
+
║ {alertas de fan-out o "✅ Sin alertas"} ║
|
|
126
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
127
|
+
║ 🎯 ROUTING DE MODELOS (fase: {fase}) ║
|
|
128
|
+
║ ║
|
|
129
|
+
║ {tabla effort-router} ║
|
|
130
|
+
║ Ahorro estimado vs. Opus-en-todo: ~{%}% ║
|
|
131
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
132
|
+
║ 🧠 MEMORIA DE AGENTES ║
|
|
133
|
+
║ ║
|
|
134
|
+
║ {estado por agente: OK / comprimido / pendiente} ║
|
|
135
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
136
|
+
║ 🔄 CACHÉ ║
|
|
137
|
+
║ ║
|
|
138
|
+
║ {oportunidades detectadas o "✅ Sin invalidadores detectados"} ║
|
|
139
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
140
|
+
║ 💰 PRESUPUESTO DE FASES RESTANTES ║
|
|
141
|
+
║ ║
|
|
142
|
+
║ {tabla por fase: costo estimado y recomendación PTC} ║
|
|
143
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
144
|
+
║ 🚀 ACCIONES RECOMENDADAS (por impacto) ║
|
|
145
|
+
║ ║
|
|
146
|
+
║ 1. {acción de mayor impacto con comando concreto} ║
|
|
147
|
+
║ 2. {segunda acción} ║
|
|
148
|
+
║ 3. {tercera acción} ║
|
|
149
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Lógica de priorización de acciones
|
|
153
|
+
|
|
154
|
+
Ordenar las recomendaciones así:
|
|
155
|
+
1. **Fan-out activo** (>5 agentes o >20 invocaciones) → acción inmediata con `effort-router`
|
|
156
|
+
2. **Memoria sobre umbral** (>50KB) → `memory-compactor`
|
|
157
|
+
3. **Invalidadores de caché detectados** → `cache-audit` con fix sugerido
|
|
158
|
+
4. **Fases costosas por delante** → `token-budget` + sugerencia de PTC
|
|
159
|
+
|
|
160
|
+
Si no hay ninguna de estas condiciones:
|
|
161
|
+
```
|
|
162
|
+
✅ La sesión está optimizada. No se detectan acciones de alto impacto.
|
|
163
|
+
Próximo paso sugerido según fase: {COMANDO_SDD}
|
|
164
|
+
```
|
|
@@ -21,6 +21,8 @@ Eres el **Orquestador del Plan**. Coordinas a los agentes especializados configu
|
|
|
21
21
|
|
|
22
22
|
**Si el usuario escribió `/sdd.planificar revisar`**: muestra el plan actual y pide cambios específicos.
|
|
23
23
|
|
|
24
|
+
**Si el usuario escribió `/sdd.planificar cambios [descripción]`**: registra feedback específico, edita el plan, y regresa al PASO 9 (aprobación explícita).
|
|
25
|
+
|
|
24
26
|
## VERIFICACIONES PRE-EJECUCIÓN
|
|
25
27
|
|
|
26
28
|
```bash
|
|
@@ -296,6 +298,68 @@ EOF
|
|
|
296
298
|
# Actualizar entrada de INDICE.md: "plan: ✅"
|
|
297
299
|
```
|
|
298
300
|
|
|
301
|
+
## PASO 8 — Presentar el plan (resumen ejecutivo)
|
|
302
|
+
|
|
303
|
+
No muestres el plan técnico completo. En su lugar, presenta un **resumen ejecutivo** adaptado al perfil:
|
|
304
|
+
|
|
305
|
+
**Si perfil == "guiado":**
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
✅ PLAN LISTO PARA CONSTRUIR
|
|
309
|
+
|
|
310
|
+
Lo que voy a hacer:
|
|
311
|
+
→ [3-5 frases en lenguaje simple de lo que se construye]
|
|
312
|
+
|
|
313
|
+
Tecnología que usaré:
|
|
314
|
+
→ [stack elegido, explicado sin jerga. Ej: "JavaScript (lenguaje web), SQLite (base de datos simple y gratis), Node.js (servidor web)"]
|
|
315
|
+
|
|
316
|
+
Tiempo aproximado:
|
|
317
|
+
→ [estimación legible: "unos 30-45 minutos"]
|
|
318
|
+
|
|
319
|
+
Archivos que cambiarán:
|
|
320
|
+
→ [lista simple de carpetas/conceptos afectados, no rutas técnicas]
|
|
321
|
+
|
|
322
|
+
Lo que queda por hacer después:
|
|
323
|
+
→ [QA, deploy, etc.]
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Si perfil == "experto":**
|
|
327
|
+
|
|
328
|
+
Muestra el plan técnico completo (todas las 17 secciones) con decisiones, riesgos y justificaciones.
|
|
329
|
+
|
|
330
|
+
## PASO 9 — Solicitar aprobación EXPLÍCITA
|
|
331
|
+
|
|
332
|
+
**Gate humano:** No avances a tareas sin aprobación clara.
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
¿Está bien este plan?
|
|
336
|
+
|
|
337
|
+
Responde:
|
|
338
|
+
✅ "sí" → Avanzamos con /sdd.tareas
|
|
339
|
+
🔄 "cambio [descripción]" → Edito el plan y pregunto de nuevo
|
|
340
|
+
❌ "rechazar" → Abortamos y revisamos la especificación
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Si usuario responde "cambio X":
|
|
344
|
+
1. Edita solo la sección relevante del plan
|
|
345
|
+
2. Vuelve al PASO 8 (resumen ejecutivo)
|
|
346
|
+
3. Solicita aprobación explícita nuevamente
|
|
347
|
+
|
|
348
|
+
**Guardar aprobación:**
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
# Si aprobación == "sí"
|
|
352
|
+
cat >> .sdd/estado.json << 'EOF'
|
|
353
|
+
"plan_aprobado": true,
|
|
354
|
+
"plan_aprobacion_timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
355
|
+
"plan_aprobacion_usuario": "usuario",
|
|
356
|
+
EOF
|
|
357
|
+
|
|
358
|
+
# Mensaje de confirmación
|
|
359
|
+
echo "✅ Plan aprobado. Siguiente: /sdd.tareas"
|
|
360
|
+
echo "💾 Tu aprobación se guardó automáticamente."
|
|
361
|
+
```
|
|
362
|
+
|
|
299
363
|
## PASO 8 — Pedir aprobación del plan
|
|
300
364
|
|
|
301
365
|
Si `comportamiento.requerir_aprobacion_plan: true` en config:
|