Skip to content

Releases: tacyan/zaivern-code

v0.17.0

Choose a tag to compare

@tacyan tacyan released this 13 Aug 04:18
2b03cc4

0.17.0 — 2026-08-13

  • インストーラが配布物を検証するようになりましたcurl | sh / irm | iex で入れるとき、展開する前にリリースの SHA-256 と突き合わせ、合わなければ展開も実行もせずに中止します。チェックサム自体が取れないときも同じく中止します。リリースには依存の一覧 (SBOM) と、「このファイルはこのリポジトリのこのコミットから作られた」という来歴も付くようになりました (gh attestation verify で誰でも確認できます)
  • 同じ行を 2 人に配ってしまう見落としが 35 件残っていたのを直しました。削除・挿入・置換を混ぜた 6000 通りで総当たりしたところ、94 行離れていて交互にもなっていないのに git が衝突する組が見つかりました。同じファイルを 2 人で分けるときは必ず境目に目印を要求するようにして、6000 通りで見落とし 0 になりました。実在のファイルでは通す数はほとんど減っていません (src/region.rs の 800 通りで 792 → 792)
  • 断られたときに、ずらせる場所を提案するようになりました。長さを変えずに、帯を満たして境目に目印がある最寄りへ移せる場合はその位置を出します
  • アイドル時の CPU を 12.45% → 1.0% にしました。チュートリアルのカードを開いたまま席を立つと、アプリ全体が毎秒 55 コマ描き続けていました。同梱プラグインの「900 秒ごと」という指定が 2 秒ごとに丸められていたのも直しています。見た目は変えていません
  • 外部で書き換えたファイルの反映が速くなりました (5.0 秒 → 0.8 秒)。別のターミナルで git checkout した変更がすぐ画面に出ます
  • 日本語入力が二重に入ることがあったのを直しました。変換を確定すると 日本語日本語 のように 2 回入ることがありました。パレットの検索欄・検索置換・エディタ本体すべてで直っています
  • Shell を開いただけで「N ファイル競合」と出ていたのを直しました。git は誰がファイルを触ったか区別できないため、同じフォルダに居る全員へ同じファイル一覧を割り当てています。そこへ素のシェルを 1 体と数えていたので、Shell を開いた瞬間に未コミットの全ファイルが競合として出ていました。表示の文言も、分かっていること (「同じ作業ツリーに居ます」) だけを書くように改めました
  • エージェントの画面でも、コピーする範囲を画面より上へ広げられるようになりました。Shell では上端を超えてドラッグすると履歴へ伸びるのに、エージェントの画面では伸びませんでした
  • 全機能ガイドが、選んだらその場で体験できるようになりました。組み込み操作を選ぶとその手順から再生し、機能を選ぶとその場で開いて見せます。行が列で揃わず、右端の打鍵表示が画面の外へ出ていたのも直しました
  • 通知音をペットのメニューからも切り替えられるようになりました。設定画面の項目と同じ設定を指しています
  • リポジトリの形が増えました。sparse-checkout / shallow / submodule で競合ゼロが成立することを実測で確かめ (submodule は --recurse-submodules を打ったとき)、git でないフォルダも --git-init で明示すれば使えます。bare と読み取り専用は原理的に無理なので、はっきり断ります
  • 他人の .gitmodules からリポジトリの外へフックを書き込めた穴を塞ぎました.gitmodules は clone した相手が中身を決められるファイルなので、path = ../../../evil と書かれていると外へ出られていました
  • 画面の破綻を捕まえる検査を入れました (44 件)。この検査自体が、パレットが候補を 1 件しか描かない / ダイアログのタイトルバーが画面外に出るなど実際の不具合を 4 件見つけています

v0.16.0 — 表示・プレビュー・端末を作り直す

Choose a tag to compare

@tacyan tacyan released this 12 Aug 03:06
85a350e

プレビューの表が崩れるという報告から入り、表示まわりを 28 コミットで直しました。

直したもの

  • プレビューの表の崩れ — 列の幅が中身と関係なく均等に割られていたため、1 文字の数値列と 12 文字の見出し列が同じ幅になり、広い列だけが必ず折り返していました。折り返した 2 行目が左端へ落ち、その高さが行に数えられず次の行と重なっていました。HTML のプレビューも同じ描画を通るので一緒に直っています
  • 巨大なファイルで文字に色が付かない — 400KB を超えると色付けそのものを諦めていました。2MB・4 万行でも色が付きます
  • 端末の選択が 1 画面ぶんしか取れない — 画面の外へドラッグすると自動でスクロールして伸び、コピーも履歴をまたげます
  • 端末の文字化け 2 種 — 読み取りの境目で日本語 1 文字が割れて「?」が残る件と、古い形式の日本語 (ISO-2022-JP) が $ だらけになる件
  • 処理が終わっていないのに鳴る「完了」通知 — 「出力が止まった」だけで完了と判断していました
  • 箇条書き・引用の折り返しが左端へ落ちる

足したもの

  • GIF の再生 — 単体で開いたときも、Markdown の ![](x.gif) でも。読み込みは裏で行うので開いた瞬間に固まりません
  • 通知と通知音のオン/オフ — 「通知は見たいが音は要らない」も選べます
  • ターミナルのコマンド区切り — 成功/失敗の印、出力を丸ごとコピー、再実行、いま見ている出力がどのコマンドのものかを上端に固定、⌘↑ / ⌘↓ で前後のコマンドへ
  • git blame の 3 段 — 出さない / カーソル行だけ / 全行
  • スクロールバーの印 — ミニマップを出していなくても検索ヒットとエラーの位置が見えます
  • 差分の行内ハイライトと段階的な折り畳み
  • ヘルプの全機能ガイド — 索引は自動生成なので新しい機能が漏れません

検証

CI は 3 プラットフォーム × テスト 2 種 + clippy + Windows 専用の 8 ジョブすべて緑。

全文は CHANGELOG.md
経緯は #16 を参照してください。

v0.15.0 — どのリポジトリでも競合が起きない

Choose a tag to compare

@tacyan tacyan released this 11 Aug 03:32
4f2dba2

どのリポジトリでも、複数の AI エージェントが同時に書いても競合が起きない。 それを主張ではなく数字にした版です。

自分のリポジトリで確かめられます

tools/anyrepo-prove.sh --repo /path/to/your/repo --writers 16

合成した実験ではなく、あなたのリポジトリの実際のファイル構成で N 体を走らせ、素の git なら何件衝突するかと、zaivern ありで何件になるかを並べます。

リポジトリ 書き手 素の git zaivern あり
Rust・追跡 259 ファイル 16 26 ファイル / 28 ハンク衝突 0 / 0(96/96 確保成立・断られ 0)
TS/HTML・追跡 1194 ファイル 16 26 / 28 0 / 0(96/96・32 件ずらし)
全員が同じ場所を要求 32 118 / 147 0 / 0(192/192・171 件ずらし)

リポジトリの形は 13 通り(bare / submodule / worktree 内 / sparse-checkout / LFS / shallow / 巨大 / detached HEAD …)を実物で確かめています。動かない形は理由を明記して飛ばします。

直した中でいちばん重いもの — 2 人が同じ行を同時に書いていました

担当は行番号ではなく「そこにある内容」で覚えます。ところが自分がその行を書き換えると自分の目印が合わなくなり、取り直したときに似た行(空行・``` ・---)へ誤って合って、担当が別の場所へ「移動」していました。空いたことになった行を他の人が正当に確保するので 2 人が同じ行を書きます。

台帳の最終形には重なりが残らない(消えたのではなく移動した)ので、台帳をいくら見ても気付けませんでした。実在リポジトリで 8 回中 3 回起きていたものが、乱数種 12 通り・126 回の検証で 0 件になっています。

静かに壊れていたもの

  • /絶対/パス/ で確保しても何も守られていませんでした。「1 件を確保しました」と返るのに、台帳には相対パスと一致しない形で載っており、他の人を 1 人も止めていませんでした
  • zai lease claim a.rs --typo の打ち間違いが --typo という名前のファイルとして確保されていました
  • --dir を付けても、関数名や行番号の解決が今いるフォルダ基準でした
  • シンボリックリンク越しの抜け道lib -> src のような別名で確保された担当が突き合わされず、リポジトリの外を指すリンク経由の書き込みも通っていました
  • rustc を上げると、台帳もセッションも端末ログも全部消えていました。置き場の名前が「版をまたいで同じ値になる保証のないハッシュ」から作られていたためです。古い名前の置き場は自動で引き取ります
  • 同じファイルで 2 人の担当が交互に並ぶ配り方zai guard check が素通りさせていました。離れていても、繰り返しの多い内容では git がハンクをまとめてしまい衝突します

数字が変わったもの

  • 64 体で 10〜13 体が締め出されていました。ずらしてよい幅の上限が固定 200 行だったのに対し、混んだ配置は 204〜234 行を要求します。6 回まわして毎回 51〜55 体しか通らなかったものが、6 回とも 64 体全部通ります
  • アイドル時の CPU を 1 コアの 1.95% → 0.35% に(20 秒窓)。入力 1 回あたりの再描画要求は 600 件 → 89 件。眠るまでの秒数は変えていないので見た目はそのままです
  • 判定そのものを 2581 倍速く(互いに素な 800 件で 9,467ms → 3.67ms)

見た目

  • gitignore されたファイルを VS Code と同じ薄い色で表示するようになりました(既定)。これまでは一覧から消えていました

正直に — できていないこと

  • 繰り返しの多い内容では「綺麗にマージできる」を保証しきれません。 同じ行を 2 人に配らないこと(所有)は内容に依らず常に成り立ちますが、マージが綺麗に通ることは内容に依存します。判定できない場合は断ります
  • Windows は実行時の挙動と GUI が未検証です。CI のテストは通っていますが、Windows で実際に触った数字はありません
  • 削除と挿入が混ざる特殊な組で、見逃しは 0 のままですが「見逃さないことを証明した」わけではありません

詳細は CHANGELOG.mddocs/conflict-zero.md にあります。

v0.14.0 — 同じファイルでも競合しない

Choose a tag to compare

@tacyan tacyan released this 10 Aug 19:10
79fe8c5

「同じファイルでも、違う行なら 2 人が同時に書ける」 — 並列エージェント開発の天井を、ファイル単位の所有から行域単位へ引き上げました。

1 ファイルに 64 体をぶつけた実測

tools/coedit-bench.sh --agents 64 --lines 2000(2000 行のファイル 1 個に 64 体が同時に書き込む):

守り方 書けた担当 断られた 衝突した枝 衝突行 人の手
守らない(素の git) 64 0 48 960 48
ファイル単位で持つ(〜v0.13) 1 63 0 0 0
行の単位で持つ 11 53 0 0 0
行の単位 + 交渉(v0.14) 64 0 0 0 0

誇張せずに言うと: 衝突ゼロ自体は v0.13 でも達成できていました。v0.14 が買うのは並列度です(64 体中 1 体しか書けなかったのが、全員書けるようになりました)。素の git は詰めた条件でも 64 体全部が書けますが、48 枝が衝突して 960 行・48 回の手作業を要します。

どのリポジトリでも 1 コマンド

$ zai czero init      # 台帳・git フック・マージドライバ・.gitattributes を一度に入れて自己診断
$ zai czero verify    # 使い捨ての一時リポジトリで実際に競合を起こし、本当に止まるか実演する
$ zai czero uninstall # 入れたものだけを綺麗に戻す

verify は設定を読むだけではありません。実際に競合を起こして止まることを実演します(対象リポジトリは 1 バイトも汚しません)。「入れたのに効いていない」が構造的に起こらないようにするためです。

変更点

  • 断られる代わりに、近くの空いている行へ自動でずらすようになりましたzai lease claim --shift)。1 ファイルへ 64 体をぶつける検証で、断られた件数が 53 件 → 0 件、書けた担当が 11 → 64 になります。マージ衝突は 0 件・人の手も 0 回のままです。ずらされた場合は「要求 → 実際に取れた場所」を必ず表示します(黙って別の場所を渡しません)
  • 「ここに足す」だけの予約ができるようになりましたsrc/a.rs#@120)。関数や use を足す作業は既存の行を 1 行も必要としないので、幅 0 で予約します。300 行のファイルに 64 体が全員入ります
  • 同じファイルでも、違う行なら 2 人が同時に書けるようになりました。これまでは「誰かが持っているファイルには書けない」でした。1 ファイルへ 64 体をぶつける検証で、ファイル単位の所有だと書けたのは 64 体中 1 体(63 体は拒否)でしたが、行域なら64 体全部が書けてマージ衝突は 0 件・人の手も 0 回です。zai lease claim 'src/app.rs#L1200-1260' のように行を指定して確保します
  • エージェント同士が裏で認識し合うようになりました。Erlang のプロセスと同じ仕組みで、それぞれが身元(再起動したら別物として扱われる ID)とメールボックスを持ち、互いを監視します。担当を持ったまま落ちたエージェントの担当は自動で解放されるので、人が掃除する必要がありません
  • 断られる代わりに「ずらす」ようになりました。要求した行域が埋まっていても、近くの空いている行域を提案して振り替えます。ただし**「ずらしてよい」と言った要求だけ**です — 行域は行番号ではなく「そこにある内容」に紐づくので、黙ってずらすと別の場所を編集させることになります
  • 「いま統合したら一撃で通るか」を証明できるようになりました。複数ブランチの変更行域が離れていれば、git merge は必ず衝突しません。実際の git で網羅的に確かめて見逃し 0 件です。証明が立てば N 本を人手ゼロで統合します。作業ツリーを一度も触らず、最後に参照を 1 回だけ動かすので、途中で失敗しても中途半端な状態が残りません
  • どのリポジトリでも、一覧への追記が衝突しなくなりました.gitignoreCHANGELOG.mdpackage.json の依存・import 宣言のような「両方の行を残すだけ」の衝突を、中身を見て自動で判定して解決します。目印を書く必要はありません。マーカ無しの検証で人が読む衝突行が 80% 減り、誤って自動解決した件数は 0 です。一覧と判断できないファイルでは素の git と 1 バイトも変わりません
  • 誰がどのファイルの何行目を持っているかが 1 画面で分かるようになりました。同じファイルを複数人が持っている状態を横帯で見せ、近すぎる組だけを赤枠にして「あと何行空ければ一撃で通るか」を出します
  • 64 体以上で確保が「混雑しています」と断られることがあるのを直しました。待ち時間の予算が固定だったため、体数が増えると必ず足りなくなっていました。台数に依存しない待ち方へ変えています
  • 行域を指定すると保護が効かなくなる不具合を直しました。誰かがファイル全体を持っていても、行を指定した確保が通ってしまい、重なる 2 つの行域も両方通っていました
  • 全文置換で他人の担当を黙って消せる不具合を直しました。200 行のファイルを 2 行に置き換えると「触れたのは 1〜2 行目」と判定され、他の行の持ち主を巻き込んでいました
  • これから書く場所を予約すると、その予約が消えて別人に取られる不具合を直しました。まだ短いファイルへ「1〜10 行目」を確保しても、実際には 1 行目しか押さえられておらず、重なる「5〜15 行目」が通っていました
  • エージェントが行を上に足すと、下にいる担当の位置がずれる問題を直しました。担当は行番号ではなく「そこにある内容」で覚えるようになったので、他の人が上に 10 行足しても同じ場所を指し続けます
  • どのリポジトリでも 1 コマンドで導入できるようになりました。zai czero init で台帳・git フック・マージドライバ・.gitattributes が一度に入り、入れた直後に自己診断まで走りますzai czero doctor は段ごとに理由と直し方を出し、zai czero verify使い捨ての一時リポジトリで実際に競合を起こして、本当に止まるかを実演します。zai czero uninstall で入れたものだけを綺麗に戻します(他人が書いた .gitattributes の行や既存のフックは無傷です)
  • 離れた行を担当する 2 人が、どちらもコミットできなかったのを直しました。コミット前の点検が行番号を見ておらず、同じファイルというだけで両方止めていました。あわせて点検を 685 倍速くしています(400 ファイル × 200 担当で 5.04 秒 → 7.4 ミリ秒)
  • 統合の順番決めが、24 体を超えると裏目に出ていたのを直しました。「手が止まるまでに自動で入る本数」が 2 → 1 に減っていました。24 体で 1 本 → 10 本、32 体で 1 本 → 11 本になります。ただし衝突の総数は変わりません — 減るのは手が止まる回数だけです
  • 互いに干渉しないブランチなら、順番を決めずに一撃で統合できるようになりました。24 本が互いに素なら「順序は不要」と出して、そのまま人手 0 回で入ります

数字と線引き(効かない条件も含めて)は docs/conflict-zero.md にあります。

検証: 全テスト 4273 件緑(6 回連続)/ clippy 緑 / macOS・Linux・Windows の CI 8 ジョブ全通過。

v0.13.0 — どのエージェントを使っても、並列の衝突が起きない

Choose a tag to compare

@tacyan tacyan released this 10 Aug 02:15
9117870
  • どのエージェントを使っても、並列の衝突が起きなくなりました。これまで書き込みを止められたのは 33 種のうち claude / codex / gemini の 3 つだけで、cursor-agent や aider を使うと素通りしていました。git そのものを関所にしたので、どのエージェントでも、素の vim でも、CI からでも止まります。新規リポジトリで zai guard init と打つだけで、他の担当が持っているファイルへのコミットが実際に拒否されます
  • 追記どうしの衝突が自動で解決されるようになりました。設定一覧・翻訳表・mod 宣言・CHANGELOG のような「両方の行を残すだけ」の衝突を、git のマージドライバとして解決します。実測で、8 人が同時に書いたときに人が読む衝突行が 350 行から 70 行へ、32 人で 4526 行から 1054 行へ減りました。純粋な追記だけの一覧は 0 件になります
  • 配る前に「衝突し得ない担当表」を作れるようになりました。zai split にタスクを渡すと、互いに素な担当集合と、どうしても共有になるファイルの扱いを出します。分割が本当に互いに素であることを、出力自身が検査します
  • 並列の成果を順番に統合できるようになりました。zai train が乾式検査で「この順序なら衝突する」を実行前に出し、衝突の少ない順に自動リベースします。途中で衝突したら全部元に戻すので、中途半端な統合が残りません。ただし衝突の総数は減りません — 減るのは手が止まる回数だけです
  • いま自分がどこまで守られているかが 1 画面で分かるようになりました。パレットの「競合ゼロ点検」で、稼働中のエージェントを 1 体ずつ ✅/❌ で出します。「強制」と丸めて表示せず、フックを持たないエージェントは持たないと出します
  • マルチバッファで、複数ファイルをまとめて直せるようになりました。これまでは読むだけでした。検索結果を 1 画面に集めてその場で書き換え、「書き戻す」で各ファイルへ一度に反映します。取り消しは 1 回で戻ります
  • 日本語入力のままコマンドパレットを開けなかったのを直しました。IME が全角の を入れるため、> で始まるコマンド検索に入れず「一致するものはありません」で行き止まりになっていました。 も同じく効いていませんでした。コマンド名で検索して 0 件になったときは「> を付けると見つかります」と案内します
  • 行の左に出る作者名が、離れた 1 文字だけになるのを直しました。1 人で書いたファイルでは全行に同じ頭文字が並び、行番号まで大きく空いていました。作者が 1 人なら日時だけを行番号のすぐ隣に出します
  • 衝突レーダーが何も出さないことがあるのを直しました。共通の起点が見つからないとき、内部で「全部同じ変更」と誤って畳んでしまい、1 件も表示していませんでした

v0.12.0 — 並列でも同じファイルを 2 人が触らない

Choose a tag to compare

@tacyan tacyan released this 09 Aug 22:51
5b2c66f
  • 並列で走らせても、同じファイルを 2 人が同時に編集することが起きなくなりました。これまで守れていたのはエージェントの書き込みだけで、このエディタ自身の保存は素通りしていました。64 体を同時に走らせて 1500 回書き込む検証で、マージ衝突は 0 件です (ガード無しでは同じ条件で 167 箇所の衝突が出ます)
  • sed -i やリダイレクトのようなシェル経由の書き込みも止まるようになりました。エージェントは日常的にコマンドで書くので、ここが最大の抜け道でした
  • Claude Code 以外のエージェントでも効くようになりました。ACP で繋がるエージェントはベンダー側の設定が一切不要で、codex / gemini はフックを設置すれば止まります。設置しただけでは効かない場合は「未承認」と正直に表示します
  • フォルダごと動かす / 消す操作も、中身を誰かが編集中なら止まります。消してしまうと戻せないので、上書きより強く守ります
  • ファイルは違うのに噛み合わない変更を見つけられるようになりました。片方が関数の引数を変え、もう片方が古い呼び方のまま書いた場合、マージは成功してもビルドは壊れます。これを画面に出します
  • 2 打鍵で画面上のどの語へでも飛べるようになりました。近い候補ほど短いラベルが付きます
  • fish と PowerShell でもコマンドの終了コードを画面から推測しなくなりました。実際のシェルで検証し、終了コードが次のコマンドへ漏れる問題などを直しています
  • 担当ファイルを指定してタスクを割り当てると、重なる相手には配らなくなりました。誰と何が重なっているかと、分け方を出します

インストール

macOS / Linux

curl -fsSL https://raw.githubusercontent.com/tacyan/zaivern-code/main/install.sh | sh

Windows (PowerShell)

irm https://raw.githubusercontent.com/tacyan/zaivern-code/main/install.ps1 | iex

実測(この版で入った保証)

検証 結果
64 体 × 1500 書込(3 種) マージ衝突 0 / 重複書込 0 / fail-open 0
128 体 × 1500 書込 衝突 0 / fail-open 0
ガード無し(同条件) 167〜184 ハンクの衝突
ゲートの費用 zai hook 台帳あり 25.5ms vs git --version 27.9ms = 計測ノイズ以下

再現: tools/conflict-bench.sh --agents 64 --files 1000

正直に言えないこと

  • cursor / goose は未対応(発火を実証できないものは「ブロックできる」と表示しません)
  • 実機 Windows での実行検証はゼロ(wine と CI が代替)
  • 意味的衝突は検出であって防止ではありません。マクロ経由・動的ディスパッチは検出できません
  • 別クローン 2 つは別台帳(worktree でないと共有されません)

v0.11.0 — エージェント同士のファイル衝突を、起きる前に止める

Choose a tag to compare

@tacyan tacyan released this 09 Aug 15:17
c7ea2f0

並列で動かす AI エージェントが、同じファイルを壊し合わなくなりました

エージェント同士の衝突を、起きる前に止める

  • 誰かが編集中のファイルへ別のエージェントが書き込もうとすると、その場でブロックします。「誰が・いつから持っているか」と、待つ / 担当を分ける / 引き継ぐ の 3 択を出します
  • どのワークツリーとどのワークツリーが、どのファイルで衝突するかを一覧できます。マージしてから気づくのではなく、エージェントが動いている最中に分かります。git に実際のマージを試させるので、行が近いだけの誤報は出しません
  • 設定を 1 つもしなくても効きます。誰も持っていないファイルへ書けばその場で本人のものになり、2 人目が止まります

画面の文字から状態を推測するのをやめました

  • エージェントを構造化プロトコル (ACP) で動かせるようになりました。計画・ツール呼び出し・承認要求を正確に受け取り、走っている途中のエージェントに割り込んで方向を直せます
  • ターミナルがコマンドの終了コードをシェル自身から受け取るようになりました。出力に error という文字が並んでいても、成功は成功と分かります

迷子にならない

  • エージェントへ渡す文脈を @正確に指定できます。関数名から探す・フォルダを掘る・ターミナルの出力・差分・問題を、そのまま添付できます。何を渡したか挿入前に確認でき、消費するトークン数も見えます
  • コミットしていない変更を戻せます。保存やエージェントのターン境界で自動的に記録され、削除したフォルダも丸ごと復元できます
  • 行にしおりを付けられます。編集で行がずれても追従し、ブランチを切り替えて戻すと復活します
  • 仕様を差分で書け、コードだけ変わって仕様が古くなったことを検出できます
  • 2 打鍵のショートカットで続きのキー一覧が出ます

品質

  • 1,412 テスト全通過・失敗ゼロ・clippy 緑・警告ゼロ
  • CI は macOS / Linux / Windows それぞれで通っています
  • ACP・衝突レーダー・シェル統合は Windows のクロスビルドまで確認済み

インストール / 更新

macOS / Linux

curl -fsSL https://raw.githubusercontent.com/tacyan/zaivern-code/main/install.sh | sh

Windows PowerShell

irm https://raw.githubusercontent.com/tacyan/zaivern-code/main/install.ps1 | iex

v0.10.0 — マルチバッファ / チェックポイント / 数秒フリーズ修正

Choose a tag to compare

@tacyan tacyan released this 09 Aug 10:19
1ff9bb1

競合 (Zed / Cursor / VS Code / superset / cmux / orca) を調査し、欠けていた機能を埋めた版です。

⿴ マルチバッファ

検索結果・問題・未コミットの変更を、ファイルを開いて回らずに前後の文脈つきで1枚の面にまとめて読めます。見出しをクリックで開閉、行をクリックでその場所へジャンプ、↑↓で一致間を移動。検索パネル/問題パネルの「⿴ まとめて開く」またはコマンドパレットから。

⏱ チェックポイントと巻き戻し

エージェントへ指示を送る直前の状態を自動で記録し、1クリックで巻き戻せます。戻す前にも自動で記録するので、戻した後にまた戻れます。記録は一時 index を経由するので、あなたがステージした内容にも作業ツリーにも触りません。スナップショットに無かったファイルは消しません。

⏸ 停止中のエージェントへ一括送信

「全員」だと作業中のエージェントまで止めてしまいます。待機・停滞・ループ・エラーで前へ進まなくなったものだけへ、まとめて指示を送れます(承認待ちは対象外 — そちらは承認の口で答えてください)。

💰 コスト上限とアラート

AI の利用料に上限を設定できます。セッション単位・1日単位で決められ、8割に達した時点と超えた時点で1度だけ知らせます。既定は無制限・知らせるだけで、勝手には止めません。

🏷 インレイヒント

型や引数名をコードの中に薄く表示します(LSP の textDocument/inlayHint)。既定はオフで、設定またはコマンドパレットから切り替えます。

⚡ 大きなリポジトリで画面が数秒固まる不具合を修正

ブランチ名とガターの差分マークを取る git が UI スレッドを止めていました。実測で特定しています。

修正前 修正後
最悪フレーム 4376 ms 20.8 ms
平均フレーム 35.5 ms 9.8 ms

git status は単独なら 0.03 秒で終わります。遅さの正体は、アプリが同じリポジトリへ status スキャン・衝突スキャン・ガターの diff を同時に撃ち、index を取り合って直列化することでした(同時実行下では 2.3〜10.2 秒)。git を裏のスレッドへ移し、リポジトリが大きいほど実行間隔を自動で空けるようにしています。

品質

3,329 テスト / 3 OS の CI 全通過 / cargo fmt --check 差分なし / clippy 緑。

v0.9.0 — 送った指示が必ず実行されるようになりました

Choose a tag to compare

@tacyan tacyan released this 09 Aug 06:58
4934d41

送った指示が、どのエージェントでも必ず実行されるようになりました

Cockpit の入力欄から送っても、エージェントによっては入力欄に文字が入ったまま実行されないことがありました。素のシェルでは効くので「効いたり効かなかったり」に見えていた不具合です。

原因は、本文と確定キー (Enter) を 1 回の書き込みでまとめて送っていたこと。Claude Code / Codex / Gemini CLI はいずれも Ink 製で、まとまって届いたバイト列を「貼り付け」と解釈するため、Enter まで貼り付けの一部として飲み込まれていました。

本文を送ってから間を置いて確定キーを送る手順へ統一し、承認プロンプトが出ている間は送らない・入力欄に残っていたら撃ち直す、まで面倒を見るようにしています。

入力欄は ⌘ / Ctrl + Enter で送信になりました (Enter は改行)。変換確定の Enter で書きかけの指示が飛ぶことがなくなります。

文字サイズだけを変えられます

画面全体のズームは余白やボタンまで大きくして画面に入る情報を減らしてしまいますが、こちらはレイアウトを変えずに文字だけ大きく / 小さくできます。メニュー「表示」・コマンドパレット・設定から。

アイドル時の再描画を 4 分の 1 以下に

計測したところ、何もしていないときの再描画は 100% がペットのアニメーションで、エージェントが 1 体でも走っていると 16.7fps を回し続けていました。18.2fps → 4.1fps

シンタックスハイライトが 102 言語 + 何万行でも壊れない

TypeScript / TSX / Vue / Svelte / Kotlin / Zig / TOML / GraphQL / Terraform / Dart / Elixir / Nix / Solidity / Dockerfile などはそもそも対応していませんでした。CUE / KDL / Dhall / COBOL / Apex / sed / V も追加しています。

Rust は async / await / トレイト境界 / where / シェバンまで色が付くようになりました。

5 万行のファイルで「1 行目で開いたコメントを 3 万行目で閉じる」ような場合でも色が壊れません。

Git の差分を行単位でステージできます

これまではハンク単位でした。行番号の帯をクリック / Shift+クリックで範囲を選び、そのまま「N 行をステージ」できます。

過去の会話をエージェント別に残して再開できます

これまで一覧に出ていたのは Claude / Codex / Antigravity の 3 つだけで、それ以外は一覧にすら出ず再開できませんでした。アプリ自身がエージェント別・フォルダ別に記録するようにしたので、Gemini でも Droid でも Aider でも、一覧から選んで続きから始められます。

そのほか

  • ターミナルのリンクをそのままクリックで開けます (⌘ を押す必要がなくなりました)
  • 配色テーマを 8 種類追加 (ダーク 5 / ライト 3)
  • ファイルツリーの ⌘C / ⌘X / ⌘V が効くようになりました
  • ターミナルへ直接打ち込んだ指示も、セッションの自動命名に使われます
  • # で始まるコミットメッセージが黙って消えていた不具合を修正
  • 更新後の初回起動で「この版の新機能」を表示します
  • zai update / zai uninstall を追加しました

インストール / 更新

macOS・Linux:

curl -fsSL https://raw.githubusercontent.com/tacyan/zaivern-code/main/install.sh | sh

Windows (PowerShell):

irm https://raw.githubusercontent.com/tacyan/zaivern-code/main/install.ps1 | iex

既に入っている場合は zai update でも更新できます。

v0.8.0 — 操作性の穴を22個埋めました

Choose a tag to compare

@tacyan tacyan released this 09 Aug 02:45
68424ec

操作性の穴を22個埋めました。 superset・VS Code・cmux・orca・Zed を調査し、「これが無いと使えない」欠落から順に潰しています。

エディタとして成立させた

これまでアプリ内で完結できなかったことを直しました。

  • Gitのコミット・push・pull・ハンク単位ステージング・履歴 — ステージまではできるのにコミット欄が無く、必ずターミナルへ落ちる必要がありました
  • .gitignoreを尊重し、索引の打ち切りを表示node_modulestargetが索引を食い潰し、8000件で無言で打ち切るためモノレポで⌘Pが壊れていました
  • 未保存の内容を再起動後に復元(Hot Exit) — これまでは失われていました。ディスク側が変わっていたら黙って上書きせず、差分を見せて選ばせます
  • マルチカーソルで実際に編集できる — ⌘Dは「選ぶ」だけで、打鍵は1箇所にしか入りませんでした
  • 取り消し履歴を自前で持つ — 整形やコードアクションも1回の⌘Zで戻せます
  • ドラッグ&ドロップでの移動と同名衝突の確認・ごみ箱・ツリー上での⌘Z — 移動先に同じ名前があっても黙って上書きしていました

VS Code相当へ

検索の正規表現・大小区別・単語単位・「前へ」・全ヒット強調 / 診断の波線とホバー /
対応括弧の強調と虹色括弧 / 縦ルーラー / インデント自動判別 /
タブのMRU切替・ピン留め・プレビュータブ / ⌘Pの最近使った順・:123行ジャンプ・@シンボル /
2打鍵ショートカット(⌘K ⌘S)とキーバインド編集画面 / 設定画面 /
問題パネルのワークスペース全体表示 / ターミナルのファイルパスとURLをクリックで開く /
東アジア文字幅の正確な計算と日本語変換中のショートカット保護

AIコックピットとして

  • 追従モード — エディタが、動いているAIの編集箇所を追いかけます。自分でスクロールすると止まります
  • 未読カーソル — 「今どれが自分待ちか」へ1打鍵で移動できます
  • 状態検知の刷新 — 画面の見た目から推測するのをやめ、構造化出力とフックを使います。判定がどこから来たかも表示するので、その判定がどれだけ当てになるか分かります
  • worktree隔離起動と衝突検出 — 2体が同じファイルを触っていたら、レビュー時ではなくその場で警告します
  • 差分レビューの集中モード — 「2 / 5」と残件を出し、]f/[fでファイル間を移動できます
  • 通知を「作業が終わった瞬間」だけに — 鳴りっぱなしをやめました
  • プリセットの⌃1〜⌃9起動 / セッションの自動命名 / トークン消費と推定コストの表示 / 並走レースの勝者評価

品質

  • 3,134テスト(前版比 +567)、macOS・Linux・Windows の3OSすべてでCI通過
  • cargo fmt --check差分なし、clippy警告ゼロ
  • 新しい依存パッケージは1つだけ(Windowsのごみ箱API用。cfg(windows)限定で他OSのビルドには入りません)

既知の制限(正直に)

  • アイドル時に約13fps描画しています(今回入れた性能計測で判明。次版で対処します)
  • 行単位のステージングはハンク単位まで(行選択のUIがまだありません)
  • Windowsのごみ箱のみ⌘Zで戻せません(APIがごみ箱内のパスを返さないため。通知でお知らせします)
  • ターミナルのOSC 8ハイパーリンクは未対応