elsabro 4.0.0 → 4.2.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/README.md +61 -7
- package/agents/elsabro-orchestrator.md +70 -20
- package/agents/elsabro-ux-designer.md +70 -0
- package/commands/elsabro/add-phase.md +20 -0
- package/commands/elsabro/add-todo.md +30 -0
- package/commands/elsabro/audit-milestone.md +20 -0
- package/commands/elsabro/check-todos.md +29 -0
- package/commands/elsabro/complete-milestone.md +20 -0
- package/commands/elsabro/debug.md +76 -1
- package/commands/elsabro/design-ui.md +407 -0
- package/commands/elsabro/discuss-phase.md +20 -0
- package/commands/elsabro/execute.md +166 -30
- package/commands/elsabro/exit.md +97 -0
- package/commands/elsabro/help.md +7 -1
- package/commands/elsabro/insert-phase.md +20 -0
- package/commands/elsabro/list-phase-assumptions.md +20 -0
- package/commands/elsabro/map-codebase.md +30 -0
- package/commands/elsabro/new-milestone.md +23 -0
- package/commands/elsabro/new.md +64 -0
- package/commands/elsabro/pause-work.md +28 -5
- package/commands/elsabro/plan-milestone-gaps.md +20 -0
- package/commands/elsabro/plan.md +20 -0
- package/commands/elsabro/progress.md +8 -0
- package/commands/elsabro/quick.md +58 -3
- package/commands/elsabro/remove-phase.md +20 -0
- package/commands/elsabro/research-phase.md +20 -0
- package/commands/elsabro/resume-work.md +21 -0
- package/commands/elsabro/set-profile.md +38 -0
- package/commands/elsabro/settings.md +38 -0
- package/commands/elsabro/start.md +31 -1
- package/commands/elsabro/update.md +28 -0
- package/commands/elsabro/verify-work.md +94 -7
- package/commands/elsabro/verify.md +30 -0
- package/hooks/elsabro-mode.sh +102 -0
- package/hooks/hooks-config-updated.json +43 -7
- package/hooks/skill-discovery.sh +38 -8
- package/package.json +5 -5
- package/references/SYSTEM_INDEX.md +9 -0
- package/references/agent-teams-integration.md +99 -36
- package/references/enforcement-rules.md +177 -62
- package/references/flow-orchestration.md +127 -32
- package/references/next-step-engine.md +134 -0
- package/skills/stitch-ui-design.md +242 -0
- package/templates/session-state.json +3 -1
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-ui
|
|
3
|
+
description: Diseñar interfaces visuales con Stitch AI - genera screens y mockups desde texto
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Read
|
|
6
|
+
- Write
|
|
7
|
+
- Task
|
|
8
|
+
- TaskCreate
|
|
9
|
+
- TaskUpdate
|
|
10
|
+
- TaskList
|
|
11
|
+
- AskUserQuestion
|
|
12
|
+
- Glob
|
|
13
|
+
- mcp__stitch__create_project
|
|
14
|
+
- mcp__stitch__get_project
|
|
15
|
+
- mcp__stitch__list_projects
|
|
16
|
+
- mcp__stitch__list_screens
|
|
17
|
+
- mcp__stitch__get_screen
|
|
18
|
+
- mcp__stitch__generate_screen_from_text
|
|
19
|
+
argument-hint: "[descripción de la interfaz o número de fase]"
|
|
20
|
+
sync:
|
|
21
|
+
reads: [".elsabro/state.json", ".planning/*-PLAN.md"]
|
|
22
|
+
writes: [".elsabro/state.json", ".elsabro/context.md", ".planning/ui-designs/"]
|
|
23
|
+
phases: ["initializing", "designing", "generating", "documenting", "done"]
|
|
24
|
+
passes_context_to: ["execute"]
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# ELSABRO: Design UI
|
|
28
|
+
|
|
29
|
+
<state_sync>
|
|
30
|
+
## SINCRONIZACIÓN DE ESTADO (OBLIGATORIO)
|
|
31
|
+
|
|
32
|
+
**IMPORTAR**: Este comando DEBE seguir `/references/state-sync.md` y `/references/enforcement-rules.md`.
|
|
33
|
+
|
|
34
|
+
### Al Iniciar (ANTES de cualquier operación)
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
// 1. Crear task de inicialización
|
|
38
|
+
TaskCreate({
|
|
39
|
+
subject: "Initialize design-ui command",
|
|
40
|
+
description: "Leer estado y preparar diseño de UI",
|
|
41
|
+
activeForm: "Inicializando..."
|
|
42
|
+
})
|
|
43
|
+
TaskUpdate(id, status: "in_progress")
|
|
44
|
+
|
|
45
|
+
// 2. Leer estado existente
|
|
46
|
+
const state = Read(".elsabro/state.json") || createInitialState();
|
|
47
|
+
|
|
48
|
+
// 3. Actualizar estado
|
|
49
|
+
state.current_flow = { command: "design-ui", phase: "initializing", started_at: new Date().toISOString() };
|
|
50
|
+
state.elsabro_mode = true;
|
|
51
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
52
|
+
|
|
53
|
+
// 4. Completar task de inicialización
|
|
54
|
+
TaskUpdate(id, status: "completed")
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Al Cambiar de Fase
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
// Antes de diseño
|
|
61
|
+
state.current_flow.phase = "designing";
|
|
62
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
63
|
+
|
|
64
|
+
// Antes de generación
|
|
65
|
+
state.current_flow.phase = "generating";
|
|
66
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
67
|
+
|
|
68
|
+
// Antes de documentación
|
|
69
|
+
state.current_flow.phase = "documenting";
|
|
70
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Al Completar
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// Registrar en historial
|
|
77
|
+
state.history.push({
|
|
78
|
+
command: "design-ui",
|
|
79
|
+
completed_at: new Date().toISOString(),
|
|
80
|
+
result: "screens_generated",
|
|
81
|
+
artifact: ".planning/ui-designs/"
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Pasar contexto a execute
|
|
85
|
+
state.context = state.context || {};
|
|
86
|
+
state.context.stitch_project_id = projectId;
|
|
87
|
+
state.context.screens_generated = screenNames;
|
|
88
|
+
state.context.ui_designs_path = ".planning/ui-designs/";
|
|
89
|
+
|
|
90
|
+
// Limpiar flujo y sugerir siguiente
|
|
91
|
+
state.current_flow = null;
|
|
92
|
+
state.suggested_next = "execute";
|
|
93
|
+
|
|
94
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
95
|
+
|
|
96
|
+
// Actualizar context.md legible
|
|
97
|
+
Write(".elsabro/context.md", generateHumanReadableContext(state));
|
|
98
|
+
```
|
|
99
|
+
</state_sync>
|
|
100
|
+
|
|
101
|
+
<objective>
|
|
102
|
+
Diseñar interfaces visuales usando **Stitch AI** como motor de generación. Convierte descripciones de texto o requerimientos de fase en screens visuales profesionales.
|
|
103
|
+
|
|
104
|
+
**El usuario puede no saber nada de diseño.** Guiarlo con opciones claras y generar screens automáticamente.
|
|
105
|
+
</objective>
|
|
106
|
+
|
|
107
|
+
<process>
|
|
108
|
+
## Paso 1: Entender el Requerimiento
|
|
109
|
+
|
|
110
|
+
### Si el argumento es un número de fase:
|
|
111
|
+
```javascript
|
|
112
|
+
// Leer plan de la fase
|
|
113
|
+
const planFile = Glob(".planning/*-PLAN.md").find(f => f.includes(`0${phaseNumber}`));
|
|
114
|
+
const plan = Read(planFile);
|
|
115
|
+
// Extraer features que necesitan UI
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Si el argumento es texto descriptivo:
|
|
119
|
+
```
|
|
120
|
+
Usar directamente como input para Stitch.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Si no hay argumento:
|
|
124
|
+
```javascript
|
|
125
|
+
AskUserQuestion({
|
|
126
|
+
questions: [{
|
|
127
|
+
question: "¿Qué interfaz necesitas diseñar?",
|
|
128
|
+
header: "Diseño UI",
|
|
129
|
+
options: [
|
|
130
|
+
{ label: "Desde fase del plan", description: "Generar UI basada en una fase planificada" },
|
|
131
|
+
{ label: "Pantalla específica", description: "Describir la pantalla que necesitas" },
|
|
132
|
+
{ label: "Flujo completo", description: "Diseñar varias pantallas conectadas" }
|
|
133
|
+
],
|
|
134
|
+
multiSelect: false
|
|
135
|
+
}]
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Paso 2: Verificar/Crear Proyecto Stitch
|
|
140
|
+
|
|
141
|
+
### 2.1 Buscar proyecto existente
|
|
142
|
+
```javascript
|
|
143
|
+
// Listar proyectos existentes
|
|
144
|
+
const projects = mcp__stitch__list_projects();
|
|
145
|
+
|
|
146
|
+
// Buscar proyecto del proyecto actual
|
|
147
|
+
const existingProject = projects.find(p => p.name.includes(projectName));
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 2.2 Crear proyecto si no existe
|
|
151
|
+
```javascript
|
|
152
|
+
if (!existingProject) {
|
|
153
|
+
const project = mcp__stitch__create_project({
|
|
154
|
+
name: state.context.current_feature || "ELSABRO Design",
|
|
155
|
+
description: "UI designs for " + (state.context.current_feature || "project")
|
|
156
|
+
});
|
|
157
|
+
projectId = project.id;
|
|
158
|
+
} else {
|
|
159
|
+
projectId = existingProject.id;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Paso 3: Generar Screens
|
|
164
|
+
|
|
165
|
+
### 3.1 Preparar descripción para Stitch
|
|
166
|
+
```javascript
|
|
167
|
+
// Construir prompt rico para Stitch
|
|
168
|
+
const screenDescription = buildScreenDescription({
|
|
169
|
+
requirement: userInput,
|
|
170
|
+
techStack: state.context.tech_stack,
|
|
171
|
+
existingPatterns: existingDesignPatterns,
|
|
172
|
+
accessibility: true
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 3.2 Generar screen
|
|
177
|
+
```javascript
|
|
178
|
+
TaskCreate({
|
|
179
|
+
subject: "Generate UI screen: " + screenName,
|
|
180
|
+
activeForm: "Generando diseño...",
|
|
181
|
+
metadata: { type: "design", tool: "stitch" }
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
const screen = mcp__stitch__generate_screen_from_text({
|
|
185
|
+
project_id: projectId,
|
|
186
|
+
text: screenDescription
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
TaskUpdate(id, status: "completed")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 3.3 Para flujos multi-pantalla
|
|
193
|
+
```javascript
|
|
194
|
+
// Generar múltiples screens en secuencia
|
|
195
|
+
const screens = [
|
|
196
|
+
"Login page with email/password and social auth",
|
|
197
|
+
"Dashboard with sidebar navigation and cards",
|
|
198
|
+
"Settings page with form sections"
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
for (const screen of screens) {
|
|
202
|
+
mcp__stitch__generate_screen_from_text({
|
|
203
|
+
project_id: projectId,
|
|
204
|
+
text: screen
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Paso 4: Revisar y Refinar
|
|
210
|
+
|
|
211
|
+
### 4.1 Listar screens generados
|
|
212
|
+
```javascript
|
|
213
|
+
const allScreens = mcp__stitch__list_screens({ project_id: projectId });
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 4.2 Mostrar al usuario
|
|
217
|
+
```
|
|
218
|
+
╔══════════════════════════════════════════════════╗
|
|
219
|
+
║ SCREENS GENERADOS ║
|
|
220
|
+
╠══════════════════════════════════════════════════╣
|
|
221
|
+
║ ║
|
|
222
|
+
║ 1. Login Page ║
|
|
223
|
+
║ └─ Email/password + social auth ║
|
|
224
|
+
║ ║
|
|
225
|
+
║ 2. Dashboard ║
|
|
226
|
+
║ └─ Sidebar + cards + stats ║
|
|
227
|
+
║ ║
|
|
228
|
+
║ 3. Settings ║
|
|
229
|
+
║ └─ Form sections + profile ║
|
|
230
|
+
║ ║
|
|
231
|
+
╠══════════════════════════════════════════════════╣
|
|
232
|
+
║ ¿Modificar alguna? (número o "ok" para aceptar)║
|
|
233
|
+
╚══════════════════════════════════════════════════╝
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 4.3 Refinamiento
|
|
237
|
+
```javascript
|
|
238
|
+
if (userWantsChanges) {
|
|
239
|
+
// Obtener screen actual
|
|
240
|
+
const screen = mcp__stitch__get_screen({
|
|
241
|
+
project_id: projectId,
|
|
242
|
+
screen_id: screenId
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// Regenerar con feedback
|
|
246
|
+
mcp__stitch__generate_screen_from_text({
|
|
247
|
+
project_id: projectId,
|
|
248
|
+
text: originalDescription + "\n\nRefinement: " + userFeedback
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Paso 5: Documentar Diseños
|
|
254
|
+
|
|
255
|
+
### 5.1 Crear directorio
|
|
256
|
+
```bash
|
|
257
|
+
mkdir -p .planning/ui-designs
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 5.2 Guardar referencia de diseños
|
|
261
|
+
```javascript
|
|
262
|
+
Write(".planning/ui-designs/UI-DESIGNS.md", `
|
|
263
|
+
# UI Designs
|
|
264
|
+
|
|
265
|
+
## Project: ${projectName}
|
|
266
|
+
## Stitch Project ID: ${projectId}
|
|
267
|
+
## Generated: ${new Date().toISOString()}
|
|
268
|
+
|
|
269
|
+
## Screens
|
|
270
|
+
|
|
271
|
+
${screens.map((s, i) => `
|
|
272
|
+
### ${i + 1}. ${s.name}
|
|
273
|
+
- **ID:** ${s.id}
|
|
274
|
+
- **Descripción:** ${s.description}
|
|
275
|
+
- **Estado:** Generated
|
|
276
|
+
`).join("\n")}
|
|
277
|
+
|
|
278
|
+
## Design Decisions
|
|
279
|
+
- [Decisiones tomadas durante el diseño]
|
|
280
|
+
|
|
281
|
+
## Next Steps
|
|
282
|
+
- Implement screens in code: /elsabro:execute
|
|
283
|
+
- Refine designs: /elsabro:design-ui
|
|
284
|
+
`);
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Paso 6: Reportar
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
╔══════════════════════════════════════════════════╗
|
|
291
|
+
║ DISEÑO UI COMPLETADO ║
|
|
292
|
+
╠══════════════════════════════════════════════════╣
|
|
293
|
+
║ ║
|
|
294
|
+
║ Proyecto Stitch: ${projectName} ║
|
|
295
|
+
║ Screens generados: ${screens.length} ║
|
|
296
|
+
║ ║
|
|
297
|
+
║ Documentación: .planning/ui-designs/ ║
|
|
298
|
+
║ ║
|
|
299
|
+
╚══════════════════════════════════════════════════╝
|
|
300
|
+
```
|
|
301
|
+
</process>
|
|
302
|
+
|
|
303
|
+
<siguiente_paso>
|
|
304
|
+
## Siguiente Paso
|
|
305
|
+
|
|
306
|
+
Al completar el diseño, establecer en state.json:
|
|
307
|
+
```javascript
|
|
308
|
+
state.suggested_next = "execute";
|
|
309
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Mostrar al usuario:
|
|
313
|
+
```
|
|
314
|
+
## Siguiente Paso
|
|
315
|
+
|
|
316
|
+
→ /elsabro:execute — implementar los diseños en código
|
|
317
|
+
→ /elsabro:design-ui — refinar o agregar más pantallas
|
|
318
|
+
```
|
|
319
|
+
</siguiente_paso>
|
|
320
|
+
|
|
321
|
+
<error_handling>
|
|
322
|
+
## Manejo de Errores
|
|
323
|
+
|
|
324
|
+
### Si Stitch no responde
|
|
325
|
+
```
|
|
326
|
+
⚠ Stitch AI no está disponible en este momento.
|
|
327
|
+
|
|
328
|
+
Opciones:
|
|
329
|
+
1. Reintentar la conexión
|
|
330
|
+
2. Crear wireframes en ASCII (manual)
|
|
331
|
+
3. Continuar sin diseño visual
|
|
332
|
+
|
|
333
|
+
¿Qué prefieres?
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Si el proyecto Stitch ya tiene screens
|
|
337
|
+
```
|
|
338
|
+
Este proyecto ya tiene ${existingScreens.length} screens.
|
|
339
|
+
|
|
340
|
+
Opciones:
|
|
341
|
+
1. Ver screens existentes
|
|
342
|
+
2. Agregar nuevos screens
|
|
343
|
+
3. Reemplazar todos
|
|
344
|
+
4. Empezar proyecto nuevo
|
|
345
|
+
```
|
|
346
|
+
</error_handling>
|
|
347
|
+
|
|
348
|
+
<integration>
|
|
349
|
+
## Integración con ELSABRO
|
|
350
|
+
|
|
351
|
+
### Con /elsabro:plan
|
|
352
|
+
- Lee planes de fase para extraer requerimientos de UI
|
|
353
|
+
- Genera screens basados en features planificadas
|
|
354
|
+
|
|
355
|
+
### Con /elsabro:execute
|
|
356
|
+
- Pasa `context.stitch_project_id` para referencia durante implementación
|
|
357
|
+
- Los screens sirven como guía visual para el código
|
|
358
|
+
|
|
359
|
+
### Con elsabro-ux-designer (Sally)
|
|
360
|
+
- Sally puede usar este comando internamente
|
|
361
|
+
- Combina con 21st.dev para componentes de código
|
|
362
|
+
|
|
363
|
+
### Con /elsabro:verify-work
|
|
364
|
+
- Los screens generados sirven como referencia visual para verificación
|
|
365
|
+
</integration>
|
|
366
|
+
|
|
367
|
+
<for_beginners>
|
|
368
|
+
## Para Usuarios Sin Experiencia
|
|
369
|
+
|
|
370
|
+
### ¿Qué es un diseño de UI?
|
|
371
|
+
```
|
|
372
|
+
UI = User Interface = La parte visual de tu app
|
|
373
|
+
|
|
374
|
+
Es cómo se VE tu app:
|
|
375
|
+
- Dónde van los botones
|
|
376
|
+
- Cómo se organizan las secciones
|
|
377
|
+
- Qué ve el usuario en cada pantalla
|
|
378
|
+
|
|
379
|
+
Stitch AI genera estos diseños automáticamente
|
|
380
|
+
a partir de tu descripción en texto.
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Ejemplo
|
|
384
|
+
```
|
|
385
|
+
Tú dices: "Necesito una página de login con email y contraseña"
|
|
386
|
+
|
|
387
|
+
Stitch genera: Un diseño profesional de login con:
|
|
388
|
+
- Campo de email
|
|
389
|
+
- Campo de contraseña
|
|
390
|
+
- Botón de iniciar sesión
|
|
391
|
+
- Opciones de login social
|
|
392
|
+
- Link de "olvidé mi contraseña"
|
|
393
|
+
```
|
|
394
|
+
</for_beginners>
|
|
395
|
+
|
|
396
|
+
<checklist>
|
|
397
|
+
## Checklist de Auto-Verificación
|
|
398
|
+
|
|
399
|
+
- [ ] TaskCreate ejecutado al inicio
|
|
400
|
+
- [ ] state.json leído y actualizado
|
|
401
|
+
- [ ] Proyecto Stitch verificado/creado
|
|
402
|
+
- [ ] Screens generados exitosamente
|
|
403
|
+
- [ ] Diseños documentados en .planning/ui-designs/
|
|
404
|
+
- [ ] state.json actualizado con stitch_project_id
|
|
405
|
+
- [ ] suggested_next establecido como "execute"
|
|
406
|
+
- [ ] TaskUpdate(completed) ejecutado
|
|
407
|
+
</checklist>
|
|
@@ -16,10 +16,12 @@ sync:
|
|
|
16
16
|
### Al Iniciar
|
|
17
17
|
- Leer `.elsabro/state.json`
|
|
18
18
|
- Verificar contexto actual del milestone/phase
|
|
19
|
+
- Activar persistent mode: `state.elsabro_mode = true`
|
|
19
20
|
|
|
20
21
|
### Al Completar
|
|
21
22
|
- Registrar cambio en `history`
|
|
22
23
|
- Actualizar `context` si corresponde
|
|
24
|
+
- Establecer `state.suggested_next = "plan"`
|
|
23
25
|
</state_sync>
|
|
24
26
|
|
|
25
27
|
<command-name>discuss-phase</command-name>
|
|
@@ -175,3 +177,21 @@ Genera/actualiza `.planning/milestones/M001/P3-DISCUSSION.md`:
|
|
|
175
177
|
|
|
176
178
|
Next: /elsabro:execute to start implementation
|
|
177
179
|
```
|
|
180
|
+
|
|
181
|
+
<siguiente_paso>
|
|
182
|
+
## Siguiente Paso
|
|
183
|
+
|
|
184
|
+
Al completar la discusión, establecer en state.json:
|
|
185
|
+
```javascript
|
|
186
|
+
state.suggested_next = "plan";
|
|
187
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Mostrar al usuario:
|
|
191
|
+
```
|
|
192
|
+
## Siguiente Paso
|
|
193
|
+
|
|
194
|
+
→ /elsabro:plan — planificar la fase discutida
|
|
195
|
+
→ /elsabro:execute — ejecutar directamente si ya está claro
|
|
196
|
+
```
|
|
197
|
+
</siguiente_paso>
|