OpenCode 権限設定
{'translated': '{'translated': 'OpenCode の権限システムは、どの操作を自動的に実行できるか、どの操作に手動での承認が必要か、どの操作を直接ブロックするかを制御します。権限を適切に設定することで、AI が効率的にタスクを完了できると同時に、誤操作によるコードの破壊や機密ファイルの漏洩を防ぐことができます。'}'}
v1.1.1 以降、旧バージョンの
toolsブール設定は非推奨となり、permissionに統合されました。旧バージョンの設定は後方互換性を保つために引き続きサポートされますが、新しいpermission書き方への移行を推奨します。
3種類の権限アクション
各権限ルールは最終的に次の3つのアクションのいずれかに解決されます。
| アクション | 効果 | 適用シナリオ |
|---|---|---|
"allow" |
承認不要で自動的に実行 | リスクが低く頻度の高い操作(ファイルの読み取り、テストの実行など) |
"ask" |
承認プロンプトが表示され、許可するかどうかを自分で決定 | ある程度リスクのある操作(ファイルへの書き込み、スクリプトの実行など) |
"deny" |
直接ブロック。実行もプロンプト表示もされない | 明確に許可されていない危険な操作(ファイルの削除、コードのプッシュなど) |
基本設定
権限設定は、リポジトリのルートディレクトリ(またはユーザー設定ディレクトリ)配下のopencode.jsonファイル内のpermissionフィールドを使用して設定します。
1. 全権限をグローバルに設定
最も簡単な書き方:1つの文字列で全操作の権限を一括設定します。クイックスタートや一時的なデバッグに適しています:
例
"$schema": "https://opencode.ai/config.json",
"permission": "allow" // すべての操作が自動実行され、プロンプトは表示されません(ローカル開発でAIを十分に信頼する場合に適しています)
}
2. ツール名ごとに設定
オブジェクト構文を使用すると、ツールごとに権限を個別に指定できます。"*"はワイルドカードで、すべての操作にマッチし、通常はフォールバックのデフォルト値として使用されます。
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask", // フォールバックルール:個別に設定されていないすべてのツールは、デフォルトでプロンプトが表示されます
"bash": "allow", // bash(シェルコマンドの実行):直接許可、プロンプトなし
"edit": "deny" // edit(ファイルの変更):直接ブロック
}
}
きめ細かいルール(オブジェクト構文)
ほとんどの権限では、統一されたアクションを設定するだけでなく、オブジェクト構文をツールの具体的な入力内容に応じて異なるルールを適用できます。例えば、bashツールでは、どのコマンドを許可するか、どのコマンドに承認が必要か、どのコマンドを直接拒否するかを区別できます:
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"bash": {
"*": "ask", // フォールバック:すべてのbashコマンドはデフォルトで承認が必要
"git *": "allow", // git で始まるコマンド(git status、git log など)は直接許可
"npm *": "allow", // npm で始まるコマンド(npm install、npm run build など)は直接許可
"grep *": "allow", // grep 検索コマンドは直接許可
"rm *": "deny" // rm 削除コマンドは直接ブロック(ファイルの誤削除防止)
},
"edit": {
"*": "deny", // デフォルトですべてのファイル編集をブロック
"packages/web/src/content/docs/*.mdx": "allow" // ドキュメントディレクトリ内の .mdx ファイルの編集のみ許可
}
}
}
ルールのマッチ順:最後にマッチしたルールが優先されます。ワイルドカードの
"*"ルールを先頭にデフォルト値として置き、より具体的なルールを後ろに置いて上書きすることをお勧めします。
ワイルドカードルール
ワイルドカードルール
| 権限パターンは単純なワイルドカードマッチをサポートしています。ルールは次のとおりです: | ワイルドカード | 意味 |
|---|---|---|
* |
例 | git *ゼロ個以上の任意の文字にマッチ(ディレクトリをまたがない)git status、git log --oneline 等 |
** |
にマッチ | ~/projects/**ディレクトリをまたぐ任意のパスにマッチ |
? |
projects 配下のすべてのファイルとサブディレクトリにマッチ | file?.txt任意の1文字に正確にマッチfile1.txt、fileA.txt |
| にマッチ | その他の文字 | git statusリテラル値として正確にマッチgit statusのみにマッチ |
、パラメータ付きのバリアントにはマッチしません注意:
*パラメータ付きのコマンドには必ず末尾に"grep *"を追加してください。例えばgrep pattern file.txtにマッチします"grep"。一方、単独で
ホームディレクトリ展開
ホームディレクトリ展開~ 或 $HOMEパターンの先頭で
を使用できます。
例
"~/projects/*"
"$HOME/projects/*"
// 以下の3つの書き方は同じ効果で、すべて /Users/username/projects/* に展開されます(パスはシステムによって異なります)
外部ディレクトリの権限(external_directory)
外部ディレクトリの権限(external_directory)デフォルトでは、OpenCode はツールが起動時の作業ディレクトリexternal_directoryとそのサブディレクトリにのみアクセスできます。プロジェクトディレクトリ外のパス(別のプロジェクトや共有設定ディレクトリなど)にアクセスする必要がある場合は、
ホームディレクトリ展開(
~/...)は単なるパスの簡略表記であり、そのパスへのアクセスを自動的に許可するものではありません。作業ディレクトリ外のパスは依然としてexternal_directoryを使用して許可する必要があります。
1. 外部ディレクトリへのアクセスを許可
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow" // ~/projects/personal/ 配下のすべてのファイルとサブディレクトリへのアクセスを許可
// ** は任意のレベルのサブパスにマッチ
}
}
}
2. 読み取りは許可するが編集は禁止
されるexternal_directory許可されたディレクトリは現在のワークスペースのデフォルト権限を継承します。readデフォルトは"allow"であるため、許可後、そのディレクトリ配下のファイルは読み取り可能になります。特定の操作をさらに制限する必要がある場合(読み取り許可だが編集禁止など)、追加のルールを重ねて設定できます:
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow" // ステップ1:この外部ディレクトリへのアクセスを許可
},
"edit": {
"~/projects/personal/**": "deny" // ステップ2:このディレクトリにルールを重ねて、読み取り許可だが編集禁止にする
}
}
}
利用可能な全権限項目
OpenCode の権限はツール名をキーとしており、ファイル操作、コマンド実行、ネットワークアクセスなどすべてのタイプを対象としています:
| 権限項目 | 制御する操作 | パターンマッチする内容 | デフォルト値 |
|---|---|---|---|
read |
ファイル内容の読み取り | ファイルパス(例:src/index.js) |
allow(.envファイルを除く) |
edit |
すべてのファイル変更(edit、write、patch、multiedit を含む) | ファイルパス | allow |
glob |
ファイルのワイルドカード検索(例:すべての.tsファイルを検索) |
ワイルドカードパターン(例:**/*.ts) |
allow |
grep |
ファイル内容内のテキスト検索 | 正規表現パターン | allow |
list |
ディレクトリ内のファイル一覧 | ディレクトリパス | allow |
bash |
Shell コマンドの実行 | 解析後の完全なコマンド(例:git status --porcelain) |
allow |
task |
サブエージェントの起動 | サブエージェントの種類名 | allow |
skill |
スキルの読み込み | スキル名 | allow |
lsp |
LSP 言語サービスのクエリを実行 | 現在、細粒度の設定はサポートされていません | allow |
webfetch |
ネットワーク URL のコンテンツを取得 | 完全な URL(例:https://example.com/api) |
allow |
websearch |
ウェブ検索 | 検索クエリ文字列 | allow |
codesearch |
コード検索 | 検索クエリ文字列 | allow |
external_directory |
作業ディレクトリ外のパスへのアクセス | 外部ディレクトリのパス | ask |
doom_loop |
同じツールが同じ入力で3回繰り返し呼び出された場合にトリガーされます(AI の無限ループ防止) | — | ask |
デフォルト権限の説明
権限を一切設定していない場合、OpenCode は以下の組み込みデフォルト値を使用します:
- ほとんどのツール権限はデフォルトで
"allow"、つまり自動実行されプロンプトは表示されません doom_loopとexternal_directoryデフォルトは"ask"、手動承認が必要ですreadデフォルトではすべてのファイルの読み取りを許可しますが、.env関連ファイルには組み込みの保護があります:
例
{
"permission": {
"read": {
"*": "allow", // デフォルトですべてのファイルの読み取りを許可
"*.env": "deny", // .env ファイルの読み取りをブロック(データベースのパスワード、API キーなどの漏洩を防止)
"*.env.*": "deny", // .env.local、.env.production などのバリアントの読み取りをブロック
"*.env.example": "allow" // .env.example の読み取りを許可(サンプルファイルであり、実際のキーは含まれない)
}
}
}
承認プロンプトの3つのオプション
ある操作の権限が"ask"の場合、OpenCode は承認プロンプトを表示し、以下の3つの選択肢を提供します:
| オプション | 効果 | 適用シーン |
|---|---|---|
| once(この一度だけ) | 今回のリクエストのみ承認し、次回同じ操作では再度プロンプトが表示されます | 特定の操作を一時的に許可したいが、永続的に許可したくない場合 |
| always(常に許可) | この操作のマッチングパターンをホワイトリストに追加し、現在のセッションの残り時間内はプロンプトを表示しません | 特定の種類の操作が安全であると確認でき、今回のセッションでは自動的に通過させたい場合 |
| reject(拒否) | 今回のリクエストを拒否し、操作は実行されません | 操作にリスクがあると判断し、明確に実行したくない場合 |
選択alwaysすると、OpenCode はツールによって推奨されるホワイトリストパターンを自動的に提供します(例:承認git statusした後、通常はgit status*をホワイトリストに追加します)。ホワイトリストは現在のセッションでのみ有効で、OpenCode を再起動するとリセットされます。
エージェントごとに権限を個別設定
ワークフローで複数のエージェント(agent)を使用している場合、各エージェントごとに権限設定を個別に上書きできます。エージェント権限はグローバル設定とマージされ、エージェントルールの優先度はグローバルルールよりも高くなります。
1. opencode.json でエージェント権限を設定
例
"$schema": "https://opencode.ai/config.json",
"permission": {
// グローバル権限:git 操作は許可するが、commit と push は禁止
"bash": {
"*": "ask",
"git *": "allow",
"git commit *": "deny",
"git push *": "deny",
"grep *": "allow"
}
},
"agent": {
"build": { // build という名前のエージェント
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"git commit *": "ask", // グローバルを上書き:build エージェントは commit を許可するが、承認が必要
"git push *": "deny", // グローバルを継承:push は引き続き禁止
"grep *": "allow"
}
}
}
}
}
2. Markdown ファイルでエージェント権限を設定
エージェントは Markdown ファイルでも設定できます。権限はファイル上部の YAML Front Matter に記述します(---の間の部分):
例
---
description: コードレビューエージェント(コードを分析するだけで、一切変更しない)
mode: subagent
permission:
edit: deny # すべてのファイル編集を禁止
bash: ask # bash コマンドは承認が必要
webfetch: deny # 外部 URL へのアクセスを禁止
---
Only analyze code and suggest changes.
# 以下はエージェントのシステムプロンプトで、このエージェントの責務と行動規範を説明します
実用的な設定例
例1: 保守モード(すべての操作に承認が必要)
OpenCode を初めて使う場合や重要なプロジェクトで作業する場合に適しています。すべての操作で手動確認が必要です:
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask" // すべてのツールのすべての操作で承認プロンプトが表示される
}
}
例2: 開発でよく使う設定(読み取りは許可、書き込みは承認)
日常開発に適しています:AI がコードを自由に読み取り・検索することを許可しますが、ファイルの変更とコマンドの実行時には確認が必要です:
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask", // フォールバック:個別に設定されていないツールはデフォルトで承認が必要
"read": "allow", // ファイルの読み取り:直接許可
"glob": "allow", // ファイルのワイルドカード検索:直接許可
"grep": "allow", // 内容の検索:直接許可
"list": "allow", // ディレクトリの一覧:直接許可
"bash": {
"*": "ask", // bash コマンドはデフォルトで承認が必要
"git status *": "allow", // git ステータスの確認:許可
"git log *": "allow", // git ログの確認:許可
"git diff *": "allow", // git 差分の確認:許可
"npm run *": "allow", // npm スクリプトの実行:許可
"npm test *": "allow", // テストの実行:許可
"rm *": "deny" // ファイルの削除:直接ブロック
}
}
}
例3: 複数のプロジェクトディレクトリへのアクセスを許可
AI が複数のプロジェクトディレクトリにまたがって作業する必要がある場合、外部ディレクトリへのアクセス権限を付与します:
例
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow", // 個人プロジェクトディレクトリへのアクセスを許可
"~/projects/work/**": "allow", // 作業プロジェクトディレクトリへのアクセスを許可
"~/dotfiles/**": "allow" // 設定ファイルディレクトリへのアクセスを許可
},
"edit": {
"~/dotfiles/**": "deny" // dotfiles へのアクセスを許可しても、編集は禁止(読み取り専用)
}
}
}