İçeriğe geç
New Kodine v2 is now available

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.

kodine.json
{
"$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:

  1. Global config (~/.config/kodine/kodine.json)
  2. Project config (kodine.json)
  3. Global eklenti dizini (~/.config/kodine/plugins/)
  4. 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.

.kodine/package.json
{
"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.

.kodine/plugins/my-plugin.ts
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ı

.kodine/plugins/example.js
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:

my-plugin.ts
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.edited
  • file.watcher.updated

Kurulum Olayları

  • installation.updated

LSP Olayları

  • lsp.client.diagnostics
  • lsp.updated

Mesaj Olayları

  • message.part.removed
  • message.part.updated
  • message.removed
  • message.updated

İzin Olayları

  • permission.asked
  • permission.replied

Sunucu Olayları

  • server.connected

Oturum Olayları

  • session.created
  • session.compacted
  • session.deleted
  • session.diff
  • session.error
  • session.idle
  • session.status
  • session.updated

Yapılacaklar Olayları

  • todo.updated

Kabuk Olayları

  • shell.env

Araç Olayları

  • tool.execute.after
  • tool.execute.before

TUI Olayları

  • tui.prompt.append
  • tui.command.execute
  • tui.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:

.kodine/plugins/notification.js
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:

.kodine/plugins/env-protection.js
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:

.kodine/plugins/inject-env.js
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:

.kodine/plugins/custom-tools.ts
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:

.kodine/plugins/my-plugin.ts
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:

.kodine/plugins/compaction.ts
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:

.kodine/plugins/custom-compaction.ts
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 status
2. Which files are being modified and by whom
3. Any blockers or dependencies between agents
4. 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.