View on GitHub

cat-task-manager

cat-task-manager

cat-task-manager

毎日繰り返す小さなタスクを管理するTUI。キーボード操作。Rustで書かれています。

背景

無くて七癖と、生活用のタスク管理アプリ。

バイブコーディングが可能になった現代、 もはやタスク管理アプリに自分の癖をあわせる必要はなく、 自分の癖にあわせたタスク管理アプリをバイブコーディングしたほうが速い。

と思ったのでバイブコーディングしました。 他人が使うことは想定していません。 頻繁に予告なく破壊的変更をします。 それはそれとして、これを共有することで誰かがなんらかのヒントを得るきっかけにでもなれば幸いです。

※以降、AIが生成した文章が多く、目が滑るので、あとで人力で修正予定です

思想

このアプリは汎用 TODO アプリではありません。 プロジェクト、期限、優先度、タグ、検索、複雑な依存関係を扱うことよりも、 「今日もやる、決まった並びの作業」を迷わず進めることを優先しています。

毎日やるタスクは、管理が大げさになるほど続かない。 必要なのは、いま見るべきタスク1つだけがすぐ見えること、開始した時刻が残ること、終わったら次に進めること、 そしてユーザーがすべき操作が軽いこと。

そのため、cat-task-manager はタスクを増やしすぎるための機能を持たない。 タスクは階層化しない。並列依存も持たない。タスクごとのメモや属性も持たない。 毎日の流れを保つために、順番に進めることだけを強く扱う。

タスクと当日の途中状態は tasks/*.md だけを正とする。config にタスクを書かない。 別の status directory も持たない。 タスクを頻繁にメンテナンスできることを ETC 原則として優先し、 ユーザーが触る対象をタスク記述マークダウンファイルのみに絞る。

- [ ] 朝のルーティン
- [ ] メール確認
- [ ] コードレビュー

この形なら、タスクを追加するときにテーブルやフィールド名を複製しなくてよい。 上から下への並びがそのまま実行順になり、順序を変えたければテキストエディタで行を動かせばよい。

実装の考え方

タスク定義と現在の状態は tasks/*.md にまとめる。 通常の非空行がタスク定義であり、状態は各タスク行の行末 JSON として読む。 行末 JSON はアプリが書く領域である。

- [x] 朝のルーティン {"date":"2026-05-19","state":"done","started_at":"2026-05-19T09:00:00+09:00","completed_at":"2026-05-19T09:05:00+09:00"}
- [ ] メール確認 {"date":"2026-05-19","state":"in_progress","started_at":"2026-05-19T09:12:00+09:00"}
- [ ] コードレビュー {"date":"2026-05-19","state":"not_started"}

これは別ファイルへ状態を複製しないための割り切りである。 タスク名の typo を直しても、その行の行末 JSON を残せば状態は消えない。 行を追加、削除、並べ替えた場合は、状態も同じ行に付いて動く。 - [x] で行末 JSON がないタスクは、検知した時刻を着手時刻と完了時刻として行末 JSON に正規化する。 行末 JSON の形式が壊れていれば起動時や reload 時にエラーとして扱う。

過去データの統計は git 履歴に残った tasks/*.md から読む。 統計画面の task 一覧の目安は、task ごとの過去の完了記録から IQR 法で外れ値を除き、5 分幅のヒストグラムで最頻帯域の平均を表示する。 最頻帯域が同率の場合は中央値を表示する。 タスク情報の永続状態は tasks/*.md だけに置く。

画面は、次に扱うタスクへ集中しつつ、必要なときだけ全体も確認できるようにしている。 起動直後は 1 行表示にし、v で 1 行、未完了、全体表示を切り替える。 未完了表示では完了済みのものを外し、全体表示では完了済みも含めて表示する。 完了済みのものは開始時刻と完了時刻から作業時間を表示する。操作対象は未着手、実施中、保留、後回しのものだけにする。

状態は少なくしている。未着手、実施中、完了、保留、後回し、時間切れだけを持つ。 保留は次のタスクをブロックし、後回しはブロックせずに次のタスクへ進めるために使う。 個別タブの1行表示で保留中のときは、他タブへ移るための状況説明を表示する。 日付が変わったら、完了していないものはその日の記録では時間切れとして扱う。 これは締め切りやスケジューリングを複雑にするためではなく、 「その日に終わらなかった」ことを簡単に残すための割り切りである。

操作はキーバインド中心にしている。開始と完了は同じキーで進め、保留(他タブへ)と再開も同じキーで切り替える。 後回しもキー操作で付け外しする。 tasks/*.md もキー操作で開き、閉じたら再読み込みする。 アプリの中でフォームを作るより、普段使っているエディタに任せるほうが速く、失敗したときも中身を確認しやすい。

設定の形

config.toml はエディタ候補、キーバインド、起動時 git snapshot、free time自動開始の設定だけを持つ。タスクは書かない。

editors = ["fresh", "zed", "nvim", "code"]

[startup_git]
auto_commit_and_push = false

[auto_free_time]
enabled = false
idle_seconds = 60
active_hours = "09:00-17:00"

[keybindings]
j = "next"
down = "next"
k = "previous"
up = "previous"
enter = "advance"
space = "advance"
p = "hold"
d = "defer"
q = "quit"
e = "edit"
l = "next_tab"
right = "next_tab"
h = "previous_tab"
left = "previous_tab"
v = "toggle_view"
s = "stats"
"?" = "help"

startup_git.auto_commit_and_push = true のときだけ、起動時に1日1回、%LOCALAPPDATA%\cat-task-manager を git commit して push する。

auto_free_time.enabled = true のときだけ、active_hours の時間帯に実施中taskがない状態が idle_seconds 続くとfree timeを自動開始する。終了時刻は時間帯に含まない。22:00-02:00 のような日跨ぎも指定できる。

保存場所は Windows の AppData Local 配下にまとめる。

%LOCALAPPDATA%\cat-task-manager\config.toml
%LOCALAPPDATA%\cat-task-manager\tasks\tasks.md

tasks/*.md はユーザーとアプリが同じ対象を読み書きする SSoT。config.toml は操作環境の設定。

割り切り

このアプリは「タスクを管理する場所」ではなく、「決まった日課を進める場所」として作っている。

柔軟な TODO 管理、検索、タグ付け、期限管理が必要なものは別の道具に任せる。 cat-task-manager は、毎日同じように始めて、上から順に進めて、終わらなかったものはその日の結果として残す。 その単純さを崩さないことを実装上の優先事項にしている。