Eklentiler
Kodine'un yeteneklerini kendi eklentilerinizle genişletin.
Eklentiler sayesinde Kodine’daki çeşitli olaylara bağlanabilir ve davranışı istediğiniz gibi özelleştirebilirsiniz. Yeni özellikler eklemek, harici servislerle entegre olmak veya varsayılan davranışı değiştirmek için kendi eklentilerinizi yazabilirsiniz.
Topluluğun geliştirdiği eklentilere göz atarak örnekler bulabilirsiniz.
Eklenti kullanımı
Bir eklentiyi yüklemenin iki yolu vardır.
Yerel dosyalardan
JavaScript veya TypeScript dosyalarınızı eklenti dizinine koymanız yeterli.
.kodine/plugins/- Projeye özel eklentiler~/.config/kodine/plugins/- Tüm projelerde geçerli eklentiler
Bu dizinlerdeki dosyalar başlangıçta kendiliğinden yüklenir.
npm’den
npm paketlerini yapılandırma dosyanızda belirtebilirsiniz.
{ "$schema": "https://kodine.net/config.json", "plugin": ["kodine-helicone-session", "kodine-wakatime", "@my-org/custom-plugin"]}Normal ve kapsamlı (scoped) npm paketlerinin ikisi de desteklenir.
Mevcut eklentileri Ekosistem sayfasında inceleyebilirsiniz.
Eklentiler nasıl kurulur?
npm eklentileri başlangıçta Bun aracılığıyla otomatik kurulur. Paketler ve bağımlılıkları ~/.cache/kodine/node_modules/ altında önbelleğe alınır.
Yerel eklentiler doğrudan eklenti dizininden yüklenir. Harici paket kullanmak isterseniz config dizininize bir package.json eklemeniz (bkz. Bağımlılıklar) ya da eklentiyi npm’e yayımlayıp yapılandırmanıza eklemeniz gerekir.
Yükleme sırası
Tüm kaynaklardaki eklentiler yüklenir ve kancalar sırayla çalıştırılır. Yükleme sırası şöyledir:
- Global config (
~/.config/kodine/kodine.json) - Project config (
kodine.json) - Global eklenti dizini (
~/.config/kodine/plugins/) - Proje eklenti dizini (
.kodine/plugins/)
Aynı ada ve sürüme sahip yinelenen npm paketleri yalnızca bir kez yüklenir. Buna karşılık aynı ada sahip bir yerel eklenti ile bir npm eklentisi birbirinden bağımsız olarak ayrı ayrı yüklenir.
Eklenti oluşturma
Eklenti, bir veya daha fazla eklenti fonksiyonu dışa aktaran bir JavaScript/TypeScript modülüdür. Her fonksiyon bir bağlam nesnesi alır ve bir kanca nesnesi döndürür.
Bağımlılıklar
Yerel eklentiler ve özel araçlar harici npm paketlerinden yararlanabilir. İhtiyaç duyduğunuz bağımlılıkları içeren bir package.json dosyasını config dizininize ekleyin.
{ "dependencies": { "shescape": "^2.1.0" }}Kodine başlangıçta bun install çalıştırarak bu paketleri kurar. Eklentileriniz ve araçlarınız sonrasında bunları içe aktarabilir.
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) } }, }}Temel yapı
export const MyPlugin = async ({ project, client, $, directory, worktree }) => { console.log("Plugin initialized!")
return { // Hook implementations go here }}Eklenti fonksiyonu şu parametreleri alır:
project: Geçerli projenin bilgileri.directory: Mevcut çalışma dizini.worktree: Git çalışma ağacının yolu.client: Yapay zekayla etkileşim için Kodine SDK istemcisi.$: Bun’un komut çalıştırmak için sunduğu shell API.
TypeScript desteği
TypeScript ile eklenti yazarken türleri eklenti paketinden içe aktarabilirsiniz:
import type { Plugin } from "@kodine-ai/plugin"
export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree }) => { return { // Type-safe hook implementations }}Olaylar
Eklentiler, aşağıdaki Örnekler bölümünde gösterildiği gibi olaylara abone olabilir. Kullanılabilecek olayların tam listesi aşağıdadır.
Komut Olayları
command.executed
Dosya Olayları
file.editedfile.watcher.updated
Kurulum Olayları
installation.updated
LSP Olayları
lsp.client.diagnosticslsp.updated
Mesaj Olayları
message.part.removedmessage.part.updatedmessage.removedmessage.updated
İzin Olayları
permission.askedpermission.replied
Sunucu Olayları
server.connected
Oturum Olayları
session.createdsession.compactedsession.deletedsession.diffsession.errorsession.idlesession.statussession.updated
Yapılacaklar Olayları
todo.updated
Kabuk Olayları
shell.env
Araç Olayları
tool.execute.aftertool.execute.before
TUI Olayları
tui.prompt.appendtui.command.executetui.toast.show
Örnekler
Aşağıda Kodine’u genişletmek için kullanabileceğiniz birkaç eklenti örneği yer alıyor.
Bildirim Gönderme
Belirli olaylar gerçekleştiğinde bildirim gönderin:
export const NotificationPlugin = async ({ project, client, $, directory, worktree }) => { return { event: async ({ event }) => { // Oturum tamamlandığında bildirim gönder if (event.type === "session.idle") { await $`osascript -e 'display notification "Session completed!" with title "kodine"'` } }, }}macOS’ta AppleScript çalıştırmak için osascript kullanılır; burada bildirim göndermek için tercih ettik.
.env Koruması
Kodine’un .env dosyalarını okumasını engelleyin:
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") } }, }}Ortam değişkenlerini enjekte etme
Ortam değişkenlerini tüm kabuk çalıştırmalarına (AI araçları ve kullanıcı terminalleri) enjekte edin:
export const InjectEnvPlugin = async () => { return { "shell.env": async (input, output) => { output.env.MY_API_KEY = "secret" output.env.PROJECT_ROOT = input.cwd }, }}Özel araçlar
Eklentiler Kodine’a özel araçlar da ekleyebilir:
import { type Plugin, tool } from "@kodine-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 yardımcısı, Kodine’un çağırabileceği özel bir araç oluşturur. Bir Zod şema fonksiyonu alır ve şunları içeren bir araç tanımı döndürür:
description: Aracın ne yaptığıargs: Araç argümanları için Zod şemasıexecute: Araç çağrıldığında çalışacak fonksiyon
Özel araçlarınız yerleşik araçlarla birlikte Kodine’un kullanımına açılır.
Günlüğe kaydetme
Yapılandırılmış günlük kaydı için console.log yerine client.app.log() tercih edin:
export const MyPlugin = async ({ client }) => { await client.app.log({ body: { service: "my-plugin", level: "info", message: "Plugin initialized", extra: { foo: "bar" }, }, })}Seviyeler: debug, info, warn, error. Ayrıntılar için SDK belgelerine bakın.
Sıkıştırma kancaları
Bir oturum sıkıştırılırken kullanılan bağlamı özelleştirin:
import type { Plugin } from "@kodine-ai/plugin"
export const CompactionPlugin: Plugin = async (ctx) => { return { "experimental.session.compacting": async (input, output) => { // Sıkıştırma istemine ek bağlam enjekte et 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 kancası, LLM devam özeti oluşturmadan hemen önce tetiklenir. Varsayılan sıkıştırma isteminin atlayacağı alana özgü bağlamları eklemek için bunu kullanın.
İsterseniz output.prompt atayarak sıkıştırma istemini tümüyle değiştirebilirsiniz:
import type { Plugin } from "@kodine-ai/plugin"
export const CustomCompactionPlugin: Plugin = async (ctx) => { return { "experimental.session.compacting": async (input, output) => { // Sıkıştırma isteminin tamamını değiştir 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.` }, }}output.prompt atandığında varsayılan sıkıştırma isteminin yerini tamamen alır; bu durumda output.context dizisi dikkate alınmaz.