yaiba — vim-flavoured todo & gantt, peer to peer

刃 — シングルバイナリで動作し、サーバーなしで即時P2P同期する Vim 風ガントチャート・ToDoプランナー

yaiba demo

Vim のモーダル操作で高速に入力・編集でき、タスク間の依存関係も定義できるローカルファーストなガントチャート・ToDo管理ツール yaiba (刃) を Rust で作りました。

刃 — the blade. A vim-flavoured todo and gantt planner that runs as a single local binary and syncs directly between people.

なぜ作ったのか

タスク管理ツールを使う際、いつも以下のようなちょっとした不満がありました。

  1. ターミナルツール:タイピングやキー操作は高速だが、全体のタイムラインや依存関係を直感的に俯瞰できるガントチャートを描くのが難しい。
  2. Webベースのプランナー:美しいガントチャートを描画してくれるが、操作のたびにマウスに手を伸ばす必要があり、データも他人のサーバーに預けなければならない。
  3. サーバー管理とアカウントの負担:チームでリアルタイム共有しようとすると、サーバーのセルフホストやアカウント作成・認証の手間が発生する。

キーボード主体で快適に操作でき、タスクの依存関係とタイムラインが美しく描画され、かつサーバー不要でP2P同期できるツール」が欲しいという思いから開発したのが yaiba です。


yaiba の主な特徴

1. キーボードがそのままインターフェース(Vim モーダル操作)

yaiba は Vim の操作体系を全面的に採用しています。

  • o / O で上下に新しいタスクを開いて即入力(Enter または Esc で確定)
  • Space で完了(または stododoingdone をトグル)
  • dd でタスク削除、u / Ctrl+r で Undo / Redo
  • J / K でタスクの上下移動(親の階層レベルに合わせて自動でインデント)
  • >> / << でタスクの階層ネスト / 押し出し
  • + / - で所要日数(duration)の増減、. / , で開始日の移動
  • D で依存関係の追加(先行タスクを指定)、X で解除

キーボードから手を離さずに、プロジェクトのタスク追加・並び替え・スケジュール調整が完結します。

2. 依存関係とクリティカルパスの自動計算

単なるビジュアル的な矢印ではなく、Finish-to-Start(完了後開始)の DAG(有向非巡回グラフ)として依存関係を計算します。

  • Forward/Backward pass により、各タスクの「最早開始日」「余裕日数(Slack)」を算出。
  • クリティカルパス(Critical Path) を自動検出し、ハイライト表示。「このプロジェクトが実際にいつ終わるのか」を提示します。
  • 後続タスクとのラグ日数指定(:dep 3 +5 で5日間の余裕を設定など)や、同日開始(:dep 3 +0)にも対応。

3. ひとつのアウトラインで、俯瞰から詳細まで(視点に応じた階層折りたたみ)

親タスクを持つタスクは自動的に サマリー(まとめタスク) となり、配下のタスクの期間や進捗率を自動で集計します。

  • zm / zr で階層レベルを折りたたみ・展開。
  • zM で全プロジェクトのサマリーのみを 1 画面に集約して表示(マネージャー視点の全体俯瞰)。
  • zR で最も深い実装タスクまで一括展開(作業者視点での詳細確認)。
  • zf で選択したサブツリーだけにズームイン、zF で戻る。

同じデータ構造のまま、表示する階層の深さ(視点)を切り替えるだけで、全体像の把握から具体的な作業まで柔軟に対応できます。

4. サーバー不要の P2P 同期 (iroh)

iroh を採用しており、中央サーバーを必要としない直接 P2P 同期を実現しています。

  • 各レプリカ(環境)が独立して動作し、編集内容は CRDT(Hybrid Logical Clock を用いた Last-Writer-Wins)により競合なく自動マージされます。
  • パブリックキーと UDP ホールパンチングにより、ポート開放やファイアウォール設定なしで相互接続。

同期の手順(ユーザー A がチケットを発行し、ユーザー B が参加する例):

sh
1
2
3
4
5
6
7
# 1. ユーザー A (共有元): アプリ内コマンド `:ticket` や起動ログからチケットを取得して B に共有
# チケット例: yaibaticket1abcdef1234567890abcdef1234567890...

# 2. ユーザー B (参加者): A から共有されたチケットを指定して参加(別プロジェクトとして独立保持)
yaiba join yaibaticket1abcdef1234567890... --as project-a

# (アプリを起動したまま UI から `:join yaibaticket1...` でも参加可能)

5. 画面モードと美しい UI(Neon / Office / Super Mode)

利用シーンに合わせて 3 種類のテーマモードを切り替えられます。

  • Neon Mode(デフォルト):サイバーパンク風のネオン HUD。クリティカルパスがマゼンタ色で流れるように強調されます。

  • Office Mode (gt または :theme light):ミーティングや画面共有、印刷向けの静かなデザイン。余計な発光や走査線をカットし、実用的な配色になります。

  • Super Mode (gs または :super):中二病全開・男のロマンを極限まで詰め込んだ覚醒モード。ネオンの発光倍率が解放され、背景に漆黒のオーロラが揺らめき、CRT走査線が走る超絶演出モードです。

    • タイピング即・斬撃:キーを1文字叩くたびにカーソルから閃光の如く斬撃エフェクトが放たれ、タイピングの連打に合わせて打撃音と反動(リコイル)が増幅!
    • 日本語変換は重打:日本語の変換確定(Enter)は、単なる1打鍵を超えた深みのある重厚な一撃として画面に刻み込まれます。
    • タスク完了は衝撃波(ショックウェーブ)Space でタスクを完了した瞬間、画面全体に強烈な波紋と衝撃波が駆け巡る!
    • タスク削除は画面激震dd で不要なタスクを滅ぼすと、画面全体がグラリと激しく振る動く!

    ※どんなにエフェクトを限界突破させても、「クリティカルパス=マゼンタ色」のルールと視覚アクセシビリティ(prefers-reduced-motion 設定時の自動モーションオフ)は厳格に守られる硬派な仕様です。

  • 日本語 UI 対応 (:lang ja):UI全体(ヘルプ、ステータスライン、コマンド拒否メッセージ、列ヘッダー等)を日本語化できます。キー名やコマンド名は統一感を保つため英語のままとなっています。

6. マウス操作と右クリックメニュー

キーボード操作が基本ですが、画面共有時や他人に操作を譲る場合のためにマウス操作もサポートしています。

  • タスクやバーのドラッグ&ドロップ(開始日・期間の調整、並び替え、依存関係の接続)。
  • 右クリックメニュー:キーボード操作のショートカットキー(dd, s, gp, zf など)が併記されており、「マウス操作をしながらキーボードショートカットを覚えられる」 ガイドの役割を果たします。

7. 計画 vs 実績 (Plan vs Actual) と イナズマ線 (Progress Line)

  • 計画日付(start, duration)と実績日付(began, ended)を両方記録。
  • gd で計画と実績の列表示(Date Columns)とコンパクト表示をトグル。
  • 基準日(As-of date)を設定可能(:asof -3d や top バーの日付クリック)。
  • ガントチャート上に イナズマ線 を描画。基準日に対して各タスクが予定通りか、遅れているか(左への折れ)、進んでいるか(右への膨らみ)が視覚的にひと目で把握できます。

8. 複数プロジェクト管理 (projects.toml)

ひとつの yaiba プロセスで複数のプロジェクト(データベースファイル)を登録・切り替え可能です。

  • :proj またはトップバーのプロジェクト名クリックで曖昧検索(Fuzzy Picker)つきのプロジェクト切り替えダイアログを起動。
  • P2P で参加した相手のタスク群は別プロジェクトとして孤立して保持されるため、自分のバックログと混ざる心配がありません。
  • 完全に融合させたい場合は yaiba merge <ticket> を使用します。

9. AI エージェント連携 (yaiba mcp)

Model Context Protocol (MCP) に対応しており、Claude Code や Cursor などの AI エージェントから計画の参照・更新が可能です。

sh
1
2
# バックグラウンドで起動中の yaiba に対して MCP サーバーを登録
claude mcp add yaiba -- yaiba mcp

エージェントは plan ツールで依存関係やクリティカルパス・遅延状況を把握し、add_tasklink ツールでタスクの分解やリンク設定を自律的に行えます。

例えば、GitHub の Issue 群やロードマップのテキストを渡して 「この内容を元に、タスクを起こしてスケジュールを組んで」 と頼むだけで、適切な親子の階層構造や依存関係(クリティカルパス含む)が設定されたガントチャートがあっという間に組み上がります。

yaiba MCP で自動生成されたガントチャートの例

手動でタスクを1つずつ打ち込んで繋ぐ手間すらなくなり、AI と対話するだけでプロジェクト計画の初動が完了します。


インストールと使い方

インストール

crates.io からインストールするか、GitHub Releases からビルド済みバイナリ(Linux / macOS / Windows)をダウンロードします。

sh
1
cargo install yaiba

クイックスタート

ターミナルで yaiba を実行すると、ローカルサーバーが起動し、自動的にブラウザで http://localhost:8188 が開きます。

sh
1
2
3
4
5
6
7
8
# 起動(デフォルトでブラウザが開きます)
yaiba

# ポート変更やブラウザ起動なし
yaiba --port 9000 --no-open

# ネットワーク非接続(完全ローカルモード)
yaiba --no-sync

主なキーバインド・コマンド

キー / コマンド説明
?ヘルプパネルの表示
o / O下 / 上 に新しいタスクを作成
space / sタスクの完了 / ステータス切り替え (tododoingdone)
dd / u / ^rタスクの削除 / Undo / Redo
+ / -所要日数を +1日 / -1日
. / ,開始日を +1日 / -1日
D / X依存関係の追加 / 削除
zm / zr階層の折りたたみ / 展開(zM / zR で全折りたたみ / 全展開)
zf / zF選択サブツリーへフォーカス / フォーカス解除
gd計画・実績の日付列表示 ⇄ コンパクト表示
gt / gsOfficeモード ⇄ Superモード トグル
:lang jaUI全体の日本語化
:projプロジェクト切り替えピッカーの起動
:ticket同期用チケットのコピー

おわりに

yaiba を作ったことで、「思考の速度でタスクを打ち込み、そのまま依存関係とタイムラインを組み上げ、必要に応じてP2PでチームやAIと共有する」という理想のタスク管理環境が手に入りました。

Webアプリケーションですがシングルバイナリとしてローカルで完結し、動作も非常に軽快です。打鍵感を極めた Super Mode でのタスク消化は癖になる爽快感があります。

「マウス中心のガントチャートツールにストレスを感じている方」「Vim のキーバインドでサクサク工程管理をしたい方」「サーバーなしでシンプルにタスクを同期したい方」は、ぜひ yaiba を試してみてください!