私はメモツールとしてObsidianを愛用している。
Obsidianにはプラグインと呼ばれる拡張機能があり、基本機能だけではできないさまざまな機能を追加できる。その中でも私が気に入っているのが、タスク管理プラグインのTaskNotesである。
TaskNotesでは、Todoタスクを締切や優先度などのメタデータと一緒に管理できるほか、ポモドーロタイマーなど、タスクの実行や記録を補助するための機能も備わっている。私はこのTaskNotesをかなり気に入っていたのだが、使っているうちに「既存の機能だけじゃうまく活用できないな」と思うことが増えてきた。
そこで、TaskNotesに自分が欲しい機能を追加するために、Claude Codeにスクリプトを書いてもらうことにした。今や欲しい機能を思いついた時、AIエージェントに頼めば三日三晩もかからずに実装できる時代である。
今回も例のごとく、サクッと作ってもらおう…そう考えていた。
ところが、これが思った以上に難しかった。
TaskNotesで感じていたちょっとした不便
※実際にどう沼ったかを先に知りたい方は次のセクションまで飛ばしてください。このセクションでは具体的な自分の開発目的や実装したい機能の詳細を説明しているだけです
TaskNotesにはポモドーロタイマーが備わっており、タスクに取り組む時間を記録できる。タイマーを使う際には、まずObsidianを開いて、取り組むタスクを選択して、開始ボタンを押してセッションを始める必要がある。
たったこれだけなのだが、この一手間が意外と面倒。
特に困っていたのが、PCを使わないタスクに取り組む場合のことだ。具体的なタスクの例としては、ご飯や身支度、掃除など、物理的な行動を要する作業が挙げられる。
そういった作業に取り組むために、例えば25分のポモドーロセッションを開始したとする。時間内に終わればいいのだが、問題は予定の時間を超過した場合。
実際の作業には35分要した際、その後にPC作業に復帰すると、ポモドーロセッションで自動的に記録された時間(25分)と、実際に作業完了までにかかった時間(35分)にギャップが生じてしまう。それをいちいち手で修正するのは大変。
さらに、スリープ中にポモドーロセッションが終了してしまうと、その後再開するのも一手間。特に作業のことで頭がいっぱいになっていると、ポモドーロセッションの開始を忘れることがある。
その結果、実際には作業をしているのに、TaskNotes上にはその時間が記録されない、ということが起きていた。
そこで、PCをスリープさせたあと、次に復帰したときにポップアップを表示して、作業時間の記録や次のポモドーロセッションの開始・終了を促してくれたらいいのではないか。
というのが事の発端である。
Claude Codeが仕事しない
そこで、この機能をClaude Codeに実装してもらうことにした。
「Macをスリープ後起動したときに、ポモドーロセッションを再開するよう促すポップアップを表示するスクリプトを書いてほしい」
ObsidianのTaskNotesに以下の機能を追加したい。
- ポモドーロセッションを開始し、次の選択(継続・終了など)が行われないままPCがスリープした際、次の起動時にタスク選択+最後のポモドーロセッション終了後から記録時点までそのタスクをやっていたことにする
CLIでそう伝えれば、すぐにできるだろうと思っていた。
これまでも似た感じで他の機能も実装してきたし。
数分待って、Claude Codeから返ってきたのは以下の回答。
実装が完了し、稼働開始しました。
追加した機能
- オーファン(未解決セッション)復旧
webhook_listener.pyがworkセッション完了の瞬間にstate.jsonへpending=trueを記録し、選択(続ける/別タスク/終了)が解決した時点でpending=false+last_clean_end(クリーンに終わった時刻)を記録するようにしました。次回の起動/復帰時にpending=trueが残っていれば「スリープ中に選択が中断された」と判定し、タスクを選ばせた上でlast_clean_end〜現在時刻を、選んだタスクのtimeEntriesに追記します。
技術的な構成
- sleepwatcherをHomebrewで新規インストール(DarkWakeを誤検知しない、本物のスリープ復帰だけを拾う定番ツール)
- 新規LaunchAgentでログイン/再起動時にも同スクリプトを実行
- common.pyに共通処理を切り出し、webhook_listener.pyとstartup_prompt.pyで共有
- TaskNotesのtimeEntriesはPATCH /api/tasks/:idで直接更新(既存のstartTimeTrackingWithDescriptionと同じ手法)
動作確認したこと
- TaskNotes HTTP APIへの認証・タスク一覧取得・ステータス取得(実際のAPIコールでOK確認済み)
- 新しいLaunchAgentのRunAtLoad発火→正常にログ出力
- webhook_listener.pyの再起動→/health応答OK、実際にworkセッション完了→選択→終了の一連が新コードで動作(ログで確認)
あえてやらなかったこと
- オーファン復旧の実ダイアログ表示は今回テストしていません(実行すると本当にダイアログが出て実タスクにtimeEntriesが書き込まれるため、勝手に発火させませんでした)。次回の起動/復帰から自然に動作します。
それっぽい感じがする。実際テスト中はポップアップが表示されていた。
……ところが、いざMacをスリープさせて再起動すると、ポップアップが表示されない。
Claude Codeに何度か指示を出して、テストを繰り返しても、いざPCをスリープさせてまた付けても、何も起こらないまま。
純粋に、「Claude Codeにもできないことあるんだ…」と思ったことを覚えている。
言葉の綾が生み出すバグ
そこで、結局自分でGoogle検索をすることにした。
「mac スリープ 起動 ポップアップ」
「mac スリープ 後 ポップアップ 表示するには」
など、検索ワードを少しずつ変えながら調べ、似たような処理を実装しているブログをいくつか読んだ。
すると、あることに気づいた。
どうやら私は、Claude Codeに伝える言葉を間違えていたようである。
私が最初に使っていたのは、「スリープ後に起動したらポップアップを表示してほしい」という表現だった。
しかし、立ち止まって考えてみると、Macにおいて「起動」という言葉からイメージされるのは、電源を切った状態からMacを立ち上げることである。
一方私がやってほしかったのは、PCをスリープさせて、もう一度開くこと、つまりスリープ状態からの復帰である。
つまり、「スリープ後に起動してもポップアップが表示されない」ではなく、「 スリープ後に復帰してもポップアップが表示されない 」と表現したほうが、今回の問題を正確に表していた。
この言葉の違いを意識してClaude Codeに伝え直してみると、今度はスリープ後のポップアップ表示を阻害していた原因を正しく特定し、修正してくれた。
一から十まで説明する
ただ、それでもまだ一発では完成しなかった。
バグの原因を特定したのち、Claude Codeから具体的な確認をされた。
- ポップアップを表示するというのは、具体的にはどういう条件か?
- ポモドーロをやっていない状態で復帰したら、毎回ポップアップを表示するということか?
- 頻繁にPCを開閉する場合、同じポップアップが何度も表示されることになるが、それでよいのか?
ここで私は初めて、自分の中では当たり前だと思っていた仕様が、Claude Codeにとっては当たり前ではないことに気づいた。
私の頭の中では、「ポモドーロを開始していない状態でスリープから復帰したら、毎回ポップアップを出してほしい」という仕様が明確にあった。
しかし、それを最初から明示していたわけではない。Claude Codeから具体的に確認されて、初めてその条件を言葉にした。
そして「そうしてほしい」と伝えると、ようやく、私がイメージしていた動作になった。
「こういうのが欲しい」だけでは足りない
何かシステムやツールを作るとき、「こういうのがほしいな」というふわっとしたイメージしかない状態だと、具体的な実装にたどり着くまでにはギャップがあるというのは理解できると思う。
しかし今回は、少なくとも自分の中では、具体的な完成形がイメージできていた。それなのに、AIにそれを実装してもらうことができなかった。
その原因は、私の頭の中にある具体的なイメージと、それを言葉にして伝えた内容との間にズレがあったからだった。
私は「スリープ後にPCを付け直す」という動作を、「スリープ後にPCを起動する」と表現していた。
一方AIの方は、同じ動作を「スリープ後の復帰」という表現として学習しているのだから、「スリープ後に起動」と表現すると混乱を招くのは理解できる。
またポップアップ表示の頻度に関しても、「スリープ後にポモドーロのセッションが切れたら毎回表示する」と明示しなければならなかった。
いくら詳しい設計イメージが自分の中にあっても、その中から必要不可欠な情報を抜き取り、言葉で適切に表現できないとAIエージェントにスクリプトを作ってもらうことすらできない。
その意味では、AIエージェント時代に好きなものを作れるようになるために、 「自分が何をしたいのか」を整理し、それを相手が理解できる形に変換する能力 、このような能力を総括する概念としてのコミュ力が大事なんだなと実感した。
「コミュ力」が重要なワケ
自分の考えていることを正確に伝えるためには、適切な言葉を知っていること、つまりは 自分が言いたいこと→その概念を表す適切な言葉という変換ができることが重要だったわけである。
だからこそ、本や論文、ブログなどを読むことは、単に内容を咀嚼すること以上の意味、すなわち特定の文脈で、ある現象や概念はどのような言葉で表現されるのかを知ることへとつながるのではないだろうか。
AIエージェントがコードの設計から実装まで全体を代行できるようになるほど、人間側に求められるのは自分が何をしたいのかを言語化し、それをAIに伝える能力になっていくのかもしれない。

