SYNON 記事 service
プラン B / ローカル実行版

GitHub アカウントなしで、手元の Mac だけで回す

非エンジニアが Claude Code で社内サービスを作り、社内配信するまで / 2026-08-21

前提: 非エンジニアは GitHub アカウントを持たない。したがって Codespaces は使わない

使う道具: Claude デスクトップアプリの CoworkClaude Code

対になる資料: claude-code-internal-app-workflow.md(プランA / Codespaces 版)

0結論

  1. 開発は Claude Code(利用者の Mac 上)で行う。利用者のフォルダを直接触って開発サーバを立てる。
  2. Cowork は仕様書づくりまで。開発ループは回らない。理由は §3 に道具の仕様として書く。
  3. GitHub は裏方として残すが、利用者はアカウントも画面も要らない。 リポジトリごとの Deploy key(アカウントに紐づかない、リポジトリ単位の書き込み鍵)で push だけできるようにする。
  4. Cloudflare の鍵は利用者の Mac に置かない。配信は GitHub Actions のみ。プランA の核心原則をそのまま維持できる。
  5. 増える手間は端末セットアップ30分/人(1回)本番公開のたびの PR 作成2分。 減るのは Codespaces の費用と、利用者分の GitHub シート
要するに

プランB はプランA より安い。代わりに、エンジニアの手作業がわずかに増え、 利用者の Mac が壊れたら作業が消えるリスクを自分で管理する必要が出ます(§6・§7)。

30分
端末セットアップ
(1人1回)
2分
本番公開1回あたり
エンジニアの PR 作成
$0
Codespaces
(使わない)
$13
月額(エンジニア2名)
+ Claude シート

1プランA との差分

プランA(Codespaces)プランB(ローカル)
利用者の GitHub アカウント必要不要(Deploy key で push)
開発場所Codespace(使い捨てできる)利用者の Mac(使い捨てできない
端末セットアップゼロエンジニアが30分/人
開発の入口ブラウザデスクトップの「◯◯を開く」をダブルクリック
スキルの配布社内マーケットプレイスリポジトリに同梱.claude/skills/
配信結果の確認gh run watchChatwork 通知gh が使えないため)
本番公開の申請利用者が PR を作る利用者は申請書を作る → エンジニアが PR を作る
バックアップ不要(クラウド上)毎日18時の自動保存が必須
退職時の環境回収組織が遠隔で削除端末返却の運用に載せる(遠隔削除できない)
ガードレール標準強化(sudo / 作業フォルダ外 / reset --hard を禁止)
Cloudflare の鍵の置き場所GitHub Actions のみ同じ(GitHub Actions のみ)
月額$50〜80$13 + Claude シート
変わらないもの

仕様書の作り方、Cloudflare の構成、Access による社内限定、承認は「エンジニアが PR をマージする行為」という一点、 4層のガードレールという考え方。この4つは両プラン共通です。

2全体像

Step 0 — 一度きり(エンジニア) テンプレートリポジトリ(スキル4本を .claude/skills に同梱) Cloudflare アカウント単位 Access を ON = 全 Worker が社内限定 Chatwork の通知先ルームと API トークンを用意 Step 1 — 1人1回・30分(エンジニアが利用者の Mac で) setup-mac.sh:端末専用の SSH 鍵 → Deploy key に登録 クローン/npm ci/DB 初期化/毎日18時の自動保存 デスクトップに「◯◯を開く.command」を作成 Step 2〜6 — 利用者の Mac の中で完結(Claude Code) /service-spec → docs/SPEC.md 開発 → localhost:5173 で確認 /service-fix 困りごとの自己診断 /service-save 作業の保存 work ブランチへ push サービスは何も変わらない /service-ship 試用環境へ配信 検査10項目 → work:staging へ push 落ちたら配信しない この Mac に Cloudflare の鍵は無い。~/.ssh にあるのはこのリポジトリ1本分の Deploy key だけ。 毎日18時に launchd が work ブランチへ自動保存(未完成のコードが試用環境に出ることはない)。 GitHub Actions → 試用環境 staging ブランチ push で自動デプロイ Cloudflare の鍵はここにだけ置く 結果を Chatwork へ通知(成功=URL / 失敗=要対応) 利用者は GitHub を見られないので通知が要る 本番公開 利用者: 申請書 docs/releases/… を作成 → 連絡文が画面に出る(コピーして送る) エンジニア: staging→main の PR を作成 マージ=本番公開の承認(1回2分) → デプロイ → スモークテスト → 失敗なら自動戻し ブランチは3本だけ work 利用者の保管場所 push しても何も起きない(=安全に自動保存できる) staging 試用環境 /service-ship だけが push する main 本番。エンジニアのみ 利用者は Deploy key + branch protection で push できない
プランB の全体像。利用者の Mac には「このリポジトリ1本分の Deploy key」しか置かず、Cloudflare の鍵は GitHub Actions にのみ存在する。

なぜ work ブランチを分けるのか

毎日の自動保存が staging に直接入ると、未完成のコードが試用環境に出てしまいますwork は「push しても何も起きないブランチ」なので、安心して自動保存できます。

鍵の置き場所(プランA と同じ原則)

置き場所何を置くか
GitHub Actions SecretsCLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID / CHATWORK_API_TOKEN
利用者の Mac(~/.ssh/リポジトリ1本分の Deploy key のみ(push しかできない)
利用者の Mac(その他)Cloudflare の鍵は無し
Deploy key とは

GitHub アカウントに紐づかず、リポジトリ1本だけに書き込める鍵です。 利用者はアカウントを作る必要がなく、他のリポジトリには一切触れません。 端末交換・退職のときはその Deploy key を削除するだけで書き込みが止まります。

3なぜ Cowork では開発ループが回らないか

推測ではなく、道具の仕様として決まっています。Cowork がお客様の Mac のフォルダを触るときのシェルには、次の制約があります。

  1. ネットワークにアクセスできないnpm ci / npm install が必ず失敗する
  2. 1回のコマンド実行に時間の上限がある(約45秒)npm run dev のような常駐プロセスを立ち上げられない
  3. ファイルを削除できない → ビルド成果物の作り直しや node_modules の入れ替えで詰まる

したがって Cowork は「文字を読み書きする工程」に限って使えます。

工程CoworkClaude Code
仕様書をつくる(/service-spec
開発する・画面を確認する×
保存・配信(/service-save /service-ship×
困りごとの記録(記録の作成のみ)
社内向けの案内文・マニュアルをつくる
スキル側で自動判定します

同梱の /service-spec には、いまどちらの道具で動いているかを判定する手順を入れてあります。 Cowork だと分かったら、仕様書を書き終えた時点で止まり 「ここから先はデスクトップの『◯◯を開く』から進めてください」と案内します。 同じフォルダを見るので、仕様書はそのまま引き継がれます。

運用の推奨

入口を2つにすると「どっちでやるんでしたっけ」が必ず問い合わせになります。 全工程を Claude Code に寄せてください。Cowork は、仕様だけ先に考えたい人や、 開発には関わらない人(部門長が仕様をレビューする、など)のための補助入口と位置づけます。

4手順

Step 0 — 基盤整備 E・一度だけ・半日

  1. 既存の cf-internal-app-starter に、キットの template/ を上書き適用(詳細は template/APPLY-B.md
  2. Settings → Template repository にチェック
  3. Cloudflare のアカウント単位 Access を有効化(all_workers + all_preview_workers
  4. Chatwork の通知先ルームを決め、API トークンを用意する
スキルをリポジトリに同梱する理由

プランA では社内マーケットプレイス(synon/claude-plugins)から配っていましたが、 その取得には GitHub へのアクセスが要ります。利用者はアカウントを持たないため、 アプリのリポジトリに直接置く方式に変えました。 .claude/skills/<名前>/SKILL.md はそのリポジトリを開いた Claude Code が自動認識します。 代償として、スキルを直したら各リポジトリに配り直す必要があります。

Step 1 — 端末セットアップ E・1人1回・30分

利用者の Mac に向かって作業します。事前に入れておくもの:

xcode-select --install                          # git
# Node.js v22 以上(https://nodejs.org の pkg か Homebrew)
curl -fsSL https://claude.ai/install.sh | bash  # Claude Code
claude                                          # 初回ログイン(本人の Claude アカウント)

そのうえで:

APP=<アプリ名> USER_NAME="<氏名>" USER_MAIL=<社内メール> bash scripts/setup-mac.sh

途中で公開鍵が表示されるので、GitHub の Settings → Deploy keys → Add deploy key("Allow write access" にチェック) に登録して Enter。

完了すると、利用者のデスクトップに 「<アプリ名>を開く.command」 ができます。 ダブルクリックすると START-HERE.md が表示され、そのまま Claude が起動します。 利用者がターミナルを意識する場面はここだけです。

セットアップ直後に必ず実測すること
cd ~/社内サービス/<アプリ名> && git push origin work:main

! [remote rejected] ... (protected branch hook declined) で拒否されれば正常。 通ってしまった場合は branch protection の設定を見直してください。 Deploy key が保護をすり抜けていないかは、資料の記述ではなく自分の目で確かめる価値があります。

Step 2 — 仕様書をつくる U・20〜30分

デスクトップの「◯◯を開く」をダブルクリック → /service-spec。 質問に答えるだけで docs/SPEC.md ができます。設計方針はプランA と同一です。

Step 3 — 開発と確認 U・反復

Claude が「画面が1枚立ち上がって動くところまで」を作ります。確認はブラウザで http://localhost:5173 (Codespaces のような PORTS タブは不要)。

区切りがついたら必ず /service-saveスキル側からも自動的に促します (機能を1つ作り終えたとき、30分以上保存していないとき、大きな変更に入る前)。

Step 4 — 初回の社内公開 E・10分

プランA と同じ。試用環境の URL を開き、Access のログイン画面 → @synon.co.jp でログイン → /cdn-cgi/access/get-identitygroups を確認 → Zero Trust のシート消費を確認。

Step 5 — 機能拡張 U・反復

Step 3 と同じ。docs/SPEC.md を更新しながら1機能ずつ。

Step 6 — 配信 U と本番申請

/service-ship で自動チェックが走ります。1つでも落ちたら配信しません。

#内容
0いま作業フォルダの中にいるか (プランB で追加)
1〜3型チェック / テスト / ビルド
4秘密の値の混入検査
5保護ファイル(wrangler.jsonc .github/ .claude/ scripts/ access.ts)の変更検査
6既存マイグレーションの改変検査
7ローカル DB のマイグレーション適用
8全 API が requireAccess 配下にあるか
9ログに個人情報が出ていないか
10ここで初めて保存する(落ちたものを保存しない)

全部通ると work へ保存 → work:staging へ push → GitHub Actions が試用環境へ → Chatwork に結果が流れます。

なぜ Chatwork 通知が要るか

利用者は GitHub の画面を見られず、gh コマンドも使えません。通知が無いと、配信が失敗したときに 利用者が待ちぼうけになり、「反映されないんですけど」という問い合わせがエンジニアに来ます。 成功時は試用環境の URL、失敗時は [toall] 付きでエンジニアに飛ぶようにしてあります。

本番公開は、利用者が docs/releases/<日付>-<名前>.md という申請書を作り、 エンジニアへ送る連絡文が画面に表示されます。エンジニアは:

  1. 申請書を読む(staging ブランチにある)
  2. 試用環境を自分でも触る
  3. stagingmain の PR を作る
    gh pr create --base main --head staging --title "<日本語1行>" \
      --body-file <(git show staging:docs/releases/<ファイル名>)
  4. 差分を確認してマージ → 本番デプロイ → スモークテスト → 失敗時は自動ロールバック
  5. 利用者に「公開しました」と連絡

この PR 作成の1工程だけが、プランA より増える手間です(1回2分)。

5事故を防ぐ4層 — ローカルで変わること

最大の違い

壊れた環境を捨てられません。Codespace なら「おかしくなったら作り直す」で済みました。 利用者の Mac は作り直せません。rm -rf を1回間違えれば実害が出ます。

プランAプランB での変更
1. Claude の権限deploy / main push / 保護ファイルを deny 左記+ sudo 禁止、rm -rf 禁止、git reset --hard / git clean / git checkout . 禁止、~/.ssh ~/Library ~/.aws の読み書き禁止、作業フォルダ外への書き込み禁止
2. フックpush 前に型チェック+テスト 左記+ 作業フォルダ外の操作・sudo・破壊的な git 操作をコマンド実行前に止めるsettings.json の deny と二重に)
3. GitHubbranch protection + CI 検査 同じ。加えて Deploy key を端末単位で発行し、退職時はそれを消すだけで止められる
4. Cloudflareアカウント単位 Access 同じ(最重要。新規 Worker が自動で社内限定になる)

同梱の guard.sh は実測で確認済み

✓ npm run dev                         → 通す
✓ git push origin work                → 通す(保存は面倒にしない)
✓ sudo rm -rf /                       → 止める
✓ rm -rf node_modules                 → 止める
✓ git reset --hard HEAD~3             → 止める
✓ cat ~/.ssh/id_rsa                   → 止める
✓ npx wrangler d1 execute DB --remote  → 止める
✓ git push origin work:main           → 止める
✓ git push origin work:staging        → 型チェックとテストを通してから通す
設計上の判断

work への保存(/service-save)は検証なしで通します。 保存を面倒にすると保存しなくなり、それが最大のリスクだからです。 検証をかけるのは「試用環境に出すとき」だけにしています。

6作業が消えないようにする

Codespaces にはクラウド側の保管がありましたが、プランB では利用者の Mac が唯一の保管場所です。 PC の故障・紛失・初期化で作業が消えます。三重に手当てします。

  1. /service-save — 利用者が自分で保存する。合図は1つだけなので覚えやすい
  2. スキルからの自動的な催促 — 機能を1つ作り終えたとき、30分以上保存していないとき、 大きな変更に入る前に、Claude の側から「保存しておきますか」と提案する
  3. 毎日18時の自動保存(launchd)scripts/autosave.shwork ブランチへ push する。 work は何も起きないブランチなので、未完成のコードが試用環境に出ることはない

START-HERE.md にも「保存しないと、この PC が壊れたときに作業が消えます」と明記しています。

7リスクと備え

リスクプランAプランB備え
作業が消える3段構えの保存(§6)
環境が壊れて直せない権限とフックを強化(§5)。最悪はセットアップをやり直す(30分)
退職者の手元にソースが残る端末返却・初期化の運用に載せる。Deploy key の削除で書き込みは止まるが、既にある複製は消せない
端末ごとに環境が違って動かないなしsetup-mac.sh で手順を固定。Node は v22 以上を必須チェック
社内ネットワーク・プロキシで npm ci が失敗なしStep 1 のセットアップ時に必ず1回通しておく(そこで出れば当日に潰せる)
本番公開でエンジニアが詰まる承認者を最低2名。試用環境は承認不要なので業務は止まらない
Zero Trust の50シート枯渇退職者のシート回収を運用に組み込む(既存の移行案件と同じ課題)
D1 が10個上限に当たるWorkers Paid($5/月)へ。Free 前提で稟議を通さない
プランB で最も重い宿題

「退職者の手元にソースが残る」は技術で解けません。 端末の返却・初期化を人事の退職手続きに紐づけてください。 機微な業務データを扱うサービスをこの方式で作る場合は、事前に情シスで判断が要ります。

8費用

項目金額備考
Cloudflare Workers Paid$5/月アカウント全体で1本。全アプリ共通。D1 10個上限と CPU 10ms の回避に必須
GitHub Team$4/user/月 × エンジニア人数のみプライベートリポジトリの branch protection に必要。利用者はアカウント不要=課金されない
GitHub Codespaces$0使わない
GitHub Actions無料枠内Team は月3,000分。社内アプリ数本なら使い切らない
Claude シート既存Pro / Max / Team のいずれかが利用者ごとに必要

エンジニア2名なら月 $13(Cloudflare $5 + GitHub Team $8)+ Claude シート。 プランA($50〜80)より 月$40〜70 安くなります。

代わりに増えるエンジニアの手作業は、端末セットアップ 30分 × 人数(1回だけ)と、 本番公開のたびの PR 作成 2分。利用者5名なら初回2.5時間、リリースが月4回でも8分/月です。 十分に元は取れます。

9導入の順序

一気に全部やらない

プランA と同じ考え方です。

やること判断ポイント
1週目Step 0 + エンジニア自身の Mac で setup-mac.sh を通しで実行Deploy key で main に push できないことを実測。Access の JWT ヘッダ問題もここで潰す
2週目意欲の高い1名の Mac をセットアップし、仕様書まで作ってもらうセットアップの実所要時間を測る。npm ci がネットワークで詰まらないか
3〜4週目同じ1名が機能拡張と本番公開まで通すChatwork 通知が期待どおり届くか。PR 作成の手間が許容範囲か
5週目以降部署内へ展開テンプレートの改善が落ち着いてから量産に入る

撤退・見直しの基準: 2週目のセットアップが30分で終わらない、または npm ci が 社内ネットワークで通らない場合、端末ごとの差異が大きすぎます。展開せず、プランA(Codespaces)に戻すか、 共用の開発端末を1台立てる方式を検討してください。

10同梱物

synon-claude-code-kit-planb.zip

template/
├── APPLY-B.md                     ★ 適用手順はここから
├── START-HERE.md                  利用者が最初に読む案内
├── CLAUDE.md.append.md            CLAUDE.md への追記内容(非エンジニア前提・実機の注意)
├── .claude/
│   ├── settings.json              権限(sudo・作業フォルダ外・破壊的 git を deny)
│   ├── hooks/guard.sh             コマンド実行前に止める(動作テスト済み)
│   └── skills/
│       ├── service-spec/          仕様書づくり(Cowork 判定つき)
│       ├── service-save/          作業の保存 ← プランB で新設
│       ├── service-ship/          試用環境への配信・本番申請
│       └── service-fix/           困りごとの自己診断(ローカル特有の症状を追加)
├── scripts/
│   ├── setup-mac.sh               利用者の Mac のセットアップ(エンジニアが実行)
│   └── autosave.sh                毎日18時の自動保存
├── .github/workflows/deploy.yml   CI/CD + Chatwork 通知
└── docs/SPEC.md                   仕様書のひな型

11未確認事項(実機で潰すこと)

  1. Deploy key で main に push できないこと。 branch protection が Deploy key にも効くはずですが、設定の組み合わせ次第で例外があり得ます。 Step 1 の直後に必ず実測してください(手順は §4 Step 1)。
  2. Static Assets を使う Worker で Cf-Access-Jwt-Assertion ヘッダが付与されるか。 プランA と同じ最優先の宿題。Step 0 で潰す。
  3. 社内ネットワーク/プロキシ下で npm ci が通るか。Step 1 で必ず1回通す。
  4. Claude Code デスクトップの認証が、端末をまたいで安定するか。 claude setup-token(1年有効)を使う場合の運用も含めて、1台目で確認する。
  5. wrangler d1 migrations apply--remote 要否(プランA と同じ)。

参考(一次情報)