launchd Manager で朝のルーティンを自動化する

背景

朝起きて最初にやることといえば、勤怠システムを開いたり、昨日のアプリレビューを確認したり、Claude に聞いて情報を整理したりすることです。

ただ Claude に「昨日のレビューをまとめて」と頼むたびにコンテキストが消費されるのが気になっていました。また複数 PC を使っていると、Claude の設定やカスタムスキルが PC ごとにズレてしまうのも地味にストレスでした。

そこで launchd Manager を使って、これらの情報収集タスクを朝のうちに自動実行するように設定しました。結果をログで確認するだけでよいので、Claude のコンテキストを使わずに済みます。

launchd Manager とは

macOS の launchd エージェントを GUI で管理できる Mac アプリです。plist ファイルを直接編集することなく、スケジュール実行や起動時の自動実行を設定できます。

Homebrew でインストールできます。

brew install --cask kusumotoa/tap/launchd-manager

エージェント一覧・詳細・ログをひとつの画面で確認でき、アンロード/ロードや起動/停止もボタン一つで操作できます。

Claude 設定の Git 同期

複数 PC で Claude を使うときに困るのが、~/.claude ディレクトリの同期です。カスタムスキルやルール、プロジェクトごとのメモリなどが PC ごとにバラバラになってしまいます。

これを解決するために ~/.claude を Git 管理して、毎朝 09:00 に自動で pull するエージェントを作りました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.kusumoto.claude-config-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/git</string>
    <string>-C</string>
    <string>/Users/kusumoto_masahiro/.claude</string>
    <string>pull</string>
    <string>--rebase</string>
    <string>--autostash</string>
    <string>origin</string>
    <string>master</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>9</integer>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
  <key>StandardOutPath</key>
  <string>/Users/kusumoto_masahiro/Library/Logs/claude-config-sync.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/kusumoto_masahiro/Library/Logs/claude-config-sync.log</string>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

--rebase --autostash を付けているのがポイントで、ローカルに未コミットの変更があっても自動的に stash してリベース後に戻してくれます。ログイン時にも実行するよう RunAtLoad を設定しているので、PC を起動した直後から最新の状態になります。

claude-sync エージェントの詳細画面。スケジュールやログパスが確認できる

ログには Already up to date. や変更があったときのコミットハッシュが記録されます。変更がなくても記録が残るので、同期が正常に動いているかを確認できます。

App Store レビューの週次自動収集

アプリを公開していると、レビューの確認が意外と手間です。毎日 App Store Connect を開いて確認するのは続きません。

そこで Python スクリプトで App Store のレビューを収集して、ログに書き出すエージェントを作りました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.user.app-weekly-review-checker</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/python3</string>
    <string>/Users/kusumoto_masahiro/Library/Scripts/launchd-manager/check_app_reviews.py</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>9</integer>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
  <key>StandardOutPath</key>
  <string>/Users/kusumoto_masahiro/Library/Logs/app-weekly-review.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/kusumoto_masahiro/Library/Logs/app-weekly-review.log</string>
</dict>
</plist>

ログには直近のレビューが日付・評価・タイトル・本文の形式で出力されます。launchd Manager のログビューアーで確認すれば、朝の数秒でレビューの状況を把握できます。

weekly-app-review エージェントのログ。直近のレビューが一覧で出力されている

GitHub Actions self-hosted runner の自動起動

macOS マシンを self-hosted runner として使っている場合、再起動のたびに手動で runner を起動し直すのが面倒です。

launchd Manager で runner 起動スクリプトをログイン時に自動実行するよう設定することで、この問題を解決できます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.github.runner.actions-runner-1</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/kusumoto_masahiro/actions-runner/run.sh</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>StandardOutPath</key>
  <string>/Users/kusumoto_masahiro/Library/Logs/actions-runner-1.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/kusumoto_masahiro/Library/Logs/actions-runner-1.log</string>
  <key>WorkingDirectory</key>
  <string>/Users/kusumoto_masahiro/actions-runner</string>
</dict>
</plist>

KeepAlivetrue にしておくと、runner プロセスが予期せず終了した場合にも launchd が自動的に再起動してくれます。

GitHub Actions runner のログ。Connected to GitHub と Listening for Jobs が記録されている

ログには Connected to GitHubListening for Jobs が記録されます。launchd Manager で確認すれば、runner が正常に稼働しているかをひと目で把握できます。複数の runner を登録している場合も、エージェント一覧からまとめて状態を確認できます。

運用してみての感想

3 つのエージェントを設定してから数週間が経ちますが、手間がかかるなと感じたことはありません。

特に Claude 設定の同期は、新しいスキルやルールが翌朝には反映されるので、複数 PC 運用の煩わしさがなくなりました。

レビュー収集も、App Store Connect を開く手間がなくなり、ログを流し見るだけで状況を把握できるようになっています。Claude に「今週のレビューをまとめて」と聞く必要がなくなりました。

launchd Manager 自体の操作感もよく、plist ファイルを直接書くより圧倒的に楽です。ログのリアルタイム表示やエラー時の状態表示が GUI で確認できるのは地味にありがたいです。

まとめ

launchd Manager を使うと、macOS の launchd エージェントを手軽に管理できます。

朝のルーティンに限らず、定期的に実行したいスクリプトがあれば launchd エージェントとして登録しておくのがおすすめです。cron と違ってシステムとの統合度が高く、スリープ中に実行時刻を過ぎた場合でも起動後に実行してくれる動作も便利です。

参考リンク