Plugins de Genesis
Un plugin añade herramientas nuevas a Genesis. Aparecen en Inicio (con formulario automático),
en el Asistente, en la CLI (genesis run ext.<plugin>.<herramienta>) y en los trabajos con
barra de progreso y botón de cancelar.
Técnicamente un plugin es un servidor MCP por stdio empaquetado con un manifiesto. Los SDK de Genesis implementan el protocolo en un solo archivo sin dependencias, así que tu código solo declara herramientas.
#Crear uno en un minuto
genesis plugin new "Mis efectos" # JavaScript / TypeScript (Node 18+)genesis plugin new "Mis efectos" --lang python # Python 3.8+También desde Ajustes → Plugins → Crear plugin. Se crea una carpeta con el manifiesto, el SDK y una herramienta de ejemplo. Edítala e instálala:
genesis plugin install ./mis-efectosgenesis run ext.mis-efectos.saludar nombre=AnaReinstalar la misma carpeta actualiza el plugin.
#Manifiesto: genesis-plugin.json
{
"id": "mis-efectos",
"name": "Mis efectos",
"version": "1.0.0",
"description": "Qué hace, en una frase.",
"author": "Tu nombre",
"homepage": "https://…",
"server": {
"command": "node",
"args": ["{plugin_dir}/index.mjs"],
"env": { "MI_VARIABLE": "valor" }
}
}| Campo | |
|---|---|
id |
Minúsculas, números y guiones. Las herramientas se llaman ext.<id>.<herramienta>. |
server.command |
node, python3 (en Windows se usa python o py si hace falta), cualquier ejecutable del PATH, o una ruta relativa como ./bin/mi-servidor. |
{plugin_dir} |
Se sustituye por la carpeta instalada del plugin en args y env. El proceso arranca con esa carpeta como directorio de trabajo. |
#SDK de JavaScript / TypeScript
genesis-plugin.mjs (+ genesis-plugin.d.ts con los tipos):
import { definePlugin } from "./genesis-plugin.mjs";
definePlugin({
name: "mis-efectos",
version: "1.0.0",
tools: [
{
name: "invertir",
title: "Invertir texto",
description: "Da la vuelta a un texto.",
input: {
type: "object",
properties: { texto: { type: "string", format: "multiline" } },
required: ["texto"],
},
async run({ texto }, { progress, signal }) {
progress(0.5, "Invirtiendo…");
if (signal.aborted) throw new Error("cancelado");
return { resultado: [...texto].reverse().join("") };
},
},
],
});#SDK de Python
genesis_plugin.py:
from genesis_plugin import Plugin
plugin = Plugin("mis-efectos", "1.0.0")
@plugin.tool(
description="Da la vuelta a un texto.",
input={"type": "object", "properties": {"texto": {"type": "string"}}, "required": ["texto"]},
)
def invertir(args, ctx):
ctx.progress(0.5, "Invirtiendo…")
if ctx.cancelled:
raise RuntimeError("cancelado")
return {"resultado": args["texto"][::-1]}
plugin.run()Cada llamada corre en su propio hilo, así que una herramienta lenta no bloquea a las demás.
#Entradas y resultados
inputes un JSON Schema. Genesis dibuja el formulario a partir de él:enumcrea un desplegable,booleanuna casilla,number/integerun campo numérico yarrayde rutas un selector de archivos múltiple.- Pistas para cadenas:
"format": "path"añade un botón para elegir archivo,"save-path"uno para elegir dónde guardar, y"multiline"un área de texto. - Devuelve un objeto (resultado estructurado, que el Asistente y otras herramientas pueden usar), un texto o nada. Lanzar un error lo muestra como fallo de la herramienta.
- Para trabajar con archivos, recibe y devuelve rutas: Genesis abre los resultados en sus editores y la galería.
progress(fracción 0..1, mensaje)actualiza la barra del trabajo; cuando el usuario cancela,signal(JS) octx.cancelled(Python) lo indica.
#Distribuir
Comprime la carpeta en un .zip (con el manifiesto en la raíz o dentro de una única carpeta) y
compártela. Se instala desde Ajustes → Plugins → Instalar .zip o con
genesis plugin install mis-efectos.zip. Si tu plugin necesita dependencias (node_modules,
paquetes de Python), inclúyelas en el zip o vendorízalas: Genesis no ejecuta instaladores de
paquetes.
Los plugins se guardan en <datos>/plugins/<id>; genesis plugin list, enable, disable y
remove los gestionan.
Seguridad: un plugin es un programa que se ejecuta en tu equipo con tus permisos. Instala solo los que vengan de fuentes de confianza.
#Ejemplos
examples/plugins/texto— JavaScript: estadísticas de texto y nombres de archivo seguros.examples/plugins/checksum— Python: huellas SHA-256/MD5 de archivos con progreso y cancelación.