7.1 三種控制機制的分工

OpenCode 提供三種控制代理行為的機制,它們各自有不同的用途與影響範圍:

機制 檔案格式 影響範圍 主要用途 變更頻率
規則(Rules) AGENTS.md 全域 / 專案層級 定義行為邊界、編碼規範、安全政策 低(設定後少改)
指令(Commands) .opencode/commands/*.md 專案層級 封裝重複性工作流程為一鍵執行 中(隨需求增加)
技能(Skills) SKILL.md 全域 / 專案 / 工作階段 提供專業領域的步驟指引 高(持續擴充)

這三種機制並非互斥,而是相輔相成。良好的 OpenCode 設定通常會同時使用三者:規則定義「可以做什麼」的界線,指令封裝「經常做」的流程,技能提供「怎麼做好」的專業知識。

🔑 關鍵原則

最具體的規則總是獲勝(Most Specific Wins)。當多個規則同時存在時,OpenCode 會選擇與當前上下文最相關、限制最明確的那一條。

7.2 AGENTS.md — 規則系統

AGENTS.md 是 OpenCode 的核心規則檔案,位於專案根目錄或使用者設定目錄。它定義了代理在專案中應該遵循的行為準則。

使用 /init 產生初始設定

在專案中執行 /init 指令可以快速產生初始的 AGENTS.md:

$
> /init
🔍 正在分析專案結構...
📁 偵測到技術棧:JavaScript, Node.js, React
📝 正在產生 AGENTS.md...
✅ AGENTS.md 已建立!
檔案位置:./AGENTS.md
已納入以下設定:
・專案描述與語言
・編碼慣例與風格
・測試與建置指令

AGENTS.md 範例

# 專案規則

## 語言與風格
- 使用 TypeScript,嚴格模式
- 使用 2 空格縮排
- 使用單引號而非雙引號
- 所有檔案末尾保留一個空行

## 測試規範
- 所有功能必須包含單元測試
- 測試檔案命名:`*.test.ts`
- 使用 Vitest 作為測試框架
- 測試覆蓋率目標:80% 以上

## 程式碼結構
- 元件放在 `src/components/` 目錄
- 頁面放在 `src/pages/` 目錄
- 工具函式放在 `src/utils/` 目錄
- 型別定義放在 `src/types/` 目錄

## 禁止事項
- 不要使用 `any` 型別
- 不要提交包含 `console.log` 的程式碼
- 不要使用已棄用的套件或 API
- 不要直接修改 `node_modules` 內容

規則的層級

規則可以放在不同的層級,影響範圍各不相同:

層級 檔案位置 影響範圍
專案層級 專案根目錄/AGENTS.md 僅限當前專案
使用者層級 ~/.config/opencode/AGENTS.md 所有專案
Claude 相容 專案根目錄/CLAUDE.md 與 Claude Code 共享的規則
💡 最佳實作

將通用的編碼風格與安全規範放在使用者層級的 AGENTS.md,將專案特定的架構規則放在專案層級。這樣當你切換專案時,通用規則會自動套用,而專案規則則各司其職。

7.3 自訂指令(Custom Commands)

自訂指令讓你將多步驟的工作流程封裝為一個簡單的斜線指令。例如,輸入 /deploy 即可自動執行建置、測試、部署等一系列操作。

建立指令

每個指令是一個放在 .opencode/commands/ 目錄下的 Markdown 檔案:

# 建立指令目錄
mkdir -p .opencode/commands

# 建立 deploy 指令
cat > .opencode/commands/deploy.md << 'EOF'
---
description: 執行完整部署流程 — 測試、建置、發布
agent: build
model: gpt-4o
---

# 部署流程

執行以下步驟來部署專案:

## 步驟 1:執行測試
\`\`\`bash
npm run test
\`\`\`

## 步驟 2:建置專案
\`\`\`bash
npm run build
\`\`\`

## 步驟 3:部署到生產環境
\`\`\`bash
npm run deploy:prod
\`\`\`

## 步驟 4:驗證部署
確認部署狀態並執行冒煙測試。
EOF

指令 Frontmatter

欄位 說明
description 指令功能的簡短描述,顯示在指令列表與自動補全中
agent 指定執行此指令的代理(預設為目前代理)
model 指定執行的模型(可覆蓋預設模型)

使用參數

指令支援多種動態參數:

---
description: 執行客製化部署,支援版本標籤與環境選擇
---

# 部署指令

## 參數
- `{{version}}`:部署版本號(必填)
- `{{env}}`:部署環境(預設:staging)
- `{{branch}}`:來源分支(預設:main)

## 步驟
1. 切換到 {{branch}} 分支並更新
2. 建置版本 {{version}}
3. 部署到 {{env}} 環境
4. 執行 {{env}} 環境的冒煙測試

執行時只需輸入:/deploy version=2.1.0 env=production

🔧 進階參數

參數值也可以來自 shell 指令的輸出:{{shell:date +%Y%m%d}} 會自動填入當前日期。你也可以引用檔案內容:{{file:VERSION}} 會讀取 VERSION 檔案的內容作為參數值。

7.4 內建指令

OpenCode 提供一系列實用的內建指令,無需任何設定即可使用:

指令 功能 使用時機
/init 初始化專案設定,產生 AGENTS.md 新專案開始時
/undo 復原上一次代理操作 當代理做了你不想要的變更時
/redo 重新套用已復原的操作 復原後改變主意時
/share 產生目前對話的可分享連結 需要與團隊討論對話內容時
/help 顯示可用指令與說明 忘記指令名稱或用法時
/compact 壓縮對話上下文以節省 Token 對話過長、回應變慢時
/models 列出可用的語言模型與切換 需要更換模型時
/new 開啟全新的對話 Session 開始全新的任務時
⚠️ 注意

/undo 和 /redo 僅能復原當前對話 Session 中的操作。如果你關閉並重新開啟了 OpenCode,這些操作歷史就無法再復原了。建議在進行重大變更前先使用版本控制(git)。

7.5 規則 vs 指令 vs 技能 — 完整比較

為了幫助你選擇最適合的控制機制,以下是三個維度的完整比較:

比較維度 規則(AGENTS.md) 指令(Commands) 技能(Skills)
定義方式 自然語言規則 步驟 + 可執行命令 步驟指引 + 觸發詞
觸發方式 自動載入(始終有效) 斜線指令手動觸發(/command) 自動匹配觸發詞或手動要求
執行模型 被動制約(不執行,僅引導) 主動執行(可包含 shell 命令) 被動指引(提供步驟框架)
動態性 靜態規則,變更頻率低 可包含動態參數 內容固定,可鏈式組合
適用場景 編碼規範、安全政策、架構原則 部署、測試、格式化、發布 程式碼審查、文件產生、UI 設計
共用性 可跨專案(使用者層級) 僅限專案層級 可跨專案(多個安裝路徑)

7.6 實戰:建立完整的開發工作流

讓我們整合本節所學,建立一個完整的開發工作流程:

1. 規則(AGENTS.md)

# 開發規則

## 程式碼規範
- 使用 ESLint + Prettier 維持程式碼品質
- 所有公開 API 必須有 JSDoc 註解
- 優先使用函式式程式設計,避免可變狀態

## 提交規範
- 使用 Conventional Commits 格式
- commit 類型:feat, fix, chore, docs, refactor, test
- 每個 commit 只包含一個邏輯變更

## 審查要求
- 合併請求至少需要 1 位 reviewer 核准
- 所有檢查必須通過才能合併

2. 指令(.opencode/commands/)

---
description: 建立一個包含測試與文件的 feature branch
---

# Feature 開發指令

## 參數
- `{{name}}`:功能名稱(kebab-case,必填)
- `{{type}}`:類型(feature/hotfix,預設:feature)

## 步驟
1. 從 main  branch 建立 {{type}}/{{name}} branch
2. 執行 \`\`\`npm run generate:component {{name}}\`\`\`
3. 建立對應的測試檔案
4. 更新文件

3. 技能(.opencode/skills/)

搭配第五章的自訂代理技能,形成完整的開發閉環。

💡 整合建議

建議的學習路徑:先設定 AGENTS.md 規則 確保代理行為符合團隊標準,再建立常用的 指令 封裝重複性工作,最後根據需求逐步擴充 技能庫。

小試身手

下列哪一種機制適合用來定義「禁止使用 any 型別」這類編碼規範?
關於 OpenCode 中的規則優先順序,下列敘述何者正確?
下列哪個不是 OpenCode 的內建指令?

常見問題

AGENTS.md 和 CLAUDE.md 有什麼不同?▼
兩者的格式與功能基本相同,主要差異在於用途:AGENTS.md 是 OpenCode 原生使用的規則檔案,而 CLAUDE.md 是 Claude Code 使用的規則檔案。OpenCode 同時支援兩者,如果你同時使用兩種工具,將規則寫在 CLAUDE.md 中可以保持相容性。建議優先使用 AGENTS.md 以獲得 OpenCode 的完整功能支援。
自訂指令的參數可以使用選擇列表嗎?▼
目前指令參數支援自由文字輸入、shell 指令輸出({{shell:command}})與檔案引用({{file:path}})。雖然不支援下拉選單,但你可以在指令步驟中透過條件判斷來模擬選擇行為,例如在步驟中寫出「如果 {{env}} 是 production,則執行 X;否則執行 Y」。
如何讓自訂指令在特定條件下才顯示?▼
指令檔案本身是固定存在的,無法根據條件動態隱藏。但你可以在指令的 Frontmatter 中設定 description 來讓使用者了解使用時機,或在指令的前言加入使用條件的說明。如果某個指令不再需要,直接刪除對應的 .md 檔案即可。