1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

月100万円稼ぐためのAI並行開発環境を、Windowsだけで作る

1
Last updated at Posted at 2026-08-25

力こそパワー!!

近年、AIが一発で完璧なコードを書くようになってから、「同時に何本仕事を進められるか」に主戦場が移ってきた気がします。

1本のタスクをAIに投げて、終わるのを眺めて、次を投げる。この使い方をしているのは少し古くなりつつあり、待ち時間が全部そのまま損失に繋がってきます。

同時に案件を10本走らせて、人間は指示と判断だけをする。これができると、同じ時間で扱える数が桁で変わります。

そして、その並行開発の環境がMacでは次々出てきましたが Windows には無かった ので作りました。

Macにはイケてる環境があるのに、Windowsには無かった。。。

ターミナルでAIを動かすのが当たり前になってから、Mac には Ghostty や cmux のような「AIエージェントを何枚も並べる前提のターミナル」が次々に出てきました。速いし、綺麗だし、最初からAI専用設計になっています。

Windows で同じものを探すと、だいたいこうなります。

  • そもそも Windows 版が無い
  • あっても WSL が必須。AI CLI も Node も WSL 側に入れ直しで、パスは /mnt/c/...
  • 好みに合うものが無い

そして最終的に、Windows は諦めて Mac を買った方が早いという結論に行き着きます。実際そう書いてある記事をよく見ます。

これがずっと納得いきませんでした。WSL は良いものですが、「Windows で開発している人が、AIを並べたいだけ」なのに、ディストリを1つ生やすところから始めるのは重すぎます。GUI アプリの起動や Windows 側のツールチェーンとの往復でも毎回つまずきます。

そこで、無いので作りました。SHIKISHA-TERM です。

  • 単一の .exe。インストーラなし、管理者権限なし、ランタイムなし
  • WSL 不要。Windows ネイティブの ConPTY で動きます(WSL のタブを開くことはできます)
  • API キー不要。手元の claude / codex / gemini と、今のサブスク契約をそのまま使います
  • Rust 製、MIT ライセンス

SHIKISHA-TERM のデスクトップ画面。複数のAIエージェントがそれぞれ working / waiting / done を表示している

先に謝っておきます。今は起動すると警告が出ます

現在 SignPath Foundation のOSS向け無償コード署名を申請中で、まだ証明書が降りていません。そのため初回起動で SmartScreen の「Windows によって PC が保護されました」が出ます。詳細情報 → 実行 で起動できます。

怪しいソフトではありません。とはいえ「よく分からない未署名の exe を実行しない」という警戒自体はまったく正しいので、安全性を確かめる手段を用意しています。

  • リリースはすべて GitHub Actions が、このリポジトリのソースからビルドしています。手元のPCで作った exe を置いているわけではないので、ダウンロードした zip に対応するビルドログが公開されています

  • zip の隣に SHIKISHA-TERM.zip.sha256 を置いています

    Get-FileHash SHIKISHA-TERM.zip -Algorithm SHA256
    
  • 署名ポリシーは SIGNING.md にあります

そしてお願いがあります。審査ではプロジェクトの実績や知名度も見られます。⭐ スターが増えるほど通りやすくなります。 署名が付けばこの警告は消えます。使えそうだと思ったらスターを押してもらえると本当に助かります。

https://github.com/styleio/ShikishaTerm


同時に10本走らせるための7つのルール

道具の紹介の前に、使い方の話をします。ここが本体だと思っています。

1. 1本ずつ待つのをやめる

一番よくある失敗が、AIに1つ投げて、終わるのを見ていることです。

AIの応答は数十秒から数分かかります。その間、人間は何もしていません。1日8時間のうち、実際に判断している時間は1時間もないはずです。残りは待機です。

待機をゼロにする方法は1つで、待っている間に別の作業を走らせることです。当たり前に聞こえますが、これを本気でやるには環境が要ります。

2. 作業場を機能ごとに分ける(git worktree)

同時に走らせようとすると、最初にぶつかるのが同じフォルダを複数のAIが触って壊す問題です。

これは git worktree で解決します。1機能につき1つの作業フォルダを切って、それぞれ別のブランチにする。AI同士がファイルで衝突しなくなるので、安心して並列にできます。

git worktree add ../orion-login    feature/login
git worktree add ../orion-billing  feature/billing
git worktree add ../orion-search   feature/search

あとは、タブごとに作業フォルダを別のワークツリーに向けるだけです。

{
  "workspaces": [{
    "name": "orion",
    "tabs": [
      { "name": "ログイン", "command": "claude", "cwd": "D:/work/orion-login" },
      { "name": "決済",     "command": "claude", "cwd": "D:/work/orion-billing" },
      { "name": "検索",     "command": "codex",  "cwd": "D:/work/orion-search" }
    ]
  }]
}

SHIKISHA-TERM はタブ名の下にそのタブが今どのブランチにいるかを出します。ワークツリーは .git がファイルとして置かれる特殊な形をしていますが、そこも追いかけるように作ってあるので、10本並んでいても「どれがどのブランチか」が一目で分かります。対応するプルリクエスト番号と、リッスンしているポートも同じ場所に出ます。

3. 「1機能しか進んでいない」なら指示に問題があるかも

ワークツリーを用意したのに1本しか動いていない、という状態がよくあります。これはツールの問題ではなく、タスクの切り出し方の問題です。

1つの大きな指示を出すと、AIは長い直列作業をします。そうではなく、独立して進められる単位に割ってから配る。設計・実装・テスト・ドキュメント・リファクタは、多くの場合それぞれ別に走らせられます。

「同時に10本走っているのが普通」という状態を先に決めて、そこから逆算してタスクを割るのがコツです。埋まらないなら、切り方が粗すぎる可能性があります。

4. 人間は指揮者に徹する

並列化してから一番やりがちなのが、個々のAIの中に入って手を動かしてしまうことです。

これをやると、その1本に人間が張り付くので、他の9本が止まります。並列化した意味が消えます。

人間の仕事は「指示を出す」「上がってきたものを判断する」の2つだけにします。細かい修正が必要なら、中に入って直すのではなく、指示として投げ直す。もし毎回中に入らないと進まないなら、それは最初の指示が足りていないサインです。

SHIKISHA-TERM だと、この「渡す」を自動化できます。

-- on_done.lua — 実装が終わったらレビュー担当に渡す。5往復で打ち切る
if tab.chain_depth == 0 then return end          -- 人間が始めたときは何もしない

local rounds = shikisha.get_var("rounds") or 0
if tab.output:match("LGTM") or rounds >= 5 then
  shikisha.notify("slack", "レビュー完了(" .. rounds .. "往復)")
  return
end
shikisha.set_var("rounds", rounds + 1)
shikisha.send_to_tab("reviewer", "以下を直してください:\n" .. tab.output)

書くAIとレビューするAIが勝手に往復して、決着したら Slack に飛んできます。人間はその通知を見るまで別のことをしていられます。

5. 見る画面を絞る

10本走らせるからといって、10枚のウィンドウを開いてはいけません。人間が把握できる量を超えた瞬間、速度は落ちます。

必要なのは「全部を見ること」ではなく「手が必要なものだけを見つけること」です。

SHIKISHA-TERM は各タブが今どの状態かを常に表示します。

状態 意味
🟡 BUSY 処理中
🟢 DONE 応答が終わった
🔵 QUESTION 確認待ち((y/n) や選択肢が出ている)
🔵 WAIT 待機中
🔴 EXIT プロセスが落ちた

これがあると、青い🔵と緑🟢だけ見ればよくなります。黄色🟡は放っておけばいい。10本あっても、人間が触るのは常に1〜2本です。

そのうえで、実際に中身を見たいものだけを画面分割で並べます。

Claude Code・Codex・Gemini CLI・DeepSeek を2×2に分割して同時に映しているところ

4枚とも別のAIです。左上が Claude Code、右上が Codex、左下が Gemini CLI、右下の DeepSeek だけは CLI ではなくモデルAPI直結のタブになっています。

分割は Ctrl+B % / "、境界はドラッグ、ダブルクリックで均等に戻ります。各ペインは中身に合わせて端末のサイズが再計算されるので、割ってもTUIが崩れません。

6. ルールはプロジェクトに置く

AIの出力品質は、指示より前に置いてある前提でほぼ決まります。コーディング規約、使っていいライブラリ、テストの方針、コミットメッセージの流儀。

これを毎回プロンプトに書くのは無駄なので、リポジトリに置きます。CLAUDE.md や各CLIの設定ファイル、それにフックです。

一人でやっているなら個人設定でも回りますが、チームでやるなら必ずリポジトリ側に集約してください。そうしないと、雑な設定のまま動かすメンバーが必ず出てきて、レビューのコストが跳ね上がります。

SHIKISHA-TERM 側は、この単位をワークスペースとして持っています。プロジェクトごとにタブ構成と自動化スクリプトを丸ごと切り替えられて、1ファイルに書き出して他のメンバーや別のマシンに渡せます。「うちのプロジェクトはこの構成で回してください」を配れる形です。

7. モデルと推論強度は使い分ける

常に一番賢いモデルを最大の推論強度で使う、というのが一番もったいない使い方です。遅いぶん、待ち時間が増えて並列数が落ちます。

実感としては、大半のタスクは中くらいの設定で十分に通ります。中くらいで通らないタスクは、モデルが弱いのではなく前提の整理か指示が足りていないことがほとんどです。そこでモデルを上げても、遅くなるだけで結果は変わりません。

強い設定が効くのは、設計の検討や難しい原因調査など、本当に思考量が要る場面だけです。そこだけ上げて、あとは戻す。この切り替えをサボると、単純に時間が溶けます。

SHIKISHA-TERM ではタブごとに違うCLI・違うモデルを刺せるので、「実装は速いモデル、設計相談は重いモデル」を横に並べたまま使い分けられます。


道具の話

ここからは SHIKISHA-TERM 自体の機能です。

いろいろなAIに対応しています

Claude Code / Codex CLI / Gemini CLI / Aider / Ollama / DeepSeek / Qwen、それと SSH 越しの素のシェル。「ターミナルで動くもの」なら基本的に相手にできます。

CLIごとの違いは Rust のコードではなく、JSON のプロファイルに切り出してあります。

{
  "name": "Claude Code",
  "command_match": ["claude"],
  "busy_patterns": ["esc to interrupt", "ctrl\\+c to stop"],
  "question_patterns": ["Do you want to", "❯\\s*1\\.", "\\(y/n\\)", "Allow .+\\?"],
  "silence_ms": 2000,
  "resume": {
    "new_id":      ["--session-id", "{id}"],
    "with_id":     ["--resume", "{id}"],
    "newest_here": ["--continue"]
  }
}

resume まで書けるので、「会話を引き継いだまま再起動」もCLIごとの流儀に合わせられます。

つまり未対応のAIも JSON を1枚足すだけで対応できます。「このCLIを使いたい」と Discussions に書いてもらえれば、こちらでプロファイルを作って取り込みます。もちろんPRでも歓迎です。

AI同士で議論させられます

discussion_jp.png

これは目玉機能なのですが、設定画面のウィザードに「AI×AI のディスカッション」があります。参加者を2人以上選んで、必要なら審判を置く。あとは最初の話者の入力欄にお題を打つだけです。

  • 参加者ごとに立場(ペルソナ)を書けます
  • 審判は「勝敗を決める」か「意見を統合する」かを選べます
  • CLIエージェントだけでなく、モデルAPI直叩きの参加者も混ぜられます

技術選定で迷ったときに、賛成側と反対側を立てて殴り合わせると、自分では出てこなかった論点が出ます。議論の結果は会話風のUIで閲覧できます、結論はマークダウンファイルとしてダウンロードも可能です。

discussion_done_jp.png

CLIエージェントを参加者にすると自動承認フラグ付きで起動します。

外出先からスマホで見られます(要 Tailscale)

設定で「スマホから使う」をオンにすると QR コードが出ます。読み取ると全タブの状態が並んだ小さなWebページが開いて、そこから指示を送れます。

スマホから見たダッシュボード。各AIの状態が並んでいる

10本走らせたまま帰宅して、電車の中で「これ終わってるな、じゃあ次これ」と投げられます。並列数を上げると、自分がPCの前にいない時間も稼働時間になるのが効いてきます。

ただしこれは「スマホからPCでコマンドを実行できる」機能なので、公開範囲の話が重要です。

  • インターネットには公開されません。同じネットワークの相手しか繋がりません
  • Tailscale(無料)を使ってください。 自分のデバイスだけが、暗号化された経路で、どこからでも届きます。これが一番安全な形です
  • Tailscale 無しだと家のLAN限定です。同じWi-Fiにいる人がURLとトークンを知れば使えてしまうので、共有Wi-Fiや公衆Wi-Fiではオンにしないでください
  • パブリックアドレスへのバインドは、自分で設定ファイルに書かない限り起きないようになっています

脅威モデルは SECURITY.md に全部書いてあります。

暴走をどう止めるか

AIがAIに仕事を渡せるということは、放っておくと無限に回るということです。並列数を上げるほど、事故ったときの被害も比例して増えます。

対策は3枚重ねにしています。

  1. max_chain — エージェント間で仕事を渡せる回数の上限(設定ファイル)
  2. Ctrl+B x — 緊急停止
  3. Ctrl+B l — タブ単位の入力ロック

Lua の自動化は既定で全拒否のサンドボックスで動きます。ファイルアクセスもネットワークも無し、通知先も事前に登録したものにしか飛びません。

もう1つ、**「走るものは見せる」**という決まりを置いています。アプリがユーザーの書いたコマンドに引数を足すなら、足した結果を必ず人が読める場所に出す、というルールです。コマンドは一文字違えば別物で、しかも確認なしに実行されます。見えない引数は誰にも点検できません。

これは実際に痛い目を見て入れました。起動処理に --session-id を足していたのを忘れたせいで、手書きの --resume と衝突してタブが起動できなくなり、しかも再起動しても同じコマンド行が組み上がるので永久に直らないという状態になりました。


技術メモ(興味がある方だけ)

軽くだけ書きます。

状態はAPIではなく画面から読んでいます。 ベンダー固有のフックやAPIに依存すると、「ターミナルで動くものなら何でも相手にする」という前提が壊れます。SSHの向こうで動いているAIも、明日出てくる新しいCLIも、画面なら必ず持っています。

判定は「画面のパターン一致」「ベル(BEL / OSC通知)」「沈黙タイマー」の3系統を重ねた状態機械です。1つだと必ず誤検知します。たとえば長文をペーストしても画面は変わるので、「画面が変化したか」ではなく「働いていることを示す表示が出ているか」を別のフラグで持っています。

単一 exe を守るために依存は徹底的に絞りました。 ウィンドウは tao、ブラウザタブは wry(WebView2)、Lua は mlua の vendored。スマホへのフレーム転送に使う WebSocket は、依存を1本増やすくらいならと自前で書いています。

日本語圏でターミナルを書く人向けの地雷を1つ。 vt100 クレートは、リサイズで全角文字が行末にまたがると panic します。日本語のTUIを動かしていれば必ず踏むので、vendor して穏やかに劣化するよう直したものを使っています。

技術の詳しいところはZennに投稿しているので興味がある人は見てください。


使い方

  1. Releases から SHIKISHA-TERM.zip を落とす
  2. 好きな場所に解凍する(USBメモリでも同期フォルダでも動きます)
  3. SHIKISHA-TERM.exe を実行

そのフォルダの外には何も書きません。インストーラも、入れるべきランタイムもありません。

初回は [e] を押すと設定画面が同じウィンドウの中で開きます。どのAIをどのフォルダで動かすかをフォームで選ぶだけで、JSON の手書きは不要です。

設定画面。タブごとに名前・コマンド・作業フォルダ・自動化をフォームで設定できる

キーバインドは tmux 風、プレフィックスは Ctrl+B(変更できます)。Ctrl+B ? でヘルプが出ます。

キー 動作
Ctrl+B 09 タブ切り替え(0 = INDEX)
Ctrl+B % / " 縦 / 横に分割
Ctrl+B o / 矢印 ペイン移動
Ctrl+B w / W ワークスペース一覧 / 次へ
Ctrl+B r / R 会話を引き継いで再起動 / 新規で再起動
Ctrl+B [ コピーモード(c で直近の応答をコピー、/ で履歴検索)
Ctrl+B a / x 自動化オン・オフ / 緊急停止
Ctrl+B : コマンドパレット

UIは Windows の言語設定に従います。日本語と英語が入っています。


おわりに

  • Windows 専用です。ConPTY の上に建てているので、他OSは未対応です、Macはもう良いソフトがあるのでいらんよね。
  • CLI を置き換えるものではありません。 AIのサブスク契約もログインも設定も今のまま使えます
  • IDE ではなくターミナルです。 セッションを束ねて、その間でテキストを動かすのが仕事です

「Mac にはあるのに Windows には無い」を、WSL を挟まずに埋めたかった、というのが全部です。

AI開発の並列化が当たり前になった昨今
同時進行数を上げようとした瞬間に昔ながらの道具が足を引っ張るのも事実で、そこを改善するために作りました。

未対応のAI、翻訳、バグ報告、どれも歓迎します。Discussions に何か書いてもらえれば喜んで反応します。

そして、署名の審査が通るまで起動時の警告は消えません。⭐ スターが増えると通りやすくなるので、良さそうだと思ったらスターを押していただけると嬉しいです。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?