電車のなかで、ふと「あのリポジトリ、あの直しだけ先に進めておきたい」と思いつく。手元にあるのはiPhone。開発マシンは家の机の上で、静かに電源だけ入っている。指示を出したい相手はそこにいるのに、自分がその前にいない——この数十センチならぬ数キロの距離が、地味に効く。
きっかけは、Codexのスマホアプリでした。手元のマシン(ホスト)と一度ペアリングしておけば、あとはスマホから、そのマシン上で新しい作業を始めたり、進捗を確認したり、コマンドを承認したりできる。ファイルも認証情報もローカルに置いたまま、操作の入口だけがスマホに来る。普段はClaude CodeとCodexを併用しているのですが、この「モバイルからの距離のなさ」だけは、正直うらやましかったんです。
じゃあClaude Codeはどうか。実は、モバイルの入口自体はちゃんとあります。Remote Controlという機能(執筆時点ではリサーチプレビュー)で起動したセッションは、Claudeのモバイルアプリから操作できる。クラウドに逃がさず、手元のマシンで動いたまま、別デバイスから続きを打てる仕組みです。ただ、ひとつだけ手前が空いている——Remote Controlが受け持つのは「すでに起動しているセッションを操作する」ところまで。その前段の「手元のマシンでセッションを起動しておく」は、いまもPCの前でやっておく前提なんです。Codexが「ペアリング1回で、あとはスマホから始められる」のに対して、Claude Codeは「始めるのは手元で」。外から起動する最後の一歩が、ぽっかり空いている。
そもそも「なぜクラウドじゃなく手元で?」という声もあると思います。Claude Codeは、GitHubとつないだリポジトリをクラウド環境に落として実装を進めることもできて、それで足りる場面も正直多い。ただ、そのクラウド環境には、リポジトリには入れず手元にグローバル配置している自分用のツール一式(普段の作業を支えているスキル群)を持っていけないんです。それ前提で回している身には、使えないのが地味にストレスでした。手元のマシンでそのまま動かせば、この一式がまるごと生きる——ローカルにこだわりたい理由は、実はここが大きかった。Remote Controlが「クラウドに逃がさず手元で動く」のは、まさにこの一点でありがたいわけです。
だったら、そこだけ自分で埋めればいい。この記事は、その隙間を「iPhoneから1コマンドで手元のセッションを立ち上げる」ところまで削った、起動用の小さなCLIの実験記録です。Claude Codeのこの一点が惜しくてCodexに流れた人にも、たぶん刺さるはず。テーマはずっと「Claude Codeを、モバイルから“起動”まで含めて使いたい」の一点に絞っています。
埋めたいのは「操作」ではなく「起動」
先に、この小さなCLIがどこを担当するのかを一枚で。上がこれまで、下が作ったあとです。
要するに、cc-launch が埋めているのは「操作」ではなく「起動」の一手間です。ここが、着想元になった Codex との差でもありました。文章より表のほうが早いので、並べておきます。
| 観点 | Codex(スマホアプリ) | Claude Code(Remote Control) |
|---|---|---|
| スマホとの連携 | ホストと QR で一度ペアリング | 起動済みセッションをアプリから操作 |
| 外から「起動」できる? | ✅ スマホから新しい作業を始められる | ❌ 手元のPCで起動しておく必要がある |
| コードやファイルの場所 | ホスト(手元)に置いたまま | 手元のマシンのまま(クラウドに出さない) |
差はほぼ一点、「外から起動できるか」に集約されます。Claude Code は操作の部品(Remote Control、執筆時点ではリサーチプレビュー)を持っているので、あとはその手前の「起動」を外から通せれば、Codex で感じたあの身軽さに一歩近づく。cc-launch はその一点だけを担当します。
ざっくり全体像
細かい話に入る前に、仕組みを一段ざっくり。拍子抜けするくらい単純で、やっているのは次の3ステップだけです。
スマホから手元のマシンに小さな「合図」を1つ送る → 受け取ったマシンが自分でセッションを起動する → あとはスマホのアプリからそのセッションを操作する。
「合図」を送る通信路には SSH を使っています(自分のPCに外から安全に入るための、昔からある定番の仕組み。特別な準備は要らず、普段づかいの鍵ログインで十分)。送るきっかけは iOS のショートカットの1タップ。むずかしいのは個々の部品ではなく、この一本道を「人が間に入らずに」通すところでした。以降は、この道を手前から1本ずつ敷いていく話です。まだ手を動かさず、流れだけ眺めてもらえれば大丈夫です。
この記事で扱うこと
- ローカルのClaude Codeをスマホから触るための「入口」の考え方
- 対象プロジェクトのセッションを1コマンドで用意する起動CLIの使い方
- 実際に運用してみて踏んだ、二重起動まわりのハマりどころ
前提
- Claude Code を日常的に使っている
- 手元の開発マシンに、外から SSH で入れる(さきほどの「合図」を送る通信路。普段の鍵ログインが設定済みなら十分で、新しく用意するものはありません)
- スマホから決まったコマンドを送れる(iOSのショートカットなど)
まず「モバイルから参照できる入口」を用意する
出発点は、Claude Code をリモートから参照・操作するモードです。手元のマシンで対象ディレクトリに入り、名前を付けてこのモードで起動しておくと、モバイルのClaudeアプリからそのセッションを覗いて指示を出せる——というのが、実際に手を動かして確認できた挙動でした。
# 手元のマシン側で、対象プロジェクトのディレクトリに入って起動する
claude --remote-control myrepo
このmyrepoが、モバイル側から見つけるときの目印になります。ここまでは公式の機能に乗っているだけで、自作の余地はありません。
問題は「手元のマシン側で、対象ディレクトリに入って起動しておく」の部分です。外出前に毎回やっておくのは現実的じゃないし(そもそも思いつくのは家を出たあと)、いざスマホから触りたくなった瞬間には、その起動作業こそがPCの前でしかできない。埋めたい距離が、埋めるための作業のなかに残ってしまう。
cc-launch:起動を1コマンドに畳む
そこで作ったのがcc-launchという起動用のCLIです。やることは単純で、「プロジェクト名を1つ渡すと、そのプロジェクトのリモート操作セッションを立ち上げる」。それだけ。
cc-launch myrepo # myrepo のリモート操作セッションを用意する
cc-launch --list # 起動できるプロジェクトの一覧を出す
肝は、これが1コマンドで完結していることです。1コマンドなら、スマホから送れる。iOSのショートカットに「開発マシンへSSHで入ってcc-launchを叩く」を仕込んでおけば、外からの起動が1タップになります。
iPhone のショートカット(1タップ)
→ ssh 開発マシン 'cc-launch myrepo'
→ 手元のマシン側でセッションが用意される
→ モバイルの Claude アプリから参照・操作
図にすると当たり前に見えますが、この一本道を通すのがゴールでした。人間がやるのは最初の1タップだけで、あとの起動作業はぜんぶ機械の側に押しやる。「PCの前でしかできない作業」を、スマホから送れる1行に翻訳したわけです。
プロジェクト名をどう住所に変換するか
cc-launch myrepoと打ったとき、そのmyrepoが実際にどのディレクトリなのかを解決する必要があります。ここは3段構えにしました。上から順に探し、最初に見つかったところで確定します。
| 順番 | 探す場所 | 使いどころ |
|---|---|---|
| 1 | 手元の設定ファイル(projects.tsv) | パスやセッション名を明示的に指定したいプロジェクト |
| 2 | 同梱のテンプレート | よく使うプロジェクトの初期設定 |
| 3 | ローカルのリポジトリ名(basename) | 設定に書いていなくても、名前が一意に定まるとき |
設定ファイルは、タブ区切りで1行1プロジェクトです。
# project path session remote-control-name
myrepo ~/path/to/myrepo myrepo myrepo
webapp ~/path/to/webapp webapp webapp
3段目のフォールバックには、あえて安全弁を入れています。リポジトリ管理ツールのローカル一覧から名前で引くのですが、同じ名前が複数の場所にあると(webappなんて何個でもありそう)どれを起動すべきか決められません。そういうときは黙って1つ選んだりせず、「候補が複数ある。設定ファイルに書いて曖昧さを消してくれ」とエラーで止まります。一意に定まるときだけ暗黙解決を許す——外から1タップで起動する以上、間違ったリポジトリを立ち上げて気づかないほうが怖い、という判断です。
ハマりどころ:「もう動いてる」の誤判定
同じ起動コマンドを二度踏んでも大丈夫なように、cc-launchは「すでにそのプロジェクトのリモート操作が動いていたら、何もしないで終わる」ようにしています。スマホの通信が不安定で二回タップしても、セッションが二重に立たない。冪等であることは、外から叩くツールでは特に効きます。
ところが最初の実装は、この判定が雑でした。「そのディレクトリでclaudeが動いているか」だけを見ていたのです。すると——手元のマシンで、同じプロジェクトを普通に開いて編集作業をしている最中に、スマホから起動しようとすると「もう動いています」と断られる。動いているのはリモート操作ではなく、目の前の対話セッションなのに。
cc-launch: Remote Control already running project=myrepo ...
↑ 実際にはリモート操作ではなく、普通の編集セッションを見て誤判定していた
直し方は、判定の対象を狭めることでした。稼働チェックを、リモート操作フラグ付きで起動しているプロセスだけに限定する。こうすると、同じディレクトリで普通に作業していても、それは「別物」として扱われ、リモート操作の起動をブロックしません。「動いているか」ではなく「何が動いているか」まで見て初めて、二重起動防止が実用になる、という後から効いてきた学びでした。
宣言的に配って、実行環境ごと固める
最後に配布の話を少しだけ。この手のスクリプトは、内部でいくつものコマンド(背景でセッションを立てるもの、リポジトリ一覧を引くもの、プロセスを確認するもの)に依存します。手元のマシンでは動くのに、環境が変わると「そのコマンドが無い」で転ぶ——よくある話です。
そこで、環境構築をコードで管理する仕組み(Home Manager)に乗せ、スクリプトが必要とする実行時コマンドを一緒に宣言してしまいました。CLI本体と、それが依存するコマンド群を1つの塊として配る。こうしておくと「自分のマシンだから動いていただけ」の再現性のなさが消え、別マシンに移しても同じように起動できます。外から叩く前提のツールほど、足元が動かないことの価値は大きい。
(余談ですが、PCの前にいるときは、複数プロジェクトの前景セッションを一覧から選んで切り替える別の小さなツールを併用しています。今回のCLIが「外から入口を開ける」役なら、そちらは「中で渡り歩く」役。役割が違うので、別物として分けています。)
動作確認
一通り組んだら、実機で次を順に確かめると安心です。
cc-launch --listで、起動対象が想定どおり並ぶか- スマホのショートカットからSSH経由で叩いて、モバイルのClaudeアプリからセッションが見えるか
- 同じプロジェクトを手元で普通に開いて作業している最中でも、リモート操作の起動がブロックされないか
- 二回続けて叩いても、セッションが二重に立たないか
特に3番目は、最初にハマった箇所そのものなので、実際に「編集セッションを開いた状態」を作って試す価値があります。テストで通っていても、現場の使い方は想像の外から来ます。
権限やアクセス範囲の締め方まで気になった方は、Claude Codeに鍵を渡さず権限を最小に絞る構成を扱った記事(AIエージェントにAPIキーを直接渡さずに動かす)も合わせてどうぞ。外から入口を開けるなら、開けた先の守りもセットで考えたくなります。
まとめ
やったことを一言でいえば、「PCの前でしかできなかった起動作業を、スマホから送れる1コマンドに畳んだ」だけです。派手な仕組みはありません。
プロジェクト名を住所に変換する解決順を決め、二重起動は「何が動いているか」まで見て防ぎ、実行環境ごと宣言的に配って再現性を持たせる。この3つを積んで、ようやく電車のなかの思いつきを1タップで手元のマシンに届けられるようになりました。ローカルで動くことの強みを保ったまま、その一番の弱点だった「その場にいないと触れない」を、少しだけ削れた実験でした。



