boosterarena-mcp 0.3.5 → 0.3.6

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/LEEME.md CHANGED
@@ -57,7 +57,7 @@ borrador y tú decides cuándo se publica.
57
57
 
58
58
  **Contenido** — poner texto, imágenes, figuras y dibujos de la biblioteca (más de 3.000
59
59
  ilustraciones y 280 fondos, que se buscan por nombre en español o inglés), y animaciones Lottie
60
- (`poner_lottie`: de la galería de Booster o por URL) y videos de YouTube, Vimeo, Drive o Loom (`poner_video`, con el enlace normal). El fondo puede ser una imagen tuya
60
+ (`poner_lottie`: de la galería de Booster o por URL) y videos de YouTube, Vimeo, Drive o Loom (`poner_video`, con el enlace normal). Con `exacto_o_nada` en `poner_lottie`/`poner_dibujo` no se conforma con un parecido. `cambiar_estilo` pone a cualquier objeto una ENTRADA al aparecer (`entrada`: pop, bounce, zoom…, con `entrada_retraso`) y a imágenes, animaciones, emojis y figuras un MOVIMIENTO en bucle (`movimiento`: float, bounce, swing…). El fondo puede ser una imagen tuya
61
61
  (`poner_fondo` con `url`), y cada capa puede llevar el suyo (`capa` en `poner_fondo`, o `fondo`
62
62
  en `nueva_capa`).
63
63
 
package/dist/nucleo.mjs CHANGED
@@ -1647,7 +1647,9 @@ function construirCatalogo(opts) {
1647
1647
  tamano: num("Tama\xF1o de letra en p\xEDxeles sobre 1080."),
1648
1648
  efecto: str("Efecto de COLOR de las letras. Ojo: el ne\xF3n pinta las letras del color DEL EFECTO, as\xED que \xABtexto blanco con ne\xF3n\xBB es color blanco Y color_efecto blanco.", { enum: efectosColor }),
1649
1649
  color_efecto: str("Color del efecto en hex: el brillo del ne\xF3n, la sombra, el borde, el bloque. Si no lo mandas, cada efecto usa el suyo."),
1650
- movimiento: str("Efecto de MOVIMIENTO.", { enum: efectosMov }),
1650
+ movimiento: str("Efecto de MOVIMIENTO en bucle. En textos, las letras. En im\xE1genes, animaciones, emojis y figuras, el objeto entero en el \u25B6 Player: float, bounce, pulse, heartbeat, swing, glide, shake, orbit, elastic (wave y sweep son solo de texto). none lo quita.", { enum: efectosMov }),
1651
+ entrada: str("Animaci\xF3n de ENTRADA del objeto al aparecer en el \u25B6 Player (al empezar el slide o al abrirse su capa). none la quita.", { enum: ["none", "pop", "bounce", "zoom", "fade", "up", "drop", "left", "right", "spin"] }),
1652
+ entrada_retraso: num("Segundos de espera antes de la entrada (0\u201330), para que los objetos entren uno tras otro: 0, 0.4, 0.8\u2026"),
1651
1653
  peso: num("Grosor de la letra, 400 a 900."),
1652
1654
  fuente: FUENTE,
1653
1655
  mayusculas: bool("TODO EN MAY\xDASCULAS (o false para quitarlo)."),
@@ -1723,6 +1725,7 @@ function conLoDelMcp(lista2, fn) {
1723
1725
  recolocar.y = num("Nuevo borde superior en %. Tambi\xE9n puede quedar fuera del slide, como `x`.");
1724
1726
  props("poner_figura").alto = num("Alto en % del alto del slide, independiente del ancho. Para los paneles de capa: una elipse blanca de w 82 \xD7 alto 77, o un rect de 83 \xD7 71. Sin esto, la figura guarda su proporci\xF3n de siempre.");
1725
1727
  recolocar.alto = num("Nuevo alto en %: para cajas (Revelador, Ciclo, QR\u2026), zonas calientes y FIGURAS, independiente del ancho.");
1728
+ props("poner_dibujo").exacto_o_nada = bool("true = si la biblioteca no tiene uno que sea EXACTAMENTE lo que buscas, no pone nada y te dice los parecidos. Sin esto se pone el m\xE1s cercano.");
1726
1729
  props("cambiar_estilo").gris_al_tocar = bool("true = en el \u25B6 Player, al tocar el objeto se vuelve gris (y otro toque le devuelve el color). Le dice al coach qu\xE9 botones ya us\xF3. false lo quita.");
1727
1730
  const i = lista2.findIndex((t) => t.function.name === "poner_emoji");
1728
1731
  lista2.splice(i + 1, 0, fn(
@@ -1735,7 +1738,8 @@ function conLoDelMcp(lista2, fn) {
1735
1738
  w: W,
1736
1739
  capa: CAPA,
1737
1740
  busca: str('Qu\xE9 animaci\xF3n buscar en la galer\xEDa, en espa\xF1ol, ingl\xE9s o portugu\xE9s: "regalo", "trofeo", "estrella", "altavoz".'),
1738
- url: str("En vez de `busca`: la URL https:// de un Lottie .json (lottie.host, o uno subido).")
1741
+ url: str("En vez de `busca`: la URL https:// de un Lottie .json (lottie.host, o uno subido)."),
1742
+ exacto_o_nada: bool("true = si no hay uno que sea EXACTAMENTE lo que buscas, no pone nada y te dice los parecidos, para que elijas otra palabra. Sin esto se pone el m\xE1s cercano.")
1739
1743
  }, ["ref", "x", "y", "w"])
1740
1744
  ));
1741
1745
  lista2.splice(i + 2, 0, fn(
@@ -3398,6 +3402,10 @@ El ref "${refBase}" es el rengl\xF3n grande; cada uno es tambi\xE9n "${refBase}_
3398
3402
  if (!hallado) {
3399
3403
  return no(b, `La biblioteca no tiene nada parecido a "${busca}". Prueba con otra palabra m\xE1s com\xFAn y en singular, o resu\xE9lvelo con una figura o un emoji.`);
3400
3404
  }
3405
+ if (args.exacto_o_nada === true && !hallado.exacto) {
3406
+ const par = [hallado.nombre, ...hallado.parecidos].map((x) => `"${x}"`).join(", ");
3407
+ return no(b, `No puse nada: la biblioteca no tiene un dibujo que sea "${busca}". Lo m\xE1s parecido: ${par}. Prueba otra palabra, o vuelve a pedirlo sin \`exacto_o_nada\` si alguno te sirve.`);
3408
+ }
3401
3409
  const pedido = pct(args.w, 20);
3402
3410
  const caja = cajaImagen(pedido, hallado.aspect);
3403
3411
  const el = encajar({
@@ -3454,6 +3462,10 @@ El ref "${refBase}" es el rengl\xF3n grande; cada uno es tambi\xE9n "${refBase}_
3454
3462
  if (!url && !hallada) {
3455
3463
  return no(b, `La galer\xEDa de animaciones no tiene nada parecido a "${busca}" (o no contest\xF3). Prueba otra palabra, en singular, o pon un dibujo con \`poner_dibujo\`.`);
3456
3464
  }
3465
+ if (hallada && args.exacto_o_nada === true && !hallada.exacto) {
3466
+ const par = [hallada.nombre, ...hallada.parecidos].map((x) => `"${x}"`).join(", ");
3467
+ return no(b, `No puse nada: la galer\xEDa no tiene una animaci\xF3n que sea "${busca}". Lo m\xE1s parecido: ${par}. Prueba otra palabra, o vuelve a pedirla sin \`exacto_o_nada\` si alguna te sirve.`);
3468
+ }
3457
3469
  if (hallada?.plan === "pro" && !b.premium) {
3458
3470
  return no(b, `La animaci\xF3n \xAB${hallada.nombre}\xBB es del plan Pro y esta cuenta no lo tiene. Se activa desde boosterarena.com.`);
3459
3471
  }
@@ -3860,7 +3872,9 @@ Pide \`describir("${el.widget}")\` para ver la forma exacta y vuelve a intentarl
3860
3872
  }
3861
3873
  if (txt(args.efecto)) el.effect = txt(args.efecto) === "none" ? void 0 : txt(args.efecto);
3862
3874
  Object.assign(el, colorDelEfecto(el.effect ?? "", txt(args.color_efecto), txt(args.color)));
3863
- if (txt(args.movimiento)) el.motion = txt(args.movimiento);
3875
+ if (txt(args.movimiento)) el.motion = txt(args.movimiento) === "none" && el.kind !== "text" ? void 0 : txt(args.movimiento);
3876
+ if (txt(args.entrada)) el.entrada = txt(args.entrada) === "none" ? void 0 : txt(args.entrada);
3877
+ if (typeof args.entrada_retraso === "number") el.entradaRetraso = Math.max(0, Math.min(30, args.entrada_retraso)) || void 0;
3864
3878
  if (num3(args.peso, 0) >= 400) el.weight = pesoReal(el.font, Math.round(num3(args.peso, 400)));
3865
3879
  if (typeof args.mayusculas === "boolean") el.caps = args.mayusculas || void 0;
3866
3880
  if (txt(args.align)) el.align = txt(args.align);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "boosterarena-mcp",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "El MCP de Booster: tu agente crea y edita presentaciones dentro de boosterarena.com",
5
5
  "keywords": [
6
6
  "mcp",