Plugins
Skriv dine egne plugins for at udvide OpenCode.
Plugins giver dig mulighed for at udvide OpenCode ved at tilslutte sig forskellige begivenheder og tilpasse adfærd. Du kan oprette plugins for at tilføje nye funktioner, integrere med eksterne tjenester eller ændre OpenCodes standardadfærd.
For eksempler, tjek plugins oprettet af fællesskabet.
Brug et plugin
Der er to måder at indlæse plugins på.
Fra lokale filer
Placer JavaScript- eller TypeScript-filer i plugin-mappen.
.opencode/plugins/- Plugins på projektniveau~/.config/opencode/plugins/- Globale plugins
Filer i disse mapper indlæses automatisk ved opstart.
Fra npm
Angiv npm-pakker i din konfigurationsfil.
{ "$schema": "https://opencode.ai/config.json", "plugin": ["opencode-helicone-session", "opencode-wakatime", "@my-org/custom-plugin"]}Både almindelige og omfangsrige npm-pakker understøttes.
Gennemse tilgængelige plugins i ecosystem.
Hvordan plugins installeres
npm plugins installeres automatisk ved hjælp af Bun ved opstart. Pakker og deres afhængigheder cachelagres i ~/.cache/opencode/node_modules/.
Lokale plugins indlæses direkte fra plugin-biblioteket. For at bruge eksterne pakker skal du oprette en package.json i din konfigurationsmappe (se Dependencies), eller udgive pluginnet til npm og add it to your config.
Indlæs rækkefølge
Plugins indlæses fra alle kilder, og alle hooks kører i rækkefølge. Indlæsningsrækkefølgen er:
- Global konfiguration (
~/.config/opencode/opencode.json) - Projektkonfiguration (
opencode.json) - Global plugin-mappe (
~/.config/opencode/plugins/) - Projekt plugin bibliotek (
.opencode/plugins/)
Dublerede npm-pakker med samme navn og version indlæses én gang. Et lokalt plugin og et npm plugin med lignende navne indlæses dog hver for sig.
Opret et plugin
Et plugin er et JavaScript/TypeScript modul, der eksporterer et eller flere plugin funktioner. Hver funktion modtager et kontekstobjekt og returnerer et hooks-objekt.
Afhængigheder
Lokale plugins og brugerdefinerede værktøjer kan bruge eksterne npm-pakker. Tilføj en package.json til din konfigurationsmappe med de afhængigheder, du har brug for.
{ "dependencies": { "shescape": "^2.1.0" }}OpenCode kører bun install ved opstart for at installere disse. Dine plugins og værktøjer kan derefter importere dem.
import { escape } from "shescape"
export const MyPlugin = async (ctx) => { return { "tool.execute.before": async (input, output) => { if (input.tool === "bash") { output.args.command = escape(output.args.command) } }, }}Grundlæggende struktur
export const MyPlugin = async ({ project, client, $, directory, worktree }) => { console.log("Plugin initialized!")
return { // Hook implementations go here }}Plugin-funktionen modtager:
project: Den aktuelle projektinformation.directory: Den aktuelle arbejdsmappe.worktree: Git worktree-stien.client: En opencode SDK klient til interaktion med AI.- `-: Buns shell API til udførelse af kommandoer.
TypeScript-understøttelse
For TypeScript-plugins kan du importere typer fra plugin-pakken:
import type { Plugin } from "@opencode-ai/plugin"
export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree }) => { return { // Type-safe hook implementations }}Begivenheder
Plugins kan abonnere på begivenheder som vist nedenfor i afsnittet Eksempler. Her er en liste over de forskellige arrangementer.
Kommandohændelser
command.executed
Filhændelser
file.editedfile.watcher.updated
Installationshændelser
installation.updated
LSP Begivenheder
lsp.client.diagnosticslsp.updated
Beskedhændelser
message.part.removedmessage.part.updatedmessage.removedmessage.updated
Tilladelsesbegivenheder
permission.askedpermission.replied
Serverhændelser
server.connected
Sessionsbegivenheder
session.createdsession.compactedsession.deletedsession.diffsession.errorsession.idlesession.statussession.updated
Todo-begivenheder
todo.updated
Shell-begivenheder
shell.env
Værktøjsbegivenheder
tool.execute.aftertool.execute.before
TUI Begivenheder
tui.prompt.appendtui.command.executetui.toast.show
Eksempler
Her er nogle eksempler på plugins, du kan bruge til at udvide opencode.
Send meddelelser
Send meddelelser, når visse hændelser indtræffer:
export const NotificationPlugin = async ({ project, client, $, directory, worktree }) => { return { event: async ({ event }) => { // Send notification on session completion if (event.type === "session.idle") { await $`osascript -e 'display notification "Session completed!" with title "opencode"'` } }, }}Vi bruger osascript til at køre AppleScript på macOS. Her bruger vi det til at sende notifikationer.
###.env-beskyttelse
Undgå opencode i at læse .env filer:
export const EnvProtection = async ({ project, client, $, directory, worktree }) => { return { "tool.execute.before": async (input, output) => { if (input.tool === "read" && output.args.filePath.includes(".env")) { throw new Error("Do not read .env files") } }, }}Injicer miljøvariabler
Injicer miljøvariabler i al shell-udførelse (AI-værktøjer og brugerterminaler):
export const InjectEnvPlugin = async () => { return { "shell.env": async (input, output) => { output.env.MY_API_KEY = "secret" output.env.PROJECT_ROOT = input.cwd }, }}Brugerdefinerede værktøjer
Plugins kan også tilføje brugerdefinerede værktøjer til opencode:
import { type Plugin, tool } from "@opencode-ai/plugin"
export const CustomToolsPlugin: Plugin = async (ctx) => { return { tool: { mytool: tool({ description: "This is a custom tool", args: { foo: tool.schema.string(), }, async execute(args, context) { const { directory, worktree } = context return `Hello ${args.foo} from ${directory} (worktree: ${worktree})` }, }), }, }}tool-hjælperen opretter et brugerdefineret værktøj, som opencode kan kalde. Det tager en Zod-skemafunktion og returnerer en værktøjsdefinition med:
description: Hvad værktøjet gørargs: Zod-skema for værktøjets argumenterexecute: Funktion, der kører, når værktøjet kaldes
Dine tilpassede værktøjer vil være tilgængelige for opencode sammen med indbyggede værktøjer.
Logning
Brug client.app.log() i stedet for console.log til struktureret logning:
export const MyPlugin = async ({ client }) => { await client.app.log({ body: { service: "my-plugin", level: "info", message: "Plugin initialized", extra: { foo: "bar" }, }, })}Niveauer: debug, info, warn, error. Se SDK documentation for detaljer.
Komprimeringskroge
Tilpas konteksten inkluderet, når en session komprimeres:
import type { Plugin } from "@opencode-ai/plugin"
export const CompactionPlugin: Plugin = async (ctx) => { return { "experimental.session.compacting": async (input, output) => { // Inject additional context into the compaction prompt output.context.push(`## Custom Context
Include any state that should persist across compaction:- Current task status- Important decisions made- Files being actively worked on`) }, }}experimental.session.compacting krogen affyres, før LLM genererer en fortsættelsesoversigt. Brug den til at injicere domænespecifik kontekst, som standardkomprimeringsprompten ville gå glip af.
Du kan også erstatte komprimeringsprompten helt ved at indstille output.prompt:
import type { Plugin } from "@opencode-ai/plugin"
export const CustomCompactionPlugin: Plugin = async (ctx) => { return { "experimental.session.compacting": async (input, output) => { // Replace the entire compaction prompt output.prompt = `You are generating a continuation prompt for a multi-agent swarm session.
Summarize:1. The current task and its status2. Which files are being modified and by whom3. Any blockers or dependencies between agents4. The next steps to complete the work
Format as a structured prompt that a new agent can use to resume work.` }, }}Når output.prompt er indstillet, erstatter den standardkompressionsprompten fuldstændigt. output.context-arrayet ignoreres i dette tilfælde.