目次
はじめに
こんにちは。エンジニアの皆さんは普段ターミナルを使いますか?
最近はAIエディタなどのGUIツールがたくさんあるので、使う機会がちょっとずつ減ってきているような気がしますが、僕は普段はほぼターミナルで作業しています。
クラウド開発事業部ではタスク管理ツールを作っているようですが、個人的に自分もタスク管理ツールを作っていたので紹介します。
個人的にタスク管理をするにあたって以下のような問題がありました、、、
1. コンテキストスイッチが辛い
ターミナルで作業中、タスクを確認するためにブラウザを開いてNotionに切り替える。この往復が地味にストレスです。git statusを打つ感覚でタスクを確認できたらどれだけ楽か。
他のコマンドとコマンドとうまく連携させてタスクをフィルタ&整形できたらどれだけ楽だろうか。GUIツールではこれは難しい。
2. スケジュールを立てるのが面倒
「このタスクは3時間かかる」「締切は金曜」——情報はあるのに、それを見ながら自分でGoogleカレンダーやExcelに配置&工数を調整するのは単純作業です。コンピュータにやらせたいですよね。
この2つを解決するツールを探しましたが、意外と見つかりませんでした。
- Taskwarrior: CLIは最高ですが、スケジュール自動生成がない、TUIが別プラグイン&操作が難しい
- Motion / Reclaim.ai: 自動スケジューリングはありますが、Web UIのみで月額$19〜
- Asana / Jira: そもそもチーム向け
CLIで操作できて、スケジュールを自動生成してくれるツール。そんなの作ってみるか。というノリで作ったのが Taskdog というツールです。
名前は適当です。Taskwarriorみたいな名前&たまたまDatadogというツールが目に止まったから付けました。
Taskdogとは

Taskdogは、CLI/TUI/REST APIを備えた個人向けタスク管理ツールです。
初めは 上の2つの課題とtodo.txt というツールの仕様をパクっただけのjsonファイルを編集するコマンドだったのですが、いろいろ機能を追加していきました。
主な機能:
- スケジュール最適化アルゴリズム: 9種類くらいのアルゴリズムから選択できます。(greedy, dependency_aware以外は実験的)土日祝を避けて指定した工数内でタスクを配置します。
- 依存関係とタグによる整理: 親子関係ではなく、フラットな構造
- Markdownノート: 各タスクに詳細なメモを添付(お気に入りのエディタとシームレスに移動できます(vim, nvimなど))
- Ganttチャート: ターミナルでタイムラインを可視化
- リアルタイム通知: WebSocketでタスクの変更をリアルタイムに通知(タスクのバックグラウンド実行を人間(自分)に通知するため)
- 監査ログ: 誰がいつ何を編集したかを記録(将来の24時間自動実行に向けて、AIの操作履歴を追跡できるように&通知の見落とし時に対応できるようにするため)
- MCP Server: Claude DesktopなどのAIからタスクを操作可能(生成AIにタスクを実行させるためのインターフェイスとして作りました)
- TUI: リアルタイムフィルタリング、ショートカット、viバインド、etc…
|
1 2 3 4 5 6 7 8 9 10 11 |
# タスク追加 taskdog add "ブログ記事を書く" --priority 8 --tag blog # 依存関係付きで追加 taskdog add "記事をレビュー" --depends-on 1 --tag blog # スケジュール最適化 taskdog optimize --algorithm greedy # Ganttチャート表示 taskdog gantt --tag blog |
TUIモード

taskdog tuiでフルスクリーンのTUIが起動します。キーボードだけで操作できます。
/キーでリアルタイムタスクフィルタリングができます。普段使っているnvimのtelescope.nvimからインスピレーションを受けました。文字を入力するたびに即座にタスクが絞り込まれていくので、大量のタスクがあっても素早く目的のタスクにたどり着けます。
キーバインドや見た目は極力viに寄せています。viユーザーなら直感的に操作できると思います。
主なキーバインド:
| キー | 操作 |
|---|---|
a |
タスク追加 |
s |
開始 |
d |
完了 |
P |
一時停止 |
e |
編集 |
v |
ノート編集 |
/ |
検索 |
Ctrl+P |
コマンドパレット |
CLIでサクッと操作するか、TUIでじっくり管理するか、気分で使い分けられます。
以下のような感じで操作できます。

やっているのは、
- タスク追加
- 編集
- timeline拡大
- 最適化
- fuzzy finderでフィルタ&refineフィルタ
- タスク削除
です。一切マウスに触れずにキーボードだけで操作できます。
設計思想:親子関係なし
Taskdogにはタスクの親子関係はありません。その代わり依存関係のみを管理しています。
例えば、特定のタスクが完了してないと他を開始できないなど。
実は最初、サブタスク(親子関係)を実装しようとしました。しかし、すぐに壁にぶつかりました。
最適化アルゴリズムが破綻する
親子関係があると、スケジュール最適化で答えのない問いが噴出します。
- 親タスクはいつスケジュールする?子の前?後?途中?
- 親の見積もり時間 = 子の合計?それとも独立?
- 親が固定で子が可変の場合、どう調整する?
これらのエッジケースを処理する必要がありました。コードは複雑になり、結果は予測不能になりました。
Redmineのなぞ
チーム向けツールのRedmineを使ったことがあるのですが、子タスクを開始しても親タスクが開始されないという謎がありました。
実際に実装してみて以下のような仕様を決める難しさがあることを知りました。
- 子タスクを開始したら親も自動開始すべき?Yesならなん階層上まで?
- 子が全て完了したら親も自動完了?
- 途中のタスクを削除したら、孤児になった子タスクはどうなる?
これらすべてに「正解」はなく、ツールごとに違う挙動をします。
解決策:依存関係 + タグ + ノート
結論として、親子関係は捨てて、依存関係・タグ・ノートで代替しました。
|
1 2 3 4 5 6 7 8 |
# 「ブログ執筆」プロジェクトをタグで管理 taskdog add "リサーチ" --tag blog taskdog add "アウトライン作成" --tag blog --depends-on 1 taskdog add "本文執筆" --tag blog --depends-on 2 taskdog add "推敲・公開" --tag blog --depends-on 3 # プロジェクト全体を表示 taskdog table --tag blog |
個人で1〜3個のタスクを同時進行する程度なら、これで十分だという判断です。機能を「捨てる」決断が、結果的にシンプルで予測可能なツールを生みました。
Clean Architectureの実践
モノレポ構成
UV Workspaceを使ったモノレポで、5つのパッケージに分離しています。
|
1 2 3 4 5 6 |
packages/ ├── taskdog-core/ # ビジネスロジック(外部依存なし) ├── taskdog-client/ # APIクライアント ├── taskdog-server/ # FastAPI REST API ├── taskdog-ui/ # Click CLI + Textual TUI └── taskdog-mcp/ # Claude Desktop連携(MCP Server) |
最初は3つ(core, server, ui)でしたが、機能追加に伴い5つに増えました。taskdog-coreはUIやフレームワークに一切依存しません。これにより、CLIからTUI、REST API、さらにMCP Serverへと、UIを追加するたびにビジネスロジックを書き直す必要がありませんでした。
UseCase + Controller設計
各操作は独立したUseCaseクラスとして実装しています。
|
1 2 3 4 5 6 |
class UseCase[TInput, TOutput](ABC): """各ビジネス操作を表す抽象クラス""" @abstractmethod def execute(self, input_dto: TInput) -> TOutput: pass |
Controllerは5つの責務に分離しました(SRP: 単一責任の原則)。
- TaskCrudController: 作成・更新・削除
- TaskLifecycleController: 開始・完了・一時停止・キャンセル
- TaskRelationshipController: 依存関係・タグ
- TaskAnalyticsController: 統計・最適化
- QueryController: 読み取り専用操作(CQRS的な分離)
|
1 2 3 4 5 6 |
class TaskLifecycleController: def start_task(self, task_id: int) -> TaskOperationOutput: return self._execute_status_change(StartTaskUseCase, task_id) def complete_task(self, task_id: int) -> TaskOperationOutput: return self._execute_status_change(CompleteTaskUseCase, task_id) |
CLI、TUI、APIのすべてが同じControllerを使います。UIが変わってもビジネスロジックは不変です。
AI時代の開発フロー
このプロジェクトはほぼClaude Codeで開発しています。実装、テスト、リファクタリング、ドキュメント作成まで、AIと対話しながら進めています。
ただし、AIに任せっぱなしだとコードは発散します。品質を担保する仕組みが必要です。
Pre-commitで「汚い実装」を弾く
コミット前に自動でチェックが走ります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# .pre-commit-config.yaml repos: - repo: https://github.com/astral-sh/ruff-pre-commit hooks: - id: ruff # Linter - id: ruff-format # Formatter - repo: https://github.com/pre-commit/mirrors-mypy hooks: - id: mypy # 型チェック - repo: local hooks: - id: unittest entry: make test # テスト実行 |
AIが生成したコードでも、lint違反や型エラーがあればコミットできません。これが「発散防止」の第一線です。
CIで多角的に検証
PRを出すと、GitHub Actionsで以下が走ります。
- Lint: Ruffによるコードスタイルチェック
- TypeCheck: mypyによる型検証
- Test: 各パッケージごとにpytest実行
- Security Scan: pip-auditによる脆弱性チェック
|
1 2 3 4 5 6 7 8 9 |
# .github/workflows/ci.yml jobs: test: strategy: matrix: include: - package: taskdog-core - package: taskdog-server - package: taskdog-ui |
PRレビューの多層化
PRレビューは「AIが書いたコードをAIがレビューする」時代になりました。
- Claude Codeで実装
- GitHub Copilot(または他の生成AI)でレビュー
- 人間(自分)が最終確認
異なるAIモデルを組み合わせることで、単一モデルの盲点を補完できます。
個人的に生成AIのコードを完璧にレビューするのではなく、そもそも壊れにくい構造に作っておくことが重要だと考えています。
なので、僕自身はコードの中身は雰囲気しか見ておらず、厳重にチェックしているのはモジュールの依存関係だけです。
Conventional Commitsでリリース自動化
リリースノートの自動生成をするために以下の工夫をしています。
- pre-commitでcommitメッセージフォーマットチェック
- github-actionsでcommitメッセージを自動分類&リリースノート自動生成
コミットメッセージの形式をpre-commitで強制しています。
|
1 2 3 4 |
- repo: https://github.com/compilerla/conventional-pre-commit hooks: - id: conventional-pre-commit args: [feat, fix, docs, style, refactor, perf, test, build, ci, chore] |
これにより、タグをプッシュするだけでリリースノートが自動生成されます。
|
1 2 3 4 5 |
# .github/workflows/release.yml - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: generate_release_notes: true # Conventional Commitsからノート生成 |
feat: は「New Features」、fix: は「Bug Fixes」として自動分類されます。手動でリリースノートを書く手間がなくなりました。
振り返りと今後
作ってよかったこと
- 自分で毎日使っている: 作ったツールを自分で使うのは、最高のドッグフーディングです
- Clean Architectureの実践的な学び: 理論だけでなく、実際に手を動かすことで理解が深まりました
- AIとの協働スタイルの確立: Claude Codeを軸に、品質担保の仕組みを構築できました
今後の展望&課題
- 定期タスク登録: 定期ミーティングなどの一定間隔ごとに発生するタスクを登録できる機能の追加。Googleカレンダー登録の定期ミーティング追加とかどうやってるのか調べたい。
- UIの改善: TUIツールをpythonで作っているのはあまり見たことがないので、goやrustのTUIも調べたい。
- 24時間タスク自動実行: MCPサーバでAIにタスクをやらせたり、コマンドラインから管理できるのは便利ですが、結局自分が命令しなければならないのが手間だということがわかりました。これを回避するには24時間自動実行する必要があります。
OSSとして公開しています。興味があれば覗いてみてください。
GitHub: https://github.com/Kohei-Wada/taskdog
- 個人向けタスク管理ツールをClean Architectureで作った話 - 2025-12-21
- GoogleColabにトンネルを掘る - 2024-12-10
- ラズパイで映像をストリーミングしてみた - 2023-12-06
【採用情報】一緒に働く仲間を募集しています






