iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0

! 本篇文章將會介紹 Skills:把 SOP 變成 Agent 的技能包,期望大家都能把重複流程一次封裝,讓 agent 按劇本辦事 :D

昨天收尾時我留了一句話:「像發文前先做機敏掃描這種重複流程,更適合封裝成按需取用的技能包」。今天來兌現這張支票。先承認一個尷尬的現狀:本系列系統的 SOP 目前散落在三個地方——generate.sh 裡的四道品質判準、config.sh 的 secret_scan()、還有 prompts/generate.md 的十條寫作規則。它們都能動,但有一種流程一直沒有正式的家:「每次都要叫 agent 照順序做、步驟固定、還會跨專案重複」的劇本。過去的解法不外乎兩種:每次在 prompt 裡重貼一次,或者寫進 AGENTS.md 讓它常駐——前者容易貼漏,後者違反昨天才講完的 token 節約原則。opencode 給的正式答案,叫 Skills。

本篇目標

讀完這篇你會學到:

  • skill 的檔案結構與 frontmatter 規範:為什麼一個資料夾加一份 SKILL.md 就是一個技能包
  • 發現機制:agent 怎麼「知道」技能存在、什麼時候才載入全文,以及它跟 AGENTS.md 的本質差異
  • 實戰:把「發文前機敏掃描」封裝成可攜帶的技能包,再用權限設定收斂風險

環境準備

  • 裝好的 opencode(opencode --version 跑得動即可)
  • 一個 git repo 當練習場——skill 的探索會從當前目錄往上找到 git worktree 根目錄,乾淨的小 repo 最好觀察
# 建立練習用的沙盒
mkdir -p ~/playground/skills-lab && cd ~/playground/skills-lab
git init

主要內容

步驟一:一個資料夾+一份 SKILL.md,技能包到手

skill 的實體樸素到令人懷疑:一個資料夾,裡面一份 SKILL.md,沒了。資料夾名就是技能名,SKILL.md 開頭的 frontmatter 只有 namedescription 必填:

# 資料夾名 = 技能名(規定必須一致)
mkdir -p .opencode/skills/git-release
$EDITOR .opencode/skills/git-release/SKILL.md
name: git-release
description: Create consistent releases and changelogs

## What I do
- Draft release notes from merged PRs
- Propose a version bump
- Provide a copy-pasteable `gh release create` command

## When to use me
Use this when you are preparing a tagged release.

frontmatter 以外的內容格式不拘,就是給 agent 讀的劇本本文。幾條硬規矩先記起來:name 只能小寫英數字加單一連字號(正則 ^[a-z0-9]+(-[a-z0-9]+)*$)、必須跟資料夾同名;description 上限 1024 字元,但別把額度用滿——它不是給人看的簡介,是 agent 挑技能的唯一線索,寫得具體比寫得長重要一百倍。

步驟二:實戰——把「發文前機敏掃描」封裝成 secret-sweep

來做一個真的有用的。本系列有一條鐵律:任何要公開的內容,發佈前必須掃機敏值。這條 SOP 目前活在兩處:config.sh 的 secret_scan()(腳本防線)和 prompts/generate.md 第 6 條(生成規範)。但哪天我在別的專案請 agent 寫會公開的文件,這套劇本就得從頭口述一遍——這正是技能包的用武之地:

name: secret-sweep
description: 掃描即將公開的文件(文章、README、log 節錄)是否殘留 API key、token、webhook URL、cookie、email 等機敏值,任何內容對外發佈前必用

## SOP
1. 逐段掃過全文,比對金鑰、長隨機字串、webhook URL、cookie、email、手機號碼等模式
2. 命中一律改成佔位符,例如 DISCORD_WEBHOOK="https://discord.com/api/webhooks/<ID>/<TOKEN>"
3. 回報:掃了哪些模式、命中幾處、各換成什麼佔位符
4. 拿不準是否機敏,一律當機敏處理

之後不管在哪個 repo、哪個對話,一句「發佈前先 secret-sweep」,劇本就是同一套。SOP 從「散落各檔+我腦內記憶」變成一個可攜帶、可 commit、可 review 的檔案。

小小小測驗:你知道 agent 平常根本沒讀過你的 SKILL.md 全文嗎?它一直在看的,只有那兩行 frontmatter。這是怎麼辦到的?看下一步。

步驟三:發現機制——簡介常駐,全文點用

opencode 啟動時,會把所有技能的 name 跟 description 列進 skill 工具的說明裡,agent 日常看到的就是這份目錄:

<available_skills>
  <skill>
    <name>secret-sweep</name>
    <description>掃描即將公開的文件……</description>
  </skill>
</available_skills>

判斷需要用某個技能時,它才呼叫工具把全文載入:

skill({ name: "secret-sweep" })

這就是 skill 跟 AGENTS.md 的本質差異:AGENTS.md 每個 session 常駐注入;skill 只常駐「目錄」(每包一兩行的簡介),內文按需付費。昨天說「任務級規則放檔案、由 prompt 點名載入」,skill 等於把這件事標準化——而且「點名」這個動作 agent 自己會判斷,不必你在 prompt 裡指定路徑。

擺放位置也有彈性:專案層放 .opencode/skills/,全域層放 ~/.config/opencode/skills/;另外相容 .claude/skills/.agents/skills/,從 Claude Code 遷移技能包同樣零成本。專案層的探索會從當前目錄一路往上找到 git worktree 根目錄,所以在 repo 的子資料夾裡開 opencode 也找得到。

步驟四:權限煞車——不是每個 agent 都該拿到每包技能

技能一多,就得想邊界。opencode.json 的 permission.skill 支援萬用字元,讓你決定哪些技能直接放行、哪些要先問、哪些根本藏起來:

{
  "permission": {
    "skill": {
      "*": "allow",
      "internal-*": "deny",
      "experimental-*": "ask"
    }
  }
}

deny 的技能會直接從 available_skills 清單消失,ask 則在載入前跳出來等你點頭。還能更細:在單一 agent 的設定裡覆寫權限,或用 tools: { skill: false } 把 skill 工具整個關掉。我的原則是:碰得到機敏資料的技能,至少設 ask

常見問題 / 踩坑記錄

  • Q:寫了 skill,agent 卻從來不主動用它?
    A:九成是 description 太模糊。agent 是靠 description 決定要不要載入的,把「什麼時候該用」直接寫進去(像 secret-sweep 的「任何內容對外發佈前必用」)。如果連 available_skills 清單裡都沒有,依序檢查:SKILL.md 是否全大寫拼對、frontmatter 有沒有 name 和 description、name 是否跟資料夾同名且全小寫。

  • Q:技能裝太多,context 會不會爆炸?
    A:常駐的只有每包一兩行的簡介,全文按需載入,數量本身不是問題。會爆的是另一種情況:把 description 寫成小作文,等於把按需付費的設計自己拆了。簡介控制在幾句內,細節放內文。

  • Q:本系列為什麼還不上 skill,繼續用 prompt 點名三個檔案?
    A:場景不同。generate.sh 是全自動排程,prompt 每晚原樣重放,明確點名檔案是最可預測、最好測試的做法。skill 的甜蜜點是「人機混合、跨專案重複」的互動場景——像 secret-sweep 這種我隨時會手動呼叫的流程。工具沒有高低,選對場景而已。

小結

  • skill = 一個資料夾+一份 SKILL.md:name 跟資料夾同名、小寫英數加連字號,description 是 agent 挑技能的唯一線索
  • 簡介常駐、全文點用——AGENTS.md 是行前簡報,skill 是按需取用的劇本櫃,兩者是分工不是取代
  • 邊界用 permission.skill 收斂:deny 藏起來、ask 先點頭,碰機敏的技能至少設 ask

明日預告

下一篇我們要介紹「Subagents:一人軍團平行作戰」。一個 agent 會按劇本辦事之後,下一步是讓多個 agent 同時上工——派出 subagent 平行工作、產能翻倍的編排技巧,敬請期待!

參考資料:

有任何疑問但沒有 iT 邦幫忙帳號,或是想匿名提問?
歡迎到 https://dev.benben.me/q/Z5442T 提問或加油打氣,沒意外的話會在完賽之後一起回答 :D


上一篇
04 AGENTS.md:教會 Agent 你的專案規矩
下一篇
06 Subagents:一人軍團平行作戰
系列文
自我耍廢組:全自動化の鐵人12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言