Ir al contenido
angel.library

Plugins — código, no manifest

A diferencia de Claude Code (plugin = manifest que empaqueta skills+agentes+hooks+MCP, con marketplace propio), un plugin de OpenCode es directamente código — una función async que devuelve un objeto de hooks. No hay marketplace: se distribuye por npm o copiando el archivo.

.opencode/plugins/mi-plugin.ts → proyecto
~/.config/opencode/plugins/mi-plugin.ts → global
.opencode/plugins/format-on-save.ts
import type { Plugin } from "@opencode-ai/plugin"
export const FormatOnSave: Plugin = async ({ $ }) => {
return {
"file.edited": async ({ file }) => {
if (file.endsWith(".ts") || file.endsWith(".tsx")) {
await $`npx prettier --write ${file}`
}
}
}
}
HookCuándo corre
tool.execute.before / .afterAntes/después de que una tool corra
file.editedDespués de editar un archivo
session.created / .idleAl crear una sesión / cuando queda inactiva
message.updatedCuando llega un mensaje nuevo
tui.toast.showMostrar una notificación en la TUI
opencode.json
{
"plugin": ["mi-plugin-de-npm"]
}

OpenCode instala el paquete automáticamente (con Bun) en el cache local al arrancar.

MecanismoCómo se distribuye
Archivo local.opencode/plugins/*.ts, copiado a mano
Paquete npmListado en opencode.json → plugin
  • Esto es lo más distinto de Claude Code de todo el sitio: aquí no hay .claude-plugin/plugin.json ni /plugin install — es control total vía código, a cambio de no tener un catálogo central para descubrir plugins de otros.
  • Si vienes de Claude Code buscando “dónde configuro un hook declarativo en JSON” — no existe, la funcionalidad equivalente vive aquí, como código.