zugzbot 1.2.0 → 1.3.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/.opencode/agents/sdd-orchestrator.md +10 -9
- package/.opencode/rules/sdd-global.md +8 -0
- package/.opencode/skills/shadcn-templates/SKILL.md +93 -32
- package/.opencode/templates/nextjs-shadcn/components.json +4 -1
- package/.opencode/tools/sdd_bootstrap.ts +21 -0
- package/.opencode/tools/sdd_catalog.ts +1040 -0
- package/package.json +1 -1
- package/.opencode/tools/akash_catalog.ts +0 -596
|
@@ -49,12 +49,13 @@ Eres el coordinador principal del arnés de desarrollo SDD (Spec-Driven Developm
|
|
|
49
49
|
<f0_detect>
|
|
50
50
|
1. **Inicialización Atómica**: Llama obligatoriamente a `sdd_get_initial_session_data` para obtener estado, memorias e Oh-My-Design en un solo turno.
|
|
51
51
|
2. **Brain Pre-carga (OBLIGATORIO)**: Inmediatamente después, invoca `brain_read_memory({ category: "learnings" })` y `brain_read_memory({ category: "errors" })` para extraer errores y lecciones históricas que prevengan repetir problemas conocidos. Guarda el resultado en una variable interna para inyectarlo en cada brief de subagente.
|
|
52
|
-
2.5 **Detección de intención de catálogo
|
|
53
|
-
- Keywords: `hero`, `landing`, `pricing`, `features`, `faq`, `testimonials`, `footer`, `cta`, `navbar`, `stats`, `logo cloud`, `login page`, `signup page`, `forgot password`, `chart`, `sidebar`, `dashboard section`, `comparison`, `use cases`, `how it works`, `changelog`, `cookie banner`, `newsletter`, `bento`, `marquee`, `gallery`, `integration`
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
- En modo
|
|
52
|
+
2.5 **Detección de intención de catálogo externo (CRÍTICO — bugfix sesión 1176)**: Analiza la petición. Si contiene ALGUNA keyword de marketing/landing/auth/composite, animaciones/shaders/WebGL, AI components, o un nombre propio de cualquier catálogo:
|
|
53
|
+
- Keywords marketing/landing (shadcn): `hero`, `landing`, `pricing`, `features`, `faq`, `testimonials`, `footer`, `cta`, `navbar`, `stats`, `logo cloud`, `login page`, `signup page`, `forgot password`, `chart`, `sidebar`, `dashboard section`, `comparison`, `use cases`, `how it works`, `changelog`, `cookie banner`, `newsletter`, `bento`, `marquee`, `gallery`, `integration`
|
|
54
|
+
- Keywords animaciones (reactbits): `shader`, `webgl`, `gsap`, `framer-motion`, `three.js`, `drei`, `animated background`, `animated text`, `gradient mesh`, `magnet`, `floating dock`, `cursor`, `particles`, `noise`, `orbit`, `aurora`, `dither`, `iridescence`, `blob`, `glare`, `staggered`, `magic bento`, `electric border`, `metallic paint`
|
|
55
|
+
- Nombres propios: `akash`, `akash3444`, `shadcnui-blocks`, `shadcn-ui-blocks`, `basecn`, `shadcn blocks`, `reactbits`, `react-bits`, `david haz`
|
|
56
|
+
- **Acción obligatoria**: cargar la skill `shadcn-templates` (que ahora referencia las tools MCP `sdd_catalog_list_blocks`, `sdd_catalog_get_block` y `sdd_catalog_warm_index` — NUNCA uses `webfetch` directo a GitHub/reactbits.dev; esta cacheado).
|
|
57
|
+
- En modo HIL: llama `sdd_catalog_list_blocks({category, limit: 5, registry: 'all'})` y presenta las 2-3 mejores opciones con `preview_url` para que el usuario elija. **Incluir siempre `preview_url` en la respuesta** — para reactbits el demo es animado y el usuario puede ver cómo se ve antes de instalar.
|
|
58
|
+
- En modo autopiloto (`/loop`): llama `sdd_catalog_get_block({name})` sobre 2-3 candidatos (uno de cada registry) y elige el que mejor encaje.
|
|
58
59
|
- Esto evita el ciclo "ping-pong" de 3+ turnos que vimos en sesión 1176 donde el usuario tuvo que guiar al orquestador hacia el catálogo correcto.
|
|
59
60
|
3. **Detección Fast-Track Dashboard (CRÍTICO — bugfix sesión 1186 y 1180)**: Analiza la petición del usuario. Si contiene ALGUNA de estas keywords: `dashboard`, `admin panel`, `panel de control`, `panel admin`, `crm`, `erp`, `panel`:
|
|
60
61
|
- **NO preguntes NADA**. Asume todos los defaults: Stack = Next.js 16 + Shadcn UI + Tailwind v4, Persistencia = localStorage/mock, Diseño = `default` (zinc nativo de Shadcn, NO inyectar marcas de Oh-My-Design), Verificación = `console`.
|
|
@@ -141,11 +142,11 @@ Eres el coordinador principal del arnés de desarrollo SDD (Spec-Driven Developm
|
|
|
141
142
|
- Anúnciala en 1 línea y delega la siguiente iteración completa a un NUEVO hilo `sdd-orchestrator` con contexto de 0 tokens.
|
|
142
143
|
- Si `loopCurrentIteration >= loopTargetIterations` o modo normal: Concluye con `sdd_set_phase({ phase: "F0_DETECT", loopMode: false })`.
|
|
143
144
|
2. **Brain save OBLIGATORIO**: Sintetiza 1-3 lecciones y regístralas con `brain_save_memory` (categoría: `learnings`, `errors`, `design` o `routing`). BLOQUEANTE — no omitir.
|
|
144
|
-
2.5 **Memory Post-Sesión para Catálogos (CRÍTICO — bugfix sesión 1176)**: Si la sesión tocó
|
|
145
|
+
2.5 **Memory Post-Sesión para Catálogos (CRÍTICO — bugfix sesión 1176)**: Si la sesión tocó cualquier catálogo externo de UI (Akash shadcn-ui-blocks, basecn, reactbits.dev), registra OBLIGATORIAMENTE en `brain.routing`:
|
|
145
146
|
- URL canónica del catálogo
|
|
146
147
|
- Comando `npx shadcn@latest add <URL>` listo para usar
|
|
147
148
|
- Nombre del autor/repo (para evitar redescubrimiento en próximas sesiones)
|
|
148
|
-
- Tool MCP del arnés a usar (`
|
|
149
|
+
- Tool MCP del arnés a usar (`sdd_catalog_list_blocks`, `sdd_catalog_get_block`, etc.)
|
|
149
150
|
3. **Mensaje Final MÁXIMO 10 LÍNEAS**:
|
|
150
151
|
```
|
|
151
152
|
✅ Sesión SDD completada
|
|
@@ -163,7 +164,7 @@ Eres el coordinador principal del arnés de desarrollo SDD (Spec-Driven Developm
|
|
|
163
164
|
<mcp_guidelines>
|
|
164
165
|
- **MCPs**: `shadcn` (UI), `context7` (APIs Next.js/FastAPI), `playwright` (Visual tests), `lucide-icons` (Iconos).
|
|
165
166
|
- `next-devtools` deshabilitado por defecto. MCPs invocados exclusivamente por subagentes.
|
|
166
|
-
- **Catálogos externos (Tools internas)**: `
|
|
167
|
+
- **Catálogos externos (Tools internas)**: `sdd_catalog_list_blocks`, `sdd_catalog_get_block`, `sdd_catalog_warm_index` — cachean el catálogo unificado (Akash shadcn-ui-blocks + basecn + reactbits.dev) en `.openspec/cache/` con TTL 7d (Akash/Basecn) y 1d (reactbits). NUNCA uses `webfetch` directo a GitHub o reactbits.dev para descubrir bloques; usa siempre estas tools. Solo se soportan registries con catálogo JSON oficialmente discoverable.
|
|
167
168
|
</mcp_guidelines>
|
|
168
169
|
|
|
169
170
|
<communication_rules>
|
|
@@ -33,6 +33,14 @@ Para optimizar el tiempo de desarrollo, garantizar una experiencia visual premiu
|
|
|
33
33
|
- **Preservación de Datos Dummy**: El archivo de datos del bloque (por ejemplo, `data.json` o constantes locales) debe mantenerse intacto en su ruta inyectada por la CLI en esta Fase A para garantizar que la vista se muestre de inmediato en el navegador exactamente idéntica al demo real.
|
|
34
34
|
- **Sustitución Atómica de Datos en Fase B**: Una vez que el bloque compila e interactúa en el navegador de manera idéntica al demo con los datos de ejemplo, el Coder procederá de forma exclusiva a sustituir los datos mock por lógica y fetchings de datos dinámicos del backend, manteniendo intactos los contenedores estructurales del bloque (grids de diseño, paddings y contenedores flex) sin alteración alguna para evitar aberraciones visuales.
|
|
35
35
|
- **Resolución Activa de Conflictos de Ruteo por Inyección de Bloques**: Si la CLI de Shadcn inyecta automáticamente una estructura de rutas (ej: `src/app/dashboard/page.tsx`) que compite con las rutas del contrato (como un route group `(dashboard)` o una ruta raíz), el Coder **debe** borrar o refactorizar de inmediato el código inyectado por defecto para evitar bucles de redirección infinitos o colisiones en el router.
|
|
36
|
+
- **Catálogo Unificado `sdd_catalog` (3 registries, todos discoverables)**: Antes de inventar cualquier layout/bloque desde cero, el Spec-Writer (F1) y el Coder (F2) **deben** consultar `sdd_catalog_list_blocks({ registry: "all", category: "<cat>" })`. El catálogo cubre 3 fuentes con catálogo JSON oficial en un solo tool:
|
|
37
|
+
1. **`shadcn`** (akash3444/shadcn-ui-blocks, GitHub Contents API) — ~540 bloques Radix/Next.js curados. **Default** para marketing, landing, auth, dashboards, footers.
|
|
38
|
+
2. **`basecn`** (akash3444/basecn, GitHub Contents API) — ~60 bloques fork Base UI. Usar solo si el proyecto está en Base UI.
|
|
39
|
+
3. **`reactbits`** (reactbits.dev, `/r/registry.json` oficial shadcn-compatible) — 134 primitivas animadas × 4 variantes (JS-CSS/JS-TW/TS-CSS/TS-TW, default `TS-TW`). **Fuente preferente** para backgrounds animados, textos con efecto, cards interactivas, cursors custom, dock flotante. Tratar como third-party trust: revisar siempre el campo `dependencies` (suelen incluir `gsap`, `three`, `@react-three/fiber`, `motion`) y validar compat con el stack target antes de instalar.
|
|
40
|
+
- **Criterio de inclusion**: solo se soportan registries con catálogo JSON oficialmente discoverable. 21st.dev fue removido porque su catálogo es JS-rendered y rompe el principio de "siempre saber qué hay disponible antes de elegir".
|
|
41
|
+
- El comando install siempre viene en el campo `install_command` del resultado de `sdd_catalog_get_block`. **Prohibido** ejecutar `npx shadcn add` con una URL adivinada; usar siempre el `install_command` literal que devuelve la tool.
|
|
42
|
+
- El catálogo guarda caché local en `.openspec/cache/` con TTL diferenciado (7d shadcn/basecn, 1d reactbits) — **NUNCA** usar `webfetch` directo a GitHub o reactbits.dev, está cacheado.
|
|
43
|
+
- Todos los items exponen `preview_url`. Para reactbits el demo es animado vivo (`https://reactbits.dev/<BaseName>`) — el orchestrator debe **siempre** presentar el `preview_url` al usuario en modo HIL para que vea cómo se ve antes de elegir.
|
|
36
44
|
|
|
37
45
|
## 4. Soporte para Subdirectorios, Monorepos (targetDir) y Estándar Corporativo `src/`
|
|
38
46
|
Si el proyecto o aplicación principal vive en un subdirectorio (ej. `next-app`, `frontend`, `backend`), se deben seguir estas directivas estrictas para mantener la consistencia y el "estándar corporativo con carpeta `src/`":
|
|
@@ -152,59 +152,120 @@ El `@sdd-spec-writer` utiliza de manera proactiva el MCP `shadcn` (`shadcn_searc
|
|
|
152
152
|
### Fase F2 (Implementation)
|
|
153
153
|
El `@sdd-coder` utiliza el template base `nextjs-shadcn`. Si el contrato no detalla todos los sub-componentes o el Coder necesita verificar el comportamiento de un bloque antes de acoplarlo con el backend, debe ejecutar `shadcn_get_item_examples_from_registries` para ver ejemplos funcionales del componente real. Tras ejecutar la instalación con `npx shadcn@latest add`, el Coder debe contrastar los archivos inyectados con el mapa del contrato y limpiar de inmediato cualquier archivo redundante (como una página de inicio duplicada) que no coincida con el router oficial.
|
|
154
154
|
|
|
155
|
-
## 5. Catálogo
|
|
155
|
+
## 5. Catálogo Unificado de Bloques Externos (`sdd_catalog`)
|
|
156
156
|
|
|
157
|
-
Además del catálogo nativo de Shadcn UI,
|
|
157
|
+
Además del catálogo nativo de Shadcn UI, el arnés expone un catálogo unificado de **3 registries** externos (todos con catálogo JSON oficial y discoverable programáticamente). Si el usuario pide cualquier interfaz (hero, footer, dashboard, login, AI chat, animated background, etc.), **TIENES LA OBLIGACIÓN** de explorar este catálogo ANTES de inventar desde cero.
|
|
158
158
|
|
|
159
|
-
### 5.0
|
|
159
|
+
### 5.0 Registries Soportados (todos discoverables)
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
| Registry | Fuente de catálogo | Contenido | TTL | Notas |
|
|
162
|
+
|---|---|---|---|---|
|
|
163
|
+
| `shadcn` | akash3444/shadcn-ui-blocks (GitHub Contents API) | ~540 bloques Radix | 7d | **Default** para marketing/landing/auth/dashboards |
|
|
164
|
+
| `basecn` | akash3444/basecn (GitHub Contents API) | ~60 bloques fork Base UI | 7d | Alternativa si el proyecto usa Base UI |
|
|
165
|
+
| `reactbits` | reactbits.dev/r/registry.json (JSON oficial shadcn) | 134 bases × 4 variantes = 536 items | 1d | Primitivas animadas (backgrounds, text, cards, cursors, etc.) |
|
|
162
166
|
|
|
163
|
-
-
|
|
164
|
-
- Devuelve el listado completo del catálogo (shadcn-ui-blocks + basecn) filtrado por categoría o substring.
|
|
165
|
-
- `registry`: `"shadcn"` (Radix), `"basecn"` (Base UI) o `"both"` (default).
|
|
166
|
-
- `force_refresh: true` re-descarga aunque el cache sea fresco.
|
|
167
|
-
- `sdd_akash_catalog_get_block({ name, registry?, force_refresh? })`
|
|
168
|
-
- Devuelve el código fuente, archivos y dependencias de un bloque específico.
|
|
169
|
-
- Incluye `install_command` listo: `npx shadcn@latest add https://shadcnui-blocks.com/r/radix/<name>.json --yes`.
|
|
170
|
-
- `sdd_akash_catalog_warm_index({ registry? })`
|
|
171
|
-
- Pre-calienta el caché para evitar la latencia del primer `list_blocks`. Llamar al bootstrap del proyecto.
|
|
167
|
+
> **Criterio de inclusion**: solo se soportan registries con catálogo JSON oficialmente discoverable. 21st.dev fue removido porque su catálogo es JS-rendered y requiere scraping para descubrir items nuevos — eso rompe el principio de "siempre saber qué hay disponible antes de elegir".
|
|
172
168
|
|
|
173
|
-
|
|
169
|
+
### 5.1 Herramientas MCP Nativas del Arnés (PREFERENTE — `sdd_catalog_*`)
|
|
174
170
|
|
|
175
|
-
|
|
176
|
-
Si el usuario solicita una interfaz (ej: "necesito un hero", "haz un footer"), **llama primero a `sdd_akash_catalog_list_blocks`**:
|
|
177
|
-
- **Asistido:** `sdd_akash_catalog_list_blocks({ category: "hero", limit: 5 })` → muestra las 5 mejores opciones con su `preview_url` (`https://shadcnui-blocks.com/blocks/<name>`).
|
|
178
|
-
- **Autopiloto:** `sdd_akash_catalog_get_block({ name: "hero-06" })` sobre 2-3 candidatos y elige el que mejor encaje.
|
|
171
|
+
**PROHIBIDO** usar `webfetch` directo a GitHub o reactbits.dev para descubrir bloques. El arnés expone 3 tools MCP dedicadas que cachean en `.openspec/cache/` y evitan redescubrimiento:
|
|
179
172
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
173
|
+
- `sdd_catalog_list_blocks({ category?, query?, registry?, limit?, force_refresh? })`
|
|
174
|
+
- `registry`: `"shadcn"` | `"basecn"` | `"reactbits"` | `"all"` (default).
|
|
175
|
+
- Filtra por categoria exacta (`hero`, `pricing`, `backgrounds`, `text`, `cards`, `navigation`, ...) o substring libre (sobre `name`, `description`, `tags`).
|
|
176
|
+
- Para `reactbits`: devuelve las **134 bases** (cada una con `variants[]` y `default_variant`), NO las 536 variantes. Esto evita duplicados y permite ver opciones de un vistazo.
|
|
177
|
+
- `sdd_catalog_get_block({ name, registry?, variant?, force_refresh? })`
|
|
178
|
+
- Formatos de `name`:
|
|
179
|
+
- shadcn/basecn: `"hero-06"`, `"sidebar-07"`
|
|
180
|
+
- reactbits: `"Dither"` (auto-resuelve a `Dither-TS-TW` por default) **o** `"Dither-JS-CSS"` (variante canónica completa)
|
|
181
|
+
- URL directa: `"https://reactbits.dev/r/Dither-TS-TW.json"` o `"https://shadcnui-blocks.com/r/radix/hero-06.json"`
|
|
182
|
+
- Namespace shadcn: `"@acme/button"`
|
|
183
|
+
- Para reactbits, parámetro opcional `variant`: `"JS-CSS" | "JS-TW" | "TS-CSS" | "TS-TW"` (default `"TS-TW"`). Aplicar solo cuando pasas el nombre base sin sufijo de variante.
|
|
184
|
+
- `registry` autodetecta por el formato; pasalo explícito solo si necesitas forzar.
|
|
185
|
+
- Devuelve `source_files[]`, `dependencies[]`, `preview_url`, `install_command` listo y metadatos `base_name` + `variant` (para reactbits).
|
|
186
|
+
- `sdd_catalog_warm_index({ registry? })`
|
|
187
|
+
- Pre-calienta caches. Llamar al bootstrap (F0) o inicio de F1.
|
|
184
188
|
|
|
185
|
-
### 5.
|
|
186
|
-
|
|
189
|
+
### 5.2 Flujo de Descubrimiento (Fase F1 - Spec-Writer)
|
|
190
|
+
|
|
191
|
+
Cuando el usuario pide una UI, sigue este orden de prioridad:
|
|
192
|
+
|
|
193
|
+
1. **Primero** `sdd_catalog_list_blocks({ registry: "all", category: "<categoria>", limit: 10 })` — devuelve candidatos de los 3 registries simultáneamente.
|
|
194
|
+
2. **Si el usuario pide animaciones/shaders/efectos visuales cinematograficos**, prioriza `registry: "reactbits"` (es donde estan las primitivas animadas reales: `Dither`, `Aurora`, `GlareHover`, `Magnet`, `StaggeredMenu`, `FloatingDock`, etc.).
|
|
195
|
+
3. **Si el usuario pide paginas de marketing completas** (landing, pricing, features), prioriza `registry: "shadcn"` (bloques Radix mas completos con texto, CTAs, imagenes placeholder).
|
|
196
|
+
4. **Si el usuario ya dio una URL** (`https://reactbits.dev/...` o `https://shadcnui-blocks.com/...`), ve directo a `sdd_catalog_get_block` con esa URL.
|
|
197
|
+
5. **Presenta opciones con `preview_url`** para que el usuario vea cada una antes de elegir:
|
|
198
|
+
- **Asistido (HIL):** muestra `preview_url` (que el usuario puede abrir en navegador) + `install_command` para los 2-3 mejores candidatos y deja que elija. Si el usuario dice "ese", ejecuta el `install_command`.
|
|
199
|
+
- **Autopiloto (`/loop`):** inspecciona 2-3 candidatos con `sdd_catalog_get_block`, analiza dependencias y compat con el stack del contrato, elige autonomamente.
|
|
200
|
+
|
|
201
|
+
### 5.3 Seleccion de Bloques (Interactiva o Autonoma)
|
|
202
|
+
|
|
203
|
+
Cuando hay multiples opciones para una categoria (ej. 10 heroes):
|
|
204
|
+
- **Modo Asistido (default):** pregunta al usuario con `question` o en chat: *"Tengo X opciones de [categoria]. ¿Quieres revisar alguna? Puedo darte el `preview_url` (ej. `https://shadcnui-blocks.com/blocks/hero-06` o `https://reactbits.dev/Dither`) para que elijas."*
|
|
205
|
+
- **Modo Autopiloto:** lee el codigo de 2-3 opciones con `sdd_catalog_get_block` y elige sin preguntar.
|
|
206
|
+
|
|
207
|
+
### 5.4 Inyeccion e Instalacion (Spec-Writer + Coder)
|
|
208
|
+
|
|
209
|
+
- **Spec-Writer (F1):** En el `contract.json`, dentro de `frontend.components`, anota el bloque usando **el `install_url` o el `name` canonico** que devolvio `sdd_catalog_get_block`:
|
|
187
210
|
```json
|
|
188
211
|
"frontend": {
|
|
189
212
|
"components": [
|
|
190
|
-
"
|
|
213
|
+
{ "name": "hero-06", "registry": "shadcn", "source": "akash3444/shadcn-ui-blocks" },
|
|
214
|
+
{ "name": "Dither", "registry": "reactbits", "variant": "TS-TW", "source": "reactbits.dev/Dither" }
|
|
191
215
|
]
|
|
192
216
|
}
|
|
193
217
|
```
|
|
194
|
-
- **Coder (F2):** Para instalar
|
|
218
|
+
- **Coder (F2):** Para instalar, usa el `install_command` literal que devuelve `sdd_catalog_get_block` (campo `block.install_command`). Ejemplos reales:
|
|
195
219
|
```bash
|
|
196
|
-
|
|
220
|
+
# Akash Radix (shadcn CLI nativo)
|
|
221
|
+
npx shadcn@latest add https://shadcnui-blocks.com/r/radix/hero-06.json --yes
|
|
222
|
+
# Basecn
|
|
223
|
+
npx shadcn@latest add https://basecn.dev/r/footer-04.json --yes
|
|
224
|
+
# reactbits (variante TS-TW explicita)
|
|
225
|
+
npx shadcn@latest add https://reactbits.dev/r/Dither-TS-TW.json --yes
|
|
197
226
|
```
|
|
227
|
+
La CLI v3 de Shadcn negocia `Accept: application/json` automaticamente, descarga el codigo y resuelve las `registryDependencies`.
|
|
198
228
|
|
|
199
|
-
### 5.
|
|
200
|
-
|
|
229
|
+
### 5.5 Validacion Post-Instalacion (BLOQUEANTE)
|
|
230
|
+
|
|
231
|
+
Tras instalar cualquier bloque externo, ejecuta INMEDIATAMENTE:
|
|
201
232
|
1. `npx tsc --noEmit` para detectar imports rotos o packages faltantes.
|
|
202
|
-
2. Verifica que todos los archivos declarados en
|
|
203
|
-
3. Si faltan archivos, reintenta
|
|
204
|
-
4.
|
|
233
|
+
2. Verifica que todos los archivos declarados en `source_files[]` (devuelto por `sdd_catalog_get_block`) fueron creados fisicamente.
|
|
234
|
+
3. Si faltan archivos, reintenta con `--overwrite`.
|
|
235
|
+
4. **Para bloques reactbits con dependencias pesadas** (`gsap`, `three`, `@react-three/fiber`, `motion`): confirma que el `package.json` del proyecto las incluye; si no, `npm install <deps>` antes de continuar. Revisa el campo `dependencies[]` del JSON retornado por `sdd_catalog_get_block`.
|
|
236
|
+
5. **Solo entonces** reporta exito al orquestador.
|
|
205
237
|
|
|
206
238
|
**Bug conocido**: `Can't resolve 'shadcn/tailwind.css'` en Tailwind v4 requiere `npm install shadcn` antes de continuar.
|
|
207
239
|
|
|
240
|
+
### 5.6 reactbits.dev - Detalles de Variantes
|
|
241
|
+
|
|
242
|
+
reactbits.dev es el registry mas "vivo" del catalogo unificado. Cada componente base se publica en **4 variantes** con sufijo `-<Lang>-<Style>`:
|
|
243
|
+
|
|
244
|
+
| Sufijo | Lenguaje | Styling |
|
|
245
|
+
|---|---|---|
|
|
246
|
+
| `JS-CSS` | JavaScript | CSS plano (.css) |
|
|
247
|
+
| `JS-TW` | JavaScript | Tailwind v4 (.tw) |
|
|
248
|
+
| `TS-CSS` | TypeScript | CSS plano |
|
|
249
|
+
| `TS-TW` | TypeScript | Tailwind v4 |
|
|
250
|
+
|
|
251
|
+
- **Default del arnés**: `TS-TW` (TypeScript + Tailwind v4, alineado al stack Next.js 16 + Shadcn + Tailwind v4 del harness).
|
|
252
|
+
- **Para usar otra variante**: `sdd_catalog_get_block({ name: "Dither", variant: "JS-CSS", registry: "reactbits" })`.
|
|
253
|
+
- **El preview_url es siempre por base**: `https://reactbits.dev/Dither` (muestra el demo vivo con animación real, ideal para que el usuario vea cómo se ve antes de instalar).
|
|
254
|
+
- **Las dependencias son reales**: `gsap@^3.13.0`, `three`, `@react-three/fiber@^9.3.0`, `postprocessing`, `motion`. **Third-party trust obligatorio**: validar compat con el stack target antes de instalar.
|
|
255
|
+
- **Mapa curado de categorias** (dentro de `sdd_catalog.ts`, constante `REACTBITS_POPULAR_BY_CATEGORY`): las ~85 bases más populares organizadas en `backgrounds`, `text`, `cards`, `navigation`, `buttons`, `animations`, `cursors`, `misc`. Las bases fuera del mapa caen en `misc` pero son buscables por `query`.
|
|
256
|
+
|
|
257
|
+
### 5.7 Preview UX — Cómo se ve antes de instalar
|
|
258
|
+
|
|
259
|
+
**Todos los items del catálogo unificado exponen `preview_url`** que el orchestrator debe presentar al usuario en modo HIL para que vea la animación/componente real antes de decidir:
|
|
260
|
+
|
|
261
|
+
| Registry | Preview URL | Tipo de preview |
|
|
262
|
+
|---|---|---|
|
|
263
|
+
| shadcn | `https://shadcnui-blocks.com/blocks/<name>` | iframe del demo oficial |
|
|
264
|
+
| basecn | `https://basecn.dev/blocks/<name>` | iframe del demo oficial |
|
|
265
|
+
| reactbits | `https://reactbits.dev/<BaseName>` | demo vivo con animacion real + codigo a la derecha |
|
|
266
|
+
|
|
267
|
+
Cuando el orchestrator presente opciones al usuario, **siempre incluir el `preview_url`** en el chat. Para reactbits en particular, el demo es animado y se ve inmediatamente cómo se mueve la UI en el navegador del usuario — esto cierra el ciclo "imaginar como se ve → ver real → decidir instalar" sin hacer conjeturas.
|
|
268
|
+
|
|
208
269
|
---
|
|
209
270
|
|
|
210
271
|
## 6. Patrones Avanzados de Layout CSS
|
|
@@ -328,6 +328,27 @@ export const bootstrap_nextjs_shadcn = tool({
|
|
|
328
328
|
]
|
|
329
329
|
for (const f of standardFiles) copyFileSafe(f)
|
|
330
330
|
|
|
331
|
+
// Post-copy: garantizar que components.json del target tenga los registries
|
|
332
|
+
// externos preconfigurados (idempotente: si ya existen, no los duplica).
|
|
333
|
+
const targetComponentsJson = path.resolve(targetPath, "components.json")
|
|
334
|
+
if (fs.existsSync(targetComponentsJson)) {
|
|
335
|
+
try {
|
|
336
|
+
const cfg = JSON.parse(fs.readFileSync(targetComponentsJson, "utf8"))
|
|
337
|
+
if (!cfg.registries) cfg.registries = {}
|
|
338
|
+
if (!cfg.registries["@react-bits"]) {
|
|
339
|
+
cfg.registries["@react-bits"] = "https://reactbits.dev/r/{name}.json"
|
|
340
|
+
fs.writeFileSync(
|
|
341
|
+
targetComponentsJson,
|
|
342
|
+
JSON.stringify(cfg, null, 2),
|
|
343
|
+
"utf8"
|
|
344
|
+
)
|
|
345
|
+
filesCopied.push("components.json (registries.@react-bits inyectado)")
|
|
346
|
+
}
|
|
347
|
+
} catch (e) {
|
|
348
|
+
// best-effort: si falla el parse, no bloqueamos el bootstrap
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
331
352
|
if (targetDir !== ".") {
|
|
332
353
|
const configFiles = [
|
|
333
354
|
"tsconfig.json",
|