端末に開発環境は要りません。Claude Code アプリから指示を出せば、クラウド側のコンテナがファイルを書き、ビルドし、検証し、PRを作ってマージまで進めます。iPadは指示と確認の画面になります。
ただし、この形には固有の急所があります。自分で検証しないなら、「エージェントが自分で検証した」という事実は担保になりません。同じ環境で自分の仕事を採点しているだけだからです。だから独立した関門を1つ、外に置く必要があります。
この構成で用意すべきものは、開発環境ではありません。間違ったものが本番に出たときに、iPadから戻せることです。人が事前に全部を確認しない以上、事前の完璧さではなく事後の復旧力に投資するのが合理的になります。
| 用意するもの | 状態 | 役割 |
|---|---|---|
| 独立したCI GitHub Actions | 導入済み | エージェントとは別の環境で node build.mjs を走らせる。この構成でいちばん効く一手(→5章) |
| ビルド失敗時の挙動 | 既定でそうなる | Cloudflareは最後に成功したデプロイを配信し続ける。壊れたビルドは本番に出ない |
| ロールバック手段 | ブラウザで可 | Cloudflareのデプロイ履歴、GitHubのRevert(→7章) |
| プレビューURL | 既定で発行 | ブランチをpushすると本番と同じ設定の実物が見られる |
| ブランチ保護 | 任意(推奨) | mainへの直接pushを禁止し、CI通過を必須にする |
| 担い手 | やること | やらないこと |
|---|---|---|
| 人(iPad) | 指示を出す/内容が正しいか判断する/公開を承認する | ビルドしない・描画確認しない・コマンドを打たない |
| エージェント クラウドのコンテナ |
ファイル生成/ビルド/整合性チェック/描画確認/commit/PR作成/マージ | 内容が事実かどうかの最終判断。公開してよいかの判断 |
| CI GitHub Actions |
エージェントとは別の環境で、同じ検証をやり直す | 内容の良し悪しは見ない |
| Cloudflare | 本番ビルドとデプロイ/プレビューURL発行/デプロイ履歴の保持 | — |
人が検証しない構成では、関門を何層持っているかがそのまま安全性になります。現状はこうです。
| 層 | 関門 | 独立性 | 止められるもの |
|---|---|---|---|
| 1 | エージェントの自己検証 | 低い | ビルドエラー・リンク切れ・描画崩れ。ただし自分の仕事を自分で採点している |
| 2 | CI(GitHub Actions) | 高い | 同上を別環境で。エージェントが検証を忘れた・環境が汚れていた場合をここで拾う |
| 3 | Cloudflareのビルド | 高い | ここで落ちても本番は前回の成功版のまま。壊れたものは出ない |
| 4 | 人による内容の確認 | — | 事実誤り・不適切な公開。他の層では絶対に止まらない |
| 5 | ロールバック | — | 出てしまったあと(→7章) |
「エージェントが検証しているならCIは重複では」と思えます。逆です。人が検証しない構成でこそ、CIの価値が上がります。
| 前提 | CIの位置づけ |
|---|---|
| 人が手元でビルドして確認する | 二重確認。あれば安心だが、無くても人が気づく |
| 人は検証せず、エージェントに任せる | 唯一の独立した検証。これが無いと、検証したという報告を検証する手段が存在しない |
.github/workflows/build.yml を導入済みです。PR と main への push で node build.mjs が走り、整合性チェックが落ちればマージ前に赤くなります。実測で15秒で完了しました。
name: build
on:
pull_request:
push:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
- name: build + integrity check
run: node build.mjs
- name: upload dist
if: always()
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
build.mjs が問題を見つけたときに process.exitCode = 1 を立てているから、CIがそれを失敗として扱えます。スクリプトが黙って成功を返す作りなら、CIを足しても何も守れません。自作のビルドを持つ構成では、まずここを確認してください。npm install を挟んでいないのは build.mjs が依存パッケージゼロだからです。依存を持つ構成なら npm ci を入れてください。
日常運用はエージェントに渡せますが、最初の一度だけ、人がブラウザで操作する部分があります。エージェントにCloudflareのAPIトークンを渡せば自動化できますが、それはシークレットを渡すということなので、本記事では人が触る前提にします。
| 回数 | 作業 | 場所 |
|---|---|---|
| 1回 | GitHubリポジトリを作る | Safari(GitHub) |
| 1回 | CloudflareとGitHubを接続 | Safari(Cloudflareダッシュボード) |
| 1回 | ビルド/デプロイコマンドの設定 | 同上 |
| 1回 | 独自ドメインの割り当て | 同上。DNSとTLSは自動 |
| 1回 | ブランチ保護の設定 | Safari(GitHub Settings) |
| 随時 | シークレットの投入 | ダッシュボード。エージェントに渡さない |
✘ [ERROR] The entry-point file at "src/index.ts" was not found.wrangler.jsonc から main の行を削除し、assets だけにします。エントリーポイントを要求されなくなります(このライブラリもこの形)。Workerコードが要る構成なら main を残したうえで src/index.ts を実在させる——片方だけだとこのエラーになります。詳細はGitOps構築ガイドに。
事前に全部を確認しない構成なので、ここが本体です。
| 症状 | 対処 | 操作 |
|---|---|---|
| ビルドが失敗した | 何もしなくてよい | Cloudflareは最後に成功したデプロイを配信し続ける。本番は無事。原因を直して再push |
| 本番に出たが内容が間違い | GitHubでRevert | マージ済みPRの画面に Revert ボタンがある。押すと打ち消しPRができるので、それをマージ。iPadで数タップ |
| すぐ戻したい | Cloudflareでロールバック | ダッシュボードのデプロイ履歴から前のデプロイに戻す。ビルドを待たずに反映される。ただしリポジトリは直っていないので、あとでRevertも必要 |
| 公開前に気づいた | PRを閉じる | マージしなければ本番には出ない |
| 項目 | 理由 |
|---|---|
| 内容が事実かどうか | この構成の最大の弱点。ビルドもCIも内容を見ません。金額・日付・手順が間違っていても全部緑になります。エージェントに「確認できたことと、できなかったことを区別して書かせる」運用にしておくと、人が読むべき箇所が絞れます |
| 公開してよいかの判断 | 個人情報・固有名詞・未公開の情報。全面公開のサイトでは取り返しがつきません(検索エンジンとAIのクローラーの双方に読まれる前提) |
| シークレット | APIトークン・パスワード。リポジトリにもエージェントにも渡さず、ダッシュボードで直接投入する |
| 破壊的な操作 | 大量削除、履歴の書き換え、既存ファイルの意図しない上書き。実行前に人に確認させる約束にしておく |
CLAUDE.md に誠実さのルール(確認していないことは書かない・URLは実際に取得できたものだけ)と公開ポリシーを書いており、エージェントは毎回それを読んでから作業します。指示のたびに言うのではなく、リポジトリ側に固定するのがこの構成の作法になります。
参考までに書いておくと、iPadで node を動かす道は事実上ありません。
node バイナリもnpmも無く、fs・process・require が存在しない。apk add nodejs でインストールはできますが、実行すると illegal instruction で落ちます。エミュレータがV8のJITが依存するSSE2命令を実装していないためで、長年未解決とされています。