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

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 homeCodex CLIのAGENTS.mdconfig.tomlを置くdirectoryです
Hermes homeHermes Agentの設定、memory、skill、logを置くdirectoryです
dry-run移行予定を表示し、対象データの適用を止めるoptionです
fixture動作確認のために作る合成データです
MCP serveragentから外部toolへ接続する設定単位です
stripped secret名前から秘密と判定され、移行対象から外れた設定です
hashfileの内容が同じか比べるための要約値です

対応関係を図で見る

今回用意する 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.mdmemories/*.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-valuesynthetic-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.tomldocs server を Hermes のconfig.yamlへ写す候補です。DOCS_MODEは秘密らしい名前ではないため残ります。DEMO_API_KEYは名前で除外されました。

memoriesは、memories/review.mdを同じ Hermes memory へ追加する候補です。AGENTS.mdと保存先が同じなので、似た内容が重複していないか確認します。

skillは、release-checkskills/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 値が出なかったことを分けて確認できました。ただし、名前による除外は秘密検出の補助です。PASSWORDTOKENを含まない変数名へ秘密を入れれば、安全とは限りません。

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 の結果を、次の順で見ます。

  1. AGENTS.mdと memory の内容が今も有効か確認します
  2. MCP の command、args、接続先を確認します
  3. 除外された secret を Hermes 側でどう供給するか決めます
  4. 同名 skill や MCP server との競合を確認します
  5. target の backup と復旧方法を用意します
  6. 適用は別の commit または作業記録として実行します

--overwrite --yesを最初から付けません。--overwriteは同名の MCP server や skill を置き換えます。--yesは確認を省きます。preview の件数と内容が想定どおりになってから使います。

よくあるエラー

症状主な原因対応
Agent directory not foundになります--sourceがCodex homeを指していませんAGENTS.mdconfig.tomlがあるdirectoryを指定します
移行候補が0件です対応fileがないか、内容が空です公式の対応表とsourceのfile一覧を照合します
MCP serverがskipされますentryにcommandurlもありません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 AgentsCodex CLIの対応表、preview、secret除外、競合時の動作
Hermes Agent CLI Commandsimport-agentの引数と--dry-runの説明
NousResearch/hermes-agent公式source repository
OpenAI Codex: Configuration Referenceconfig.tomlmcp_serversの公式設定
OpenAI Codex: Custom instructions with AGENTS.mdCodex CLIが読むAGENTS.mdの役割
2026年9月15日の合成fixture検証Hermes Agent v0.21.0で4件のpreview、secret値の非表示、移行先fileの状態を確認
この記事をシェア