Codexの作業完了をずんだもんに喋らせてみた

Claude Code版に続いて、Codexでも作業完了をずんだもんに喋らせるようにした。

Codexで長めの修正や調査を任せていると、気づいたら処理が終わっていることがある。ターミナルをずっと見張るのも微妙なので、Codexが止まったタイミングでVOICEVOXのずんだもんが報告してくれるようにした。

作ったものはこちら。

GitHub: https://github.com/shotasten/codex-skills-zundamon

以前作ったClaude Code版

先にClaude Code版も作っていた。やりたいことはほぼ同じで、「AIエージェントが作業を終えたら音声で気づけるようにする」というもの。

今回はこれのCodex版。Claude Codeとは設定ファイルやhookの扱いが違うので、Codex用に作り直した。

codex-skills-zundamonでできること

codex-skills-zundamon は、Codexの作業報告をVOICEVOXで読み上げるためのSkillとhookをまとめたリポジトリ。

  • $zundamon で任意テキストや直前作業の報告を読み上げる
  • Codexのturn停止時にStop hookで最後のメッセージを読み上げる
  • エラー・失敗・警告っぽい内容ならヒソヒソ声に切り替わる
  • 再生中の読み上げを停止できる

対応OSはREADME上ではmacOS / WSL / Linux。私は「作業が終わったことに気づく」用途なので、まずはStop hookが本命。

前提条件

VOICEVOX EngineをDockerで動かすので、Dockerが使える状態にしておく。

また、読み上げスクリプトでは以下のコマンドを使う。

  • curl
  • jq
  • python3
  • macOSなら afplay
  • WSLなら powershell.exe
  • Linuxなら ffplay(ffmpeg)

インストール

1. リポジトリをクローン

shell
git clone https://github.com/shotasten/codex-skills-zundamon.git
cd codex-skills-zundamon

2. VOICEVOXを起動

リポジトリには docker-compose.yml が入っているので、そのまま起動する。

shell
docker compose up -d

VOICEVOX Engineは http://localhost:50021 で待ち受ける。スクリプト側もデフォルトではこのURLを見に行く。

3. SkillをCodexに入れる

全リポジトリで $zundamon を使いたい場合は、CodexのグローバルSkillディレクトリへコピーする。

shell
mkdir -p ~/.codex/skills
cp -R .agents/skills/zundamon ~/.codex/skills/

特定のリポジトリだけで使いたい場合は、そのリポジトリに .agents/skills/zundamon をコピーすればよい。

4. Stop hookを有効にする

Codexが止まるたびに自動で読み上げるには、hookを設定する。全リポジトリで使うなら ~/.codex/hooks.json を作る。

~/.codex/hooks.json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "/usr/bin/env bash ${HOME}/git/codex-skills-zundamon/hooks/zundamon_stop.sh",
            "timeout": 30,
            "statusMessage": "ずんだもんに報告中"
          }
        ]
      }
    ]
  }
}
パスは自分の配置先に合わせる

command${HOME}/git/codex-skills-zundamon/ は、自分がリポジトリを置いた場所に合わせて変更する。ここがずれているとhookは動かない。

Codex起動後、/hooks でhookを確認してtrustする。Codexは信頼していないhookを勝手には実行しない。

リポジトリ単位でhookを入れる場合

全体設定ではなく、特定のリポジトリだけで使いたい場合はrepo-local hookにする。

shell
mkdir -p /path/to/repo/.codex /path/to/repo/hooks /path/to/repo/scripts
cp .codex/hooks.json /path/to/repo/.codex/
cp .codex/config.toml /path/to/repo/.codex/
cp hooks/zundamon_stop.sh /path/to/repo/hooks/
cp hooks/zundamon_stop_playback.sh /path/to/repo/hooks/
cp scripts/zundamon_say.sh /path/to/repo/scripts/
chmod +x /path/to/repo/hooks/zundamon_stop.sh /path/to/repo/hooks/zundamon_stop_playback.sh /path/to/repo/scripts/zundamon_say.sh

この場合もCodex起動後に /hooks からtrustする。

使い方

Codex内では、以下のように依頼する。

text
$zundamon ここまでの作業を報告して
$zundamon テストが通ったのだ
ずんだもんの読み上げを止めて

$zundamon にテキストを渡せばその内容を読み上げる。テキストなしで作業報告を頼むと、Codexが直近の作業を短くまとめて読み上げる。

Stop hookを入れておけば、こちらから $zundamon を呼ばなくてもCodexのturn停止時に自動で喋る。バックグラウンドでCodexに作業させるなら、個人的にはこっちが便利。

エラーっぽいときはヒソヒソ声になる

読み上げスクリプトは、テキストにエラー・失敗・警告などの単語が含まれるかを見ている。

  • 通常時: ずんだもん ノーマル(ID: 3)、速度 1.3
  • ネガティブ時: ずんだもん ヒソヒソ(ID: 38)、速度 1.2

たとえば「テストが失敗しました」みたいな報告だとヒソヒソ声になる。画面を見なくても、なんとなく「あ、何か失敗したな」と分かるのがよい。

Stop hookだけでもかなり便利

使ってみると、一番ありがたいのはCodexが止まった瞬間に気づけることだった。

Codexは調査、修正、テスト実行などで少し待つ場面がある。その間に別の作業をしていると、完了に気づくのが遅れる。Stop hookで音が鳴ると、ターミナルを見に戻るタイミングが分かりやすい。

読み上げ内容を細かく制御したいときは $zundamon、とにかく完了に気づきたいときはStop hook、という使い分けがよさそう。

さいごに

Claude Code版に続いて、Codex版もずんだもんに喋ってもらえるようにした。

地味な仕組みだけど、作業完了に気づけるだけでAIエージェントとの付き合い方が少しラクになる。Codexを別ウィンドウで動かしがちな人には、けっこう相性がよいと思う。