style-direction
$
npx mdskill add 686f6c61/alfred-dev/style-directionLaunch Selina's visual companion to select style directions for interface projects.
- Enables agents to choose families, typography, and color palettes for UI projects.
- Depends on a local server running visual artifacts and state management.
- Recommends styles through a guided selection flow or final three-option comparison.
- Delivers results by writing HTML files to a designated screen directory.
SKILL.md
.github/skills/style-directionView on GitHub ↗
---
name: style-direction
description: "Abrir y operar el companion visual de Selina para elegir una direccion de estilo en proyectos con interfaz. Skill manual: levanta un servidor local y escribe artefactos visuales."
disable-model-invocation: true
---
# Guía del servidor visual de Selina
Servidor local en navegador para mostrar sistemas de diseño y opciones visuales
durante la fase de dirección de estilo. Funciona como un visual companion para
enseñar el catálogo base de Selina, dejar que el usuario fije familia +
tipografía + gama de color y cerrar después una ronda final de tres columnas.
## Cuándo usar el servidor visual
Siempre que Selina genere opciones de estilo. El servidor es la herramienta principal
de Selina: sirve tanto para enseñar la galería de 10 sistemas de diseño base como
para el nuevo flujo guiado de selección y la ronda final de 3 propuestas comparables.
## Arrancar sesión
```bash
visual/scripts/start-server.sh --project-dir /ruta/al/proyecto
```
Respuesta JSON esperada:
```json
{
"type": "server-started",
"port": 7432,
"url": "http://localhost:7432",
"screen_dir": "/ruta/al/proyecto/.alfred-dev/visual/<pid-timestamp>/content",
"state_dir": "/ruta/al/proyecto/.alfred-dev/visual/<pid-timestamp>/state",
"state": "ready"
}
```
Guarda `screen_dir` (directorio donde escribir los HTML de opciones) y `state_dir`
(directorio donde leer eventos de clic y verificar estado del servidor).
El fichero `state_dir/server-info` contiene el mismo JSON emitido en el arranque.
Léelo para comprobar que el servidor sigue activo antes de cada operación.
Indica al usuario que abra la URL en el navegador.
## El ciclo
1. Comprueba que el servidor sigue activo leyendo `STATE_DIR/server-info`.
2. Si aporta contexto, genera primero la galería del catálogo con `python3 visual/scripts/write-style-demo-gallery.py --visual-path "$STATE_DIR"`.
3. Flujo guiado recomendado:
- `python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR"` para elegir el sistema base.
- lee la elección con `python3 visual/scripts/read-choice.py "$STATE_DIR"`.
- `python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR" --style-id "<style_id>"` para que el usuario elija tipografía + paleta.
- vuelve a leer la elección con `python3 visual/scripts/read-choice.py "$STATE_DIR"`.
- `python3 visual/scripts/write-guided-style-options.py --visual-path "$STATE_DIR"` para generar automáticamente la ronda final de 3 variantes a partir de esa selección.
4. Flujo directo alternativo: si ya tienes las tres propuestas decididas, genera `screen_dir/style-options.html` con `python3 visual/scripts/write-style-options.py --visual-path "$STATE_DIR"`. Si necesitas escribirlo a mano, usa la clase `.style-grid`.
5. El sidecar JSON final debe vivir en `screen_dir/style-options.json` para poder generar luego el artefacto final sin reinterpretar la pantalla.
6. Informa al usuario: recuerda la URL, resume qué se muestra, pide que elija una opción.
7. En el siguiente turno: lee la elección final con `python3 visual/scripts/read-choice.py "$STATE_DIR"` o, si lo prefieres, inspecciona `STATE_DIR/events` directamente.
8. Genera `docs/style-direction.md` con `python3 visual/scripts/write-style-direction.py --project-dir "$PWD" --visual-path "$STATE_DIR"` o, si necesitas control manual, escribe el artefacto tú misma usando el sidecar JSON.
9. Escribe `waiting.html` en `screen_dir` para limpiar el navegador hasta la próxima acción.
## Sidecar JSON recomendado
Para que el artefacto final salga con buen nivel, intenta que cada propuesta incluya al
menos:
- `choice`
- `name`
- `concept` o `description`
- `palette`
- `typography`
- `spacing_density` o `layout_density`
- `tone` o `mood`
- `sample_component` o `component_example`
- `visual_principles` o `design_principles`
- `layout_grammar` o `composition_grammar`
- `surface_treatment` o `materiality`
- `shape_language`
- `motion_language`
- `signature_elements` o `visual_motifs`
- `implementation_guardrails` o `guardrails`
- `prompt_seed` o `design_prompt`
- `rationale` o `why`
- `not_this_direction` o `anti_patterns`
- `context_signals`, `audience` o `constraints`
El writer canónico tolera sidecars incompletos y alias razonables, pero cuanto más
específica sea la propuesta, menos genérica será la dirección final.
### Regla crítica del flujo guiado
Si el usuario ya ha fijado **familia + tipografía + paleta**, las tres variantes finales
deben seguir perteneciendo a ese mismo sistema. Lo que puede cambiar entre `A / B / C`
es la composición, la jerarquía o el grado de expresividad, pero no la gramática base
del sistema elegido.
Cuando generes sidecars manuales:
- reutiliza la `prompt_seed` del sistema como semilla principal
- arrastra siempre `visual_principles`, `layout_grammar` y `signature_elements`
- usa `implementation_guardrails` para evitar que la variante se desvíe hacia otra familia
- no mezcles referencias de una tendencia distinta solo para “hacerla más bonita”
## Writer canónico de opciones
El helper recomendado es:
```bash
python3 visual/scripts/write-style-options.py --visual-path "$STATE_DIR"
```
Este script:
- autodetecta `style-options.json`
- normaliza aliases comunes del sidecar
- escribe un fragmento HTML compatible con el servidor real
- evita depender de assets externos que no existen en el repo
Si necesitas personalizar el copy de cabecera, acepta `--title` y `--subtitle`.
## Selector guiado de sistema + tipografía + paleta
Selina ya puede trabajar en tres pasos naturales:
1. **Sistema base** — `python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR"`
2. **Tipografía + paleta** — `python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR" --style-id "<style_id>"`
3. **Tres variantes finales** — `python3 visual/scripts/write-guided-style-options.py --visual-path "$STATE_DIR"`
`read-choice.py` sigue siendo el lector canónico entre pasos. Si la elección
pertenece al flujo guiado, devolverá además `parsed_choice` con `stage`,
`style_id`, `font_pairing_id` y `palette_mode`.
## Estructura HTML de las opciones
El servidor ya envuelve fragmentos HTML en su frame propio e inyecta `helper.js`, así
que no hace falta escribir un documento completo ni enlazar assets extra. Este es el
formato recomendado:
```html
<section class="style-screen">
<div class="style-screen-header">
<p class="style-screen-kicker">Selina propone</p>
<h1>Selecciona una dirección visual</h1>
<p class="style-screen-subtitle">Elige la propuesta que mejor encaja con el producto.</p>
</div>
<div class="style-grid">
<div class="style-option" data-choice="A">
<div class="style-preview" style="background:#1a1a2e;">
<span class="style-letter">A</span>
</div>
<div class="style-meta">
<h2>Oscuro espacial</h2>
<p>Contraste alto, tipografía sans-serif, sensación tecnológica.</p>
<div class="palette">
<span class="swatch" style="background:#1a1a2e;" title="#1a1a2e"></span>
<span class="swatch" style="background:#e94560;" title="#e94560"></span>
<span class="swatch" style="background:#ffffff;" title="#ffffff"></span>
</div>
</div>
</div>
<div class="style-option" data-choice="B">
<div class="style-preview" style="background:#f5f0e8;">
<span class="style-letter">B</span>
</div>
<div class="style-meta">
<h2>Editorial cálido</h2>
<p>Tonos crema, serif clásico, aire de revista de lujo.</p>
<div class="palette">
<span class="swatch" style="background:#f5f0e8;" title="#f5f0e8"></span>
<span class="swatch" style="background:#c8a96e;" title="#c8a96e"></span>
<span class="swatch" style="background:#2c2c2c;" title="#2c2c2c"></span>
</div>
</div>
</div>
<div class="style-option" data-choice="C">
<div class="style-preview" style="background:#0d7377;">
<span class="style-letter">C</span>
</div>
<div class="style-meta">
<h2>Minimalismo vibrante</h2>
<p>Verde azulado saturado, mucho espacio negativo, tipografía condensada.</p>
<div class="palette">
<span class="swatch" style="background:#0d7377;" title="#0d7377"></span>
<span class="swatch" style="background:#14ffec;" title="#14ffec"></span>
<span class="swatch" style="background:#f8f8f8;" title="#f8f8f8"></span>
</div>
</div>
</div>
</div>
</section>
```
Cada `.style-option` debe incluir obligatoriamente `data-choice` con un identificador
único (letra, número o slug). El atributo es el que queda registrado en los eventos
al hacer clic.
## Formato de eventos
El archivo `STATE_DIR/events` contiene una línea JSON por evento, en orden cronológico.
La forma canónica actual es:
```jsonl
{"source":"user-event","type":"click","choice":"A","label":"Oscuro espacial","element":".style-option","ts":"2026-03-31T10:14:02Z","timestamp":"2026-03-31T10:14:02Z"}
{"source":"user-event","type":"click","choice":"A","label":"Oscuro espacial","element":".style-option","ts":"2026-03-31T10:14:05Z","timestamp":"2026-03-31T10:14:05Z"}
```
El lector canónico `visual/scripts/read-choice.py` también acepta el formato legacy anterior:
```jsonl
{"ts":"2026-03-31T10:14:02Z","type":"click","choice":"A","element":".style-option"}
{"ts":"2026-03-31T10:14:05Z","type":"click","choice":"A","element":".style-option"}
```
El último clic con `type: "click"` sobre un `.style-option` se considera la elección
definitiva del usuario. Si hay varios clics sobre la misma opción, se interpreta como
confirmación. Si hay clics sobre opciones distintas, prevalece el más reciente.
## Parar servidor
```bash
visual/scripts/stop-server.sh <session_dir>
```
`session_dir` es el directorio de sesión devuelto por `start-server.sh`, o bien el
padre común de `screen_dir` y `state_dir`. El script detiene el proceso y limpia los
archivos temporales de la sesión.
More from 686f6c61/alfred-dev
- acceptance-criteriaGenerar criterios de aceptación en formato Given/When/Then. Activar cuando el usuario quiera definir criterios de aceptacion, usar formato Given When Then, escribir en Gherkin, saber como determinar que algo esta terminado o establecer una definicion de hecho.
- architecture-docsUsar para documentar la arquitectura del sistema. Activar ante: documentar arquitectura, diagrama del sistema, como funciona el proyecto, vision general tecnica
- bundle-sizeAnalizar y reducir el tamaño de bundles frontend. Activar cuando el bundle sea grande, se quiera reducir tamaño, aplicar tree shaking, configurar lazy loading, usar webpack analyzer o analizar el peso de la aplicacion.
- choose-stackUsar para evaluar y elegir tecnologías con matriz de decisión ponderada. Activar cuando el usuario quiera elegir tecnología, comparar frameworks, decidir entre alternativas técnicas, construir una matriz de decisión, evaluar stack, seleccionar base de datos, elegir lenguaje o comparar herramientas.
- ci-cd-pipelineConfigurar pipeline CI/CD adaptado al proyecto. Activar cuando el usuario quiera configurar CI, crear GitHub Actions, configurar GitLab CI, montar un pipeline de despliegue, automatizar tests o implementar integracion continua.
- code-review-responseUsar al recibir feedback de code review para responder técnicamente. Activar cuando el usuario quiera responder a comentarios de PR, gestionar feedback de code review, resolver comentarios de un revisor, o cuando el revisor pide cambios en el código.
- compliance-checkUsar para verificar cumplimiento RGPD, NIS2 y CRA. También: verificar RGPD, cumplimiento normativo, NIS2, CRA, Cyber Resilience Act, protección de datos, regulación europea.
- copy-reviewRevisar textos publicos: claridad, tono, ortografia y CTAs. Activar ante: revisar textos, mejorar copy, tono de comunicacion, textos de la web, landing page copy
- dependency-strategyEstrategia integral de gestion de dependencias: inventario, evaluacion de riesgo, politica de actualizaciones y documentacion. Usar para auditar el estado global de las dependencias del proyecto.
- dependency-updateRevisar dependencias desactualizadas, con CVEs o end-of-life, y proponer actualizaciones seguras. También: actualizar paquetes, actualizar dependencias, Dependabot, Renovate, versión desactualizada, breaking changes.