戰(zhàn)完整指南)
3步打造專屬AI編程助手OpenCode插件實(shí)戰(zhàn)完整指南【免費(fèi)下載鏈接】opencodeThe open source coding agent.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/openc/opencode想讓AI改完代碼后自動(dòng)跑一遍測(cè)試套件OpenCode是開源的AI編程助手它的插件系統(tǒng)讓你把自己的工具和邏輯掛進(jìn)AI工作流的任意節(jié)點(diǎn)。本文按最短路徑帶你走一遍OpenCode插件開發(fā)從5分鐘跑通第一個(gè)自定義工具到完整的自動(dòng)測(cè)試場(chǎng)景。5分鐘跑通第一個(gè)插件OpenCode會(huì)自動(dòng)加載插件把.ts文件丟進(jìn)項(xiàng)目的.opencode/plugins/目錄即可全局生效則放~/.config/opencode/plugins/不用配置也不用構(gòu)建。下面這個(gè)插件定義了一個(gè)名為hello的自定義工具存成文件就完事了// .opencode/plugins/hello.ts import { type Plugin, tool } from opencode-ai/plugin export const HelloPlugin: Plugin async () { return { tool: { hello: tool({ description: 返回問候語(yǔ)用于驗(yàn)證插件是否生效, args: { name: tool.schema.string().describe(名字), }, async execute(args) { return Hello ${args.name}! 插件已生效 }, }), }, } }重啟 opencode在會(huì)話里說用 hello 工具問候我看到 Hello OpenCode! 插件已生效 就成了。如果插件發(fā)在 npm 上只需把包名寫進(jìn)opencode.json的plugin數(shù)組啟動(dòng)時(shí)會(huì)自動(dòng)安裝不用手動(dòng) install。它到底是怎么工作的插件就是一個(gè)函數(shù)接收上下文返回 Hooks 對(duì)象。export type Plugin (input: PluginInput) PromiseHooks啟動(dòng)時(shí) OpenCode 按固定順序加載插件全局配置、項(xiàng)目配置、全局插件目錄、項(xiàng)目插件目錄。所有鉤子按加載順序依次執(zhí)行所以多個(gè)插件掛同一個(gè)事件時(shí)行為是確定、可預(yù)期的。上下文對(duì)象ctx帶來一組現(xiàn)成能力client是 SDK 客戶端可以查會(huì)話、寫日志directory和worktree是項(xiàng)目路徑$是 Bun 的 shell能直接跑命令。插件跑在 OpenCode 進(jìn)程內(nèi)部既能讀狀態(tài)也能改行為。鉤子就是事件流上的攔截點(diǎn)chat.params在請(qǐng)求發(fā)往 LLM 前改參數(shù)tool.execute.before/after包住每次工具調(diào)用event接收session.idle、file.edited這類全局事件。tool()只是個(gè)包裝函數(shù)——它拿 Zod schema 加一個(gè) execute 函數(shù)把工具變成 AI 眼里和內(nèi)置工具沒有區(qū)別的自定義工具。一個(gè)完整場(chǎng)景走一遍hello 工具驗(yàn)證了鏈路現(xiàn)在解決真問題AI 改完代碼立刻知道測(cè)試掛沒掛。第一步注冊(cè)新建.opencode/plugins/auto-test.ts。第二步掛鉤子用tool.execute.after攔截文件編輯類工具順手把測(cè)試跑掉。這個(gè)插件的核心就是一個(gè)鉤子——文件編輯工具執(zhí)行后跑一遍bun test把結(jié)果寫進(jìn)展示元數(shù)據(jù)// .opencode/plugins/auto-test.ts import { type Plugin } from opencode-ai/plugin export const AutoTestPlugin: Plugin async (ctx) { return { tool.execute.after: async (input, output) { if (input.tool ! edit input.tool ! write) return // 跳過只讀工具 const result await ctx.$bun test --silent.nothrow() // nothrow 防止失敗拋異常 output.title Tests ${result.exitCode 0 ? passed : failed} // TUI 直接可見 output.metadata.testPassed result.exitCode 0 }, } }第三步驗(yàn)證重啟 opencode讓 AI 改某個(gè)函數(shù)。 TUI 里 edit 工具調(diào)用下方的標(biāo)題會(huì)變成 Tests passed 或 Tests failed不用切回終端。想攔截更危險(xiǎn)的操作也一樣簡(jiǎn)單在tool.execute.before里對(duì).env路徑直接throw new Error(...)before 鉤子里拋異常就是合法的阻斷手段。踩過的坑 提效技巧參數(shù)校驗(yàn)從嚴(yán)args里用 Zod 加.positive()、.enum()這類約束AI 傳入臟數(shù)據(jù)時(shí)在入口就被拒掉而不是在運(yùn)行時(shí)炸出莫名其妙的錯(cuò)。錯(cuò)誤當(dāng)文本處理execute里套 try/catch 并返回人能看懂的說明直接拋異常會(huì)讓 AI 無法判斷失敗原因、只能盲目重試。??別阻塞關(guān)鍵路徑tool.execute.before在每次工具調(diào)用必經(jīng)的路徑上別在里面同步跑慢命令重邏輯放 after 鉤子或event。資源要清理起了定時(shí)器或文件監(jiān)聽的插件實(shí)現(xiàn)dispose鉤子釋放長(zhǎng)會(huì)話跑一天下來會(huì)漏。名字別撞車插件工具與內(nèi)置工具同名時(shí)插件優(yōu)先起名edit、read等于靜默覆蓋內(nèi)置行為建議加業(yè)務(wù)前綴。繼續(xù)往下挖官方插件文檔 packages/web/src/content/docs/plugins.mdx全部鉤子列表、事件類型表和 npm 插件安裝方式寫新鉤子前先翻它。最小參考實(shí)現(xiàn) packages/plugin/src/example.ts倉(cāng)庫(kù)里自帶的十幾行示例插件動(dòng)手前值得過一遍。工具定義源碼 packages/plugin/src/tool.ts看ToolContext里sessionID、abort、metadata()這些字段寫復(fù)雜工具時(shí)會(huì)用到。把第二節(jié)的 hello.ts 拷進(jìn)你項(xiàng)目的.opencode/plugins/目錄重啟一次你就有了第一個(gè)能跑的 OpenCode 插件?!久赓M(fèi)下載鏈接】opencodeThe open source coding agent.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/openc/opencode創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考