Codex の workspace-write で作業ディレクトリ外にも書き込ませる writable_roots と /tmp の扱い
Codex のサンドボックス workspace-write で書き込める範囲(作業ディレクトリ、/tmp、)と、writable_roots で追加する方法、一時ディレクトリを外す設定、.git が読み取り専用になる注意点を解説します。
Codex を workspace-write で動かしていると、~/.cache や ~/.pyenv のような作業ディレクトリ外への書き込みでビルドやパッケージのインストールが失敗することがあります。サンドボックスが書き込み先を制限しているためです。
結論として、書き込みを許可する場所は [sandbox_workspace_write] の writable_roots に追加できます。逆に、既定で書き込める /tmp と $TMPDIR を外すのが exclude_slash_tmp と exclude_tmpdir_env_var です。
KEY POINT
この記事で分かること
workspace-writeで既定で書き込める場所writable_rootsの書き方と、/tmp/$TMPDIRの除外設定.git/や.codex/が書けない理由と、フル権限との違い
workspace-write の既定の範囲
sandbox_mode には 3 つの値があります。
| 値 | できること |
|---|---|
read-only | ファイルの閲覧のみ。編集やコマンド実行には承認が必要 |
workspace-write | 作業領域内のファイル編集と、その範囲内での通常のローカルコマンド実行。ローカル作業の既定 |
danger-full-access | サンドボックスなし。ファイルシステムとネットワークの境界を外す |
workspace-write で書き込めるのは、作業ディレクトリ(cwd)と、既定では /tmp と $TMPDIR です。サンプル設定の既定値は次のとおりです。
[sandbox_workspace_write]
# 作業ディレクトリ以外に追加で書き込める場所。既定: []
writable_roots = []
# サンドボックス内からの外向き通信。既定: false
network_access = false
# $TMPDIR を書き込み可能から外す。既定: false
exclude_tmpdir_env_var = false
# /tmp を書き込み可能から外す。既定: false
exclude_slash_tmp = false
用語解説
writable roots: サンドボックスが書き込みを許可するディレクトリの起点です。ここに含まれる配下のパスに書けます。作業ディレクトリは常に含まれ、writable_roots で増やせます。
writable_roots で追加する
公式ドキュメントの例は、pyenv の shims ディレクトリを追加しています。
[sandbox_workspace_write]
writable_roots = ["/Users/YOU/.pyenv/shims"]
追加する候補になりやすいのは、次のようなツールのキャッシュやインストール先です。
| 用途 | 例 |
|---|---|
| Python の仮想環境やツールの shims | ~/.pyenv/shims |
| パッケージマネージャのキャッシュ | ~/.npm、~/.cache/pip、~/.cargo/registry |
| 複数リポジトリをまたぐ作業 | 隣接するリポジトリのパス |
パスは絶対パスで書きます。~ の展開が効くかは公式ドキュメントでは確認できなかったので、上の例のようにフルパスで書くのが確実です。
追加は最小限に。ホーム全体を足さない
writable_roots = ["/Users/YOU"] のようにホーム全体を足すと、シェルの設定ファイルや SSH の鍵まで書き込み可能になり、サンドボックスの意味がほぼなくなります。必要なキャッシュディレクトリだけを個別に足してください。
/tmp と $TMPDIR を外す
一時ディレクトリへの書き込みも止めたい場合は、除外フラグを true にします。
[sandbox_workspace_write]
exclude_slash_tmp = true
exclude_tmpdir_env_var = true
ただし、多くのビルドツールやテストランナーは一時ファイルを /tmp に作るため、外すと承認の回数が増えます。共有マシンで /tmp に他人のファイルがある、といった具体的な理由がない限り既定のままで問題ありません。
.git と .codex が書けない理由
公式ドキュメントは、workspace-write でも「環境によっては .git/ と .codex/ が読み取り専用のまま」になると説明しています。Codex が git の履歴や設定、自分自身の設定ファイルを書き換えてしまうのを防ぐ措置です。コミットを Codex に作らせたい場合に .git/ への書き込みが拒否されるなら、その操作は承認を伴う形で行うか、コミット自体は自分で行う運用にしてください。
ネットワークを開けるかどうかは network_access で別に決めます。承認ポリシーとサンドボックスの組み合わせ全体は親記事の approval mode と sandbox 設定の違い を、--full-auto が何を変えるかは Codex の --full-auto は何をするのか を参照してください。
まとめ
workspace-writeの既定で書けるのは作業ディレクトリと/tmp、$TMPDIR- 作業ディレクトリ外は
[sandbox_workspace_write] writable_rootsに絶対パスで追加する。ホーム全体は足さない /tmpと$TMPDIRを外すのはexclude_slash_tmp/exclude_tmpdir_env_var(既定false).git/と.codex/は環境によっては読み取り専用のまま- ネットワークは
network_accessで別に制御する
よくある質問
- workspace-write では既定でどこに書けますか?
- 作業ディレクトリ(cwd)に加えて、/tmp と $TMPDIR です。サンプル設定では exclude_slash_tmp と exclude_tmpdir_env_var の既定が false と示されており、既定ではどちらも書き込み可能です。
- ホームディレクトリ配下のキャッシュに書けずにビルドが失敗します。
- そのパスを writable_roots に追加します。公式の例では pyenv の shims ディレクトリを追加しています。
- .git に書けないのは仕様ですか?
- 公式ドキュメントは、workspace-write でも環境によっては .git/ と .codex/ が読み取り専用のままになると説明しています。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。