はじめに
個人開発やプロジェクト管理において、皆さんはTODOやIssueをどのように管理していますか?
GitHub IssuesやJiraは非常に強力ですが、ターミナルから一歩も出ずに完結させたい、あるいはAIコーディングエージェントに自律的にタスクを消化させたいと考えたとき、少しもどかしさを感じることがありました。
かくいう私も、ghコマンドを打ってもらったり、GitHubのAPIを叩いたりと様々なことを試してみましたが、どうしても速度であったり手間であったりの問題でうまくいかないことが多かったです。
そこで今回、AIエージェントと人間がGitを介して共同作業するためのLocal Issueトラッカー、lissue(リシュー)をRustで開発し、crates.ioに公開しました。
# インストール方法
cargo install lissue
この記事では、lissueを開発した背景や、AI時代に合わせた技術選定・アーキテクチャの工夫について紹介します。
なぜ作ったのか?(既存ツールの課題)
開発のきっかけは、既存のTODOツールやIssue管理に以下の3つの課題を感じたことです。
-
Web UIのオーバーヘッド
CLI中心で作業するエンジニアや、ターミナル上で動くAIエージェントにとって、ブラウザを開いてIssueを確認する動作はコンテキストスイッチの塊です。 -
Gitとの親和性とコンフリクト
TODOの状態をソースコードと一緒にGitで管理したいという欲求は昔からあります。しかし、単一のJSONファイルなどで管理しようとすると、複数人(あるいは複数エージェント)での作業時にマージコンフリクトが頻発してしまいます。 -
AIエージェントへの最適化不足
LLMにコードを修正させる際、プロンプトにタスクの詳細や関連ファイルを効率的に渡す仕組みが欠けていました。
これらの課題を解決するため、GitHub Issuesのローカル版というコンセプトを明確にし、Local Issuesを略して「lissue」と名付けました。
技術選定とアーキテクチャのこだわり
1. ストレージ戦略:SQLiteと分割JSONのハイブリッド
ローカルCLIツールにおいて、データをどう保存するかは非常に重要です。以下の選択肢を検討しました。
- SQLiteのみ: 検索・更新は高速だが、バイナリデータなのでGitでの共有・同期に不向き。
- 単一JSON: 透過的で読みやすいが、タスクが増えると保存に $O(N)$ の時間がかかり、Gitでのコンフリクトが致命的。
結果として、SQLite(WALモード)と分割JSONのハイブリッド構成を採用しました。
ローカルでの高速な操作はSQLiteが担い、データの永続化とGit共有は1タスク1ファイルの分割JSONとして出力します。
これにより、Gitマージ時のコンフリクトを物理的に回避しつつ、パフォーマンスも飛躍的に向上しました。実際、5000タスク時の書き込み時間を約400ms(単一ファイル)から 約0.3ms(分割ファイル) へと短縮し、$O(1)$ の書き込み性能を実現しています。
2. クリーンアーキテクチャによる分離
将来の拡張性(DBの変更やWebサーバー化)と、テストの容易性を考慮し、Rustでクリーンアーキテクチャを採用しました。
- Domain: タスクの本質的なルール(UUID, ステータス遷移, 親子関係)
- Usecase: ビジネスロジック(同期、コンテキスト生成、タスク取得戦略)
- Infrastructure: 具体的な実装(SQLite, YamlConfig, 分割JSON)
- Presentation: CLIインターフェース(clapクレートによるコマンド定義)
これにより、ストレージ層をモック化して同期ロジックのユニットテストを徹底することができました。
3. Last-Write-Wins (LWW) による同期ロジック
Git経由で共有されたJSONファイルと、ローカルのSQLiteの状態をどう整合させるか。
lissueでは、各タスクに更新日時タイムスタンプを持たせ、常に更新日時が新しい方を正とするLast-Write-Wins(LWW)戦略を採用しました。
lissue sync コマンドを実行すると、全JSONを走査し、DBより新しければDBへ反映、DBの方が新しければJSONを更新するという双方向の同期を安全に行います。
実践:Gitを介したシームレスな同期
lissue sync を実行することで、Git経由で取り込んだ分割JSONとローカルDBの状態が高速に統合されます。
1タスク1ファイルの構成により、複数人(あるいは人間とAI)での開発においても、Issue管理がマージコンフリクトするストレスから解放されます。
AIエージェント最適化機能
lissueの最大の特徴は、AIエージェントの利用を前提としたコマンド群です。AIは大量のリストから選ぶよりも、明確な次のアクションを与えられることを好みます。
AI自律ループの構築
-
lissue next: 未割当で最も古いタスクを1つだけ出力。AIが次に何をすべきか迷うのを防ぎます。 -
lissue claim: 作業開始時に担当者(エージェント名など)を記録して排他ロックをかけ、マルチエージェント環境での作業衝突を防ぎます。 -
lissue context: タスクの詳細や紐づく関連ファイルの内容を、LLMのプロンプト用に一括でダンプします。
これにより、AIエージェントに lissue next でタスクを取得させ、lissue context で状況を理解させ、完了したら lissue close させる、といった自律的なループを最小限の手順で構築できます。
ファイル移動・リネームへの追従
AIによる大規模なリファクタリングでディレクトリ構造やファイルパスが変わった場合でも、lissue は関連ファイルの変更を検知し、コンテキストの整合性を保ちます。AIが「どこを直すべきか」を見失うことはありません。
大規模プロジェクトへの対応:階層管理
大きなIssueを小さなサブタスクに分解して管理することも可能です。
「この親タスクのサブタスクを順番に片付けて」といった、AIエージェントへの段階的な指示出しが容易になり、トークン制限のあるLLMでも複雑な課題に立ち向かえるようになります。
今後の展望:AIと人間の「協働」が前提のツールへ
今後、あらゆるローカル開発ツールは「AIと人間が共に使うこと」を前提に再設計される必要があると考えています。
現状のツールの多くは、まだ「人間向け」か「AI向け」のどちらかに偏っていますが、その間をシームレスに繋ぐ「橋渡し」となるアプリが、これからの主流になるはずです。lissueもその一翼を担うべく、以下のアップデートを予定しています。
TUI (Terminal User Interface) の実装: 人間がより直感的にタスクの優先度を操作できるように。
Neovimプラグインへの移植: エディタから一歩も出ずに、AIにタスクを振り、自分でもタスクを消化する究極の体験。
おわりに
lissueは、単なるTODOアプリではなく、AIエージェントと人間が同じプロジェクト内でスムーズに協業するためのインフラを目指して開発しました。
普段ターミナルから離れたくない方、AIコーディングアシスタントを活用している方は、ぜひ一度試してみてください!
- リポジトリ: https://github.com/Morishita-mm/rust-todo-cli
- crates.io: https://crates.io/crates/lissue
スターやIssue(もちろんGitHubのIssueでも、手元のlissueでも!)をお待ちしています!




