Skip to content

Repository files navigation

codiva

対象の Git リポジトリで起動し、指示ごとに独立した git worktree 上で Claude Code セッションを並列実行する TUI アプリ。

npm version CI License: MIT

codiva は、自然文で指示を投げるたびに独立した git worktree + ブランチ上で Claude Code セッション(Claude Agent SDK 経由)をバックグラウンド起動し、複数タスクを並列に進行させるターミナル UI です。「指示を次々投げるだけで、並列に実装が進む」体験を目指しています。

特徴

  • 並列セッション — 指示ごとに worktree(.codiva/worktrees/<slug>)とブランチ(codiva/<slug>)を自動生成。互いのファイル変更が干渉しない。
  • リアルタイム進捗 — 一覧画面で全セッションの状態(実行中 / Step 4/7 / 質問あり / 許可待ち / 完了 / 失敗)と経過時間を表示。
  • ノンブロッキング投入 — 指示を投げても即座に次の指示を入力できる。
  • 許可応答・追加指示 — 詳細ビューでツール使用の許可 / 拒否、稼働中セッションへの追加指示ができる。
  • エージェントの切替 — セッションを動かすエージェントとして Claude Code のほかに Codexcodex CLI)と Grok(xAI の grok CLI)を選べる。一覧の /agent で新規セッションの既定を選び(自動で保存)、詳細ビューの /agent でそのセッションを途中から切り替える。導入・ログイン状態も /agent に表示(下記)。
  • マージ or 破棄 — 完了セッションの diff stat を確認し、ベースブランチへマージ、または worktree ごと破棄。
  • リポジトリ追加指示.codiva/prompt.md に書いた指示(例:「作業完了時に PR を出す」)を全セッションに自動注入。一覧画面の /prompt コマンドから TUI 内で編集できる。
  • プラン / 使用状況の表示 — 一覧画面のヘッダに claude.ai のプラン種別(Pro / Max / Team / Enterprise)と使用リミット枠(使用率・リセットまでの残り時間)を表示。
  • 現在ブランチの表示 — ヘッダに対象リポジトリがチェックアウトしているブランチ(= 新しいセッションの分岐元・マージ先)を表示。別ターミナルで切り替えても数秒で追従します。
  • 学習データ利用の警告 — claude.ai の「Help improve our AI models」(モデル学習へのデータ提供)が ON のときだけ、起動時のヘッダに注意行を出す。
  • アップデート通知 — 起動時に npm の最新版を確認し、新しいバージョンがあればヘッダに 1 行表示。/update コマンドで確認の上その場で更新できる。
  • キーボード完結 — マウス不要。入力欄・ヘッダ・セッション詳細のログはドラッグで範囲選択してコピーもできます(ログは画面外へドラッグすると自動スクロールしながら選択が続きます)。ログ内の URL はクリックでブラウザで開けます。
  • 日本語 / 英語 UI~/.codiva/config.json または CODIVA_LANG で切替。

動作要件

  • Node.js >= 20
  • claude / codex / grok の CLI が 1 つ以上インストール・ログイン済みであること(下記「Codex / Grok で動かす」)。 どれも無くても codiva は起動でき、/login で codiva の中からサインインできます。
  • 対象が Git リポジトリで、コミットが 1 つ以上あること

インストール

npm install -g codiva

一度きり試すだけなら:

npx codiva

アップデート

起動時に npm レジストリを 1 回だけ確認し、新しいバージョンがあればバナーに ↑ 新しいバージョン v0.3.0 が利用できます · /update で更新 と表示します(最新のときや確認できなかったときは何も表示しません)。

/update を実行すると最新版を確認し直し、更新があれば実行するコマンドを提示して y / n を尋ねます。y で codiva がそのまま npm install を実行し、完了後に再起動を促します。

  • グローバルインストール(npm install -g codiva)→ npm install -g codiva@latest を実行します(実行前に稼働中セッションがあれば警告します)
  • npx codiva → インストールが無いので何もしません(次回の npx で最新が使われます)
  • それ以外(プロジェクトのローカル依存 / volta などのツールマネージャ配下 / Windows / 判別できない配置)→ codiva からは実行せず、実行すべきコマンドの提示だけを行います

codiva 側から実行しない範囲を広く取っているのは意図的です。ローカル依存の更新は利用者のリポジトリの package.json と lockfile を書き換え、node_modules(既定で各 worktree にシンボリックリンクされています)を作り直してしまいます。また判別できない配置に npm install -g すると、実際に入っている場所とは別の場所へインストールして環境を壊しかねません。誤検出のコストを「自動化されないだけ」に抑えています。

確認の通信は https://registry.npmjs.org/codiva/latest への 1 リクエスト(約 2.3KB・3 秒でタイムアウト)だけで、送るのはパッケージ名のみです。バージョンや利用状況は送信しません。オフラインでも起動は一切ブロックされません。~/.codiva/config.json"updateCheck": false でこの通信を完全に止められます。

使い方

対象リポジトリのルートで起動します。

cd path/to/your-repo
codiva
  1. 入力欄に指示(例:「ログイン機能を実装してください」)を入力して Enter。新しいセッションが作成され、すぐ次の指示を入力できます。
  2. 一覧で各セッションの進捗をリアルタイムに確認します。
  3. セッションを選ぶと詳細ビューに入り、ログ閲覧・追加指示・許可応答ができます。
  4. 完了したら diff stat を確認し、マージまたは破棄します。

worktree ディレクトリ .codiva/ には * の 1 行だけを書いた .codiva/.gitignore が自動生成され、.codiva/ 以下がまるごと git から見えなくなります(除外ファイル自身も * に一致するので自己完結します)。対象リポジトリの .gitignore.git/ の中も書き換えません。

入力欄

長い指示は画面幅で自動的に折り返され、打った文字が切り捨てられずに全部見えます(空白があれば単語の途中で切りません)。入力が縦に伸びるのは 8 行までで、それを超えるとカーソル位置に合わせて内部スクロールします。

キー操作

すべての入力欄(一覧のコンポーザ、詳細ビューの追加指示欄、/prompt エディタ、質問ダイアログの 「自分で入力する」欄)で共通です。実装も 1 つなので、場所によって挙動が変わることはありません。

キー 動作
Enter 送信(先頭が / のときはコマンド実行)
Shift+Enter 改行(効かない端末では行末に \ を置いて Enter
Ctrl+U 書きかけを全消し(キャレット位置に関係なく入力欄を空にする)
←→ キャレット移動
↑↓ キャレット移動(見えている行 = 折り返し後の行の単位で動く)。上端/下端でさらに押すと入力履歴(一覧のコンポーザのみ)
Backspace 1文字削除

入力履歴(一覧のコンポーザ)

一覧画面の入力欄では、shell と同じように さっき送った指示を呼び戻せます(直近 50 件。同じ指示の連投は 1 件にまとめます)。

  • は「キャレットが最上段の行にあるとき」だけ履歴になります。複数行を書いている途中では通常のキャレット移動が優先されるので、書きかけが履歴に化けることはありません。
  • は新しい方へ戻り、最新を越えると辿り始めたときの書きかけが復帰します(履歴を覗いただけで書きかけを失いません)。
  • 呼び戻したテキストはそのまま編集できます(キャレットは末尾)。Ctrl+U で捨てられます。
  • 詳細ビューの追加指示欄では ↑↓ はログのスクロールなので、履歴は一覧のコンポーザだけの機能です。

macOS の Cmd+Delete は端末がアプリへ送らない(kitty keyboard protocol を有効にした端末でしか super 修飾が届かない)ため、全消しは Ctrl+U に割り当てています。Cmd+Delete で使いたい場合は端末側で Ctrl+U\x15)へ割り当ててください。Ghostty なら設定ファイルに次の 1 行を足します。

keybind = super+backspace=text:\x15

一覧のフォーカス移動(Tab)と質問への回答

一覧画面のフォーカスは Tab入力欄 → 質問/許可ダイアログ → セッション一覧 → 入力欄 と回ります(Esc はどこからでも入力欄へ戻ります)。ダイアログは選択中のセッションが質問・許可を待っているときだけこの輪に入ります。

ゾーン ↑↓ の動作 主なキー
入力欄 キャレット移動 / 入力履歴 Enter 送信
ダイアログ ダイアログの選択肢 Enter 決定 ・ Space トグル(複数選択) ・ y/n(ツール許可)
セッション一覧 セッションの選択 Enter/ 詳細 ・ m/d/xp
  • 質問・許可を待っている行を選ぶと、ダイアログがそのままキーを持ちます↑↓ での移動でも、行のクリックでも)。回答は待たせている用事なので、そこに辿り着くのに Tab を余分に押す必要はありません。
  • そこから一覧へ戻る(= ↑↓ で別のセッションへ切り替える)出口は Tab です。一覧ゾーンではダイアログは表示されたまま(内容は読めます)ですが、キーは受け取りません。
  • ダイアログの選択肢はクリックでも選べますEnter で決定 — 一覧の行をクリックして Enter で詳細を開くのと同じ関係です)。ラベルの折り返し行や説明の行をクリックしても、その選択肢が選ばれます。一覧ゾーンで「表示だけ」になっているダイアログも、選択肢をクリックすればそのまま回答へ戻れます。
    • クリックで許可(y)や決定が確定することはありません。ツール許可の y/n は必ずキーで押します。
  • 回答の途中(何問目か・チェック済みの選択肢・書きかけの自由記述)は Tab で往復しても、選択肢をクリックして「自分で入力する」に戻っても保持されます。
  • 回答し終えるとフォーカスは入力欄へ戻るので、次の質問が来てもタイピング中のキーを奪われませんTab 1 回でまた回答できます)。

詳細ビューのフォーカス移動(Tab)— 回答する前にログを遡る

セッション詳細で質問・許可のダイアログが出ている間も、Tabダイアログ ⇄ 会話ログ を行き来できます。質問だけを見せられて「何の話か分からないまま答える」ことがないように、背景を読み返してから回答するための切り替えです。

ゾーン ↑↓ / PgUp PgDn の動作 主なキー
ダイアログ(既定) ダイアログの選択肢 Enter 決定 ・ Space トグル ・ y/n(ツール許可)
会話ログ ログのスクロール Tab 回答へ戻る ・ Esc ダイアログへ
  • ダイアログが出るとまずダイアログにフォーカスが当たります(回答は待たせている用事なので、そこへ辿り着くために Tab を押す必要はありません)。ログを遡りたくなったら Tab を 1 回押してください。
  • ログゾーンでもダイアログは表示されたまま(内容は読めます)で、キーだけを受け取りません。回答へ戻るのは TabEscダイアログのクリックのどれでも構いません。
  • 回答の途中(何問目か・チェック済みの選択肢・書きかけの自由記述)は往復しても保持されます。
  • ログゾーンではドラッグでの範囲選択・URL のクリックも普段どおり使えます(ホイールでのスクロールはどちらのゾーンでも効きます)。
  • 回答し終えるとフォーカスはダイアログ側に戻るので、次の質問もそのまま答えられます。
  • Ctrl+C(中断)はどちらのゾーンでも効きます。

ログの読み方・スクロール

セッション詳細のログでは、エージェントの応答が返ってきたぶんだけ下に伸びていきます(1 行が書き換わり続けるのではなく、チャットと同じように読み進められます)。

  • 一番下にいるときだけ追従します。 /PgUp/ホイールで過去ログへ戻っている間は、応答が伸びても表示は 1 行も動きません(読んでいる途中で流されない)。画面下に「過去ログを表示中 — 最新まで N 行」と出るので、/PgDn で末尾へ戻ればまた追従します。
  • 書きかけのあいだは装飾(太字・見出しなど)が付かないプレーンな表示で、ターンが完了した時点で整形された本文に置き換わります。

実行中の作業を中断する(Ctrl+C

セッション詳細ビューで Ctrl+C を押すと、そのセッションが今やっているターンを中断します(Claude Code の Ctrl+C と同じ操作です)。codiva 自体は終了しません。

  • 中断したセッションは失敗ではなく「中断」として残るので、Ctrl+R(または追加指示を送る)で同じ会話の続きから再開できます。worktree・ブランチ・書きかけのコードはそのままです。
  • 許可待ち / 質問待ちのダイアログが出ている間も効きます。ダイアログの n(拒否)は「そのツール 1 回を断る」だけで作業は続くので、「この作業自体をやめたい」ときは Ctrl+C を使ってください。
  • 入力欄にフォーカスがあっても効きます(書きかけを消したいだけなら Ctrl+U)。実行中は画面下に案内が出ます。
  • 中断ではなくセッションを捨てたいときは d(破棄)/ x(削除)です。一覧ビューでは Ctrl+C は何もしません(誤爆を避けるため、中断は詳細ビューだけの操作です)。

テキストのコピー

すべての入力欄(一覧のコンポーザ・詳細の追加指示欄・/prompt のリポジトリ指示エディタ・質問ダイアログの自由記述欄)と、ヘッダ(ワードマーク / プラン / モデル / ブランチ / cwd)・セッション詳細のログは、ドラッグで範囲選択して離すとクリップボードへコピーされます(OSC 52 なので SSH 越しでも動きます)。ヘッダの cwd 行をドラッグすれば、いま作業しているパスをそのまま貼り付けられます。ヘッダのドラッグは入力中のフォーカスや一覧の選択行を動かしません。

  • ログは画面に収まらない範囲も選択できます。選択したまま可視域の外(上端より上 / 下端より下)へドラッグすると、その向きへ自動スクロールしながら選択が伸び続けます。マウスを止めていてもスクロールは続き、ボタンを離した時点で選択した範囲だけがコピーされます。
  • コピーされるのは画面に見えているとおりの文字列です(折り返した位置が改行になり、 などの行頭記号や継続行の字下げも含みます)。
  • 選択のハイライトは反転表示され、何かキーを押すと解除されます。
  • 端末ネイティブの選択(画面のどこでも選べる代わりにアプリ側の機能が使えない)は Shift+ドラッグ、または設定 "mouse": false でマウス捕捉を無効化して使えます。

ログ内の URL を開く

セッション詳細のログに出てくる URL は下線付きで表示され、クリックするとブラウザで開きます(ドラッグせずに押して離したときだけ開くので、範囲選択の操作とは競合しません)。

  • 対象は http(s) の URL です。Markdown のリンク([ラベル](URL))はラベルの部分をクリックするとリンク先へ飛びます。
  • 折り返しで URL が 2 行に分かれていても、どちらの行をクリックしても URL 全体が開きます。
  • Cmd+クリック(端末のリンク機能)ではなく、普通のクリックです。 codiva は全画面のあいだ端末のマウスレポートを有効にしており、この状態では端末側のリンク検出が無効になる端末があるためです(Ghostty はマウス捕捉中はリンクのホバー・クリックを一切扱いません。SGR マウスレポートには Cmd/Super を表すビットもありません)。そこで codiva 自身がクリックを受け取って開くようにしてあり、どの端末でも同じ操作で動きます。
  • 併せて OSC 8 ハイパーリンクも出力しているので、対応端末(iTerm2 / GNOME Terminal / Windows Terminal など)では端末側の Cmd+クリック / Ctrl+クリックも使えます。Ghostty / kitty / WezTerm では端末側のリンク機能は Shift を足した Shift+Cmd+クリック(Linux は Shift+Ctrl+クリック)で使えます(Shift がマウス捕捉のバイパスキーになっているため)。非対応の端末はこのエスケープを無視するだけで、表示は変わりません。

GitHub の PR ステータス表示

一覧の各行の右端に、そのセッションのブランチに対応する PR の状態が出ます(gh コマンドを 20 秒ごとに実行して検知。クリック / p でブラウザで開けます)。

表示 意味
確認中(1 回目の問い合わせが完了していない)
(空) このブランチに PR は無い
⋯ #12 PR あり。状態を確認中(再起動直後など)
? #12 PR あり。状態を確認できなかった(レート制限 / オフライン / gh 未認証)
✓ #12 マージ可能(チェックも通っている)
● #12 チェック実行中
✗ #12 チェック失敗、またはコンフリクトでマージ不可
⑂ #12 マージ済み
✓ #12 +2 PR が全部で 3 本ある(後述)
? 確認できなかった(GitHub の API レート制限 / オフライン / gh 未認証)

番号が薄い表示(#12)のときは draft PR です。gh が入っていない環境では PR 欄は常に空になります。

1 セッションから複数 PR が出たとき

セッションが自分で別ブランチを切って gh pr create すると、1 セッションに複数の PR が紐づきます。このとき一覧は #12 +2(代表の番号 + 残りの件数)と表示し、全件は詳細ビュー(Enter)の PR 3 件: ✓ #12 · #13 · #14 の行に出ます。

  • 代表として出るのはセッションのブランチ(codiva/<slug>)の PR です。クリック / p で開くのもこの PR で、グリフ( / / )もこの PR の状態です。ブランチに PR が無い場合は、セッションが最後に作った PR が代表になります。
  • 代表になった PR は、head ブランチが worktree に残っていなくても(別リポジトリの PR でも)その PR の URL で問い合わせて状態を追います(グリフが付きます)。代表以外(+n に畳まれているもの)は追跡対象外なので、詳細ビューでも番号のみです。
  • 逆に、GitHub が「そんな PR は無い」と答えた参照は一覧から消えます(URL の誤検知や、PR ごと消えた場合)。レート制限やオフラインで「確認できなかった」ときは消えません(? が出るだけです)。
  • 検知は gh pr create を実行したときのコマンド出力(PR の URL)からです。gh pr listgh pr view で他の PR を眺めただけのものは数えません(gh pr create … || gh pr list … のように読み取り系と混ざったコマンドも、誤検出を避けるため数えません)。検知した番号は保存されるので、再起動しても +n は残ります。
  • 逆に、codiva が起動していない間に作られた PR や、この機能より前に作られた PR は +n に出ません(コマンド出力は一度きりで、後からブランチ名で引き直せないため)。セッションブランチの PR は従来どおり gh で検知します。
  • 複数 PR の行があるときは PR 列を少し広げるため、狭い端末(80 桁前後)ではブランチ列が省かれることがあります。

PR の番号状態は別に扱います。番号はブランチに対して不変なので保存され、次回起動時にはすぐ #12 が出ます(状態のグリフは最初のポーリングで付きます)。状態だけが取得できなかった場合も番号は消えず、代わりに (確認中)/ ?(確認できず)がグリフの位置に出ます。

? が出るときは gh auth statusgh api rate_limit を確認してください。とくに GitHub の API レート制限(GraphQL は 1 時間あたり 5000)は Claude セッション自身の gh 実行とも共有なので、大量に並列作業していると枯れることがあります。この状態を検知したら codiva は 5 分間ポーリングを止めて回復を待ちます。確認できなかった間も直前に検知した PR 番号・状態は表示したままにします(消えて見えないほうが混乱するため)。

詰まった PR を立て直す(コンフリクト取り込み / CI 修正)

PR がコンフリクト()になったり CI が落ちたりしたとき、1 件ずつ worktree に入って直さなくて済むようにしています。

操作 何をするか
/sync 選択中(詳細ビューではそのセッションの)worktree にベースブランチを取り込む
/fix-ci 選択中のセッションに、落ちた CI を直すよう指示する
Ctrl+F(= /recover 詰まっている全セッションをまとめて立て直す(件数を見せて y / n 確認)

Ctrl+F はフォーカスに関係なく効きます。詰まっている行があるあいだは一覧に案内行が出ます。

/sync の挙動git fetch origin <base>git merge):

状況 結果
すでにベースを含んでいる 何もしない
きれいにマージできた マージして push まで済ませる(セッションは起こさない = トークンを使わない)
競合した git merge --abort せず競合を worktree に残したまま、競合ファイル一覧を添えてセッションに解決を依頼する
未コミットの変更がある マージを試みず、コミット/退避してから取り込むようセッションに依頼する(書きかけと混ざるのを防ぐ)

競合の解決を codiva が -X ours のような指定で勝手に片付けることはありません(コードを無言で捨てるため)。判断はセッション(AI)が行い、判断できない場合は質問するよう指示しています。

/fix-ci の挙動: PR ステータスと同じ 1 回の gh pr view に含まれる情報から落ちたチェック名と URL を取り出し(追加の API 呼び出しはしません)、それを添えて「gh run view --log-failed でログを見て原因を直し、push する」よう指示します。ログの取得と修正はセッション自身が行います。

自動化(既定は無効。手動コマンドは設定に関係なく使えます):

{ "autoSync": true, "autoFixCi": true }
  • autoSync: PR がコンフリクトと分かったら自動でベースを取り込む。
  • autoFixCi: チェックが赤くなったら自動で修正を依頼する。
  • どちらもセッションが手を止めているとき(完了・失敗・中断など)だけ動きます。作業中に指示を割り込ませることも、作業中の worktree で git merge を走らせることもありません(手動の /sync も同じです)。
  • 自動の依頼は 1 セッション・1 種類あたり 2 回までです。回数が戻るのは PR が実際に緑になった(またはマージされた)ときだけで、push 直後の「チェック実行中」では戻りません(直らない修正を push し続けると永久にターンが回ってしまうため)。
  • 既定を無効にしているのは、依頼が発生した時点でターンが回る = 課金が走るためです。

問い合わせの頻度(セッションが増えても重くならない)

20 秒ごとに全セッションへ問い合わせるのはやめて、次のようにしています。

  • 状態ごとに再取得の間隔を変える — チェック実行中は 20 秒、GitHub がマージ可否を計算中なら 60 秒、落ち着いた PR は 3 分。マージ済みの PR と破棄・マージ済みセッションは二度と問い合わせません。それ以外の間はキャッシュした値をそのまま表示します。
  • まとめて 1 回に畳む — 同じタイミングで 3 件以上を確認する必要があるときは、gh pr list 1 回で全部取得してローカルで突き合わせます。セッションが 10 個あっても API 呼び出しは 1 回です。
  • 枯れたら止まる — レート制限・未認証を検知したら 5 分間ポーリングを停止します。

プラン / 使用状況の表示

一覧画面のヘッダ(バナー)に、ログイン中の claude.ai プランと使用リミット枠が出ます。

Codiva v0.3.1   3 セッション
プラン: Claude Max   モデル: claude-sonnet-5   ブランチ: main
/Users/you/projects/your-repo

使用状況
  現在のセッション  ████████░░░░░░░░░░░░  42%  2時間45分後にリセット
  今週              ██████████████████░░  88%  3日0時間後にリセット
  • 全枠(5時間枠・週次枠・追加利用枠)がゲージ + 使用率 + 残り時間で並びます。プラン名・組織名と 対象リポジトリの現在ブランチは、モデル名と同じ行(プラン: Claude Max モデル: sonnet ブランチ: main) に出ます(ブランチは新しいセッションの分岐元・マージ先。別ターミナルで git switch しても数秒で追従し、 detached HEAD のときは表示しません)。
  • 更新は2系統: 稼働中セッションはターン開始ごとに Claude から届く最新値、待機中は 5分ごとの自動取得 (どちらも Claude への問い合わせだけで推論は走らないため、トークン消費・課金はありません)。 リセットまでの残り時間はカウントダウンします。
  • 使用率(%)は Claude が返さないプランもあります。その場合はゲージを出さず残り時間だけを表示します (0% と誤読させないため)。
  • API キー / Bedrock / Vertex 利用時はサブスク制限が無いため、この表示は出ません。
  • 画面下部のステータスバーはモード表示(⏵⏵ 自動モード)と操作ヒントだけです。プラン / 使用状況は ヘッダに集約しています(詳細ビューで見たいときは Esc で一覧へ戻ります)。

Codex / Grok で動かす(/agent

セッションを動かすエージェントとして、Claude Code のかわりに Codex(OpenAI の codex CLI)または Grok(xAI の grok CLI)を選べます。

  1. 使いたい CLI をインストールしてログインを済ませる(codexcodex login / grokgrok login。Grok は curl -fsSL https://x.ai/cli/install.sh | bash で入り、XAI_API_KEY でも動きます)。codiva はこれらの CLI を同梱しませんgitgh と同じく、あなたの環境に入っているコマンドを起動します(使わない人にまで大きなバイナリを配らないため)。認証も codiva は一切触りません。
  2. 一覧で /agent と入力し、使いたいエージェントを選ぶだけで新規セッションの既定になります(設定ファイルの手編集は不要 — 選ぶと ~/.codiva/config.json に保存されます。もちろん "agent": "codex" / "agent": "grok" を直接書いても構いません)。ダイアログには各エージェントの導入・ログイン状態使用できます / 未ログイン / 未導入)が並びます。
  3. すでに動いているセッションを途中で切り替えるなら、詳細ビュー(一覧で Enter)で /agent を選びます。切替は次の指示から効きます。

claudecodexgrok も入っていない状態でも codiva は起動します。その場合は一覧に「コーディングエージェントが見つかりません」と出るので、案内どおりどれかを入れてログインしてください。

サインインは codiva の中でできます。 一覧・詳細で /login と入力する(または /agent のダイアログで対象を選んで l)と、codex login / claude auth login / grok login --device-auth を裏で起動し、認証 URL とワンタイムコードをダイアログに表示します(URL は自動でブラウザでも開きます)。ブラウザでサインインを終えると自動で状態が更新されます(Esc で中止)。端末を明け渡さないので、他のセッションはそのまま動き続けます。

/agent で切り替えたとき、引き継がれるもの / 引き継がれないものは次のとおりです。

引き継がれる 引き継がれない
worktree・ブランチ・作業ツリーの内容、codiva 上のログ・タイトル・PR 会話の文脈(各 CLI がそれぞれ自分の記録を持つため)

一度使ったエージェントの会話 id はセッションごとに保存されるので、Claude → Codex → Claude と戻したときは元の会話の続きから再開します(codiva を再起動しても同じです)。

Codex セッションの制約(Claude セッションとの違い):

  • ツール使用の許可を尋ねません。 codex exec の JSON 出力モードは承認要求を CLI 内部で自動的に拒否してしまい、codiva 側へ上げる手段がありません。そこで codiva は「それらしい許可ダイアログ」を出さず、サンドボックスを唯一の安全弁にしています(設定 codexSandbox。既定の workspace-write では書き込みがセッションの worktree 内に限定されます)。質問あり の状態にもなりません。
  • コストを表示しません。 Codex はターン終了時にトークン数しか返さず、金額もアカウント全体の使用状況も運びません。ヘッダの合計コストと使用状況ゲージには Codex ぶんが含まれません。
  • 再起動後にログが復元されません(セッションの続きを再開すること自体はできます)。ログの再構築は Claude CLI の記録ファイルを読む仕組みで、Codex の記録は形式が異なるためです。
  • /model の選択肢は Codex 側のモデル一覧(codex debug models)になります。一覧を取得できない環境では「デフォルト」だけになります(推測でモデル名を並べません)。/agent で provider を切り替えると、互換性のない切替前のモデル指定は CLI 既定へ戻ります。Codex は実行イベントにモデル名を含めないため、/model で明示したモデル名をセッション一覧に表示します。

Grok セッションの制約(Claude セッションとの違い):

  • ツール使用の許可と質問はそのまま届きます。 Codex と違い、Grok は許可要求(許可待ち)と質問(質問あり)を codiva の双方向のやり取りで上げてくるので、いつもどおりダイアログで応答できます。
  • コストを表示しません。 Grok はターンの終わりにトークン数しか返さず、金額もアカウント全体の使用状況も運びません。ヘッダの合計コストと使用状況ゲージには Grok ぶんが含まれません。
  • 再起動後にログが復元されません(セッションの続きを再開すること自体はできます)。ログの再構築は Claude CLI の記録ファイルを読む仕組みで、Grok の記録は形式が異なるためです。
  • /model の選択肢は Grok 側のモデル一覧になります。一覧を取得できない環境では「デフォルト」だけになります(推測でモデル名を並べません)。/agent で provider を切り替えると、互換性のない切替前のモデル指定は CLI 既定へ戻ります。Codex と違い Grok は実際に動いているモデル名を自分で教えてくれるので、/model で明示していなくてもセッション一覧にモデル名が出ます。

設定

ON/OFF の項目は TUI から切り替えられます(一覧画面で /config。上記「設定を画面から変える」)。以下はファイルを直接書く場合の全項目です。

~/.codiva/config.json(任意):

{
  "language": "auto",
  "ignoredFiles": "symlink",
  "updateCheck": true
}
  • language: "ja" / "en" / "auto"(OS ロケール準拠)。環境変数 CODIVA_LANGja / en)が最優先です。
  • updateCheck: 起動時に npm の最新バージョンを確認するか。既定 truefalse にすると起動時の通信をやめ、/update も「確認できませんでした」になります。
  • ignoredFiles: セッション用 worktree を作るとき、.gitignore された未追跡ファイル(node_modules/.env など)をどう引き継ぐか。git worktree は追跡対象しか引き継がないため、これがないと依存の再インストールや環境変数の再設定が必要になります。既定 "symlink"
    • "symlink"(既定): リポジトリルートへシンボリックリンクを張るだけ。複製コストがゼロで即起動できます。実体を共有するので、その旨と「書き込む前にリンクを切る」手順をセッション(AI)にも伝えます(下記)。
    • "copy": リポジトリルートから実体を複製します。worktree が完全に独立し作業が絶対に重複しませんが、node_modules/ が巨大だとコピーが重くなります。
    • "none": 何も引き継ぎません(依存や環境変数はセッション側で用意し直す)。
    • 非推奨の copyIgnored(真偽値)も後方互換で解釈します(truecopy 相当、falsenone 相当)。ignoredFiles があればそちらが優先されます。
    • ビルド生成物・キャッシュは引き継ぎません.next/ .nuxt/ .svelte-kit/ .turbo/ .vite/ .cache/ dist/ build/ out/ coverage/ target/ __pycache__/ *.tsbuildinfo など)。生成物なのでセッション側で作り直せますし、共有すると壊れるためです(下記)。
  • ignoredFilesExclude: 上の除外リストに足す/打ち消すパターンの配列。既定の後ろに足され、最後に一致したパターンが勝ちます。/ を含まないパターンはパスの最終セグメントに一致するので、apps/web/.next/ のようなネストした場所にも効きます。* 前置は接尾一致(*.log)。
    { "ignoredFilesExclude": ["!dist", ".venv", "*.sqlite"] }
    この例は「dist/ は引き継ぐ(既定の除外を打ち消す)/.venv/*.sqlite は引き継がない」になります。
  • notifications: 質問・許可要求・完了などのタイミングでデスクトップ通知を出すか。既定 truefalse で無効化)。
  • privacyWarning: 学習データ利用が ON のときヘッダに注意行を出すか。既定 truefalse にすると判定自体を行いません(下記)。
  • autoSync: PR がコンフリクトになったら自動でベースブランチを取り込むか。既定 false(上記)。
  • autoFixCi: PR の CI が落ちたら自動でセッションに修正を依頼するか。既定 false(上記)。
  • crashLog: 予期せず終了したときに ~/.codiva/logs/ へクラッシュログを残すか。既定 true(下記)。false にするとファイルは書かず、理由の表示と端末の復元だけを行います。
  • agent: 新しいセッションを既定でどのエージェントで動かすか。"claude"(既定)/ "codex" / "grok"一覧の /agent で選ぶとここへ自動保存されるので、通常は手で書く必要はありません。セッションごとの途中切替は詳細ビューの /agent です(上記)。
  • claudeSettingSources: Claude セッションが読み込む設定ファイルの層の配列。"user"~/.claude/settings.json)/ "project"<repo>/.claude/settings.json)/ "local"<repo>/.claude/settings.local.json)。既定は ["project"] で、"project" は指定しなくても必ず含まれます(対象リポジトリの CLAUDE.md はこの層でしか読まれないため)。
    { "claudeSettingSources": ["user", "project", "local"] }
    Claude Code のプラグインを codiva のセッションでも使いたいときは "user" を足してください。 claude plugin install で入れたプラグインの有効化(enabledPlugins)は ~/.claude/settings.json に書かれるので、既定のままではプラグインの skill / コマンド / サブエージェント / hook / MCP サーバが一切ロードされません。副作用として、その層のほかの設定(hooks・permissions・statusLine など)もセッションに載ります。既定を ["project"] にしているのはそのためで、セッションは手元ではなく worktree で自動的に走るため、手元の Claude Code 用の設定を黙って持ち込まない側に倒しています。
  • codexSandbox: Codex セッションのサンドボックス。"read-only" / "workspace-write"(既定)/ "danger-full-access"。Codex はツール使用の許可を尋ねられないため、ここが Codex セッションに対する唯一の安全弁です。既定の workspace-write は「読み取りは全体・書き込みはセッションの worktree 内だけ」です。
  • codexNetworkAccess: codexSandbox"workspace-write" のときネットワークアクセスを許可するか。既定 true。Codex 自身の既定は遮断ですが、それだと npm installgh が失敗して大半の作業が完了しないため codiva 側では開けています(塞ぎたいときは false)。

シンボリックリンクの共有と「必要になったら切り離す」

ignoredFiles: "symlink"(既定)では、node_modules/.env のような .gitignore 済みパスは元リポジトリの実体を指すリンクです。読むだけなら問題ありませんが、そこへ書き込む操作(依存の追加・更新、ビルドやコード生成、キャッシュの削除など)はリンク越しに実体を書き換えるため、メインのチェックアウトや並行して動いているほかのセッションに波及します。

そこで codiva は、このモードのときだけセッションの systemPrompt に次の内容を載せます。

  • この worktree の ignore 済みパスは元リポジトリへのシンボリックリンクで、実体は共有物であること
  • 読むのは安全だが、書き込む前にそのパスだけリンクを切って worktree 専用の実体を作ること(現在の内容をコピーする / 依存の再インストールやクリーンビルドで作り直す、のどちらでもよい)
  • リンクを消すときに rm -rf <path>/<path>/*(末尾スラッシュ・グロブ)を使うと共有先の中身を消してしまうこと
  • .gitignorenode_modules/ のような末尾スラッシュのパターンは symlink にマッチしないため、リンクが untracked として現れること(git add -A するとリンク自体がコミットされてしまうので、パス指定でステージする)
  • 実際に書き込むパスだけを切り離し、触らない作業では何もしなくてよいこと

言語やツールチェインに依存しない書き方(「symlink かどうかで判定する」)にしてあるので、node_modules を持たないプロジェクトでも同じように機能します。codiva 側が先回りしてリンクを張り替えることはしません(何が書き込み対象になるかは指示内容次第で、全部コピーすると symlink モードの利点が消えるため)。

はじめから完全に独立させたい場合は "copy"、自分で用意し直したい場合は "none" を使ってください。

ビルド生成物は引き継がない(開発サーバのフリーズ対策)

.gitignore されたパスのうち、ビルド生成物と各種キャッシュ.next/ / dist/ / target/ / coverage/ / *.tsbuildinfo など)は "symlink" / "copy" のどちらでも引き継ぎません。理由は 2 つです。

  • 共有すると壊れます。 元リポジトリと複数の worktree で同時に開発サーバやビルドを走らせると、同じ実体へ並行して書き込むことになります。
  • worktree はリポジトリ配下(.codiva/worktrees/<slug>)にあります。 そのため、プロジェクトルートから再帰的にファイル監視する開発サーバ(Next.js / Turbopack など)からは、自分が書き込み続けているディレクトリが worktree の数だけ別経路として見えます。変更通知が何重にも跳ね返って CPU・メモリ・ファイルディスクリプタを食い潰し、OS ごとフリーズすることがあります(#81)。

生成物はセッション側で作り直せるので、引き継がないのが安全な既定です。判定はディレクトリ名のリストなので、プロジェクト固有の生成物があれば ignoredFilesExclude に足してください(逆に共有したいものは "!dist" のように打ち消せます)。

既存のセッション worktree に残っているリンクは起動時に自動で外します(以前のバージョンで作った worktree にも効きます)。外すのはシンボリックリンクだけなので、リンク先(元リポジトリの中身)と、worktree 内に実体として存在するビルド結果には触りません。

なお、監視対象そのものを減らしたい場合は、対象プロジェクト側で .codiva を開発サーバの監視除外設定に追加するのが確実です(git から隠す方は codiva が .codiva/.gitignore を置いて自動で済ませます。対象リポジトリの .gitignore は書き換えません)。

デスクトップ通知

セッションが「質問あり」「許可要求」「完了」「失敗」などの状態に変わったタイミングで通知します(同じ状態が続いている間は鳴りません)。

通知は可能なかぎりターミナル自身に出させます(Ghostty / WezTerm / foot / iTerm2 / kitty の通知エスケープシーケンスを利用)。そのため通知をクリックすると codiva を動かしているターミナルが前面に来ます。tmux 内でも動きますが、set -g allow-passthrough on が必要です。SSH 越しの場合、TERM から判別できる Ghostty / kitty / foot と、LC_TERMINAL を転送する iTerm2 では手元のターミナルに通知が出ます。

上記に該当しないターミナル(macOS 標準の Terminal.app、Windows Terminal など)では OS のコマンド(macOS は osascript、Linux は notify-send)にフォールバックします。macOS のこのフォールバック経路では通知が「スクリプトエディタ」名義になり、クリックするとスクリプトエディタが開きますosascript から出した通知の仕様上の制約です)。ターミナル側の通知設定(Ghostty の desktop-notifications など)を無効にしている場合も通知は出ません。

学習データ利用(モデル学習へのデータ提供)の警告

claude.ai の設定「Help improve our AI models」が ON のアカウントでは、Claude Code / codiva 経由の会話も Anthropic のモデル改善に使われることがあります。codiva は並列セッションで大量のコードを流すため、ON と判定できたときだけ起動時ヘッダに注意行を出します。

⚠ 学習データ利用が ON です(会話がモデル改善に使われる場合があります)
  変更: https://claude.ai/settings/data-privacy-controls
  • 設定を変えるのは上記 URL(または Claude Code の /privacy-settings)です。codiva はアカウント設定を書き換えません(読み取りのみ)。
  • 判定は「~/.claude.json のキャッシュ → Claude Code と同じ API へ問い合わせ」の順で、起動を待たせません。判定できないとき(未ログイン・ANTHROPIC_API_KEY などの API 利用・オフライン・仕様変更)は何も表示しません
  • 設定を OFF に変えたあとは、次の起動で警告が消えます(キャッシュが ON でも API で確認し直すため)。
  • 問い合わせには Claude Code の OAuth トークン(macOS は Keychain の Claude Code-credentials、それ以外は ~/.claude/.credentials.json)を読み取り専用で使います。これが嫌な場合は "privacyWarning": false にすると、Keychain もネットワークも一切触りません。

リポジトリ追加指示(.codiva/prompt.md

対象リポジトリの .codiva/prompt.md に書いた内容は、そのリポジトリで起動する全セッションの systemPrompt に自動注入されます。「作業が終わったらテストを実行し PR を出す」など、リポジトリ固有のワークフローをチームで共有できます(CLAUDE.md とは独立に併用可能。ファイルが無ければ無指示で従来どおり)。

ファイルを直接編集するほか、一覧画面のコンポーザで /prompt と入力すると TUI 内エディタが開きます(現在の内容をシード。Enter で保存、Shift+Enter で改行、Esc で取消、空で保存すると削除)。保存内容は以降の新規セッションに反映されます(稼働中のセッションは起動時の指示を維持)。

利用できるスラッシュコマンドは、コンポーザで / を入力するとパレット表示されます(/prompt/config/model/agent(一覧=既定の選択 / 詳細=そのセッションの切替)・/login(codiva 内でサインイン)・/sync/fix-ci/recover/remove/clear/update/help など)。端末が低くて一覧が入り切らないときは末尾が「他 N 件」に畳まれるので、続けて文字を打って絞り込んでください(全件は /help)。

設定を画面から変える(/config

一覧画面のコンポーザで /config(別名 /settings)と入力すると、~/.codiva/config.json の ON/OFF 項目を切り替えるダイアログが開きます。

キー 動作
項目を選ぶ(選んだ項目の説明が下に 1 行出ます)
Enter / Space その項目の ON / OFF を切り替える([x] / [ ]
Esc 閉じる

切り替えはその場で ~/.codiva/config.json に保存されます(キャンセルはありません。既定値に戻した項目はキーごと消えるので、設定ファイルは「既定から変えたものだけ」に保たれます)。ただしこれらの設定は起動時に読まれてセッションや端末の設定に焼き込まれるため、反映は次回の起動からです(ダイアログにもその旨が出ます)。

出てくる項目は、デスクトップ通知 / マウス操作 / origin 追従 / PR 自動作成 / コンフリクトの自動取り込み / CI 失敗の自動修正依頼 / Claude Code のプラグイン読み込み / 学習データ利用の警告 / 起動時の更新確認 / クラッシュログ / Codex のネットワーク許可の 11 項目です。多肢選択の設定(languageignoredFilescodexSandbox など)は画面に出ないので、設定ファイルを直接編集してください(model と既定エージェントは /model/agent から変えられます)。

セッションを消す(x / /remove / /clear

一覧に残っているセッションは、次の 3 通りで片付けられます(いずれも y / n の確認を挟みます)。

操作 対象 何が消えるか
d(破棄) 選択中の 1 件 worktree とブランチ。行は「破棄」として一覧に残ります(再起動すると消えます)
x(= /remove 選択中の 1 件 worktree とブランチ+一覧の行そのもの。記録ごと消えます
/clear 終了済みの全件(完了・中断・失敗など。実行中は対象外) 各セッションの worktree とブランチ+一覧の行。件数を確認してから実行します

x は詳細ビューでも使えます(Tab で操作パネルへ切り替え)。削除するとそのセッションは開けなくなるので、自動的に一覧へ戻ります。

x を使うのは、過去の PR に紐づくセッションを片付けたいときです。d(破棄)だと行が「破棄」として残り、そのブランチの PR がコンフリクトしていたり CI が落ちていたりすると Ctrl+F(一括立て直し)の候補として出続けます。x は行ごと消すので、一括操作の対象からも完全に外れます。

いずれもローカルの worktree とブランチを消すだけで、push 済みのリモートブランチと GitHub 上の PR には触りません(PR を閉じたい場合は GitHub 側で操作してください)。未コミットの変更が残っていても削除は強制実行されるため、残したい作業があるときは先にコミットしてください。

スラッシュを打ち忘れても、その画面で使えるコマンド名と完全に一致する入力exit / help など)はそのコマンドとして実行されます。実行されるときはコマンドパレットに出るので、Enter の前に何が起きるか分かります。exit の挙動を直して のように後ろに文字が続く場合、また ?changes のような別名は通常の指示として扱うので、指示が誤ってコマンドになることはありません。

/exit は画面によって意味が変わります。一覧画面では codiva を終了し、セッション詳細画面では詳細を閉じて一覧へ戻りますEsc と同じ)。詳細を見ている途中に /exit を打ってアプリごと落ちてしまうことがないようにしています。

トラブルシューティング

終了後にスクロールすると大量の文字が入力される

codiva は全画面表示のあいだ、端末のマウスレポート(クリック・ドラッグの通知)を有効にしています。 通常の終了時には必ず無効化しますが、codiva が強制終了した場合(メモリ不足による abort や kill -9 など、プロセスに何の実行機会も残らない死に方)は無効化が走らず、端末が有効なままになります。 この状態でスクロールすると端末がマウスの位置情報を送り続け、シェルには [<64;12;5M のような 文字列が大量に入力されたように見えます。

復旧するには次のどちらかを実行してください(どちらも安全で、何度実行しても構いません)。

codiva --reset-terminal   # 端末モード(マウス捕捉・代替スクリーン・カーソル)を戻す
reset                     # 端末全体をリセットする汎用コマンド

codiva は次回の起動時にも自動でマウスレポートを無効化してから画面を作るので、 そのまま codiva を立ち上げ直しても直ります。

突然終了した原因を調べる

codiva は全画面(代替スクリーン)で描画しているため、異常終了時のエラーは画面を抜けた瞬間に 消えてしまいます。そこで終了理由を ~/.codiva/logs/ に残します。

ファイル 内容
crash-<日時>-<pid>.log codiva 自身が書くレポート(種別・エラーメッセージ・スタックトレース・バージョン・端末・メモリ使用量・セッションのステータス内訳)。最新 20 件を保持
report.<日時>.<pid>....json Node の診断レポート。メモリ不足(ヒープ枯渇)やネイティブのクラッシュでは JavaScript が一切動けないため、上のログは残りません。その場合はこちらだけが出ます
  • 予期せぬ終了のときは、ターミナルにも同じ内容とログのパスを表示します(画面を戻したあとに出すので消えません)。
  • SIGTERM / SIGHUP で終了した場合も kind: signal として記録します(「落ちた」のか「終了させられた」のかの切り分け用)。
  • 不要であれば設定の "crashLog": false で出力を止められます。
  • 不具合として報告いただけると助かります → Issuescrash-*.log に含まれるのは上記の技術情報だけで、指示内容やコードは含みません。
    • report.*.json(Node が書くもの)は環境変数も含み得ます。codiva は除外できる Node(23.3 以降)では自動で除外しますが、それより古い Node では環境変数(ANTHROPIC_API_KEY など)が入るので、共有する前に中身を確認してください。

長時間動かすとメモリ使用量が増え続ける(0.3.9 で修正)

0.3.8 以前は、描画するたびに解放されないメモリが残る不具合がありました(1 日弱で Node 既定の ヒープ上限 ~4GB に達し、Allocation failed - JavaScript heap out of memory で突然終了します。 この落ち方では crash-*.log は残らず report.*.json だけが出ます)。原因は React が 開発ビルドで動いており、描画ごとに計測エントリ(performance.measure)を積んでいたことでした。 0.3.9 で製品ビルドに切り替え(描画も約 2.5 倍高速になりました)、加えて計測エントリを定期的に 捨てるようにしています。

もし 0.3.9 以降でも増え続ける場合は、~/.codiva/logs/report.*.json を添えて Issues へご報告ください。

詳細ログの古い行が消える

セッション詳細のログは直近 2000 件 / 合計 40 万文字までを保持し、それより古い行は落とします (1 件が極端に長い場合も途中で切り、末尾に を付けます)。長時間動かしたセッションのログを 無制限に抱えると codiva 自身がメモリ不足で落ちるためで、会話の完全な記録は Claude Code 側の トランスクリプト(~/.claude/projects/)に残っています。

なお、この上限に達したログを上へスクロールして読んでいる最中に新しい行が追記されると、 古い行が落ちたぶん表示位置が少し新しい方へ動きます(範囲選択は安全のため解除されます)。

開発

npm run dev        # tsx で TUI 起動(開発)
npm test           # vitest(coverage 付き)
npm run lint       # biome check
npm run typecheck  # tsc --noEmit
npm run build      # tsup → dist/index.js(起動シム)+ dist/main-<hash>.js(本体)

設計ドキュメントは docs/ を参照してください(PRD / ARCHITECTURE / TECH_NOTES)。

コーディング規約は .claude/rules/(レイヤ構成・命名・i18n・Ink・セッションドメイン・SDK 連携・git/IO・テスト)、 スラッシュコマンド追加などの定型作業の手順は .claude/skills/ にまとめてあります。 全体の索引と「やりたいこと → 触るファイル」の地図は CLAUDE.md にあります。

リリース

npm への配信は npm Trusted Publishing(OIDC) を利用し、GitHub Actions からトークンレスで行います。GitHub 上で Release を publish するだけで、バージョン同期・npm 配信・main へのバージョン更新コミットが自動実行されます。初回の手順・GitHub / npm の設定は docs/RELEASE.md を参照してください。

ライセンス

MIT

Releases

Packages

Contributors

Languages