.codex/config.tomlをchezmoiで管理する

公開

はじめに

~/.codex/config.tomlは、モデルやfeatureフラグの設定などが含まれるファイルのため、dotfilesとして管理したくなります。ただ、Codex CLIはプロジェクトのtrust設定をこのファイルに勝手に追記します。

~/.codex/config.toml
model = "gpt-5.3-codex"
model_reasoning_effort = "high"
# ...
# 初めてCodex CLIを実行するディレクトリだとプロンプトが出て、許可すると勝手に追記される
[projects."/path/to/project"]
trust_level = "trusted"
# ちなみに許可しなくても追記される
[projects."/path/to/project"]
trust_level = "untrusted"

この追記が入るせいで、chezmoiなどでそのまま管理しようとしても差分が出てかなり面倒です。

chezmoi 公式では、ファイルを丸ごとではなく部分的に管理する方法として、modify_属性を使う方法が紹介されています。

今回はこのmodify_属性を使って、~/.codex/config.tomlを部分管理する方法を紹介します。

modify_で部分管理する

modify_を付けたファイルはスクリプトとして実行されます。スクリプトには標準入力で既存ファイルの内容が渡されます。そしてスクリプトの標準出力がファイルの内容として適用されます。また、chezmoi:modify-templateが含まれる場合、chezmoiのテンプレートとして解釈され、既存ファイル内容は.chezmoi.stdinで参照できます。

実際にはこんな感じで書けば、部分的な管理ができます。

dot_codex/modify_config.toml
{{- /* chezmoi:modify-template */ -}}
# chezmoi-managed:start
model = "gpt-5.3-codex"
model_reasoning_effort = "high"
web_search = "live"
[features]
multi_agent = true
prevent_idle_sleep = true
# chezmoi-managed:end
{{- .chezmoi.stdin | replaceAllRegex "(?s)^# chezmoi-managed:start.*?# chezmoi-managed:end\n*" "\n\n" -}}

これで、# chezmoi-managed:startから# chezmoi-managed:endまでをchezmoiの管理領域としつつ、それ以外の行は既存ファイルから引き継げます。

このテンプレートがやっていること

最初のブロック(chezmoi-managed:startend)は、管理対象のコンフィグです。モデルやfeatureのように「自分で決めた値を維持したい設定」をここに置きます。ブロックの先頭と最後のコメントはchezmoiが管理しているブロックであることを示して、後ろのスクリプトで置き換えるためのマーカーです。

最後の1行は.chezmoi.stdin(現在の~/.codex/config.toml)から、以前に出力した管理ブロックだけを正規表現で削って、残りを後ろに連結しています。その結果、Codex CLIが追記したprojects.*trust_levelは残り、chezmoiの管理領域だけが更新されます。

注意点

最初の実行時はマーカーコメントが無いため、管理対象のコンフィグが既存のコンフィグの先頭に差し込まれる形になります。手動で~/.codex/config.tomlを編集して、整合性を保つようにしてください。なお、modify_属性を使用した場合、chezmoi re-addでの追加ができなくなってしまいます。 Codex CLI側でモデル名やfeatureフラグを編集した場合は差分が出てしまうので、手動でchezmoi側を編集する必要があります。

おわりに

modify_属性を使うことで~/.codex/config.tomlの部分管理が可能です。実際に私が運用しているmodify_config.tomlも置いておくので参考にしてみてください。