package.json), manifiestos (openclaw.plugin.json), entradas de configuración y esquemas de configuración.
Metadatos del paquete
Elpackage.json necesita un campo openclaw que indique al sistema de plugins qué proporciona el plugin:
- Plugin de canal
- Plugin de proveedor / base de referencia de ClawHub
La publicación externa en ClawHub requiere
compat y build. Los fragmentos canónicos de publicación se encuentran en docs/snippets/plugin-publish/.Campos de openclaw
string[]
Archivos de punto de entrada (relativos a la raíz del paquete). Entradas de código fuente válidas para el desarrollo en espacios de trabajo y checkouts de Git.
string[]
Archivos JavaScript compilados equivalentes para
extensions, preferidos cuando OpenClaw carga un paquete npm instalado. Consulte Puntos de entrada del SDK para conocer el orden de resolución entre código fuente y código compilado.string
Entrada ligera exclusiva para la configuración (opcional).
string
Archivo JavaScript compilado equivalente para
setupEntry. Requiere que también se establezca setupEntry.object
Identidad de plugin alternativa de
{ id, label }, utilizada cuando un plugin no tiene metadatos de canal o proveedor de los que derivar un identificador o una etiqueta.object
Metadatos del catálogo de canales para las superficies de configuración, selección, inicio rápido y estado.
object
Indicaciones de instalación:
npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery, requiredPlatformPackages.object
Indicadores de comportamiento durante el inicio.
object
Intervalo de versiones de
pluginApi compatible con este plugin. Obligatorio para publicaciones externas en ClawHub.Los identificadores de proveedores (
providers: string[]) son metadatos del manifiesto, no metadatos del paquete. Declárelos en openclaw.plugin.json, no aquí; consulte Manifiesto del plugin.openclaw.channel
openclaw.channel son metadatos de paquete ligeros para el descubrimiento de canales y las superficies de configuración antes de cargar el entorno de ejecución.
Campos de configuración propiedad del canal
Los plugins de canal deben definir los campos de configuración una sola vez en el código del entorno de ejecución mediantedefineChannelSetupContract(...) y publicar la proyección serializable correspondiente en openclaw.channel.setup.fields. La definición del entorno de ejecución infiere el tipo de entrada local del plugin, analiza tanto los valores guiados como los no interactivos y mantiene las claves específicas del canal fuera de los tipos del núcleo. Los metadatos del paquete permiten que openclaw channels add <channel-id> --help y openclaw channels add --channel <channel-id> --help descubran únicamente las opciones del canal seleccionado sin cargar el plugin.
string, boolean, integer, string-list y choice. Utilice sensitive: true para las credenciales. Cada clave de campo debe ser igual al nombre de atributo en camelCase de su opción larga de la CLI, incluida cualquier forma negada, como apiToken para --api-token. Los campos booleanos pueden añadir cli.negatedFlags cuando se necesiten tanto las formas positivas como las formas --no-*. channel, account y el name de visualización de la cuenta siguen formando la envoltura de control compartida.
El adaptador publicado setup/ChannelSetupInput continúa disponible para los plugins externos existentes. Los plugins nuevos deben exponer setupContract; OpenClaw siempre lo prefiere cuando ambos están presentes.
Ejemplo:
exposure admite:
configured: incluye el canal en las superficies de listado de configuración/estadosetup: incluye el canal en los selectores interactivos de configuracióndocs: marca el canal como visible públicamente en las superficies de documentación/navegación
openclaw.install
openclaw.install son metadatos del paquete, no metadatos del manifiesto.
Comportamiento de la incorporación
Comportamiento de la incorporación
La incorporación interactiva utiliza
openclaw.install para las superficies de instalación bajo demanda: si el plugin expone opciones de autenticación del proveedor o metadatos de configuración/catálogo del canal antes de que se cargue el entorno de ejecución, la incorporación puede solicitar la instalación desde ClawHub, npm o una fuente local, instalar o habilitar el plugin y, a continuación, continuar con el flujo seleccionado. Las opciones de ClawHub utilizan clawhubSpec y se prefieren cuando están presentes; las opciones de npm requieren metadatos de catálogo de confianza con un npmSpec de registro (las versiones exactas y expectedIntegrity son fijaciones opcionales que se aplican durante la instalación/actualización cuando se establecen). Mantenga «qué mostrar» en openclaw.plugin.json y «cómo instalarlo» en package.json.Aplicación de minHostVersion
Aplicación de minHostVersion
Si se establece
minHostVersion, se aplica tanto durante la instalación como al cargar registros de manifiestos no incluidos. Los hosts antiguos omiten los plugins externos; se rechazan las cadenas de versión no válidas. Se presupone que los plugins de fuente incluidos tienen la misma versión que el checkout del host.Instalaciones de npm con versión fijada
Instalaciones de npm con versión fijada
Para las instalaciones de npm con versión fijada, mantenga la versión exacta en
npmSpec y añada la integridad esperada del artefacto:Ámbito de allowInvalidConfigRecovery
Ámbito de allowInvalidConfigRecovery
allowInvalidConfigRecovery no es una omisión general para configuraciones dañadas. Solo permite una recuperación limitada de plugins incluidos, de modo que la reinstalación/configuración pueda reparar restos conocidos de actualizaciones, como la ausencia de la ruta de un plugin incluido o una entrada channels.<id> obsoleta para ese mismo plugin. Si la configuración está dañada por motivos no relacionados, la instalación sigue fallando de forma cerrada e indica al operador que ejecute openclaw doctor --fix.Carga completa diferida
Los plugins de canal pueden optar por la carga diferida mediante:setupEntry durante la fase de inicio previa a la escucha, incluso para los canales ya configurados. La entrada completa se carga después de que el Gateway comienza a escuchar.
Si la entrada de configuración/completa registra métodos RPC del Gateway, manténgalos bajo un prefijo específico del plugin. Los espacios de nombres administrativos reservados del núcleo (config.*, exec.approvals.*, wizard.*, update.*) siguen siendo propiedad del núcleo y siempre se normalizan a operator.admin.
Manifiesto del plugin
Cada plugin nativo debe incluir unopenclaw.plugin.json en la raíz del paquete. OpenClaw lo utiliza para validar la configuración sin ejecutar el código del plugin.
channels (y, para los plugins de proveedor, añada providers):
Publicación en ClawHub
Las Skills y los paquetes de plugins utilizan comandos de publicación de ClawHub distintos. Para los paquetes de plugins, utilice el comando específico para paquetes:clawhub skill publish <path> es un comando distinto para publicar una carpeta de Skills, no un paquete de plugin. Consulte Publicación en ClawHub.Entrada de configuración
setup-entry.ts es una alternativa ligera a index.ts que OpenClaw carga cuando solo necesita superficies de configuración (incorporación, reparación de la configuración e inspección de canales deshabilitados):
defineBundledChannelSetupEntry(...) de openclaw/plugin-sdk/channel-entry-contract en lugar de defineSetupPluginEntry(...). Ese contrato incluido también admite una exportación opcional runtime para que el cableado del entorno de ejecución durante la configuración pueda seguir siendo ligero y explícito.
Cuándo utiliza OpenClaw setupEntry en lugar de la entrada completa
Cuándo utiliza OpenClaw setupEntry en lugar de la entrada completa
- El canal está deshabilitado, pero necesita superficies de configuración/incorporación.
- El canal está habilitado, pero no está configurado.
- La carga diferida está habilitada (
deferConfiguredChannelFullLoadUntilAfterListen).
Qué debe registrar setupEntry
Qué debe registrar setupEntry
- El objeto del plugin de canal (mediante
defineSetupPluginEntry). - Cualquier ruta HTTP necesaria antes de que el Gateway comience a escuchar.
- Cualquier método del Gateway necesario durante el inicio.
config.* o update.*.Qué NO debe incluir setupEntry
Qué NO debe incluir setupEntry
- Registros de CLI.
- Servicios en segundo plano.
- Importaciones pesadas del entorno de ejecución (criptografía, SDK).
- Métodos del Gateway que solo son necesarios después del inicio.
Importaciones limitadas de asistentes de configuración
Para las rutas críticas exclusivas de configuración, prefiera las interfaces limitadas de asistentes de configuración en lugar del módulo generalplugin-sdk/setup cuando solo necesite una parte de la superficie de configuración:
Utilice la interfaz más amplia
plugin-sdk/setup cuando necesite el conjunto completo de herramientas compartidas de configuración, incluidos asistentes para aplicar parches a la configuración, como moveSingleAccountChannelSectionToDefaultAccount(...).
Utilice createSetupTranslator(...) para el texto fijo del asistente de configuración. Utiliza el primer valor no vacío de OPENCLAW_LOCALE, LC_ALL, LC_MESSAGES y LANG, en ese orden, y después recurre al inglés. Establezca OPENCLAW_LOCALE=en para indicar una sustitución explícita en inglés. Mantenga el texto de configuración específico del plugin en código propiedad del plugin y utilice las claves del catálogo compartido únicamente para etiquetas comunes de configuración, texto de estado y texto de configuración de plugins oficiales incluidos.
Los adaptadores de parches de configuración siguen siendo seguros al importarse en rutas críticas. La consulta de la superficie del contrato de promoción de cuentas únicas incluidas es diferida, por lo que importar plugin-sdk/setup-runtime no carga anticipadamente el descubrimiento de superficies de contratos incluidos antes de que se utilice realmente el adaptador.
Campos de entrada de configuración propiedad del canal
ChannelSetupInput es un contenedor genérico compartido por los invocadores de configuración y los
plugins de canal. Sus campos con tipado permanente son name, token, tokenFile,
useEnv, allowFrom y defaultTo. Aun pueden existir claves adicionales propiedad del plugin
en el objeto de entrada del entorno de ejecución, pero el tipo compartido no declara una
firma de índice. Cada plugin debe declarar y delimitar sus propios campos de configuración o
validarlos mediante un esquema propiedad del plugin en el límite del adaptador:
ChannelSetupInput permanecen tipados temporalmente para mantener la compatibilidad con fuentes externas.
Están obsoletos. Una revisión del registro del 2026-07-22 de 426 plugins de canal publicados fuera del árbol
eliminó 21 campos sin lectores y conservó 22 con lectores conocidos.
Cada campo conservado se elimina en cuanto ningún plugin publicado lo lee;
no se requiere ningún límite de versión. Los plugins nuevos e incluidos no deben depender de este
nivel; deben declarar localmente los campos que poseen.
Promoción de cuenta única propiedad del canal
Cuando un canal pasa de una configuración de nivel superior de una sola cuenta achannels.<id>.accounts.*, el comportamiento compartido predeterminado mueve los valores promovidos con ámbito de cuenta a accounts.default.
Cada plugin de canal puede ampliar o restringir esa promoción mediante su adaptador de configuración:
singleAccountKeysToMove: claves adicionales de nivel superior que deben trasladarse a la cuenta promovidanamedAccountPromotionKeys: cuando ya existen cuentas con nombre, solo estas claves se trasladan a la cuenta promovida; las claves compartidas de políticas y entrega permanecen en la raíz del canalresolveSingleAccountPromotionTarget(...): permite elegir qué cuenta existente recibe los valores promovidos
singleAccountKeysToMove indica que el contrato de promoción está completo. Declare el campo aunque sea una matriz vacía para excluirse de la promoción de claves heredadas. Los adaptadores que omiten el campo conservan un nivel de promoción anterior a la declaración, respaldado por lectores, para los plugins ya publicados. La revisión del registro del 2026-07-22 eliminó 23 claves sin dependientes publicados y conservó seis claves comunes, además de la clave exclusiva de configuración rooms. Cada clave conservada se elimina en cuanto sus lectores publicados migran a las declaraciones; no se requiere ningún límite de versión.
Declare openclaw.setupFeatures.configPromotion: true en el manifiesto del paquete del plugin cuando doctor deba cargar estas declaraciones desde el artefacto ligero de configuración incluido. La superficie del plugin exclusiva de configuración y el plugin de canal completo deben exponer las mismas declaraciones.
Al llamar a moveSingleAccountChannelSectionToDefaultAccount(...) con un plugin ya resuelto, pase su adaptador de configuración como setupSurface. Las superficies de configuración proporcionadas por el llamador tienen prioridad sobre la búsqueda cargada e incluida, lo que mantiene los plugins con ámbito o exclusivos de configuración independientes del registro global.
Matrix es el ejemplo incluido actual. Si ya existe exactamente una cuenta de Matrix con nombre, o si
defaultAccount apunta a una clave no canónica existente, como Ops, la promoción conserva esa cuenta en lugar de crear una nueva entrada accounts.default.Esquema de configuración
La configuración del plugin se valida con el esquema JSON del manifiesto. Los usuarios configuran los plugins mediante:api.pluginConfig durante el registro.
Para la configuración específica del canal, utilice en su lugar la sección de configuración del canal:
Creación de esquemas de configuración de canales
UtilicebuildChannelConfigSchema para convertir un esquema de Zod en el contenedor ChannelConfigSchema utilizado por los artefactos de configuración propiedad del plugin:
openclaw.plugin.json#channelConfigs para que las superficies del esquema de configuración, de configuración y de la interfaz de usuario puedan inspeccionar channels.<id> sin cargar código de ejecución.
Asistentes de configuración
Los plugins de canal pueden proporcionar asistentes de configuración interactivos paraopenclaw onboard. El asistente es un objeto ChannelSetupWizard en ChannelPlugin:
ChannelSetupWizard también admite textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize y más. Consulte src/setup-core.ts del plugin de Discord para ver un ejemplo incluido completo.
Indicaciones allowFrom compartidas
Indicaciones allowFrom compartidas
Para las indicaciones de la lista de permitidos de mensajes directos que solo necesitan el flujo estándar
note -> prompt -> parse -> merge -> patch, se recomienda utilizar los asistentes de configuración compartidos de openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...) y createTopLevelChannelParsedAllowFromPrompt(...).Estado estándar de configuración del canal
Estado estándar de configuración del canal
Para los bloques de estado de configuración del canal que solo varían en las etiquetas, las puntuaciones y las líneas adicionales opcionales, se recomienda utilizar
createStandardChannelSetupStatus(...) de openclaw/plugin-sdk/setup en lugar de crear manualmente el mismo objeto status en cada plugin.Superficie opcional de configuración del canal
Superficie opcional de configuración del canal
Para las superficies de configuración opcionales que solo deben aparecer en determinados contextos, utilice
createOptionalChannelSetupSurface de openclaw/plugin-sdk/channel-setup:plugin-sdk/channel-setup también expone los constructores de nivel inferior createOptionalChannelSetupAdapter(...) y createOptionalChannelSetupWizard(...) cuando solo se necesita una mitad de esa superficie de instalación opcional.El adaptador y el asistente opcionales generados se cierran de forma segura ante escrituras reales de configuración. Reutilizan un único mensaje de instalación requerida en validateInput, applyAccountConfig y finalize, y añaden un enlace a la documentación cuando se establece docsPath.Asistentes de configuración respaldados por binarios
Asistentes de configuración respaldados por binarios
Para las interfaces de configuración respaldadas por binarios, se recomienda utilizar los asistentes delegados compartidos en lugar de copiar el mismo código de conexión de binarios y estados en cada canal:
createDetectedBinaryStatus(...)para bloques de estado que solo varían en las etiquetas, las sugerencias, las puntuaciones y la detección de binarioscreateCliPathTextInput(...)para entradas de texto respaldadas por rutascreateDelegatedSetupWizardProxy(...)cuandosetupEntrynecesita reenviar de forma diferida el comportamiento de estado, preparación o finalización a un asistente completo más pesadocreateDelegatedTextInputShouldPrompt(...)cuandosetupEntrysolo necesita delegar una decisióntextInputs[*].shouldPrompt
Publicación e instalación
Plugins externos: publíquelos en ClawHub y, a continuación, instálelos:- npm
- Solo ClawHub
- Especificación de paquete npm
clawhub:, npm:, git: o npm-pack: para seleccionar la fuente de forma determinista; consulte Administrar plugins.Para las instalaciones procedentes de npm,
openclaw plugins install instala el paquete en un proyecto por plugin bajo ~/.openclaw/npm/projects con los scripts del ciclo de vida desactivados (--ignore-scripts). Mantenga los árboles de dependencias de los plugins exclusivamente en JS/TS y evite los paquetes que requieran compilaciones postinstall.El inicio del Gateway no instala las dependencias de los plugins. Los flujos de instalación de npm/git/ClawHub son responsables de la convergencia de dependencias; los plugins locales deben tener ya instaladas sus dependencias.
Contenido relacionado
- Creación de plugins — guía de introducción paso a paso
- Manifiesto del plugin — referencia completa del esquema del manifiesto
- Puntos de entrada del SDK —
definePluginEntryydefineChannelPluginEntry