Codex CLIの設定をHermes Agentへ移す前に|dry-runの境界を実機で確かめる

--dry-runと表示されていても、「プロセスが何も書かない」とは限りません。
2026 年 9 月 15 日、Hermes Agent v0.21.0 へ合成した Codex CLI 設定を渡しました。移行候補は 4 件です。config.yaml、移行先の memory、skill は変わりませんでした。一方、空の検証先にはSOUL.mdと 2 つの log が新しくできました。
移行データを書かないことと、Hermes の起動処理が補助ファイルを作ることは別でした。私は dry-run を「対象データの preview」として扱い、作業 directory 全体の不変性は hash と file 一覧で確認します。
Claude Codeの棚卸しからCodex CLIへ進む
前回の「Claude Codeの設定をHermes Agentへ移す前に」では、実際の~/.claudeを preview しました。移行候補はCLAUDE.mdの 1 件で、4 項目が skip されました。
今回は実環境の~/.codexを読みません。専用の合成 directory へ、Codex CLI の主要な移行対象を 1 件ずつ置きます。これなら秘密を開かず、対応関係をまとめて確認できます。
| 時点 | 確認できる範囲 |
|---|---|
| 前回完了時 | Claude CodeのCLAUDE.mdと権限設定をpreviewできます |
| 今回開始時 | Codex CLIのMCP、memory、skillの変換結果は未確認です |
| 今回完了後 | 合成した4項目の移行先、秘密名の除外、書き込み境界を検査できます |
すでに Codex CLI の対応表を知っている場合は、「合成した Codex 設定を用意する」まで飛ばせます。実行結果だけ確認する場合は、「4 件の移行候補を読む」から読めます。
なぜ本物の~/.codexを最初から読まないのか
Codex CLI の home には、AGENTS.mdや skill だけでなくauth.jsonも置かれます。認証 file は移行対象外ですが、実データを使うと検査 log や画面共有へ秘密を混ぜる余地が残ります。
そこで、構造だけを再現した合成 fixture を使います。API key らしい名前にも、実在しない値を入れます。preview に値が出なければ、除外処理を安全に確かめられます。
この方法には限界もあります。本番の設定競合や、長い memory が文字数上限へ達する動作までは確認できません。まず変換の基本線を調べ、本番適用は別の変更として扱います。
用語を揃える
| 用語 | この回での意味 |
|---|---|
| Codex home | Codex CLIのAGENTS.mdやconfig.tomlを置くdirectoryです |
| Hermes home | Hermes Agentの設定、memory、skill、logを置くdirectoryです |
| dry-run | 移行予定を表示し、対象データの適用を止めるoptionです |
| fixture | 動作確認のために作る合成データです |
| MCP server | agentから外部toolへ接続する設定単位です |
| stripped secret | 名前から秘密と判定され、移行対象から外れた設定です |
| hash | fileの内容が同じか比べるための要約値です |
対応関係を図で見る
今回用意する source は 4 系統です。auth.jsonも置きますが、移行線へは入りません。
/tmp/hibanas-codex-import-lab/
├── codex-source/
│ ├── AGENTS.md ───────────────┐
│ ├── config.toml ── MCP ──────┼──> hermes import-agent codex --dry-run
│ ├── memories/review.md ──────┤ │
│ ├── skills/release-check/ ───┤ ├── preview 4件
│ └── auth.json ── 対象外 ─────┘ └── secret名を除外
│
└── hermes-target/
├── config.yaml 内容は不変
├── memories/MEMORY.md 未作成
├── skills/codex-imports/... 未作成
├── SOUL.md 起動時に作成
└── logs/ 起動時に作成
公式の対応表では、AGENTS.mdとmemories/*.mdは Hermes のMEMORY.mdへ入ります。config.tomlの[mcp_servers.*]は Hermes のmcp_serversへ変わります。Codex の skill はskills/codex-imports/配下へ移る設計です。
合成したCodex設定を用意する
専用パスが既にある場合は、削除して使い回しません。別の名前へ変えます。
LAB=/tmp/hibanas-codex-import-lab
[ ! -e "$LAB" ] || {
printf 'already exists: %s\n' "$LAB"
exit 1
}
mkdir -p \
"$LAB/codex-source/memories" \
"$LAB/codex-source/skills/release-check" \
"$LAB/hermes-target"
AGENTS.mdには 2 つの短い規則を置きます。
printf '%s\n' \
'# Working rules' \
'' \
'- Run tests before commit.' \
'- Keep changes focused.' \
> "$LAB/codex-source/AGENTS.md"
memory と skill も 1 件ずつ作ります。
printf '%s\n' \
'# Review' \
'' \
'Record the exact command output before reporting success.' \
> "$LAB/codex-source/memories/review.md"
printf '%s\n' \
'---' \
'name: release-check' \
'description: Check a release candidate.' \
'---' \
'' \
'# Release check' \
'' \
'Run the project tests.' \
> "$LAB/codex-source/skills/release-check/SKILL.md"
MCP 設定には、残す環境変数と除外させる環境変数を並べます。値はどちらも合成値です。
printf '%s\n' \
'[mcp_servers.docs]' \
'command = "npx"' \
'args = ["-y", "@modelcontextprotocol/server-filesystem", "/tmp/demo"]' \
'env = { DOCS_MODE = "read-only", DEMO_API_KEY = "synthetic-value" }' \
> "$LAB/codex-source/config.toml"
対象外を確認するため、auth.jsonにも合成値を置きます。本物の token は使いません。
printf '%s\n' \
'{"token":"synthetic-auth-value"}' \
> "$LAB/codex-source/auth.json"
printf '{}\n' > "$LAB/hermes-target/config.yaml"
移行先の基準状態を保存する
今回は、移行対象となるconfig.yamlの hash を先に取ります。
sha256sum "$LAB/hermes-target/config.yaml"
実測値は次の通りでした。
ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356 /tmp/hibanas-codex-import-lab/hermes-target/config.yaml
空の target へconfig.yamlを先に置いた理由があります。Hermes Agent v0.21.0 のimport-agentは、設定 file がなければデフォルト設定を作ってから preview します。import 処理と起動処理を分けて観察するため、空の YAML mapping を用意しました。
Codex CLI向けdry-runを実行する
HERMES_HOMEは検証先だけへ向けます。通常利用している Hermes home は変更しません。
HERMES_HOME="$LAB/hermes-target" \
hermes import-agent codex \
--source "$LAB/codex-source" \
--dry-run \
| tee "$LAB/dry-run.txt"
期待する判断材料は 3 つです。
- 移行候補が 4 件あります
DEMO_API_KEYの名前が除外一覧へ出ますsynthetic-valueとsynthetic-auth-valueは出力へ現れません
実行結果の主要部分は次の通りでした。
Import Preview — 4 item(s) would be imported
✓ Would import:
agents-md → .../memories/MEMORY.md
mcp-servers → config.yaml mcp_servers.docs
memories → .../memories/MEMORY.md
skill → .../skills/codex-imports/release-check
Secrets stripped (never imported):
mcp_servers.docs.env.DEMO_API_KEY
Summary: 4 would import
表示の...は出力の捏造ではありません。検証用 root の重複部分だけを省略しています。完全な出力では、すべて/tmp/hibanas-codex-import-lab/配下を指していました。
4件の移行候補を読む
agents-mdは、Codex home 直下のAGENTS.mdを Hermes memory へ変える候補です。Markdown の見出しや箇条書きから entry を抽出します。project 固有の規約を global memory へ入れてよいかは、人が判断します。
mcp-serversは、config.tomlのdocs server を Hermes のconfig.yamlへ写す候補です。DOCS_MODEは秘密らしい名前ではないため残ります。DEMO_API_KEYは名前で除外されました。
memoriesは、memories/review.mdを同じ Hermes memory へ追加する候補です。AGENTS.mdと保存先が同じなので、似た内容が重複していないか確認します。
skillは、release-checkをskills/codex-imports/release-checkへ copy する候補です。Codex 側の directory をそのまま移すため、SKILL.mdだけでなく補助 script や asset も確認対象になります。
4 件すべてが変換可能でも、そのまま適用してよいとは限りません。preview は構文上の移行可否を示します。現在の運用方針との一致までは判定しません。
秘密値が出ていないことを機械で確かめる
目視だけでは、長い出力の見落としが残ります。合成値を文字列検索します。
python3 -c "from pathlib import Path
text=Path('$LAB/dry-run.txt').read_text()
for value in ('synthetic-auth-value', 'synthetic-value'):
print(value, 'present' if value in text else 'absent')"
実出力は両方ともabsentでした。
synthetic-auth-value absent
synthetic-value absent
auth.jsonの値が出なかったことと、MCP の secret 値が出なかったことを分けて確認できました。ただし、名前による除外は秘密検出の補助です。PASSWORDやTOKENを含まない変数名へ秘密を入れれば、安全とは限りません。
dry-run後のfileを確認する
移行先の主要 3 項目を読みます。
sha256sum "$LAB/hermes-target/config.yaml"
[ ! -e "$LAB/hermes-target/memories/MEMORY.md" ] \
&& echo 'memory_file=absent'
[ ! -e "$LAB/hermes-target/skills/codex-imports/release-check" ] \
&& echo 'skill_dir=absent'
実出力です。
ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356 /tmp/hibanas-codex-import-lab/hermes-target/config.yaml
memory_file=absent
skill_dir=absent
config.yamlの hash は実行前と同じです。memory file と skill directory も作られていません。移行対象データは適用されていないと判断できます。
一方、target 全体の file 一覧は増えました。
実行前: config.yaml
実行後: SOUL.md, config.yaml, logs/agent.log, logs/errors.log
Hermes の起動処理がSOUL.mdと log を用意したためです。CLI には「No files were modified」と表示されましたが、これは import 対象の変更がないという意味で読むのが安全です。空の Hermes home 全体が byte 単位で不変という意味にはできません。
既存の Hermes home では、log への追記も起こり得ます。厳密な不変検査では、設定、memory、skill など、守りたい対象を先に決めて hash や file 一覧を取ります。
本番適用前に分けて判断する
私は preview の結果を、次の順で見ます。
AGENTS.mdと memory の内容が今も有効か確認します- MCP の command、args、接続先を確認します
- 除外された secret を Hermes 側でどう供給するか決めます
- 同名 skill や MCP server との競合を確認します
- target の backup と復旧方法を用意します
- 適用は別の commit または作業記録として実行します
--overwrite --yesを最初から付けません。--overwriteは同名の MCP server や skill を置き換えます。--yesは確認を省きます。preview の件数と内容が想定どおりになってから使います。
よくあるエラー
| 症状 | 主な原因 | 対応 |
|---|---|---|
Agent directory not foundになります | --sourceがCodex homeを指していません | AGENTS.mdやconfig.tomlがあるdirectoryを指定します |
| 移行候補が0件です | 対応fileがないか、内容が空です | 公式の対応表とsourceのfile一覧を照合します |
| MCP serverがskipされます | entryにcommandもurlもありません | Codexのconfig.tomlを確認します |
| secret名が除外されません | 変数名が秘密らしいpatternに一致しません | 値をsourceへ直書きせず、Hermes側で秘密管理します |
config.tomlのparse errorが出ます | TOML構文が壊れています | Codex CLIで設定を読み直し、該当fileを修正します |
| 同名skillがconflictになります | Hermes側に移行先directoryがあります | 両方のSKILL.mdを読み、正本を決めます |
| dry-run後にfileが増えました | Hermesの起動処理が補助fileやlogを作りました | import対象とruntime補助fileを分けて比較します |
| 値が出力へ伏せ字で出ます | Hermesのsecret redactionが働いています | raw値を共有せず、合成値で再検査します |
検証用directoryを片付ける
本番 home ではないことを確認してから、専用 directory だけを削除します。
[ "$LAB" = /tmp/hibanas-codex-import-lab ] || exit 1
rm -rf -- "$LAB"
~/.codexや~/.hermesを削除対象へ含めません。パスが一致しない場合は、削除せず止めます。
previewの言葉を広げすぎない
今回、AGENTS.md、MCP、memory、skill の 4 件は移行候補として表示されました。MCP のDEMO_API_KEYは名前だけが除外一覧へ出て、2 つの合成値は出力へ現れませんでした。
移行先では、config.yamlの hash が一致し、memory と skill も未作成でした。ただし、Hermes Agent v0.21.0 の起動によりSOUL.mdと log が作られました。
この差は小さく見えますが、automation では重要です。「dry-run 成功」を directory 全体の無変更と同じにしないためです。何を守りたいか決め、その file を実行前後で検査すれば、preview の境界を実測値で説明できます。
一次情報
| 資料 | 確認した内容 |
|---|---|
| Hermes Agent: Import from Other Agents | Codex CLIの対応表、preview、secret除外、競合時の動作 |
| Hermes Agent CLI Commands | import-agentの引数と--dry-runの説明 |
| NousResearch/hermes-agent | 公式source repository |
| OpenAI Codex: Configuration Reference | config.tomlとmcp_serversの公式設定 |
| OpenAI Codex: Custom instructions with AGENTS.md | Codex CLIが読むAGENTS.mdの役割 |
| 2026年9月15日の合成fixture検証 | Hermes Agent v0.21.0で4件のpreview、secret値の非表示、移行先fileの状態を確認 |
