siesa-agents 2.1.90 → 2.1.92
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/bmad/_config/bmad-help.csv +45 -0
- package/bmad/_config/files-manifest.csv +272 -0
- package/bmad/_config/manifest.yaml +23 -0
- package/bmad/_config/skill-manifest.csv +43 -0
- package/bmad/bmm/module-help.csv +33 -0
- package/bmad/config.toml +69 -0
- package/bmad/config.user.toml +17 -0
- package/bmad/core/config.yaml +9 -0
- package/bmad/core/module-help.csv +13 -0
- package/bmad/custom/config.toml +7 -0
- package/bmad/scripts/resolve_config.py +176 -0
- package/bmad/scripts/resolve_customization.py +230 -0
- package/claude/skills/sa-wds-visual-proposals/SKILL.md +6 -0
- package/package.json +1 -1
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/data/component-mapping.csv +47 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-01-init.md +148 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-01b-continue.md +79 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-02-bridge.md +114 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-02b-kit-warmup.md +96 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-03-scenarios.md +102 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-04-specs.md +97 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-05-prototype.md +102 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/steps/step-06-handoff.md +96 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/templates/product-brief-bridge.md +68 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/templates/proposal-index.md +46 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/templates/trigger-map-bridge.md +54 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/workflow.md +82 -0
- package/siesa-agents/bmm/workflows/3-solutioning/wds-visual-proposals/workflow_ext.md +195 -0
- package/siesa-agents/scripts/phases/phase1.js +42 -4
- package/siesa-agents/scripts/phases/phase2.js +42 -4
- package/siesa-agents/scripts/phases/phase3.js +42 -4
- package/siesa-agents/wds/config.yaml +20 -0
- package/siesa-agents/wds/data/agent-contracts.md +72 -0
- package/siesa-agents/wds/data/agent-guides/freya/agentic-development.md +223 -0
- package/siesa-agents/wds/data/agent-guides/freya/content-creation.md +270 -0
- package/siesa-agents/wds/data/agent-guides/freya/design-system.md +333 -0
- package/siesa-agents/wds/data/agent-guides/freya/meta-content-guide.md +495 -0
- package/siesa-agents/wds/data/agent-guides/freya/specification-quality.md +262 -0
- package/siesa-agents/wds/data/agent-guides/freya/strategic-design.md +116 -0
- package/siesa-agents/wds/data/agent-guides/saga/content-structure-principles.md +190 -0
- package/siesa-agents/wds/data/agent-guides/saga/conversational-followups.md +372 -0
- package/siesa-agents/wds/data/agent-guides/saga/discovery-conversation.md +265 -0
- package/siesa-agents/wds/data/agent-guides/saga/dream-up-approach.md +1034 -0
- package/siesa-agents/wds/data/agent-guides/saga/inspiration-analysis.md +215 -0
- package/siesa-agents/wds/data/agent-guides/saga/resources/project-brief.template.md +187 -0
- package/siesa-agents/wds/data/agent-guides/saga/seo-strategy-guide.md +391 -0
- package/siesa-agents/wds/data/agent-guides/saga/strategic-documentation.md +454 -0
- package/siesa-agents/wds/data/agent-guides/saga/trigger-mapping.md +653 -0
- package/siesa-agents/wds/data/agent-guides/saga/working-with-existing-materials.md +172 -0
- package/siesa-agents/wds/data/design-system/component-boundaries.md +318 -0
- package/siesa-agents/wds/data/design-system/figma-component-structure.md +697 -0
- package/siesa-agents/wds/data/design-system/naming-conventions.md +200 -0
- package/siesa-agents/wds/data/design-system/state-management.md +93 -0
- package/siesa-agents/wds/data/design-system/token-architecture.md +474 -0
- package/siesa-agents/wds/data/design-system/validation-patterns.md +74 -0
- package/siesa-agents/wds/data/presentations/freya-how-i-help.md +63 -0
- package/siesa-agents/wds/data/presentations/freya-intro.md +269 -0
- package/siesa-agents/wds/data/presentations/freya-presentation.md +77 -0
- package/siesa-agents/wds/data/presentations/freya-workflows-guide.md +51 -0
- package/siesa-agents/wds/data/presentations/mimir-agents-overview.md +66 -0
- package/siesa-agents/wds/data/presentations/mimir-tone-setting.md +48 -0
- package/siesa-agents/wds/data/presentations/saga-how-i-help.md +62 -0
- package/siesa-agents/wds/data/presentations/saga-intro.md +285 -0
- package/siesa-agents/wds/data/presentations/saga-presentation.md +74 -0
- package/siesa-agents/wds/data/presentations/saga-workflows-guide.md +48 -0
- package/siesa-agents/wds/data/shared-activation.md +49 -0
- package/siesa-agents/wds/data/wds-glossary.md +98 -0
- package/siesa-agents/wds/module-help.csv +19 -0
- package/siesa-agents/wds/scripts/README.md +155 -0
- package/siesa-agents/wds/scripts/wds-add-object.js +207 -0
- package/siesa-agents/wds/scripts/wds-add-spacing.js +158 -0
- package/siesa-agents/wds/scripts/wds-init-page.js +234 -0
- package/siesa-agents/wds/scripts/wds-init-scenario.js +125 -0
- package/siesa-agents/wds/scripts/wds-nav.js +206 -0
- package/siesa-agents/wds/scripts/wds-validate.js +306 -0
- package/siesa-agents/wds/skills/freya.activation.md +204 -0
- package/siesa-agents/wds/skills/handoff.md +91 -0
- package/siesa-agents/wds/skills/saga.activation.md +169 -0
- package/siesa-agents/wds/skills/shared/git.md +55 -0
- package/siesa-agents/wds/skills/start.md +99 -0
- package/siesa-agents/wds/skills/wrap.md +198 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# MANDATORY RULES: WDS-VISUAL-PROPOSALS WORKFLOW
|
|
2
|
+
|
|
3
|
+
These Siesa-specific rules are injected into memory BEFORE the base workflow runs and remain active throughout. They are non-negotiable.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. MANDATORY RULE — PHASE BRANCH CREATION AT WORKFLOW START
|
|
8
|
+
|
|
9
|
+
**TRIGGER:** Immediately when the user initiates this workflow (e.g., `/wds-visual-proposals`).
|
|
10
|
+
|
|
11
|
+
**CRITICAL INSTRUCTION:** Before executing any workflow step, you MUST invoke the `generate-commits-by-phase` skill to create the **Phase 2 (planning)** branch. Visual proposals are a planning-phase activity.
|
|
12
|
+
|
|
13
|
+
### EXECUTION STEPS (PERFORM THESE ACTIONS NOW, BEFORE ANYTHING ELSE)
|
|
14
|
+
|
|
15
|
+
**STEP 1: INVOKE THE SKILL — CREATE PHASE 2 BRANCH**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
node _siesa-agents/scripts/phases/phase2.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- If the `planning` branch already exists, the script will report it — continue normally.
|
|
22
|
+
- If it is created successfully, confirm to the user and proceed.
|
|
23
|
+
|
|
24
|
+
**STEP 2: CONFIRM AND CONTINUE**
|
|
25
|
+
|
|
26
|
+
Output to the user:
|
|
27
|
+
> `✅ Rama Phase 2 (planning) lista. Procediendo con la generación de propuestas visuales WDS...`
|
|
28
|
+
|
|
29
|
+
**DO NOT proceed to the workflow steps until this rule is fully executed.**
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. CONTEXT AND STANDARDS SETUP
|
|
34
|
+
|
|
35
|
+
Establish the following context paths for use throughout all steps:
|
|
36
|
+
|
|
37
|
+
- `company_standards_path` = `{project-root}/_siesa-agents/bmm/workflows/3-solutioning/create-architecture/data/company-standards`
|
|
38
|
+
- `wds_module_path` = `{project-root}/_siesa-agents/wds`
|
|
39
|
+
- `wds_scripts_path` = `{wds_module_path}/scripts`
|
|
40
|
+
- `siesa_uikit_catalog_url` = `https://siesa-ui-kit.pages.dev/llms.txt`
|
|
41
|
+
- `base_ux_spec` = `{project-root}/_siesa-agents/resources/ux-ui/ux-design-specification.md`
|
|
42
|
+
- `frontend_base_repo` = `https://github.com/SiesaTeams/BaseFrontend`
|
|
43
|
+
- `frontend_dir` = `{design_artifacts}/_kit-playground` (el harness del frontend ES un clon de `frontend_base_repo`)
|
|
44
|
+
|
|
45
|
+
### Company Standards Integration
|
|
46
|
+
|
|
47
|
+
🔴 **CRITICAL**: Load these before producing any spec or prototype:
|
|
48
|
+
- `{company_standards_path}/frontend-standards.md` — **siesa-ui-kit** rules + component strategy
|
|
49
|
+
- `{company_standards_path}/technical-preferences-ux.md` — UX/UI preferences and patterns
|
|
50
|
+
|
|
51
|
+
| Priority | Rule | Why Critical |
|
|
52
|
+
|----------|------|--------------|
|
|
53
|
+
| 🔴 P0 | **siesa-ui-kit obligatorio** | Check siesa-ui-kit (via `{siesa_uikit_catalog_url}`) before proposing ANY component |
|
|
54
|
+
| 🔴 P0 | **UI text in Spanish** | All user-facing text MUST be in Spanish |
|
|
55
|
+
| 🔴 P0 | **Vite over Next.js** | Any rendered prototype harness uses Vite + React + Tailwind v4, never Next.js |
|
|
56
|
+
| 🔴 P0 | **Fidelidad al diseño de referencia** | Si el usuario entregó un diseño a seguir (mockup HTML, imagen, Figma), **renderízalo** y replícalo; su look manda sobre los defaults del kit y se **verifica lado a lado** (ver §3C) |
|
|
57
|
+
| 🟡 P1 | Design tokens | Use the tokens defined in `{base_ux_spec}` and the project `ux-design-specification.md` |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 3. SIESA-UI-KIT MANDATORY CHECK (applies to step-04 and step-05)
|
|
62
|
+
|
|
63
|
+
**BEFORE mapping any object to a component or rendering any prototype, you MUST:**
|
|
64
|
+
|
|
65
|
+
1. Fetch the live catalog from `{siesa_uikit_catalog_url}` (authoritative source of available components).
|
|
66
|
+
2. Resolve the **actual installed package name** by reading the target frontend app's `package.json` — do NOT assume `@siesa/ui-kit`. `llms.txt` does not declare the npm name.
|
|
67
|
+
3. Follow the Component Decision Protocol:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
Component needed → ¿Está en siesa-ui-kit (per llms.txt / kit-grounding.md)?
|
|
71
|
+
├── YES → USA el componente siesa-ui-kit tal cual
|
|
72
|
+
└── NO → busca en shadcn (registro MCP de shadcn)
|
|
73
|
+
├── existe → usa el componente shadcn
|
|
74
|
+
└── no existe → el agente lo CREA (compone primitivos + tokens de marca)
|
|
75
|
+
(AUTOMÁTICO — no preguntar al usuario; registrar la decisión kit/shadcn/custom en el design log.)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
4. Prefer siesa-ui-kit **view-level** components when they fit the page (e.g. `LoginView`, `SignUpView`, `RecoverPasswordView`, `Dashboard`, `LayoutBase`, `ProductsView`, `MasterCrud`) — they raise fidelity and reduce effort.
|
|
79
|
+
|
|
80
|
+
### UI Text Language Rule
|
|
81
|
+
|
|
82
|
+
🔴 **MANDATORY**: All user-facing text MUST be in Spanish.
|
|
83
|
+
- ✅ "Guardar", "Cancelar", "Enviar", "Nombre de usuario", "Datos guardados correctamente"
|
|
84
|
+
- ❌ "Save", "Cancel", mixed "Save cambios"
|
|
85
|
+
|
|
86
|
+
> **Note on the bilingual scaffold:** the WDS scripts (`wds-add-object.js`) expose `--se` (Swedish) and `--en` (English) fields. For Siesa, put the **Spanish** UI string in `--se` (primary product language) and the English reference in `--en`. Spanish is the language the prototype renders.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 3A. MANDATORY RULE — CLONA Y TRABAJA BAJO BaseFrontend
|
|
91
|
+
|
|
92
|
+
**TRIGGER:** En step-02b (Kit Warm-up), al montar el harness del frontend, y durante todo step-05.
|
|
93
|
+
|
|
94
|
+
🔴 **CRITICAL:** El frontend NO se scaffoldea a mano. Se **clona el repositorio base oficial** `{frontend_base_repo}` en `{frontend_dir}` y se trabaja **dentro de él**. Ese repo ya trae Vite 6 + React 19 + TS + Tailwind v4 + `siesa-ui-kit@^1.0.109` con TODOS los peers instalados, TanStack Router (file-based), Clean Architecture por módulos, capa mock en memoria y un shell (`LayoutBase`) ya cableado. No reinventar nada de eso.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
git clone --depth 1 {frontend_base_repo} {frontend_dir}
|
|
98
|
+
rm -rf {frontend_dir}/.git # el clon vive DENTRO del repo SIESA; no anidar .git
|
|
99
|
+
cd {frontend_dir} && npm install
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- **`.git` fuera:** tras clonar, borra `{frontend_dir}/.git` para que los fuentes queden versionados por el repo SIESA padre (no como submódulo). `node_modules/` ya está en el `.gitignore` del propio base.
|
|
103
|
+
- **Ejecución:** el prototipo se ve con `npm run dev` (modo standalone, **puerto 3010**, todos los permisos activos, datos en memoria mock). NUNCA Next.js.
|
|
104
|
+
- **Convenciones del base (respétalas, no las reescribas):**
|
|
105
|
+
- **Shell = `_app.tsx`** → usa `LayoutBase` de siesa-ui-kit con `navigationItems` de `src/config/navigation.tsx` + `<Outlet/>`. Este ES el shell persistente; no hay que construir Navbar/rail a mano.
|
|
106
|
+
- **Un módulo por dominio** en `src/modules/<dominio>/` con las 4 capas `domain / application / infrastructure / presentation` (copia el patrón de los módulos de ejemplo `agentes` y `colaboradores`, que luego se reemplazan).
|
|
107
|
+
- **Listado + CRUD** → componente `MasterCrud` dirigido por un array `fields` (accessorKey/header/type/config) + un `service` que implementa `CrudService<T>` + schema Zod. No coloques objetos a mano cuando `MasterCrud` cubre la pantalla.
|
|
108
|
+
- **Estado compartido = capa mock** (`src/lib/mock/*.mock.ts`): BD en memoria por entidad. Los flujos conectados entre módulos (eliminar padre → hijos huérfanos, asociar/reasignar reflejado en ambos, enlaces cruzados) se implementan sobre estos stores.
|
|
109
|
+
- **Rutas** = TanStack Router file-based: una ruta por módulo en `src/routes/_app/<modulo>.tsx` + su ítem en `config/navigation.tsx`. `routeTree.gen.ts` se autogenera (no editar).
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 3B. MANDATORY RULE — KIT WARM-UP GROUNDING BEFORE DESIGN
|
|
114
|
+
|
|
115
|
+
**TRIGGER:** After the strategic bridge (step-02) and BEFORE generating scenarios/specs (step-03+).
|
|
116
|
+
|
|
117
|
+
🔴 **CRITICAL:** El agente NO debe diseñar contra el catálogo `llms.txt` solo. Debe ejecutar **step-02b (Kit Warm-up)**: clonar BaseFrontend (§3A), instalarlo, verificar con `npm run build`/render que el paquete **real** de siesa-ui-kit compila, y producir `{frontend_dir}/kit-grounding.md` con nombres y props **reales**.
|
|
118
|
+
|
|
119
|
+
- **Source of truth:** cuando `kit-grounding.md` y el catálogo discrepan, **gana el grounding** (usa el export real: p. ej. `ContentLayout` no `LayoutContent`; no inventes `Dashboard`/`StatCard` → compón con `Card`). BaseFrontend ya usa `LayoutBase` y `MasterCrud` con contratos reales — documéntalos en el grounding.
|
|
120
|
+
- **No silent skip:** si no se puede clonar/instalar (sin red/registro), `kit-grounding.md` se escribe igual desde el catálogo pero marcado `⚠️ NO VERIFICADO EN RUNTIME`.
|
|
121
|
+
- **Spec Sync (feedback obligatorio):** todo hallazgo del warm-up que invalide un supuesto del `ux-design-specification.md` (nombre/contrato inexistente) debe reflejarse en una sección "Kit Grounding — Spec Sync" del spec en el mismo ciclo.
|
|
122
|
+
|
|
123
|
+
🔴 **ENTREGABLE = LA APP CLONADA (BaseFrontend) INTEGRADA, NO pantallas sueltas.** Step-05 trabaja **dentro de `{frontend_dir}`**: reemplaza los módulos de ejemplo por **un módulo por dominio** del alcance, siguiendo las convenciones del base (shell `LayoutBase`, `MasterCrud` data-driven, stores mock compartidos, rutas + nav). Resultado: una app navegable de punta a punta con `npm run dev`, **estado compartido** entre módulos y **flujos conectados** (eliminar padre → hijos huérfanos; asociar/reasignar refleja en ambos; enlaces cruzados navegables). Las épicas de relación se integran DENTRO de los módulos que relacionan; la épica de shell YA es el shell del base. **Prohibido** entregar un prototipo aislado por épica, y **prohibido** HTML+CSS que se auto-rotule como si usara el kit (`<div class="rail" title="NavigationRail">`, `/* siesa-ui-kit Button */`) — esa es la alucinación que este flujo elimina. Todo con componentes reales, `npm run build` exit 0. **Entregable estático = la app compilada en UN HTML autocontenido (`propuesta-app.html`, vía vite-plugin-singlefile + hash routing), NO una galería de screenshots** (los screenshots son solo verificación interna del agente). Gotchas obligatorios (el base ya resuelve varios): `ContentLayout` = master-detail (no header); `GenericEntityModal`/`ContactManager` requieren `QueryClientProvider` (el base ya lo provee en `config/query-client.ts`); `LookupField` requiere `fetcher` mock.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 3C. MANDATORY RULE — REFERENCE DESIGN FIDELITY (cuando el usuario entrega un diseño a seguir)
|
|
128
|
+
|
|
129
|
+
**TRIGGER:** El usuario aportó, en cualquier punto del flujo, un **diseño de referencia** que la propuesta debe replicar: un mockup HTML (incluidos los HTML autocontenidos/"bundled" que se auto-desempaquetan), una imagen (PNG/JPG), un PDF de pantallas, o un enlace de Figma. step-01 lo detecta e ingesta; step-05 lo replica; **esta regla aplica durante todo el flujo.**
|
|
130
|
+
|
|
131
|
+
🔴 **Regla de oro: NO se diseña contra una descripción textual del diseño — se diseña contra el diseño RENDERIZADO.** El fallo que esta regla previene es construir "de memoria"/desde texto y declarar fidelidad sin haber visto nunca el diseño real.
|
|
132
|
+
|
|
133
|
+
### A. Renderizar el diseño de referencia a imágenes (obligatorio antes de diseñar)
|
|
134
|
+
|
|
135
|
+
Convierte el diseño a screenshots que sean la **verdad visual** (guárdalos en `{design_artifacts}/_design-ref/`):
|
|
136
|
+
|
|
137
|
+
- **Imagen/PDF** → úsala directamente (o exporta cada página del PDF a PNG).
|
|
138
|
+
- **HTML autocontenido/bundled** (abre por sí solo, p. ej. un export con assets en base64) → renderízalo en **Chrome headless**:
|
|
139
|
+
`chrome --headless=new --disable-gpu --hide-scrollbars --window-size=1600,1050 --virtual-time-budget=8000 --screenshot=<out.png> "file:///<ruta-del-html>"`.
|
|
140
|
+
Dale tiempo (`--virtual-time-budget`) si el HTML se desempaqueta/renderiza vía JS.
|
|
141
|
+
- **HTML interactivo / multi-pantalla** (la pantalla objetivo se alcanza haciendo clic, p. ej. "Crear/Editar") → **NO basta la pantalla inicial**: conduce el Chrome instalado con `puppeteer-core` (`npm i puppeteer-core`, `executablePath` = Chrome local), navega/haz clic hacia cada estado (lista, crear, editar, diálogos) y captura **un screenshot por pantalla**.
|
|
142
|
+
- **Figma/URL** → exporta los frames a PNG (o pide al usuario los PNG exportados). Si no hay acceso, avísalo y trabaja con lo que haya.
|
|
143
|
+
|
|
144
|
+
Registra las referencias en `_progress/wds-project-outline.yaml` (`reference_design: [rutas]`) y en el design log.
|
|
145
|
+
|
|
146
|
+
### B. Extraer sus tokens (gotcha que deja todo sin estilo)
|
|
147
|
+
|
|
148
|
+
Si el diseño define tokens como custom properties CSS (`:root { --surface-card: …; --space-4: …; --radius-xl: …; --text-sm: … }`), **cópialos al harness** (`{kit_playground}/src/styles/tokens.css`, importado desde `src/index.css`) **antes** de escribir componentes custom. Los componentes que referencian `var(--…)` sin esas definiciones renderizan **colapsados/sin estilo** (flex/gap 0, sin fondos ni bordes) — `siesa-ui-kit/styles.css` define SUS tokens, no los del diseño de referencia.
|
|
149
|
+
|
|
150
|
+
### C. Precedencia de fidelidad (el diseño manda sobre los defaults del kit)
|
|
151
|
+
|
|
152
|
+
siesa-ui-kit primero **sigue vigente para primitivos** (`Input`, `Textarea`, `Select`, `Switch`, `Badge`, `Button`, `LookupField`, `Table`). Pero los **componentes de vista** (`MasterCrud`, `LayoutBase`, etc.) imponen un look que **puede no parecerse en nada** al diseño de referencia (p. ej. el diseño usa barra superior sin rail y una tabla limpia con pills de color, no el toolbar por defecto de `MasterCrud`). Cuando el default del kit diverge del diseño: **compón la presentación a medida para igualar el diseño**, importando primitivos del kit donde encajen. La fidelidad al diseño entregado por el usuario tiene prioridad sobre "usar el componente de vista del kit". Registra kit/custom en el design log.
|
|
153
|
+
|
|
154
|
+
### D. Verificación lado a lado (antes de declarar "listo")
|
|
155
|
+
|
|
156
|
+
Para CADA página del alcance: renderiza tu build y ponlo **al lado del screenshot de referencia**; solo pasa si coinciden **layout, colores, espaciado, tipografía y componentes**. 🚫 **PROHIBIDO declarar fidelidad** contra tu propio modelo mental, contra una descripción textual, o contra la pantalla inicial cuando la referencia tiene más pantallas. Si no coincide, corrige e itera antes de presentar.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 4. PATH RECONCILIATION (WDS docs are internally inconsistent)
|
|
161
|
+
|
|
162
|
+
WDS docs disagree on output paths. Resolve at runtime in this order:
|
|
163
|
+
|
|
164
|
+
1. Read `{wds_module_path}/config.yaml`. Use its `design_artifacts` value as the **base output path** for all WDS scaffold scripts (`--output <design_artifacts>`). Scripts create `C-UX-Scenarios/` under it.
|
|
165
|
+
2. Place the bridge artifacts as Freya's activation expects them, relative to that base:
|
|
166
|
+
- `{design_artifacts}/A-Product-Brief/product-brief.md`
|
|
167
|
+
- `{design_artifacts}/B-Trigger-Map/trigger-map.md` (+ personas)
|
|
168
|
+
- `{design_artifacts}/C-UX-Scenarios/` (scenarios + page specs)
|
|
169
|
+
- `{design_artifacts}/_progress/wds-project-outline.yaml` and `_progress/00-design-log.md`
|
|
170
|
+
3. NEVER hardcode `_bmad-output` vs `design-artifacts`. Always derive from `config.yaml`.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 5. MANDATORY RULE — PHASE COMMIT AT WORKFLOW END
|
|
175
|
+
|
|
176
|
+
**TRIGGER:** Immediately after the visual proposals (specs + prototype + index) are generated and saved (end of step-06).
|
|
177
|
+
|
|
178
|
+
**STEP 1: INSPECT CHANGES**
|
|
179
|
+
1. `git status --short`
|
|
180
|
+
2. `git diff --stat`
|
|
181
|
+
|
|
182
|
+
**STEP 2: GENERATE COMMIT MESSAGE**
|
|
183
|
+
Format: `[Phase 2 - Planning] <brief description>` — e.g. `[Phase 2 - Planning] add WDS visual proposals for <project name>`. Write it in `{communication_language}`.
|
|
184
|
+
|
|
185
|
+
**STEP 3: INVOKE THE SKILL — COMMIT PHASE 2 CHANGES**
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
node _siesa-agents/scripts/phases/phase2.js --commit "<generated commit message>"
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**STEP 4: CONFIRM COMPLETION**
|
|
192
|
+
Output to the user:
|
|
193
|
+
> `✅ Propuestas visuales WDS committeadas en la rama Phase 2 (planning).`
|
|
194
|
+
|
|
195
|
+
**This is the LAST action of the workflow. Do not execute any further steps after this commit.**
|
|
@@ -11,6 +11,35 @@ function run(command, cwd) {
|
|
|
11
11
|
return execSync(command, { cwd, stdio: 'pipe' }).toString().trim();
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Extrae el detalle real de un error de execSync. Con stdio:'pipe', git escribe el
|
|
15
|
+
// motivo (identidad faltante, "nothing to commit", etc.) en stdout/stderr, NO en
|
|
16
|
+
// error.message — que solo dice "Command failed: <cmd>". Sin esto el usuario ve un
|
|
17
|
+
// fallo sin causa. Preferimos stderr y caemos a stdout.
|
|
18
|
+
function gitErr(error) {
|
|
19
|
+
const err = (error.stderr ? error.stderr.toString() : '').trim();
|
|
20
|
+
const out = (error.stdout ? error.stdout.toString() : '').trim();
|
|
21
|
+
return [err, out].filter(Boolean).join('\n') || error.message;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// En una máquina recién configurada (git init sin ~/.gitconfig) `git commit` falla
|
|
25
|
+
// con "unable to auto-detect email address". Si no hay identidad, seteamos una local
|
|
26
|
+
// de respaldo para que el flujo no se caiga, y avisamos para que el usuario ponga la suya.
|
|
27
|
+
function ensureGitIdentity(projectRoot) {
|
|
28
|
+
const has = (key) => {
|
|
29
|
+
try { return run(`git config ${key}`, projectRoot).length > 0; }
|
|
30
|
+
catch { return false; }
|
|
31
|
+
};
|
|
32
|
+
if (has('user.email') && has('user.name')) return;
|
|
33
|
+
console.warn('⚠️ Git no tiene identidad configurada; usando una de respaldo local.');
|
|
34
|
+
console.warn(' Configura la tuya: git config user.name "Tu Nombre" && git config user.email tu@correo');
|
|
35
|
+
try {
|
|
36
|
+
if (!has('user.name')) run('git config user.name "Siesa Agents"', projectRoot);
|
|
37
|
+
if (!has('user.email')) run('git config user.email "agents@siesa.com"', projectRoot);
|
|
38
|
+
} catch (e) {
|
|
39
|
+
console.warn(' No se pudo setear identidad de respaldo:', gitErr(e));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
14
43
|
function createDiscoveryBranch(projectRoot) {
|
|
15
44
|
console.log(`\n🔍 Phase 1 - Creando rama "${BRANCH_NAME}"...`);
|
|
16
45
|
|
|
@@ -78,19 +107,28 @@ function commitAll(comentario, projectRoot) {
|
|
|
78
107
|
|
|
79
108
|
console.log('\n📦 Agregando todos los archivos al stage...');
|
|
80
109
|
try {
|
|
81
|
-
run('git add
|
|
82
|
-
console.log('✓ git add
|
|
110
|
+
run('git add -A', projectRoot);
|
|
111
|
+
console.log('✓ git add ejecutado correctamente.');
|
|
83
112
|
} catch (error) {
|
|
84
|
-
console.error('❌ Error al ejecutar git add
|
|
113
|
+
console.error('❌ Error al ejecutar git add:\n' + gitErr(error));
|
|
85
114
|
process.exit(1);
|
|
86
115
|
}
|
|
87
116
|
|
|
117
|
+
ensureGitIdentity(projectRoot);
|
|
118
|
+
|
|
88
119
|
console.log(`\n💾 Creando commit: "${comentario}"...`);
|
|
89
120
|
try {
|
|
90
121
|
run(`git commit -m "${comentario.replace(/"/g, '\\"')}"`, projectRoot);
|
|
91
122
|
console.log('✅ Commit creado correctamente.');
|
|
92
123
|
} catch (error) {
|
|
93
|
-
|
|
124
|
+
const detail = gitErr(error);
|
|
125
|
+
// "nothing to commit, working tree clean" no es un error del flujo: no había
|
|
126
|
+
// cambios que commitear, así que continuamos sin abortar.
|
|
127
|
+
if (/working tree clean|nada para (confirmar|hacer commit)/i.test(detail)) {
|
|
128
|
+
console.log('ℹ️ No había cambios nuevos para commitear; continuando.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
console.error('❌ Error al crear el commit:\n' + detail);
|
|
94
132
|
process.exit(1);
|
|
95
133
|
}
|
|
96
134
|
}
|
|
@@ -11,6 +11,35 @@ function run(command, cwd) {
|
|
|
11
11
|
return execSync(command, { cwd, stdio: 'pipe' }).toString().trim();
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Extrae el detalle real de un error de execSync. Con stdio:'pipe', git escribe el
|
|
15
|
+
// motivo (identidad faltante, "nothing to commit", etc.) en stdout/stderr, NO en
|
|
16
|
+
// error.message — que solo dice "Command failed: <cmd>". Sin esto el usuario ve un
|
|
17
|
+
// fallo sin causa. Preferimos stderr y caemos a stdout.
|
|
18
|
+
function gitErr(error) {
|
|
19
|
+
const err = (error.stderr ? error.stderr.toString() : '').trim();
|
|
20
|
+
const out = (error.stdout ? error.stdout.toString() : '').trim();
|
|
21
|
+
return [err, out].filter(Boolean).join('\n') || error.message;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// En una máquina recién configurada (git init sin ~/.gitconfig) `git commit` falla
|
|
25
|
+
// con "unable to auto-detect email address". Si no hay identidad, seteamos una local
|
|
26
|
+
// de respaldo para que el flujo no se caiga, y avisamos para que el usuario ponga la suya.
|
|
27
|
+
function ensureGitIdentity(projectRoot) {
|
|
28
|
+
const has = (key) => {
|
|
29
|
+
try { return run(`git config ${key}`, projectRoot).length > 0; }
|
|
30
|
+
catch { return false; }
|
|
31
|
+
};
|
|
32
|
+
if (has('user.email') && has('user.name')) return;
|
|
33
|
+
console.warn('⚠️ Git no tiene identidad configurada; usando una de respaldo local.');
|
|
34
|
+
console.warn(' Configura la tuya: git config user.name "Tu Nombre" && git config user.email tu@correo');
|
|
35
|
+
try {
|
|
36
|
+
if (!has('user.name')) run('git config user.name "Siesa Agents"', projectRoot);
|
|
37
|
+
if (!has('user.email')) run('git config user.email "agents@siesa.com"', projectRoot);
|
|
38
|
+
} catch (e) {
|
|
39
|
+
console.warn(' No se pudo setear identidad de respaldo:', gitErr(e));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
14
43
|
function createPlanningBranch(projectRoot) {
|
|
15
44
|
console.log(`\n📋 Phase 2 - Creando rama "${BRANCH_NAME}"...`);
|
|
16
45
|
|
|
@@ -78,19 +107,28 @@ function commitAll(comentario, projectRoot) {
|
|
|
78
107
|
|
|
79
108
|
console.log('\n📦 Agregando todos los archivos al stage...');
|
|
80
109
|
try {
|
|
81
|
-
run('git add
|
|
82
|
-
console.log('✓ git add
|
|
110
|
+
run('git add -A', projectRoot);
|
|
111
|
+
console.log('✓ git add ejecutado correctamente.');
|
|
83
112
|
} catch (error) {
|
|
84
|
-
console.error('❌ Error al ejecutar git add
|
|
113
|
+
console.error('❌ Error al ejecutar git add:\n' + gitErr(error));
|
|
85
114
|
process.exit(1);
|
|
86
115
|
}
|
|
87
116
|
|
|
117
|
+
ensureGitIdentity(projectRoot);
|
|
118
|
+
|
|
88
119
|
console.log(`\n💾 Creando commit: "${comentario}"...`);
|
|
89
120
|
try {
|
|
90
121
|
run(`git commit -m "${comentario.replace(/"/g, '\\"')}"`, projectRoot);
|
|
91
122
|
console.log('✅ Commit creado correctamente.');
|
|
92
123
|
} catch (error) {
|
|
93
|
-
|
|
124
|
+
const detail = gitErr(error);
|
|
125
|
+
// "nothing to commit, working tree clean" no es un error del flujo: no había
|
|
126
|
+
// cambios que commitear, así que continuamos sin abortar.
|
|
127
|
+
if (/working tree clean|nada para (confirmar|hacer commit)/i.test(detail)) {
|
|
128
|
+
console.log('ℹ️ No había cambios nuevos para commitear; continuando.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
console.error('❌ Error al crear el commit:\n' + detail);
|
|
94
132
|
process.exit(1);
|
|
95
133
|
}
|
|
96
134
|
}
|
|
@@ -11,6 +11,35 @@ function run(command, cwd) {
|
|
|
11
11
|
return execSync(command, { cwd, stdio: 'pipe' }).toString().trim();
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Extrae el detalle real de un error de execSync. Con stdio:'pipe', git escribe el
|
|
15
|
+
// motivo (identidad faltante, "nothing to commit", etc.) en stdout/stderr, NO en
|
|
16
|
+
// error.message — que solo dice "Command failed: <cmd>". Sin esto el usuario ve un
|
|
17
|
+
// fallo sin causa. Preferimos stderr y caemos a stdout.
|
|
18
|
+
function gitErr(error) {
|
|
19
|
+
const err = (error.stderr ? error.stderr.toString() : '').trim();
|
|
20
|
+
const out = (error.stdout ? error.stdout.toString() : '').trim();
|
|
21
|
+
return [err, out].filter(Boolean).join('\n') || error.message;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// En una máquina recién configurada (git init sin ~/.gitconfig) `git commit` falla
|
|
25
|
+
// con "unable to auto-detect email address". Si no hay identidad, seteamos una local
|
|
26
|
+
// de respaldo para que el flujo no se caiga, y avisamos para que el usuario ponga la suya.
|
|
27
|
+
function ensureGitIdentity(projectRoot) {
|
|
28
|
+
const has = (key) => {
|
|
29
|
+
try { return run(`git config ${key}`, projectRoot).length > 0; }
|
|
30
|
+
catch { return false; }
|
|
31
|
+
};
|
|
32
|
+
if (has('user.email') && has('user.name')) return;
|
|
33
|
+
console.warn('⚠️ Git no tiene identidad configurada; usando una de respaldo local.');
|
|
34
|
+
console.warn(' Configura la tuya: git config user.name "Tu Nombre" && git config user.email tu@correo');
|
|
35
|
+
try {
|
|
36
|
+
if (!has('user.name')) run('git config user.name "Siesa Agents"', projectRoot);
|
|
37
|
+
if (!has('user.email')) run('git config user.email "agents@siesa.com"', projectRoot);
|
|
38
|
+
} catch (e) {
|
|
39
|
+
console.warn(' No se pudo setear identidad de respaldo:', gitErr(e));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
14
43
|
function createSolutioningBranch(projectRoot) {
|
|
15
44
|
console.log(`\n🛠️ Phase 3 - Creando rama "${BRANCH_NAME}"...`);
|
|
16
45
|
|
|
@@ -78,19 +107,28 @@ function commitAll(comentario, projectRoot) {
|
|
|
78
107
|
|
|
79
108
|
console.log('\n📦 Agregando todos los archivos al stage...');
|
|
80
109
|
try {
|
|
81
|
-
run('git add
|
|
82
|
-
console.log('✓ git add
|
|
110
|
+
run('git add -A', projectRoot);
|
|
111
|
+
console.log('✓ git add ejecutado correctamente.');
|
|
83
112
|
} catch (error) {
|
|
84
|
-
console.error('❌ Error al ejecutar git add
|
|
113
|
+
console.error('❌ Error al ejecutar git add:\n' + gitErr(error));
|
|
85
114
|
process.exit(1);
|
|
86
115
|
}
|
|
87
116
|
|
|
117
|
+
ensureGitIdentity(projectRoot);
|
|
118
|
+
|
|
88
119
|
console.log(`\n💾 Creando commit: "${comentario}"...`);
|
|
89
120
|
try {
|
|
90
121
|
run(`git commit -m "${comentario.replace(/"/g, '\\"')}"`, projectRoot);
|
|
91
122
|
console.log('✅ Commit creado correctamente.');
|
|
92
123
|
} catch (error) {
|
|
93
|
-
|
|
124
|
+
const detail = gitErr(error);
|
|
125
|
+
// "nothing to commit, working tree clean" no es un error del flujo: no había
|
|
126
|
+
// cambios que commitear, así que continuamos sin abortar.
|
|
127
|
+
if (/working tree clean|nada para (confirmar|hacer commit)/i.test(detail)) {
|
|
128
|
+
console.log('ℹ️ No había cambios nuevos para commitear; continuando.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
console.error('❌ Error al crear el commit:\n' + detail);
|
|
94
132
|
process.exit(1);
|
|
95
133
|
}
|
|
96
134
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# WDS Module Configuration
|
|
2
|
+
# Generated by BMAD installer
|
|
3
|
+
# Version: 6.9.0
|
|
4
|
+
# Date: 2026-06-25T17:13:35.737Z
|
|
5
|
+
|
|
6
|
+
project_knowledge: "{project-root}/docs"
|
|
7
|
+
project_type: digital_product
|
|
8
|
+
design_artifacts: "{project-root}/design-artifacts"
|
|
9
|
+
design_system_mode: none
|
|
10
|
+
methodology_version: wds-v6
|
|
11
|
+
product_languages:
|
|
12
|
+
- en
|
|
13
|
+
design_experience: intermediate
|
|
14
|
+
|
|
15
|
+
# Core Configuration Values
|
|
16
|
+
user_name: Ssancheze
|
|
17
|
+
project_name: Dev
|
|
18
|
+
communication_language: Spanish
|
|
19
|
+
document_output_language: English
|
|
20
|
+
output_folder: "{project-root}/_bmad-output"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# WDS Agent Contracts
|
|
2
|
+
|
|
3
|
+
Defines what each agent owns, what they explicitly do not own, and how they hand off to each other.
|
|
4
|
+
All agents load this file at activation. These rules are non-negotiable.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Domain Boundaries
|
|
9
|
+
|
|
10
|
+
| Agent | Owns | Does NOT own |
|
|
11
|
+
|-------|------|--------------|
|
|
12
|
+
| **Saga** | Phases 0–2: Alignment, Product Brief, Trigger Mapping | Any design work. Any code. Scenarios (Phase 3+). |
|
|
13
|
+
| **Freya** | Phases 3–4: UX Scenarios, UX Design. Phases 6–7: Asset Generation, Design System. | Discovery (Phases 1–2). Any code. PRDs. |
|
|
14
|
+
| **Mimir** | Phase 5: Tech Audit, PRD, Build. Phase 8: Product Evolution. | Discovery. Design. Writing specs without a Work Order. |
|
|
15
|
+
|
|
16
|
+
**If a user asks an agent to do work outside its domain:** name the right agent and offer to hand off. Never attempt the work yourself.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Prerequisites
|
|
21
|
+
|
|
22
|
+
Each agent requires the following before starting core work:
|
|
23
|
+
|
|
24
|
+
| Agent | Required | Blocks |
|
|
25
|
+
|-------|----------|--------|
|
|
26
|
+
| Saga | Nothing | — |
|
|
27
|
+
| Freya | `A-Product-Brief/product-brief.md` + `B-Trigger-Map/00-trigger-map.md` | Cannot design without strategic foundation |
|
|
28
|
+
| Mimir | At least one Work Order from Freya | Cannot build without a WO. Cannot PRD without a WO. |
|
|
29
|
+
| Mimir (existing codebase) | `E-Development/000-tech-audit.md` | Cannot PRD without knowing the codebase |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Handoff Rules
|
|
34
|
+
|
|
35
|
+
**Saga → Freya**
|
|
36
|
+
Trigger: Product Brief and Trigger Map are complete and aligned.
|
|
37
|
+
Action: Saga runs `/wrap freya`. Freya picks up with `/freya progress/freya.md`.
|
|
38
|
+
Never: Saga does not write scenarios or design anything before handing off.
|
|
39
|
+
|
|
40
|
+
**Freya → Mimir**
|
|
41
|
+
Trigger: Work Order written, page spec complete, ready for implementation.
|
|
42
|
+
Action: Freya runs `/wrap mimir` or `/handoff mimir`. Mimir picks up the Work Order.
|
|
43
|
+
Never: Freya does not write code. Freya does not write PRDs.
|
|
44
|
+
|
|
45
|
+
**Mimir → Freya**
|
|
46
|
+
Trigger: Implementation complete, browser-verified. Or: blocked on design decision.
|
|
47
|
+
Action: Mimir runs `/handoff freya` with the specific question or completion note.
|
|
48
|
+
Never: Mimir does not modify specs or Work Orders. He implements what they say.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Quality Rules (all agents)
|
|
53
|
+
|
|
54
|
+
- **One task at a time.** Complete and verify before moving on.
|
|
55
|
+
- **No plausible-looking wrong output.** If you cannot follow the template exactly, stop and say so. Wrong-but-plausible output breaks every downstream phase.
|
|
56
|
+
- **Read the template before writing.** Every artifact has a template. Load it, follow it.
|
|
57
|
+
- **Decisions are documented.** Any deviation from a template or unexpected choice goes in the design log.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Out-of-Scope (explicit)
|
|
62
|
+
|
|
63
|
+
Things no WDS agent does, ever:
|
|
64
|
+
|
|
65
|
+
- Produce output in a custom format when a WDS template exists
|
|
66
|
+
- Write to `progress/` without going through the memory tool
|
|
67
|
+
- Commit without a meaningful message (conventional commits required)
|
|
68
|
+
- Force push, skip hooks, or bypass git safety
|
|
69
|
+
- Start a new phase without the prerequisite documents
|
|
70
|
+
- Write code without a PRD (Mimir only)
|
|
71
|
+
- Mark a requirement done without browser verification (Mimir only)
|
|
72
|
+
- Design without a Trigger Map (Freya only)
|