Codex CLIでもセッションの再開(resume)を簡単にするためのCLIツール、「cdxresume」を作った
はじめに
こんにちは。フリーランスでソフトウェアエンジニアをやってます。ささざめです。
先日、Claude Codeのresume機能(-r)を簡単にするためのツール「ccresume」というのを開発しました。エンジニア人生で初めて正式に公開したOSSプロジェクトで、なんと2025年9月現在で138スターも頂いてしまいました。
zennで書いた記事のほうも沢山読んでいただけて、ありがたい限りです。
Claude Codeが爆発的に盛り上がってから3ヶ月ほどが経った頃ですが、私は一旦Claude MAX Plan($100)の課金を止めて、Open AIのCodex CLIに乗り換えています。
巷ではclaudeの性能が劣化した!って言われていますが、私の場合は別にそういうわけではなくて、最近ちょっと業務が忙しくなってきていて、Claude Codeの利用頻度が落ちているのもあって、コスト削減のために一度Max Plan($100)を止めることにした、という経緯。
で、ついでに$20で試せるCodex CLIを触ってみようじゃないかと思い立ったのでした。
resumeが、ない!
Codex CLI触り始めると、なかなか手触りはいい感じ。
まだsubagentとかの仕組みがないのは残念だけど、これはclaude側の最新機能みたいな感じだしまあ仕方ないかな、と思ってました。
で、ちょっと重いタスクをやらせているときに、完全にターミナルが停止してしまって、WSLごと再起動したんですよ。
セッション再開して、タスクの割り方変えてみるか……なんて思いながらcodex -r
を叩いてみると
$ codex -r
error: unexpected argument '-r' found
tip: to pass '-r' as a value, use '-- -r'
Usage: codex [OPTIONS] [PROMPT]
codex [OPTIONS] [PROMPT] <COMMAND>
For more information, try '--help'.
ないんか~い、と。もちろんヘルプを見ても、ソレらしい機能が見当たらず。
コンテキストを上手く構築していくのが、Agentic Coding(Vibe Coding)では重要なわけで、resumeとかcontinueとかの機能はもはや必須級ではないかと思います。
世間の会話や公式Issueなんかを見ていると、すぐ対応されるんじゃないか、という雰囲気を感じてはいたんですが、数日待っても出てこない。
というわけで、前回ccresumeを作った経験から、自前でそれっぽいツールを用意することにしたのでした。
作ったもの
cdxresume
- Codex CLIのセッションを簡単に再開できるCUI(TUI)ツールです。
主な機能
- 過去の全プロジェクトのCodex CLI会話履歴を一覧表示
- 会話の詳細(チャット履歴)を簡易プレビュー
- fキーで、会話ログのフルビューモードに切り替え(実験機能)
- Enterキーで選択した会話を即座に再開
- 起動時に与えられたオプションはすべてcodexコマンドの実行時引数に引き渡し
- -キーで、オプション編集画面に切り替え。付与し忘れたオプションの編集が可能
インストール・使い方
# npxで実行(インストール不要)
npx cdxresume@latest
# またはグローバルインストール
npm install -g cdxresume
ccresumeのときは、@sasazame/ccresumeという感じでスコープを付ける必要がありましたが、今回はなしでいけました。
実現手法
先述の通り、codexの公式ヘルプテキスト内には、現時点(20250903)ではresumeに相当するオプションがありません。
実際の実現手法は、codex -c experimental_resume=<path-to-jsonl>
を実行しています。
jsonlファイルとは、実際の会話ログのこと。Claude Codeと同様に、セッションごとに切り分けられた1行1レコードで構成されるjsonl(JSON Lines)ファイルを参照して、セッションを再開します。
もう少し分解すると、-c
オプションは、実際にはconfig指定のオプションです。
-c, --config <key=value>
Override a configuration value that would otherwise be loaded from `~/.codex/config.toml`. Use a
dotted path (`foo.bar.baz`) to override nested values. The `value` portion is parsed as JSON. If
it fails to parse as JSON, the raw string is used as a literal
# AI訳
-c, --config <key=value>
通常は `~/.codex/config.toml` から読み込まれる設定値を上書きします。
ネストされた値を上書きする場合は、ドット区切りのパス(例: `foo.bar.baz`)を使用します。
`value` 部分は JSON として解釈されます。JSON として解釈に失敗した場合は、
文字列そのものがリテラル値として使われます。
このオプションに、experimental_resumeというコンフィグ値を、任意のセッションファイルで上書きすることで、セッションが再開される仕組みとなっています。
現状課題:会話ログはcodex上では見えない
現状のexperimental_resumeでは、「会話履歴が表示されない」という制限があります。
Claude Codeの場合、セッションを再開すると、それまでの会話が復元されるため、セッションが再開されたことが一目瞭然であったのですが、codexではそこがわからないのが現状です。
resumeしたときに、これまでの会話内容を聴くと、記憶していることがわかるため、おそらく正しく継続できているのだとは思いますが、確証はありません。(まあ、会話ログが出ていたからといってセッションが引き継がれている証拠にもならないんですが笑)
この欠点は、cdxresume
をご利用いただけると、ある程度解消されます。
まとめ
というわけで、さっと作ってみたツールの紹介でした。
npx cdxresume@latest
で簡単に試せますので、codexのセッション再開でお困りの方はぜひお試しください。
Claude Codeユーザーの方は、ぜひccresume
の方もよろしくお願いいたします。npx @sasazame/ccresume@latest
で試せます。(Claude課金を切ってる都合上、メンテは難しいため、なにか変更が必要であればforkしてAIとかに直してもらってください笑)
宣伝
はてなブログさんの方で、ささざめブログという雑記ブログを毎日更新中です。
よければ遊びに来てね。
Discussion