第 6 章

自訂指令

學會建立自己的斜線指令,將重複性工作自動化

摘要

自訂指令(Custom Commands)是 OpenCode 最強大的生產力功能之一。你可以將常用的提示詞、操作流程封裝成斜線指令,在 TUI 中以 /<command> 的形式快速呼叫。本章介紹 JSON 與 Markdown 兩種設定方式,以及參數、注入、檔案參照等進階功能。

學習目標

JSON 設定方式

opencode.jsoncommands 欄位中定義:

{
  "commands": {
    "explain": {
      "description": "解釋選取的程式碼",
      "prompt": "請用繁體中文解釋以下程式碼的工作原理:\n\n$ARGUMENTS"
    },
    "refactor": {
      "description": "重構選取的程式碼",
      "prompt": "請重構以下程式碼,使其更簡潔、可讀性更高:\n\n$ARGUMENTS"
    },
    "test": {
      "description": "為選取的程式碼產生測試",
      "prompt": "請為以下程式碼撰寫單元測試:\n\n$ARGUMENTS"
    }
  }
}

$ARGUMENTS 是一個特殊變數,在執行時會被替換為使用者在指令後輸入的全部內容。

Markdown 設定方式

AGENTS.md 或獨立的 .mdc 檔案中使用 YAML frontmatter 定義:

---
command: explain
description: 解釋選取的程式碼
---

請用繁體中文解釋以下程式碼的工作原理:

$ARGUMENTS

Markdown 方式的好處是提示詞可以寫得更長、更結構化,且易於版本控制。

你也可以建立目錄來組織多個指令:

.opencode/
  commands/
    explain.mdc
    refactor.mdc
    test.mdc

位置參數

除了 $ARGUMENTS(全部參數),你也可以使用位置參數精確控制輸入:

{
  "commands": {
    "commit": {
      "description": "產生 git commit message",
      "prompt": "根據以下 diff 產生一個簡潔的 git commit message:\n\n$1"
    },
    "review": {
      "description": "審查 PR",
      "prompt": "請審查以下 PR diff(變更語言:$1):\n\n$2\n\n請專注於:架構、安全性、效能。"
    }
  }
}

使用方式:/commit "feat: add login"/review python "diff內容"

Shell 輸出注入

可以在提示詞中嵌入 Shell 指令的輸出,使用 !`command` 語法:

{
  "commands": {
    "fix": {
      "description": "修正編譯錯誤",
      "prompt": "以下是專案中最近的編譯錯誤:\n\n!`cargo build 2>&1 | tail -50`\n\n請分析並提供修復方案。"
    },
    "status": {
      "description": "分析專案狀態",
      "prompt": "當前 Git 狀態:\n\n!`git status`\n\n最近提交:\n\n!`git log --oneline -10`\n\n請根據以上資訊提供建議。"
    }
  }
}

Shell 注入在指令執行時即時執行,讓提示詞永遠基於最新狀態。

檔案參照

使用 @filename 語法參照專案中的檔案:

{
  "commands": {
    "document": {
      "description": "為函式產生文件",
      "prompt": "請為 @$1 中的每個公開函式撰寫 JSDoc 註解。\n\n$ARGUMENTS"
    },
    "refactor-file": {
      "description": "重構指定檔案",
      "prompt": "請重構 @$1,使其遵循 SOLID 原則。\n\n$ARGUMENTS"
    }
  }
}

使用方式:/document src/utils.ts 加入型別註解

進階選項

自訂指令支援多個進階選項,讓你可以精細控制行為:

{
  "commands": {
    "security-audit": {
      "description": "執行安全性稽核",
      "prompt": "請稽核以下程式碼的安全性漏洞:\n\n$ARGUMENTS",
      "agent": "explore",        // 指定使用的代理
      "model": "claude-opus-4-20250514:high",  // 指定模型(含變體)
      "temperature": 0.2,        // 控制創造力(0-1)
      "subtask": true,           // 在子任務中執行
      "hidden": false            // 是否隱藏於指令清單
    },
    "quick": {
      "description": "快速回答",
      "prompt": "請簡潔回答:$ARGUMENTS",
      "model": "claude-haiku-4",
      "temperature": 0.7
    }
  }
}

選項說明

內建指令覆寫

你可以覆寫 OpenCode 的內建指令,自訂其行為:

{
  "commands": {
    "help": {
      "description": "顯示自訂說明",
      "prompt": "你是 OpenCode 使用專家。請根據使用者的問題提供幫助:\n\n$ARGUMENTS"
    },
    "clear": {
      "description": "清除對話(含確認)",
      "prompt": "請先確認使用者是否真的要清除對話,然後回覆 CLEAR_CONFIRMED。"
    }
  }
}

可覆寫的內建指令包括:helpclearnewsearch 等。覆寫時需注意原指令的功能是否仍可透過其他方式存取。

實戰練習

練習 1:建立程式碼助手指令

opencode.json 中建立三個常用的開發指令:

{
  "commands": {
    "doc": {
      "description": "為程式碼產生文件註解",
      "prompt": "請為以下程式碼產生完整的文件註解(繁體中文):\n\n$ARGUMENTS"
    },
    "find-bug": {
      "description": "尋找程式碼中的潛在錯誤",
      "prompt": "請仔細檢查以下程式碼,找出所有潛在的錯誤、邊界情況和效能問題:\n\n$ARGUMENTS"
    },
    "simplify": {
      "description": "簡化複雜的程式碼",
      "prompt": "請將以下程式碼簡化,在保持相同功能的同時減少行數和提高可讀性:\n\n$ARGUMENTS"
    }
  }
}

重啟 OpenCode 後試著使用 /doc/find-bug/simplify

練習 2:使用 Shell 注入建立專案分析指令

建立一個指令來分析專案的當前狀態:

{
  "commands": {
    "project-status": {
      "description": "分析專案健康狀態",
      "prompt": "請根據以下資訊分析專案狀態並給出建議:\n\n## 未提交的變更\n!`git diff --stat`\n\n## 最近提交\n!`git log --oneline -5`\n\n## 未追蹤檔案\n!`git status --porcelain | head -20`\n\n## 分支\n!`git branch -a`"
    }
  }
}

執行 /project-status 查看 OpenCode 對你專案的分析。

練習 3:建立多步驟 code review 流程

使用具有不同 agent 和 model 的指令建立審查流程:

{
  "commands": {
    "quick-review": {
      "description": "快速程式碼審查(Haiku)",
      "prompt": "請快速審查以下程式碼,列出 3 個最重要的改進點:\n\n$ARGUMENTS",
      "agent": "general",
      "model": "claude-haiku-4"
    },
    "deep-review": {
      "description": "深度程式碼審查(Opus)",
      "prompt": "請進行深度程式碼審查,包含:安全性、效能、可維護性、測試覆蓋率:\n\n$ARGUMENTS",
      "agent": "explore",
      "model": "claude-opus-4-20250514:max",
      "temperature": 0.3
    }
  }
}

比較 /quick-review/deep-review 對同一段程式碼的回應差異。