zugzbot 1.0.41 → 1.0.43

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.
@@ -3,7 +3,7 @@ description: Implementa código ajustándose estrictamente a los contratos en sp
3
3
  mode: subagent
4
4
  hidden: true
5
5
  steps: 10
6
- model: google/gemini-3.5-flash
6
+ model: deepseek/deepseek-v4-flash
7
7
  temperature: 0.35
8
8
  frequency_penalty: 0.5
9
9
  presence_penalty: 0.2
@@ -2,7 +2,7 @@
2
2
  description: Limpia Docker y realiza el despliegue local del sistema
3
3
  mode: subagent
4
4
  hidden: true
5
- model: google/gemini-3.5-flash
5
+ model: deepseek/deepseek-v4-flash
6
6
  temperature: 0.1
7
7
  tools:
8
8
  write: true
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Coordinador principal del flujo SDD y del stack cerrado
3
3
  mode: primary
4
- model: google/gemini-3.5-flash
4
+ model: deepseek/deepseek-v4-flash
5
5
  temperature: 0.1
6
6
  tools:
7
7
  write: false
@@ -2,7 +2,7 @@
2
2
  description: Realiza una auditoría/revisión de código contra el contrato y el linter
3
3
  mode: subagent
4
4
  hidden: false
5
- model: google/gemini-3.5-flash
5
+ model: deepseek/deepseek-v4-flash
6
6
  temperature: 0.1
7
7
  tools:
8
8
  write: false
@@ -2,7 +2,7 @@
2
2
  description: Redacta y valida contratos OpenAPI e interfaces en specs/
3
3
  mode: subagent
4
4
  hidden: true
5
- model: google/gemini-3.5-flash
5
+ model: deepseek/deepseek-v4-flash
6
6
  temperature: 0.1
7
7
  tools:
8
8
  write: true
@@ -3,7 +3,7 @@ description: Diseña y corre pruebas unitarias, integración y visuales (Playwri
3
3
  mode: subagent
4
4
  hidden: true
5
5
  steps: 15
6
- model: google/gemini-3.5-flash
6
+ model: deepseek/deepseek-v4-flash
7
7
  temperature: 0.35
8
8
  frequency_penalty: 0.5
9
9
  presence_penalty: 0.2
@@ -26,7 +26,9 @@ Cuando el estado del sistema tiene `loopMode === true` (activado mediante el com
26
26
  Para optimizar el tiempo de desarrollo, garantizar una experiencia visual premium y evitar la invención de layouts o formularios comunes desde cero:
27
27
  - **Prioridad de Bloques**: Al diseñar cualquier interfaz de usuario (Layouts, Dashboards, Paneles de Control, Vistas de Configuración, Páginas de Autenticación, Tablas de Datos, Gráficos), los agentes **deben** buscar y utilizar de forma prioritaria los bloques prehechos del registro oficial `@shadcn` (como `dashboard-01`, `sidebar-01` al `16`, `login-01` al `05`, `signup-01` al `05`).
28
28
  - **Búsqueda Proactiva**: El Spec-Writer **debe** consultar el registro utilizando las herramientas del MCP `shadcn` (`shadcn_search_items_in_registries`, `shadcn_list_items_in_registries`) al redactar el contrato (F1) para identificar qué bloques se ajustan a la necesidad, y declararlos en `frontend.components` y `files_affected` de `contract.json`. Además, el Spec-Writer **debe** invocar `shadcn_view_items_in_registries` sobre los bloques complejos seleccionados para inspeccionar por adelantado sus archivos, rutas y dependencias inyectadas por defecto, anticipando cualquier colisión de ruteo y documentándolo con precisión en el contrato.
29
- - **Inyección Zero-Touch y Migración Física en Fase A**: El Coder (F2) **debe** instalar el bloque usando `npx shadcn@latest add <block-name>`. Los archivos se descargarán en `src/components/blocks/<block-name>/`. Queda **estrictamente prohibido** importar el `page.tsx` del bloque como un simple componente hijo (ej: `return <BlockPage />` desde la raíz de la app), ya que esto rompe el router, layouts y metadata de Next.js. El Coder debe **copiar íntegramente el contenido del código** de `src/components/blocks/<block-name>/page.tsx` hacia el `page.tsx` de la ruta destino, y **reescribir todos los imports relativos** de componentes y datos locales (ej. `./components/...` o `./data.json`) para usar aliases absolutos que apunten a la ruta física descargada por Shadcn (ej. `@/components/blocks/<block-name>/components/...` o `@/components/blocks/<block-name>/data.json`). El archivo de datos locales `data.json` debe preservarse e importarse para garantizar un renderizado visual clonado perfecto.
29
+ - **Inyección Zero-Touch y Preservación del Bloque en Fase A (MANDATORIO)**: El Coder (F2) **debe** instalar el bloque usando `npx shadcn@latest add <block-name>`. La CLI inteligente de Shadcn colocará automáticamente el archivo de página (ej. `src/app/dashboard/page.tsx` o `src/app/page.tsx`) y los componentes y datos locales asociados (ej. `src/components/` o `src/app/dashboard/data.json`) en las carpetas de producción correctas listas para renderizar.
30
+ - **No realizar migraciones físicas o reescrituras de imports artificiales**: Si la CLI ya colocó los archivos en sus rutas funcionales de producción de manera nativa, queda **estrictamente prohibido** mover los archivos a carpetas artificiales (como `src/components/blocks/...`) o reescribir sus imports usando alias complejos. Esto rompe la integración de Shadcn y destruye la sincronización de estilos y gráficos en modo oscuro. ¡Conserva el esqueleto tal como lo instala la CLI!
31
+ - **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.
30
32
  - **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.
31
33
  - **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.
32
34
 
@@ -72,3 +74,9 @@ Para optimizar el diseño, evitar cambios de arquitectura estructurales a mitad
72
74
  Para mantener la limpieza y disciplina en la ventana de contexto de la sesión:
73
75
  - **Orquestador No-Coder:** El orquestador principal (`sdd-orchestrator`) tiene estrictamente prohibido usar herramientas de edición (`edit` o `write`) para modificar código de producción o archivos de test.
74
76
  - **Rollback Disciplinado:** Si en la fase `F3_VERIFICATION` el linter o los tests reportan errores, el orquestador **debe** transicionar el estado a `F2_IMPLEMENTATION` mediante `sdd_core_set_phase` y re-invocar al subagente experto (`sdd-coder`) para que realice la corrección cleanly. No se permiten parches rápidos a mitad de fase de test.
77
+
78
+ ## 9. Segmentación de Specs y Compilación Atómica (Evitar Coder-Exhaustion)
79
+ Para evitar que los subagentes se queden sin pasos (step/token exhaustion) o acumulen errores difíciles de depurar al final de la sesión:
80
+ - **Regla de Micro-Specs:** Si una funcionalidad requiere implementar múltiples vistas complejas o formularios densos, el Spec-Writer **debe** dividirla obligatoriamente en specs incrementales secuenciales de máximo 3 componentes principales por contrato. No intentes implementar todo un panel de administración en una sola iteración de contrato.
81
+ - **Compilación Atómica:** El Coder **debe** implementar y compilar exitosamente cada archivo de forma individual antes de escribir el siguiente. Está estrictamente prohibido escribir todos los componentes de golpe sin ejecutar validaciones intermedias de TypeScript (`tsc --noEmit`).
82
+ - **Verificación Temprana de Dependencias:** El Coder **debe** comprobar en el primer paso de F2 que dependencias de pruebas críticas como `@testing-library/dom` estén correctamente instaladas en proyectos React 19 para evitar fallos intermitentes de tipado en Vitest.
@@ -77,12 +77,11 @@ Utiliza las plantillas y bloques existentes de Shadcn como el estándar absoluto
77
77
 
78
78
  Para garantizar interfaces de usuario premium y visualmente idénticas a los demos oficiales de Shadcn, se debe seguir de manera mandatoria la **Metodología de Arquitectura Block-First**:
79
79
 
80
- 1. **El Bloque es el Esqueleto Absoluto (Fase A - Inyección Pura y Migración Física)**:
80
+ 1. **El Bloque es el Esqueleto Absoluto (Fase A - Inyección Pura y Preservación de Estructura)**:
81
81
  - El Coder (F2) **debe** instalar el bloque de Shadcn correspondiente mediante la CLI (`npx shadcn@latest add <block-name>`).
82
- - El bloque se descargará en `src/components/blocks/<block-name>/`. El Coder tiene **estrictamente prohibido** importar el `page.tsx` del bloque como un simple componente hijo (ej: `return <BlockPage />` desde la raíz de la app), ya que esto rompe la estructura del router de Next.js, layouts y metadata.
83
- - **Acción Obligatoria**: El Coder debe **copiar el contenido íntegro del código** de `src/components/blocks/<block-name>/page.tsx` hacia el `page.tsx` de tu ruta destino (por ejemplo, `src/app/page.tsx` o `src/app/dashboard/page.tsx`).
84
- - **Corrección de Imports de forma Manual**: Al mover el código de la ruta de componentes al App Router de Next.js, los imports relativos en ese archivo se romperán. El Coder tiene la obligación de **reescribir todos los imports relativos de componentes e información locales** (ej. `./components/app-sidebar` o `./data.json`) para usar aliases absolutos que apunten a la ubicación física descargada por Shadcn (ej. `@/components/blocks/<block-name>/components/app-sidebar` o `@/components/blocks/<block-name>/data.json`).
85
- - **Preservación de Datos Mock/Dummy**: El archivo de datos del bloque (por ejemplo, `data.json` o constantes internas) **debe ser preservado e importado de manera intacta** durante esta Fase A para garantizar que la vista renderice con datos idénticos al demo original en el navegador.
82
+ - La CLI de Shadcn colocará automáticamente la página del bloque (ej: `src/app/dashboard/page.tsx`) y los componentes y datos asociados en las ubicaciones de producción correctas de tu proyecto.
83
+ - **Acción Obligatoria / Prohibición de Migración**: Queda **estrictamente prohibido** mover los archivos del bloque a carpetas artificiales (como `src/components/blocks/...`) o reescribir manualmente sus imports si la CLI ya los ha ubicado en sus posiciones funcionales definitivas. Esto evita errores sutiles de compilación, rotura de imports y degradación de los estilos de modo oscuro en gráficos de Recharts.
84
+ - **Preservación de Datos Mock/Dummy**: El archivo de datos del bloque (por ejemplo, `data.json` o constantes locales) **debe ser preservado e importado de manera intacta en su ruta nativa** durante esta Fase A para garantizar que la vista renderice con datos idénticos al demo original en el navegador.
86
85
  - **Meta**: Al terminar la Fase A, la aplicación debe renderizarse de manera *pixel-perfect* (idéntica) al demo oficial de Shadcn en local, sin un solo error de compilación o de imports rotos.
87
86
 
88
87
  2. **Sustitución de Datos Atómica (Fase B - Conexión de Lógica)**:
@@ -99,6 +99,59 @@ function detectPythonPackageManager(root: string): "uv" | "pip" {
99
99
  }
100
100
  }
101
101
 
102
+ const DEFAULT_PACKAGE_JSON = {
103
+ "name": "nextjs-shadcn-sdd",
104
+ "version": "0.1.0",
105
+ "private": true,
106
+ "scripts": {
107
+ "dev": "next dev",
108
+ "build": "next build",
109
+ "start": "next start",
110
+ "lint": "next lint",
111
+ "typecheck": "tsc --noEmit",
112
+ "test": "vitest run"
113
+ },
114
+ "dependencies": {
115
+ "next": "^15.1.0",
116
+ "react": "^19.0.0",
117
+ "react-dom": "^19.0.0",
118
+ "lucide-react": "^0.468.0",
119
+ "clsx": "^2.1.1",
120
+ "tailwind-merge": "^2.5.5",
121
+ "class-variance-authority": "^0.7.1",
122
+ "recharts": "^2.15.0",
123
+ "next-themes": "^0.4.4"
124
+ },
125
+ "devDependencies": {
126
+ "typescript": "^5.7.2",
127
+ "@types/node": "^20.17.9",
128
+ "@types/react": "^19.0.1",
129
+ "@types/react-dom": "^19.0.2",
130
+ "tailwindcss": "^4.0.0-alpha.30",
131
+ "@tailwindcss/postcss": "^4.0.0-alpha.30",
132
+ "postcss": "^8.4.49",
133
+ "eslint": "^9.16.0",
134
+ "eslint-config-next": "^15.1.0",
135
+ "vitest": "^2.1.8",
136
+ "@vitejs/plugin-react": "^4.3.4",
137
+ "jsdom": "^25.0.1",
138
+ "@testing-library/react": "^16.1.0",
139
+ "@testing-library/dom": "^10.4.0"
140
+ }
141
+ }
142
+
143
+ const getTemplatePackageJson = (templateDir: string): any => {
144
+ const tmplPkgPath = path.join(templateDir, "package.json")
145
+ if (fs.existsSync(tmplPkgPath)) {
146
+ try {
147
+ return JSON.parse(fs.readFileSync(tmplPkgPath, "utf8"))
148
+ } catch {
149
+ // ignore
150
+ }
151
+ }
152
+ return DEFAULT_PACKAGE_JSON
153
+ }
154
+
102
155
  // Tool: sdd_bootstrap_status
103
156
  export const bootstrap_status = tool({
104
157
  description: "Reporta el estado de bootstrap del proyecto.",
@@ -141,6 +194,8 @@ export const bootstrap_status = tool({
141
194
  }
142
195
  })
143
196
 
197
+ export const status = bootstrap_status
198
+
144
199
  // Tool: sdd_bootstrap_nextjs_shadcn
145
200
  export const bootstrap_nextjs_shadcn = tool({
146
201
  description: "Inicializa un proyecto Next.js 16 + Shadcn UI + Tailwind v4 + Vitest.",
@@ -206,10 +261,11 @@ export const bootstrap_nextjs_shadcn = tool({
206
261
 
207
262
  const userPkgPath = path.resolve(targetPath, "package.json")
208
263
  let mergedPkg: any = null
264
+ const tmplPkg = getTemplatePackageJson(templateDir)
265
+
209
266
  if (fs.existsSync(userPkgPath) && !args.force) {
210
267
  try {
211
268
  const userPkg = JSON.parse(fs.readFileSync(userPkgPath, "utf8"))
212
- const tmplPkg = JSON.parse(fs.readFileSync(path.join(templateDir, "package.json"), "utf8"))
213
269
  for (const key of ["dependencies", "devDependencies", "peerDependencies"]) {
214
270
  if (tmplPkg[key]) {
215
271
  userPkg[key] = { ...tmplPkg[key], ...(userPkg[key] || {}) }
@@ -220,10 +276,12 @@ export const bootstrap_nextjs_shadcn = tool({
220
276
  fs.writeFileSync(userPkgPath, JSON.stringify(userPkg, null, 2), "utf8")
221
277
  filesCopied.push("package.json (merged)")
222
278
  } catch (e) {
223
- copyFileSafe("package.json")
279
+ fs.writeFileSync(userPkgPath, JSON.stringify(tmplPkg, null, 2), "utf8")
280
+ filesCopied.push("package.json")
224
281
  }
225
282
  } else {
226
- copyFileSafe("package.json")
283
+ fs.writeFileSync(userPkgPath, JSON.stringify(tmplPkg, null, 2), "utf8")
284
+ filesCopied.push("package.json")
227
285
  }
228
286
 
229
287
  const userNextConfig = path.resolve(targetPath, "next.config.ts")
@@ -266,6 +324,28 @@ export const bootstrap_nextjs_shadcn = tool({
266
324
  ]
267
325
  for (const f of standardFiles) copyFileSafe(f)
268
326
 
327
+ if (targetDir !== ".") {
328
+ const configFiles = [
329
+ "tsconfig.json",
330
+ "vitest.config.ts",
331
+ "components.json",
332
+ "next.config.ts",
333
+ "eslint.config.mjs",
334
+ "postcss.config.mjs",
335
+ ]
336
+ for (const file of configFiles) {
337
+ const rootFile = path.resolve(root, file)
338
+ if (fs.existsSync(rootFile)) {
339
+ try {
340
+ fs.unlinkSync(rootFile)
341
+ filesCopied.push(`${file} (cleaned from root)`)
342
+ } catch {
343
+ // ignore
344
+ }
345
+ }
346
+ }
347
+ }
348
+
269
349
  const pm = detectPackageManager(targetPath)
270
350
 
271
351
  let installDuration = 0
@@ -9,7 +9,7 @@ DB_PATH = "/Users/wavesbyte/.local/share/opencode/opencode.db"
9
9
 
10
10
  # Escribe aquí el ID de la sesión que deseas exportar (ejemplo: "ses_1234...")
11
11
  # Si se deja vacío, el script requerirá el ID como argumento al ejecutarlo
12
- TARGET_SESSION_ID = "ses_11a7"
12
+ TARGET_SESSION_ID = "ses_119a"
13
13
 
14
14
 
15
15
  def format_timestamp(ts):
package/opencode.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "permission": {
7
7
  "webfetch": "deny"
8
8
  },
9
- "model": "google/gemini-3.5-flash"
9
+ "model": "deepseek/deepseek-v4-flash"
10
10
  }
11
11
  },
12
12
  "permission": {
@@ -43,7 +43,7 @@
43
43
  "./.opencode/oh-my-design/packages/mcp/dist/index.mjs"
44
44
  ],
45
45
  "enabled": true,
46
- "purpose": "Busca, consulta y aplica temas de dise\u00f1o (Toss, Stripe, Supabase, etc.)."
46
+ "purpose": "Busca, consulta y aplica temas de diseño (Toss, Stripe, Supabase, etc.)."
47
47
  },
48
48
  "shadcn": {
49
49
  "type": "local",
@@ -76,7 +76,7 @@
76
76
  "--isolated"
77
77
  ],
78
78
  "enabled": true,
79
- "purpose": "Ejecuta pruebas de regresi\u00f3n visual y capturas de pantalla de Playwright."
79
+ "purpose": "Ejecuta pruebas de regresión visual y capturas de pantalla de Playwright."
80
80
  },
81
81
  "next-devtools": {
82
82
  "type": "local",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zugzbot",
3
- "version": "1.0.41",
3
+ "version": "1.0.43",
4
4
  "description": "Fácil instalador del arnés SDD de Zugzbot para proyectos OpenCode",
5
5
  "type": "module",
6
6
  "bin": {