HAGI 母艦 / 24時間ヘッドレス運用 + Agent Board 常駐 — 2026-09-12 作成
画面の指示どおりに進めます。判断が要るのは次の3つだけです。
| 聞かれること | こうする | 理由 |
|---|---|---|
| ユーザ名(アカウント名) | 英数字だけにする 例: hamada | SSH のログイン名とホームフォルダ名になります。日本語や記号が入ると後で面倒です |
| FileVault(ディスク暗号化) | オフ | 下の注意を読んでください |
| Siri / 解析の送信 | どちらでも | 動作に影響しません |
ここが一番大事です。この章を終える前に画面を外すと、二度と入れなくなって最初からやり直しになります。
システム設定 → 一般 → 共有 を開いて、次の2つをオンにします。
「リモートログイン」の情報ボタンから、アクセスを許可するユーザに自分が入っているか確認してください。
同じ画面の上部にある「コンピュータ名」を hagi にします。
これで他の機械から hagi.local で呼べるようになります(IPアドレスを覚えなくて済みます)。
アプリケーション → ユーティリティ → ターミナル を開いて、次を貼り付けて実行します(パスワードを聞かれます)。
# 本体もディスクもスリープさせない sudo pmset -a sleep 0 sudo pmset -a disksleep 0 # 停電などで落ちたあと、電気が戻ったら自動で起動する sudo pmset -a autorestart 1 # ネットワーク越しの起動要求で目を覚ます sudo pmset -a womp 1 # 確認(sleep 0 / autorestart 1 になっていればOK) pmset -g
システム設定 → ユーザとグループ → 自動ログイン で自分のアカウントを選びます。
これで再起動後、誰も操作しなくてもデスクトップまで立ち上がり、Agent Board が自動で復帰します。FileVault がオンだとこの項目は選べません。
Windows の PowerShell または ターミナル を開いて、次を打ちます(hamada は手順1で決めた名前に置き換え)。
ssh hamada@hagi.local
初回は「本物か?」と聞かれるので yes、続いてパスワードを入れます。
プロンプトが hamada@hagi ~ % のように変われば成功です。
hagi.local が見つからない場合は、Mac の画面で
システム設定 → ネットワーク から IP アドレス(192.168.x.x)を確認して、
ssh hamada@192.168.x.x を試してください。
それでもダメなら、手順2-1の「リモートログイン」がオンになっていません。
ここからは SSH で入った Mac のターミナルで打ちます。
xcode-select --install
ダイアログが出たらインストールを選びます。数分かかります。すでに入っていればエラーが出ますが、それで正常です。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
終わったら、PATH を通します(Apple Silicon はここを忘れると brew: command not found になります)。
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" brew --version
brew install git python@3.13 node gh git --version python3 --version node --version gh --version
このあと手順6・6.5 で private リポジトリを2つ取ってきます。 ここでログインしておかないと、その2箇所で必ず止まります(GitHub はパスワードでの clone を受け付けません)。
gh auth login
聞かれたら GitHub.com → HTTPS → Yes(git の認証に使う)→ Login with a web browser の順に選びます。
XXXX-XXXX の形のワンタイムコードが表示されます。先にこれを控えてから Enter を押してください。
Enter を押すまで認証の待ち受けが始まらないので、押し忘れるとブラウザ側で承認しても端末が止まったままに見えます。
Enter を押したら、Windows のブラウザで https://github.com/login/device を開き、控えたコードを入力します
(Mac の画面が無くても、これで通ります)。
gh auth status
Logged in to github.com と出れば準備完了です。
npm install -g @anthropic-ai/claude-code claude --version
ログインします。表示された URL を Windows のブラウザで開いて認証します。
claude
Codex も使うなら、Windows で入れているのと同じ方法で入れてください(npm install -g 系)。
明日は Agent Board が動けば十分なので、Codex は後日でも構いません。
cd ~ git clone https://github.com/yamadao/agent-hub.git cd agent-hub
private リポジトリです。手順4-4 で gh auth login を済ませていれば、何も聞かれずに通ります。
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt
カードのタイトルを短く要約する機能に使います。無くても board は動きます(要約が省略されるだけ)。
echo 'ANTHROPIC_API_KEY=ここにキー' > ~/agent-hub/.env chmod 600 ~/agent-hub/.env
.env は .gitignore 済みなので GitHub には上がりません。
cd ~/agent-hub source .venv/bin/activate python -m uvicorn hub:app --host 0.0.0.0 --port 8765
エラーが出ずに止まっていれば動いています。この状態のまま、Windows のブラウザで次を開いてください。
http://hagi.local:8765/
ボードが表示されれば成功です(カードは空です。まだ誰も報告していないので正常)。 iPad でも同じ URL を開いて、見えることを確認してください。
確認できたらターミナルで Control + C を押して一旦止めます。次で自動起動にします。
macOS の自動起動は launchd という仕組みを使います。次をそのまま貼り付けてください。
mkdir -p ~/Library/LaunchAgents ~/agent-hub/logs
cat > ~/Library/LaunchAgents/local.agent-hub.plist <<'PLIST'
<?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>local.agent-hub</string>
<key>ProgramArguments</key>
<array>
<string>PYTHONPATH_PLACEHOLDER</string>
<string>-m</string><string>uvicorn</string>
<string>hub:app</string>
<string>--host</string><string>0.0.0.0</string>
<string>--port</string><string>8765</string>
<string>--log-level</string><string>warning</string>
</array>
<key>WorkingDirectory</key> <string>WORKDIR_PLACEHOLDER</string>
<key>RunAtLoad</key> <true/>
<key>KeepAlive</key> <true/>
<key>StandardOutPath</key> <string>LOGDIR_PLACEHOLDER/hub.log</string>
<key>StandardErrorPath</key> <string>LOGDIR_PLACEHOLDER/hub.err</string>
</dict>
</plist>
PLIST
# プレースホルダを自分の実際のパスに置き換える
sed -i '' "s|PYTHONPATH_PLACEHOLDER|$HOME/agent-hub/.venv/bin/python|" ~/Library/LaunchAgents/local.agent-hub.plist
sed -i '' "s|WORKDIR_PLACEHOLDER|$HOME/agent-hub|" ~/Library/LaunchAgents/local.agent-hub.plist
sed -i '' "s|LOGDIR_PLACEHOLDER|$HOME/agent-hub/logs|g" ~/Library/LaunchAgents/local.agent-hub.plist登録して起動します。
launchctl unload ~/Library/LaunchAgents/local.agent-hub.plist 2>/dev/null
launchctl load ~/Library/LaunchAgents/local.agent-hub.plist
sleep 2
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8765/api/sessionsHTTP 200 と出れば常駐成功です。Mac を再起動しても自動で戻ります。
cat ~/agent-hub/logs/hub.err
ham は「AI分身脳 HAGI」の本体です。Windows の C:\ham と同じ中身を Mac にも置きます。
手順6 の Agent Board とは別のリポジトリで、役割もまったく違います
(board = 作業状況を映す画面 / ham = AI社員たちの本体)。
cd ~ git clone https://github.com/yamadao/ham.git cd ham
こちらも private リポジトリです。手順4-4 のログインが済んでいればそのまま通ります。
空の雛形を作ります。値はご自分で書き込んでください(AI は .env を読み書きしません)。
cd ~/ham if [ -f .env ]; then echo "すでに .env があります。上書きしません。" else cat > .env <<'EOF' TELEGRAM_DAILY_BOT_TOKEN= TELEGRAM_DAILY_ALLOWED_USER_ID= TELEGRAM_DAILY_DIR=01-private/01-daily TELEGRAM_DAILY_TIMEZONE=Asia/Tokyo EOF fi chmod 600 .env cat .env
すでに .env がある場合は上書きせずそのままにします(値を入れたあとに間違ってもう一度実行しても、書いた秘密は消えません)。
中身が4行表示されれば成功です。項目は Telegram 日記受信(tools/telegram-daily)用のこの4つだけで、 Mac で日記Botを動かさないなら、値は空のままでも ham 自体は問題なく使えます。
| 項目 | 中身 |
|---|---|
TELEGRAM_DAILY_BOT_TOKEN | 日記専用Botのトークン |
TELEGRAM_DAILY_ALLOWED_USER_ID | ご自分の user id |
TELEGRAM_DAILY_DIR | 既定のままでよい(01-private/01-daily) |
TELEGRAM_DAILY_TIMEZONE | 既定のままでよい(Asia/Tokyo) |
値を入れるなら、Windows の C:\ham\.env をそのまま持ってくるのが一番早いです。
中身は秘密なのでコピー操作はご自分で行ってください。
なお C:\ham にある .env.example(雛形)は、まだ GitHub に上げていないため clone しても降りてきません。
上のコマンドで直接作っているのはそのためです(2026-09-12 実測)。
cd ~/ham claude
ham の中で Claude Code を起動すると、CLAUDE.md 経由で AGENTS.md(起動手順書)が読み込まれます。
「AI社員ワークスペース」として応答すれば成功です。Codex の場合は AGENTS.md を直接読みます。
01-private/)が入っています。
リポジトリが private のままであることを確認してください。公開に切り替えないこと。
Mac で動かす Claude Code のフックを登録します。Mac 上の ~/.claude/settings.json に対する作業です。
設定ファイルは下の 7-2 のコマンドがその場で作ります(あらかじめ用意したファイルは使いません。
GitHub に上げ忘れていても止まらないようにするためです)。
中身は Windows 側の登録(8イベント = SessionStart / UserPromptSubmit / PreToolUse / PostToolUse / PermissionRequest / Notification / Stop / SessionEnd)を
Mac のパスに置き換えたものです。SubagentStop は Windows 側にも登録が無いので入れていません。
Python は /usr/bin/python3 を使います(agent_hook.py は標準ライブラリだけで動くので、.venv を作り直してもフックが壊れません)。
送信先の指定は不要です(未設定なら自機の 127.0.0.1:8765 に送る=Mac 自身の board が正解)。
cat ~/.claude/settings.json
「No such file or directory」と出るか、{} だけなら 7-2 に進んでください。
何か中身が表示された場合は 7-2 をやらず、私に声をかけてください。上書きすると既存の設定が消えます。私が足りないぶんだけ足します。
下の全部をまとめてコピーして、ターミナルに貼り付けてください(1回で通ります)。
mkdir -p ~/.claude
cp ~/.claude/settings.json ~/.claude/settings.json.bak-$(date +%Y%m%d-%H%M%S) 2>/dev/null
/usr/bin/python3 - <<'PY' > /tmp/claude-hooks.json
import json, os
cmd = "/usr/bin/python3 %s claude" % os.path.expanduser("~/agent-hub/agent_hook.py")
events = ["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse",
"PermissionRequest", "Notification", "Stop", "SessionEnd"]
with_matcher = {"PreToolUse", "PostToolUse", "PermissionRequest", "Notification"}
with_async = {"PreToolUse", "PostToolUse"}
hooks = {}
for e in events:
h = {"type": "command", "command": cmd, "timeout": 5}
if e in with_async:
h["async"] = True
g = {"hooks": [h]}
if e in with_matcher:
g["matcher"] = ""
hooks[e] = [g]
print(json.dumps({"hooks": hooks}, indent=2))
PY
/usr/bin/python3 -m json.tool /tmp/claude-hooks.json > /dev/null \
&& cp /tmp/claude-hooks.json ~/.claude/settings.json \
&& echo "JSON OK" \
&& grep -c "agent_hook.py" ~/.claude/settings.jsonJSON OK と出て、そのあとの数字が 8 なら成功です(8イベントぶん登録されています)。
ホームディレクトリの場所は自動で埋まるので、ユーザー名が何であってもそのまま動きます。
形式が壊れていたら JSON OK が出ず、既存の設定にも触りません。
Mac で Claude Code を起動して、何か一言打ってみてください。
cd ~/ham claude
http://hagi.local:8765/ を開き直して、ham のカードが出れば成功です。
出ない場合は、次のコマンドで board に直接テストの報告を送ってみてください。
これでカードが出るなら board とフック本体は正常なので、原因は settings.json の登録側だけに絞れます。
cd ~/ham
echo '{"session_id":"hook-test","cwd":"'"$PWD"'","hook_event_name":"SessionStart"}' \
| /usr/bin/python3 ~/agent-hub/agent_hook.py claude確認できたら、次でテスト用カードを終了状態にしておきます(放っておくと board に残り続けます。 終了状態にすれば1時間ほどで自動的に消えます)。
cd ~/ham
echo '{"session_id":"hook-test","cwd":"'"$PWD"'","hook_event_name":"SessionEnd"}' \
| /usr/bin/python3 ~/agent-hub/agent_hook.py claudeWindows に環境変数を1つ足すだけです。PowerShell で次を実行します。
[Environment]::SetEnvironmentVariable("AGENT_HUB_URL","http://hagi.local:8765/event","User")設定後、Claude Code と Codex を開き直してください(起動中のセッションには反映されません)。 以降、Windows の作業も Mac のボードに出ます。
Windows 側の Agent Board(8765)は、しばらく動かしたままで構いません。Mac 側が安定したら止めます。
ssh hamada@hagi.local で入れるhttp://hagi.local:8765/ が見えるようになるhttp://hagi.local:8765/ が開ける~/ham が clone できていて、その中で claude が起動する(手順6.5)| 項目 | いつ |
|---|---|
| 外出先からボードを見る(Cloudflare Tunnel + 認証) | LAN で安定してから |
machine_id(どちらのマシンの作業か表示) | 2台運用を始めてすぐ。明日無くても動きます |
| Mac のパスに合わせたプロジェクト定義・アイコン | Mac の実際のフォルダ構成が決まってから |
| カードをタップしてウィンドウを前面化 | Mac はヘッドレスなので「セッションにアタッチ」に設計変更。別途 |
| HAGI の中身づくり(部署・スキルの設計) | 土台ができてから。仕様のヒアリングが先。明日やるのは手順6.5 の「置くだけ」まで |