開發外掛
用 SDK。它提供型別、本機測試、打包與一行安裝:
bash
npx @walisayu/plugin-sdk init my-plugin
cd my-plugin && npm install
npx walis-plugin render --input target=stg-01 # 看它會產生什麼
npm test
WALIS_API_KEY=... npx walis-plugin install # 需要管理員金鑰ts
import { definePlugin } from '@walisayu/plugin-sdk'
export default definePlugin({
manifest: {
id: 'acme.deploy',
name: '部署到測試機',
parameters: [{ name: 'target', label: '目標主機', required: true }]
},
render(inputs, ctx) {
return `scripts/deploy.sh ${ctx.shell.quote(inputs.target)}`
}
})一定要跳脫
ts
// 對
return `echo ${ctx.shell.quote(inputs.message)}`
// 錯——使用者填 '; rm -rf / #' 就拿到你的機器了
return `echo ${inputs.message}`ctx.shell.quote 跟伺服器端是同一套規則,而且兩邊都有測試釘住,本機看到的就是實際會跑的。
測試
ts
const { script, logs, fetches } = renderPlugin(plugin, { target: 'stg-01' })測試工具重現了 host 的行為:參數預設值、boolean 的空字串語意, 以及「沒宣告的網域連不出去」。fetches 讓你斷言外掛沒有多打不該打的 API。
打包時的檢查
walis-plugin build 會掃出 host 沒有的東西——require、process、fs、setTimeout、 裸 fetch、await、Promise——以及超過 20,000 字元的程式碼。只要還有警告,install 就拒絕上傳, 讓你現在就發現,而不是在正式建置跑到一半才失敗。
用 AI 產生草稿
管理介面可以依描述產生草稿。有兩條規則讓這件事敢開放:
- 你的描述被當成資料而不是指令——系統提示要求模型忽略其中任何試圖改變輸出格式或擴大權限的內容。
- 模型的輸出同樣不被信任。 權限一律剝除、類型與 API 版本強制寫死、識別字重新驗證, 而且絕不會自動安裝。
就算提示詞完全被繞過,攻擊者能得到的也只是一段你會在畫面上看到、而且要自己按下安裝的腳本。