はじめに
Claude Codeがタスクをこなしている間、ずっとMacの前で待機しているのは時間の無駄だと感じたことはありませんか?そんな時間を有効活用して、リラックスしながら開発を進める「お風呂駆動開発」をご紹介します。
この記事では、macOS/iOSユーザーを対象に、Claude Code、ntfy、Termiusを組み合わせて、家中のどこからでもローカルネットワーク経由で開発タスクの進行状況を把握し、次の指示を出せる環境を構築する方法を解説します。
お風呂駆動開発とは
お風呂駆動開発(Bath-Driven Development、BDD)は、Claude Code君が頑張っている間に、人間がお風呂でリラックスタイムを楽しみながら効率的に作業を進める開発手法です。主な特徴は以下の通りです:
- 非同期的な作業管理: タスクの完了を通知で受け取る
- リモートアクセス: iPhoneから開発環境にアクセス
- マルチタスキング: リラックスしながら次のタスクを準備
必要なツールのセットアップ
Claude Code
Claude Pro もしくは Maxプランに登録後、Claude Codeをインストールしましょう。
Hooksを使用するので最低でも1.0.38が必要ですが、それ以降のバージョンでもいくつかHooksへの修正が入っているため、最新版への更新をおすすめします。
npm install -g @anthropic-ai/claude-code
Termius
TermiusはiOS/iPadOSで利用可能な優れたSSHクライアントアプリです。無料でダウンロードできます。
iPhoneからmacにssh接続するために、設定をしていきましょう。
macOSでのSSHサーバー設定
macOSでSSHサーバーを有効にする手順:
-
システム設定から有効化:
システム設定 > 一般 > 共有 > リモートログイン をオン
-
コマンドラインから有効化(代替方法):
sudo systemsetup -setremotelogin on
-
SSHサーバーの状態確認:
sudo systemsetup -getremotelogin
-
Macがスリープしないように設定:
長時間のタスク実行中にMacがスリープしないよう、以下のコマンドを実行します:方法1: caffeinateコマンドを使用 caffeinate caffeinate -t 7200 方法2: システム設定から設定 システム設定 > バッテリー > 電源アダプタ使用時 > 「ディスプレイがオフの時にコンピュータを自動でスリープさせない」をオン
Termiusのローカルネットワーク接続を許可する
Termius側で接続を許可していない場合、仮にiPhoneとMacが同じネットワークにいても疎通ができません。予め許可していることを確認しておきましょう。
接続先マシンのローカルIPを確認する
例:
※環境によって正確な取得方法は異なります。
Termiusに接続先情報を登録
ローカルネットワークのmacに接続する場合であれば、以下の3つの情報で接続できます。
- ローカルIPアドレス
- macのユーザー名
- macにログインするときのパスワード
ターミナルに接続
ターミナルが現れる
ntfy
ntfyは、シンプルなプッシュ通知サービスです。curlコマンドだけで簡単に通知を送信でき、webやモバイルアプリなどで通知を受信できます。
iOSアプリをインストールし、topicをサブスクライブしたあと、curlで簡単なメッセージを送信してみましょう。
topicのサブスクライブ
メッセージの送信
curl -d "ビルドが完了しました!" ntfy.sh/mybathtopic
curl -H "Title: ビルド完了" -H "Priority: high" -d "詳細なメッセージ" ntfy.sh/mybathtopic
実際にntfyのiOSアプリでメッセージを受信した様子
Claude Code Hooksでタスク完了通知を実装
基本的なhooksの設定
Claude Codeでは、settings.json
ファイルでhooksを設定することで、タスクの完了時に自動的にntfyへ通知を送信できます。ここでは ~/.claude/
配下に簡単なShellスクリプトを作成して、 ~/.claude/settings.json
で実行させるようにしましょう。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": ""
}
]
}
]
}
}
hooksで利用するスクリプトの作成
手順
DEFAULT_TOPIC_NAME="your-topic-name-D615CCC1-8C83-450C-9DF9-8044F234A296"
TOPIC_NAME="${NTFY_TOPIC:-$DEFAULT_TOPIC_NAME}"
TRANSCRIPT=$(jq -r .transcript_path)
LATEST_MSG=$(tail -1 "$TRANSCRIPT" | jq -r '.message.content[0].text // empty')
USER_MSG=""
while IFS= read -r line; do
TYPE=$(echo "$line" | jq -r '.type // empty')
if [ "$TYPE" = "user" ]; then
ROLE=$(echo "$line" | jq -r '.message.role // empty')
if [ "$ROLE" = "user" ]; then
CONTENT=$(echo "$line" | jq -r '.message.content // empty')
if [ -n "$CONTENT" ] && [ "${CONTENT:0:1}" != "[" ]; then
USER_MSG="$CONTENT"
break
fi
fi
fi
done (tac "$TRANSCRIPT")
if [ -n "$LATEST_MSG" ]; then
echo "$LATEST_MSG" | sed 's/^/ /' | head -c 500 | \
curl -H "Title: ${USER_MSG:0:100}" -d @- "ntfy.sh/${TOPIC_NAME}"
fi
sudo chmod +x ~/.claude/ntfy.sh
最後に、 settings.json
を編集して、タスクが終了したタイミングで ntfy.sh
を実行させるようにします。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/ntfy.sh"
}
]
}
]
}
}
適当な会話をして試してみる
タイトル付きで、作業結果が通知されます!
ntfyで通知が来る!
実践例:お風呂タイムの有効活用
実際のワークフローの例:
-
お風呂に入る前
caffeinate claude "src/ディレクトリ全体の単体テストを書いて"
-
お風呂で
- iPhoneでntfyの通知を確認
- Terminusで開発機に入り、
claude --resume
で該当のセッションに入る - 必要に応じて複数タブを開き、test実行やlint, format実行を行う
- 結果を確認し、claude-codeに次の指示を出す
-
お風呂上がり
- 書斎のmacで引き続き作業続行
トラブルシューティング
通知が届かない場合
- ntfyのトピック名が正しいか確認(
ntfy.sh
内のTOPIC_NAME
を実際のトピック名に変更) - jqコマンドがインストールされているか確認:
- Claude Codeの設定ファイルが正しく読み込まれているか確認
まとめ
今回ご紹介したお風呂駆動開発では、お風呂の中で通知を受け取り、claude codeに指示が出せる手法をご紹介しました。
あくまで基礎的な内容しか載せていないので、セキュリティ的に脆い部分や使い勝手の悪い部分もあります。各設定をカスタマイズするなどして応用していただければと思います。
例えば、
- projectごとに
TOPIC_NAME
を分けて通知先を変える - Tailscaleを使用して、家の外からでもssh接続する
- ntfyのメッセージでemojiやpriorityを活用する
- Claude Codeの報告を別のAIで要約してからntfyに投げる
などです。
それでは、良いお風呂駆動開発を!
Views: 0