Zettelkasten 運用記録 Part 2: 分析編
Makefileで自分の活動を可視化する。タグの偏り分析、曜日×時間のヒートマップなど
Taskdogは、タスクの期限・見積もり時間・優先度から1日の作業時間上限を守りながらスケジュールを自動生成するCLI/TUIタスク管理ツールです。
👉 https://github.com/Kohei-Wada/taskdog

タスク管理ツールは世の中に山ほどあります。Todoist、Notion、Trelloなどどれも素晴らしいツールです。
しかし、どれも自分のワークフローにはフィットしませんでした。
そんなわけで、自分で作ることにしました。
最初に試したのはTaskwarriorでした。
Taskwarriorは素晴らしいCLIタスク管理ツールです。15年以上の歴史があり、シンプルで高速、カスタマイズ性も高い。しばらく使っていました。
でも、一つ大きな不満がありました。
スケジュールの自動生成機能がない。
タスクに期限と見積もり時間を設定しても、「じゃあいつやるの?」は自分で考えなければなりません。Taskwarriorは「何をやるか」の優先順位付けは得意ですが、「いつやるか」のスケジューリングは守備範囲外のようです。
毎朝「今日は何をどれだけやるか」を手動で決めるのは、正直面倒でした。
次に試したのはAIスケジューリング系のサービスです。
Motion や Reclaim.ai は「AIがスケジュールを自動で組んでくれる」というコンセプト。確かに便利そうでした。
でも、いくつか引っかかる点がありました:
「AIが決めました」と言われても、納得できないスケジュールを押し付けられている感覚がありました。
チーム向けツールも試してみました。
機能は豊富ですが、個人で使うには重すぎました。親子タスク、サブタスク、エピック、ストーリー…。
一人で使うのに、こんな複雑な構造は要りません。
普段のチームのドキュメント整理にはNotionを使っています。ページの階層構造やデータベース機能は素晴らしいと思います。
でも、自分のワークフローには向いていませんでした。
結局、自分が欲しかったのはこういうツールでした:
既存ツールでこの条件を満たすものが見つからなかったので、作ることにしました。
| 機能 | Taskdog | Taskwarrior | Motion/Reclaim |
|---|---|---|---|
| スケジュール自動生成 | ✅ | ❌ | ✅ |
| 工数上限の考慮 | ✅ | ❌ | ✅ |
| 土日祝日スキップ | ✅ | ❌ | ✅ |
| ローカル完結 | ✅ | ✅ | ❌ |
| 透明なアルゴリズム | ✅ | - | ❌ |
| 価格 | 無料 | 無料 | $19-34/月 |
| CLI/TUI | ✅ | ✅ | ❌ |
| 依存関係 | ✅ | ✅ | 一部 |
Taskdogの立ち位置: Taskwarriorの使い勝手 + Motion/Reclaimのスケジュール自動生成、をローカル完結で実現するツールです。
名前は適当です。Taskwarriorを使っていたときにたまたまDatadogが目に入って、「Task + dog = Taskdog」にしました。深い意味はありません。
Pythonで作ったタスク管理システムで、以下の3つのインターフェースを持っています:
# タスク追加taskdog add "READMEを書く" --priority 3 --tag docs
# タスク一覧(テーブル表示)taskdog table
# タスク開始・完了taskdog start 1taskdog done 1Taskdogの核心機能は「1日の作業時間上限を超えない」自動スケジューリングです。
見積もり10時間のタスクを期限3日前に入れたら、自動で3日間に分散してくれます。土日祝日は自動でスキップされるので、現実的なスケジュールが組めます。
# 見積もり10時間、期限が3日後のタスクtaskdog add "レポート作成" --estimate 10h --deadline 2025-01-05
# 最適化を実行taskdog optimize# → 1日6時間上限で、平日のみに分散してスケジュール(設定でデフォルトを変更可能)
優先度・期限・依存関係を考慮して、工数上限を守ってスケジュールを組んでくれます。
実用的な3つのアルゴリズム:
taskdog optimize # greedy(デフォルト)taskdog optimize --algorithm backward # 期限逆算taskdog optimize --algorithm dependency_aware # 依存関係考慮| アルゴリズム | 説明 | いつ使う? |
|---|---|---|
| greedy | 前倒しでスケジュール | 早く終わらせたいとき |
| backward | 期限から逆算(JIT) | 締切駆動の仕事 |
| dependency_aware | クリティカルパス法(CPM) | 依存関係が多いとき |
普段使うのはこの3つです。
学習用の実験的アルゴリズム(6種類):
balanced, priority_first, earliest_deadline, round_robin, genetic, monte_carlo も実装しています。これらは実験的に作成しました。詳細はリポジトリを参照してください。
Motion/Reclaimとの違い:
taskdog ganttターミナルでガントチャートが見れます。日別の負荷量も表示されるので、「この日は詰め込みすぎだな」が一目で分かります。

taskdog tui見た目や操作感はVim/Neovimに寄せています。
/でリアルタイムタスク検索ができますが、これはtelescope.nvimの操作感を参考にしました。Neovimユーザーなら違和感なく使えると思います。
| キー | 操作 |
|---|---|
a | タスク追加 |
s | 開始 |
d | 完了 |
/ | 検索 |
Ctrl+P | コマンドパレット |
? | ヘルプを表示 |

taskdog add-dependency 2 1(タスク2はタスク1の完了後に)| 層 | ライブラリ |
|---|---|
| CLI | Click + Rich |
| TUI | Textual |
| API | FastAPI + Uvicorn |
| DB | SQLite + SQLAlchemy + Alembic |
| 型チェック | mypy |
| リンター | Ruff |
| パッケージ管理 | uv |
Clean Architectureを採用し、uv workspaceでmonorepo構成にしました。
packages/├── taskdog-core/ # ビジネスロジック(UI依存なし)├── taskdog-client/ # HTTP APIクライアント├── taskdog-server/ # FastAPI REST API├── taskdog-ui/ # CLI/TUI└── taskdog-mcp/ # Claude Desktop統合(MCP)この構成により:
チーム機能、クラウド同期、コラボレーション…全部切り捨てました。
理由:
「AIがスケジュールを決めました」ではなく、「このアルゴリズムでこう決めました」と説明できるようにしました。
実用的な3つのアルゴリズム(greedy, backward, dependency_aware)は全てソースコードで確認できます。納得できなければ自分で改良することもできます。
David Allenの「Getting Things Done」の考え方を取り入れました:
taskdog today, taskdog gantt)最初は親子タスク(サブタスク)機能を実装しようと試みました。
「大きなタスクを小さなタスクに分解できたら便利だろう」と思ったからです。
でも、実装を進めるうちに問題が山積みになりました:
特にスケジュール最適化アルゴリズムとの相性が最悪でした。最適化アルゴリズム全てで親子関係の特別処理が必要になり、コードが複雑化していきました。
結局、親子タスクは廃止して依存関係 + タグ + ノートで代替することにしました。
個人で管理するタスクは同時に数個程度。親子構造で整理する必要がないことに気づきました。
最初はシンプルな構成で始めましたが、機能が増えるにつれてコードが混乱してきました。(当初はただのJSONファイルを編集するコマンドの集合体でした。)
途中でClean Architectureに移行。これが大変でした:
でも、この苦労のおかげで:
詳しくは DESIGN_PHILOSOPHY.md を参照してください。
「自分専用のタスク管理ツールを作る」というのは、プログラマの特権かもしれません。
Taskdogはまだ開発中で、バグや不具合もあると思います。それでも、自分のワークフローには完全にフィットしています。
特に以下の人に向いていると思います:
興味があればぜひ試してみてください。Star、Issue、PRも歓迎です。
Makefileで自分の活動を可視化する。タグの偏り分析、曜日×時間のヒートマップなど
Linuxのプロセス管理の仕組みと、Hyprland の正しい起動方法について
Dagger製のMCPツール「container-use」を使って、ディレクトリ構造を汚さずにClaude Codeで並列開発を実現する方法