【awlog】
毎回、AIの承認待ちで止まらないための
ツール分割
(ルーティン)

  • 作業を記録するのはActivityWatch、そこから必要なぶんだけ取り出すのは自作コマンドのawlog、読んで要約して登録するのはClaude。三つに分担させました。
  • ログを丸ごとAIに渡すとトークンを食うので、先に絞り込んでから渡します。そのために作ったコマンドが、あとで自動化するときにそのまま効きました。
  • コマンドは自由に組み合わせられるぶん、組み合わせが変わるたびに人間の承認が要ります。よく使う形をもう一段固めて、毎朝同じ手順が最後まで走るようにしました。

関連記事

1. 記録と取り出しと要約を、別の道具に持たせた

はじめは、ActivityWatchの画面をそのまま眺めていました1。
けれど、これがよく分からない。
ウィンドウを切り替えるたびの記録が細かく並んでいるので、一日に何をしていたかが見えてこないのです。

細かすぎる、というのは記録として悪いことではありません。
細かいから、あとから何とでも束ね直せる。
そこで、ActivityWatchの画面は生データを置いておく場所と考えて、読むのは別の方法にすることにしました。

読みやすくまとめるのは、生成AIの得意なところです。
ただ、記録を丸ごと渡すのは気が進みませんでした。
一日ぶんでも数百行あって、それを毎日投げるとトークンをかなり消費します2。

なので、渡す前に絞り込むことにしました。
その日ぶんだけ、時間帯ごとに、意味のあるタイトルだけを集めて出す。
これがawlogです。

役割は三つに分かれました。
ActivityWatchは記録に徹する常駐ソフト、awlogはそこから決まった形で取り出すコマンド、Claudeは出てきたテキストを人の言葉に直す係。
言い換えると、ActivityWatchが貯めた記録をデータベースのように扱い、そこへクエリを投げる窓口をコマンドとして用意して、AIにはその窓口だけを触らせる形です3。

2. awlogを、毎朝同じ一本で呼べる形にした

2.1. AIに貼るために、クリップボードへ出せるようにした

最初のawlogは、その日ぶんを画面に表示するだけのものでした4。
自分で読むならそれで足りますが、AIに渡すとなると、ターミナルの出力を選択してコピーする手間が挟まります。

そこで c を付けるとクリップボードへ直接入るようにしました5。
awlog c d 1 と打てば、前日ぶんが整った形でコピーされて、あとは貼るだけ。
ファイルに残したいときは o ~/out のように書けば、日付ごとのテキストになります。

日付の指定も増やしました。
today、yesterday、d 1 でN日前、week で今週、lastweek で先週、2026-08-01 2026-08-07 と並べれば期間。
どれも同じコマンドの引数ちがいなので、覚えることは増えません。

2.2. 一日の区切りを、0時ではなく4時にした

夜中まで作業していると、日付が変わったところで記録が翌日に飛びます。
0時をまたいで書いていた記事が、翌日の日誌の先頭に一行だけ現れる。
これでは、その日に何をしていたかが読み取れません。

既定の一日を、4時から翌日の4時までにしました。
翌日の1時は「25時」、2時は「26時」と表示されます6。
4時より前に awlog today を実行したときも、前の作業日を対象にします。

暦のとおり0時で切りたいときは -normal を付ける。
あわせて -m 30 のように書くと、30秒に満たない項目を落とせるようにしました。
一瞬だけ切り替えたウィンドウまで残っていると、読むときに邪魔になります。

3. AIに任せるのは、読んで束ねるところだけ

3.1. 生のログは、そのまま流し込まない

絞り込んだといっても、awlogが出すのは時間帯ごとのアプリ名とウィンドウタイトルの一覧です7。
同じアプリが一日に何度も出てきますし、途中に別の作業が挟まる。
これをそのまま日誌に貼っても、自分ですら読めません。

「9時から11時にかけて、断続的にこの資料を作っていた」とまとめ直すところに、判断が要ります。
どこまでを一つの作業と見るか、どの固有名詞を残すか。
ここだけをAIに渡して、「・9時 内容」の形にしてもらっています。

ひとつ決めているのは、読めなかったことを推測させないこと。
メールを開いていた記録はあっても、用件までは分かりません。
そういうものは本文に混ぜず、「ログから読めなかった点」として別に並べます。
カレンダーの下に薄い字で出ているのがそれです。

3.2. 正データはJSON、画面はそこから作る

3.2. 正データはJSON、画面はそこから作る

Claudeのルーティンに書いた指示文には、最初からこう入れていました8。

3.2. 正データはJSON、画面はそこから作る

前日の作業をコマンド、awlog d 1で確認して、ローカルフォルダ内に、日報として記録してください。カレンダー形式のHTMLに追記していくようにして、カレンダーをタップすると、そのログがわかるようにしてください。HTMLは1つではなく、ビューとデータを分けるようにしてください。

3.2. 正データはJSON、画面はそこから作る

最後の一文が効きました。
AIにHTMLを直接書き足させると、毎日どこかの見た目が変わります。
表示とデータが同じファイルに入っていると、差分を見ても何が増えたのか読み取れない。

いまは data/logs.json が正データで、画面が読む data/logs.js はそこから自動で作られます。
calendar.html のほうは、日付が増えても触りません。
登録に使うのは log_tool.py set 2026-09-04 --file 一時ファイル の一行だけで、JSONの更新も読み込み用ファイルの再生成も、このコマンドがやります。

おかげで、見るときにAIは関わりません。
ブラウザでローカルのHTMLを開けば、その場でカレンダーが出る。
AIの応答を待つ画面ではなく、ただのファイルです。

4. 承認待ちで止まらないように、定型に落とす

毎日、自分でコマンドを打ってコピーして、AIに貼って、返ってきたものを保存する。
数日やってみて、これは続かないと思いました。
そこでClaudeのルーティンに、毎朝7時半に前日ぶんをまとめるよう頼んでみたのです。

このときに効いたのが、先にコマンドを作っておいたことでした。
AIがActivityWatchのデータベースを直接あちこち見に行かなくても、awlog d 1 と叩けば必要なぶんだけ返ってくる。
ルーティンの指示文にも、そのコマンド名を一行書けば済みました。

ただ、コマンドは自由に組み合わせられます。
日付を変え、出力先を変え、オプションを足す。
便利な反面、コマンドの形が変わるたびに人間の確認が必要になります。

最初は、実行されるコマンドをその都度そのまま承認していました。
ルーティンの設定画面に「常に許可」として溜まっていったのが、Bash (awlog d *) のように最初からワイルドカードで許したものと、Bash (node --check data/logs.js) のように一字一句そのままで許したものの混在です9。

4. 承認待ちで止まらないように、定型に落とす

ここで詰まったのが、日付を引数に取るコマンドでした。
log_tool.py set 2026-09-04 --file … は、日付も、一時ファイルのパスも毎日変わります。
文字列として一致しないので、いつまで経っても自動では通りません。
7時半にルーティンが動いても、最後の登録の手前で承認を待って止まっていました。

数日ぶんの承認履歴が溜まって、ようやく形が見えます。
変わらないのは python3 scripts/log_tool.py set という骨格、変わるのは日付と一時ファイルのパス。
そこまで分かってから Bash(python3 scripts/log_tool.py set *) の形に広げました10。
最初から広く許してしまうと、想定していない引数の組み合わせまで無審査で通ってしまう。
順番が逆だと危ないわけです。

手順のほうも、もう一段固めました。
awlogを呼ぶ、要約する、JSONにまとめる、log_tool.py set で登録する。
この流れをスキルとして書いておくと、AIは毎回同じコマンドを同じ順で呼びます11。
呼び方が毎回同じだから、許可の形も毎回同じになる。
自動で進むようになったのは、賢い仕組みを足したからではなく、やることを狭くしたからでした。

朝、カレンダーを開くと、昨日の自分が時間帯ごとに並んでいます。
自分で書いた覚えのない文章なのに、書いてあることには覚えがある。
広く試せる状態でいろいろ触ってみて、そのうちよく使う形だけを取り出して固めていく。
この後半の作業を飛ばすと、便利な道具はいつまでも手動のままです。

  1. ActivityWatchは無料で使えるオープンソースの時間追跡ツールで、記録はクラウドへ送られず端末のなかに保存されます。 – 完全無料の自動時間追跡ツール「ActivityWatch」の使い方
  2. Claudeの利用料はトークンという単位で数えられ、1トークンは英語でおよそ4文字にあたります。 – 料金 – Claude Docs
  3. ActivityWatchにはクエリ言語があり、バケットから取り出したイベントを絞り込んだり、並べ替えたり、別のバケットと突き合わせたりできます。 – Querying Data
  4. ActivityWatch自身にも aw-client というコマンドがあり、バケットの一覧や、ホストごとのcanonical eventsの取得ができます。 – CLI Usage
  5. pbcopyはmacOSに最初から入っているコマンドで、パイプで渡した内容をそのままクリップボードに置きます。pbはペーストボードの略。 – macOSのターミナルでのクリップボード操作(pbcopy/pbpaste)
  6. 日本の放送業界では、0時から5時を24時から29時と書く30時間制が使われています。起点を4時に取る数え方は28時間制と呼ばれます。 – 30時間制 – Wikipedia
  7. ActivityWatchのcanonical eventsは、ウィンドウの記録と離席の記録を突き合わせて作られたもので、公式の画面もこれを使っています。 – Working with ActivityWatch Data
  8. Claude Codeのデスクトップ版には、決まった時刻に新しいセッションを始めるスケジュール機能があります。ローカルで動かすものは、アプリが開いていてパソコンが起動しているときだけ実行されます。 – Claude Code Desktop でスケジュール設定されたタスクを実行する
  9. allowに登録されたコマンドは、確認なしで実行されます。ルールはdeny、ask、allowの順に見て、最初に一致したものが決まりになります。 – 権限を設定する – Claude Code Docs
  10. Bash(npm run test:*) のように書くと、その形で始まるコマンドがまとめて許可されます。広げるときは、その範囲を本当に許してよいかを確かめる必要があります。 – Claude Codeの権限設定ルール
  11. スキルは指示やスクリプトをまとめたフォルダで、中心のSKILL.mdに手順を書いておくと、必要な場面でエージェントが読み込みます。 – Agent Skills – Claude Platform Docs